Compare commits

...

171 commits

Author SHA1 Message Date
Hans-Christoph Steiner
57244dec63 Merge branch 'noversioncode' into 'master'
update: Handle APKs without a version code in their manifest

Closes #1240

See merge request fdroid/fdroidserver!1695
2025-08-26 10:10:51 +00:00
Tobias Mueller
2eb3986ecf update: Handle APKs without a version code in their manifest 2025-08-26 10:10:51 +00:00
Hans-Christoph Steiner
d4ad523dd2 Merge branch '__init__.py-black-format' into 'master'
convert fdroidserver/__init__.py to black format

See merge request fdroid/fdroidserver!1690
2025-08-18 15:48:23 +00:00
Hans-Christoph Steiner
6fff73b678 convert fdroidserver/__init__.py to black format 2025-08-18 15:38:08 +00:00
linsui
fbf8fc54db Merge branch 'patch-1' into 'master'
Sonatype is now Maven Central

See merge request fdroid/fdroidserver!1693
2025-08-18 13:32:29 +00:00
Licaon_Kter
f5f79ac1ea Sonatype is now Maven Central 2025-08-18 13:32:29 +00:00
Michael Pöhn
97e9784d5d Merge branch 'fix-srcname-cache-crash' into 'master'
update: don't crash if src tarball is not present

See merge request fdroid/fdroidserver!1691
2025-07-31 15:31:38 +00:00
Hans-Christoph Steiner
d20a6a5dcf update: don't crash if src tarball is not present 2025-07-29 17:20:11 +02:00
Michael Pöhn
058f0b7f6a Merge branch 'cache-srcname-sha256' into 'master'
update: cache the SHA-256 of the src tarball

Closes #1290

See merge request fdroid/fdroidserver!1686
2025-07-28 21:10:40 +00:00
Hans-Christoph Steiner
e07cdf5f0c update: cache the SHA-256 of the src tarball
closes #1290
2025-07-28 14:11:07 +00:00
Hans-Christoph Steiner
f9d111c8c1 Merge branch 'removeunf' into 'master'
Remove UpstreamNonFree

Closes fdroiddata#2481

See merge request fdroid/fdroidserver!1680
2025-07-28 14:10:18 +00:00
Licaon_Kter
8b54e2b4cf Remove UpstreamNonFree 2025-07-28 15:59:35 +02:00
Hans-Christoph Steiner
d594a683ab Merge branch 'isort' into 'master'
Sort import

See merge request fdroid/fdroidserver!1689
2025-07-26 15:47:48 +00:00
linsui
7a98650ed3 Sort import
ruff check --fix --select I
2025-07-26 15:35:19 +00:00
linsui
b19b8050db Merge branch 'fix-schildichat-fastlane' into 'master'
update: more accurate fastlane subdir/flavor matching

See merge request fdroid/fdroidserver!1687
2025-07-26 12:52:31 +00:00
Hans-Christoph Steiner
6a3758d3c4 update: more accurate fastlane subdir/flavor matching
This should fix Schildichat showing Element X's metadata.
2025-07-26 12:36:32 +00:00
Hans-Christoph Steiner
546821fc3d Merge branch 'scanpath' into 'master'
scanner: report all errors

See merge request fdroid/fdroidserver!1688
2025-07-26 10:44:26 +00:00
linsui
120a1655b4 scanner: report all errors 2025-07-26 18:33:57 +08:00
linsui
19d709edcd Merge branch 'standalone-gradlew-fdroid' into 'master'
make gradlew-fdroid a standalone project

See merge request fdroid/fdroidserver!1684
2025-07-25 17:46:59 +00:00
Hans-Christoph Steiner
5049645003 make gradlew-fdroid a standalone project
https://gitlab.com/fdroid/gradlew-fdroid
2025-07-25 17:46:31 +00:00
Hans-Christoph Steiner
e4b54c9768 Merge branch 'docker-buildserver-always-apt-https' into 'master'
buildserver: always use HTTPS for apt connections in Docker image

See merge request fdroid/fdroidserver!1603
2025-07-23 16:24:56 +00:00
Hans-Christoph Steiner
7988c54d00 buildserver: always use HTTPS for apt connections in Docker image
This configuration has been in use in .gitlab-ci.yml scripts for a while
now and has proven reliable.  This is a "low hanging fruit" improvement.
It provides an extra layer of protection for when their are apt vulns.  And
it makes it much harder to profile what a server/laptop is doing based on
the internet traffic.  The network observer will no longer be able to see
which packages are being downloaded since apt uses HTTP pipelining so size
attacks are not really possible. And HTTPS hides the URLs, filenames,
download contents, etc.
2025-07-23 16:09:20 +00:00
Hans-Christoph Steiner
05c4bf2483 Merge branch 'ci-PUBLISH-to-bookworm' into 'master'
gitlab-ci: update PUBLISH to bookworm since prod has already

See merge request fdroid/fdroidserver!1685
2025-07-23 16:08:48 +00:00
Hans-Christoph Steiner
7e219561b7 gitlab-ci: update PUBLISH to bookworm since prod has already 2025-07-22 21:52:28 +02:00
Hans-Christoph Steiner
6ad3c74bb4 Merge branch 'subdir-fastlane-support' into 'master'
update: support fastlane/ dir in subdir:

See merge request fdroid/fdroidserver!1679
2025-07-17 08:46:27 +00:00
Hans-Christoph Steiner
96c0d928da update: support fastlane/ dir in subdir:
GNU Taler apps use this.
* https://git.taler.net/taler-android.git/tree/merchant-terminal/fastlane/metadata/android/en-US?h=pos-1.0.2
2025-07-16 17:32:49 +02:00
Hans-Christoph Steiner
ba5c78d45f update: fetch Builds one time and reuse 2025-07-16 16:35:58 +02:00
linsui
8f1411607a Merge branch 'update-gradle-job' into 'master'
gitlab-ci: update "gradle" job to only check files when changed

See merge request fdroid/fdroidserver!1682
2025-07-16 12:23:02 +00:00
Hans-Christoph Steiner
97b0b0eaf8
gitlab-ci: update gradle: job to only check files in
While we are at it, also upgrade to Debian/trixie and rules:

this now handles making the merge requests:
https://gitlab.com/fdroid/gradle-transparency-log/-/merge_requests/2
2025-07-16 14:08:54 +02:00
Hans-Christoph Steiner
c6c4764b33 Merge branch 'gradle-release-checksums.py' into 'master'
bot: update to gradle v7.6.6

See merge request fdroid/fdroidserver!1681
2025-07-16 12:06:44 +00:00
fdroid-bot
7946acd52a gradle v8.14.3 2025-07-16 11:52:37 +00:00
linsui
0a91b98aee Merge branch 'gradle' into 'master'
AGP 8.11 requires Gradle 8.13

See merge request fdroid/fdroidserver!1678
2025-07-06 07:30:11 +00:00
linsui
09a51a429b AGP 8.11 requires Gradle 8.13 2025-07-06 07:29:46 +00:00
linsui
47b5ecdc8c Merge branch 'gradle' into 'master'
gradle 8.14.3

See merge request fdroid/fdroidserver!1677
2025-07-05 07:15:55 +00:00
linsui
909864a8c7 gradle 8.14.3 2025-07-05 15:03:27 +08:00
Hans-Christoph Steiner
47b9b24aef Merge branch 'gitlab-ci-pages-needs' into 'master'
gitlab-ci: 'pages' needs 'Build documentation' but it has `changes:`

See merge request fdroid/fdroidserver!1670
2025-06-26 06:55:43 +00:00
Hans-Christoph Steiner
f4f1c003a6 gitlab-ci: 'pages' needs 'Build documentation' but it has changes:
Fixes this error:

> Unable to create pipeline
>
> 'pages' job needs 'Build documentation' job, but 'Build documentation'
> does not exist in the pipeline. This might be because of the only,
> except, or rules keywords. To need a job that sometimes does not exist
> in the pipeline, use needs:optional.
2025-06-26 06:44:56 +00:00
Michael Pöhn
51b55963a5 Merge branch 'only-copy-icons-if-they-changed' into 'master'
only copy icons into repo/ if they changed

See merge request fdroid/fdroidserver!1664
2025-06-25 10:32:06 +00:00
Hans-Christoph Steiner
52c1bcca70 only copy icons into repo/ if they changed
This should make things more efficient and reduce the size of the diffs in
the transparency log.  Using shutil.copy2() preserves metadata.
2025-06-25 09:46:20 +00:00
Hans-Christoph Steiner
8a36e264b4 Merge branch 'merge_weblate' into 'master'
weblate

See merge request fdroid/fdroidserver!1676
2025-06-25 08:05:47 +00:00
Hans-Christoph Steiner
d5d65cfabd
make -C locale update 2025-06-25 09:54:03 +02:00
Hans-Christoph Steiner
dcb804f70d enable Bashkir (ba) as supported locale, its at 100% 2025-06-25 09:50:54 +02:00
Zulfar
a0cae97155 Translated using Weblate: Bashkir (ba) by Zulfar <mzulfar20@gmail.com>
Currently translated at 100.0% (579 of 579 strings)

Added translation using Weblate: Bashkir (ba) by Zulfar <mzulfar20@gmail.com>

Co-authored-by: Zulfar <mzulfar20@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ba/
Translation: F-Droid/F-Droid Server
2025-06-25 09:49:50 +02:00
Hans-Christoph Steiner
956cb11f91
gitlab-ci: rm dash from macOS tests, it reliably segfaults
dash rarely changes and is reliably run on Debian in the hooks/pre-commit
job.  So remove it from the macOS job, where it is flaky and hard to
troubleshoot (who has macOS? ;-)

https://gitlab.com/fdroid/fdroidserver/-/jobs/10454622138

```
==============================================================================
run commit hooks
+ echo_header 'run commit hooks'
+ test -x ./hooks/pre-commit
+ ./hooks/pre-commit
WARNING: pydocstyle is not installed, using dummy placeholder!
WARNING: pyflakes is not installed, using dummy placeholder!
WARNING: pycodestyle is not installed, using dummy placeholder!
./hooks/pre-commit: line 111: 20320 Segmentation fault: 11  $DASH -n $f
ERROR: dash tests failed!
```
2025-06-25 09:42:46 +02:00
Hans-Christoph Steiner
193ca5842c
version 2.4.2 2025-06-24 21:52:38 +02:00
Hans-Christoph Steiner
a44364d661
update CHANGELOG.md 2025-06-24 21:52:21 +02:00
Hans-Christoph Steiner
9fffe0aea4 Merge branch 'merge_weblate' into 'master'
weblate

See merge request fdroid/fdroidserver!1675
2025-06-24 15:24:31 +00:00
Artyom Rybakov
76eb0611a0 Translated using Weblate: Russian (ru) by Artyom Rybakov <rib.artem@gmail.com>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Artyom Rybakov <rib.artem@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/
Translation: F-Droid/F-Droid Server
2025-06-24 17:12:59 +02:00
WaldiS
e21fd0d167 Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (579 of 579 strings)

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 98.4% (570 of 579 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/
Translation: F-Droid/F-Droid Server
2025-06-24 17:12:59 +02:00
Swyter
d5e554dcd6 Translated using Weblate: Spanish (es) by Swyter <swyterzone@gmail.com>
Currently translated at 98.2% (569 of 579 strings)

Translated using Weblate: Spanish (es) by Swyter <swyterzone@gmail.com>

Currently translated at 98.2% (569 of 579 strings)

Co-authored-by: Swyter <swyterzone@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/
Translation: F-Droid/F-Droid Server
2025-06-24 17:12:59 +02:00
Hans-Christoph Steiner
e3ee7ed42e Merge branch 'gradle-release-checksums.py' into 'master'
update to gradle v7.6.5

See merge request fdroid/fdroidserver!1674
2025-06-24 15:08:15 +00:00
fdroid-bot
417ec9fe96 gradle v8.14.2 2025-06-24 14:58:15 +00:00
Torsten Grote
a3cd45c3fb Merge branch 'nightly-deploy-fixes' into 'master'
fixes for nightly and deploy, while debugging fdroidclient-nightly

See merge request fdroid/fdroidserver!1672
2025-06-24 12:05:14 +00:00
Hans-Christoph Steiner
d71fba164c nightly: fix bug that clones nightly repo to wrong location
bug introduced in ce018158ee from !1563
2025-06-24 13:08:48 +02:00
Hans-Christoph Steiner
e177520379 nightly: include project's LICENSE in the nightly repo 2025-06-24 13:08:48 +02:00
Hans-Christoph Steiner
10f2a4c592 Merge branch 'gitlab-ci-docker-depends-on-fdroid-build' into 'master'
gitlab-ci: "fdroid build" changes: for "docker" job

Closes docker-executable-fdroidserver#28

See merge request fdroid/fdroidserver!1673
2025-06-24 11:02:38 +00:00
Hans-Christoph Steiner
6b6cc2379c gitlab-ci: "fdroid build" changes: for "docker" job
"docker" depends on "fdroid build", so "fdroid build"'s changes: needs to
include "docker"'s.
2025-06-24 12:56:24 +02:00
Hans-Christoph Steiner
dcd5336138 scanner: fix tests after !1526 2025-06-23 23:10:15 +02:00
Hans-Christoph Steiner
f953146505
version 2.4.1 2025-06-23 22:37:29 +02:00
Hans-Christoph Steiner
e110390b99
update CHANGELOG.md 2025-06-23 22:37:26 +02:00
Hans-Christoph Steiner
fd3f71ad3c
run tests/refresh-SUSS_DEFAULT.py 2025-06-23 22:37:23 +02:00
Hans-Christoph Steiner
336d5381ae Merge branch 'fix-flaky-test' into 'master'
update: change assert to fix flaky tests

See merge request fdroid/fdroidserver!1671
2025-06-23 19:03:27 +00:00
Hans-Christoph Steiner
63298ad2ad update: change assert to fix flaky tests
This was happening often:

```
======================================================================
FAIL: test_strip_and_copy_image_in_file_ctime_changed (tests.test_update.UpdateTest.test_strip_and_copy_image_in_file_ctime_changed)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/builds/fdroid/fdroidserver/tests/test_update.py", line 1409, in test_strip_and_copy_image_in_file_ctime_changed
    self.assertNotAlmostEqual(
AssertionError: 1750683024.4857466 == 1750683024.4957466 within 0.01 delta (0.009999990463256836 difference)
```
2025-06-23 15:16:21 +02:00
Torsten Grote
61777e273c Merge branch 'deploy-fix-for-nightly' into 'master'
deploy: use master branch when working complete git-mirror repo

See merge request fdroid/fdroidserver!1666
2025-06-23 13:09:57 +00:00
Hans-Christoph Steiner
53bf6c7ce1 deploy: use master branch when working complete git-mirror repo
The *-nightly git repo always uses the _master_ branch.  The `index_only:`
support maintains a separate local branch since its git repo should be as
small as possible.  The full repo should be maintained for mirrors not
using `index_only:` so that when it force-pushes, it does not need to always
push all the files, only the updated ones.  So the full repo should be
maintained in the _master_ branch, and only the `index_only` mirrors should
have their own branch.

This adds a test case to reproduce this error:
https://gitlab.com/fdroid/fdroidclient/-/jobs/10347168516

This case also applies to any setup that used `servergitmirrors:` before the
`index_only:` feature was added.  This also applies to cases if the repo
maintainer manually clones the *-nightly repo into _fdroid/git-mirror/_
2025-06-23 12:39:15 +00:00
linsui
51c973f15e Merge branch 'buildserver-androguard-from-backports' into 'master'
buildserver: androguard res0/res1 fixes from bookworm-backports

See merge request fdroid/fdroidserver!1667
2025-06-20 10:34:59 +00:00
Hans-Christoph Steiner
894fdb641e buildserver: androguard res0/res1 fixes from bookworm-backports 2025-06-20 10:34:27 +00:00
Hans-Christoph Steiner
d029095641 Merge branch 'merge_weblate' into 'master'
weblate

See merge request fdroid/fdroidserver!1669
2025-06-18 21:01:20 +00:00
Bora Atıcı
85dba17d48 Translated using Weblate: Turkish (tr) by Bora Atıcı <boratici.acc@gmail.com>
Currently translated at 99.8% (578 of 579 strings)

Co-authored-by: Bora Atıcı <boratici.acc@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/
Translation: F-Droid/F-Droid Server
2025-06-18 22:49:22 +02:00
Nuri KÜÇÜKLER
57541eb52e Translated using Weblate: Turkish (tr) by Nuri KÜÇÜKLER <enatsek@gmail.com>
Currently translated at 98.6% (571 of 579 strings)

Co-authored-by: Nuri KÜÇÜKLER <enatsek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/
Translation: F-Droid/F-Droid Server
2025-06-18 22:49:22 +02:00
ssantos
7e8976d9b0 Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos <ssantos@web.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/
Translation: F-Droid/F-Droid Server
2025-06-18 22:49:22 +02:00
WaldiS
b6d7e8732b Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 98.2% (569 of 579 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/
Translation: F-Droid/F-Droid Server
2025-06-18 22:49:22 +02:00
Ecron
2590f00ff0 Translated using Weblate: Catalan (ca) by Ecron <ecron_89@hotmail.com>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Ecron <ecron_89@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/
Translation: F-Droid/F-Droid Server
2025-06-18 22:49:22 +02:00
Hans-Christoph Steiner
1135cee8b7 Merge branch 'nightly-GitPython' into 'master'
nightly: switch dep from vcs_git to GitPython

See merge request fdroid/fdroidserver!1563
2025-06-18 16:47:06 +00:00
Hans-Christoph Steiner
76d711ba3c nightly: convert to black format 2025-06-18 18:34:53 +02:00
Hans-Christoph Steiner
b2057a1ce0 nightly: switch dep from vcs_git to GitPython
This code already depends on GitPython, and hopefully the common.vcs* stuff
can eventually go away entirely.  GitPython should provide those bits
already, and they are maintained by someone else.

https://github.com/gitpython-developers/GitPython/pull/2029
2025-06-18 18:34:49 +02:00
Hans-Christoph Steiner
ce018158ee nightly: set up test for git clone function 2025-06-18 18:03:59 +02:00
Hans-Christoph Steiner
d398994ad3 Merge branch 'fix-categories-yml-only-icon' into 'master'
update: If categories.yml only has icon:, then add name:

See merge request fdroid/fdroidserver!1659
2025-06-16 17:25:09 +00:00
Hans-Christoph Steiner
494d811846 update: If cateogories.yml only has icon:, then add name:
E.g. if _categories.yml_ is like:

```yaml
Time:
  icon: time.png
```
2025-06-16 17:13:48 +00:00
Hans-Christoph Steiner
964861eb68 Merge branch 'polish-pylint' into 'master'
polish pylint

See merge request fdroid/fdroidserver!1637
2025-06-16 17:13:27 +00:00
linsui
8c14e44f63 gitlab-ci: show pylint output in log when it fails 2025-06-16 17:08:38 +00:00
Hans-Christoph Steiner
e1a8e1a08a pylint: use default good-names list 2025-06-16 17:08:38 +00:00
Hans-Christoph Steiner
d5bc7a6942 let pylint choose how many CPUs to use 2025-06-16 17:08:38 +00:00
Jochen Sprickerhof
78e6b8f04c Merge branch 'strip-and-copy-check-by-time' into 'master'
update: use ctime/mtime to control _strip_and_copy_image runs

See merge request fdroid/fdroidserver!1665
2025-06-11 19:26:03 +00:00
Hans-Christoph Steiner
59102fb07f update: use ctime/mtime to control _strip_and_copy_image runs
Oftentimes, the file that is copied is stripped, in which case, the file
size is different.  Using a file size check here means it will rerun the
strip and copy every time `fdroid update` is run for any image that needs
to be stripped.  If the source's ctime is newer than the destination, then
the process should run since it is a newly created file.  Even more so with
mtime, since the destination's mtime is reset based on the source's.
2025-06-11 17:33:34 +02:00
Hans-Christoph Steiner
3cb6078059 Merge branch 'lazyconfig' into 'master'
Lazyload environment variables in config.yml

See merge request fdroid/fdroidserver!1645
2025-06-11 13:02:09 +00:00
linsui
cd1630d2f5 Lazyload environment variables in config.yml 2025-06-11 13:02:09 +00:00
linsui
e44fd22199 Merge branch 'gradle' into 'master'
gradlew-fdroid: update AGP required gradle version

See merge request fdroid/fdroidserver!1661
2025-06-10 17:33:49 +00:00
linsui
69003ae65b gradlew-fdroid: update AGP required gradle version 2025-06-10 17:18:35 +00:00
Hans-Christoph Steiner
d4a71cd572 Merge branch 'two-fixes-for-tests' into 'master'
two fixes for the tests

See merge request fdroid/fdroidserver!1657
2025-06-10 17:14:21 +00:00
Hans-Christoph Steiner
721de49104 make_website: only parse repo_pubkey if its needed
This makes writing tests a lot easier, since the test cases no longer need
to provide a value for `repo_pubkey:`.
2025-06-08 20:12:04 +00:00
Hans-Christoph Steiner
677301bc8a gitlab-ci: make gradle job show files with trigger it
For some reason, this logic thinks that this merge request has changed
makebuildserver and/or gradlew-fdroid, though it clearly has not. This
should shed some light on it.

https://gitlab.com/fdroid/fdroidserver/-/jobs/9835383262
2025-06-08 20:12:04 +00:00
linsui
f281068cbf Merge branch 'gradle8142' into 'master'
gradle 8.14.2

See merge request fdroid/fdroidserver!1663
2025-06-08 07:14:18 +00:00
Licaon_Kter
e98f0966e0 gradle 8.14.2 2025-06-08 09:31:16 +03:00
linsui
0885cf3b49 Merge branch 'gradle8141' into 'master'
gradle - 8.14.1

See merge request fdroid/fdroidserver!1660
2025-05-24 07:32:06 +00:00
Licaon_Kter
c70af2503c gradle - 8.14.1 2025-05-24 09:36:38 +03:00
Hans-Christoph Steiner
bd10ee73c1 Merge branch 'deprecate_bzr_svn' into 'master'
Deprecate bzr, hg and git-svn support (attack surface)

See merge request fdroid/fdroidserver!1656
2025-05-23 07:15:12 +00:00
Jochen Sprickerhof
cfc848771d Deprecate bzr, hg and git-svn support (attack surface) 2025-05-23 07:14:42 +00:00
Michael Pöhn
ac90d11906 Merge branch 'funding-manifest-urls' into 'master'
💸 add .well-known/funding-manifest-urls

See merge request fdroid/fdroidserver!1658
2025-05-22 15:31:33 +00:00
Michael Pöhn
7cf1cd1f4c
💸 add .well-known/funding-manifest-urls
This is used by floss.fund to automatically verify that a repository is
indeed owned by the author of the corresponding funding.json file.
2025-05-22 17:29:50 +02:00
Hans-Christoph Steiner
2a939bf87f Merge branch 'flavor' into 'master'
update: match fastlane flavor with all combinations

See merge request fdroid/fdroidserver!1647
2025-05-22 12:59:26 +00:00
linsui
a5d966bf0f calculate all combinations of gradle flavors 2025-05-22 12:24:33 +02:00
linsui
e957583337 common: add calculate_gradle_flavor_combination 2025-05-22 12:24:32 +02:00
linsui
6c054f62ca flavour -> flavor 2025-05-22 12:16:43 +02:00
Hans-Christoph Steiner
0ac750463f Merge branch 'checkupdate' into 'master'
checkupdates: set push ref to HEAD:refs/heads/branch_name

See merge request fdroid/fdroidserver!1638
2025-05-22 10:13:23 +00:00
Hans-Christoph Steiner
8c9b0b3a2a add test case 2025-05-22 12:12:24 +02:00
linsui
243a0475f9 checkupdates: don't create branch with .lock end 2025-05-22 12:12:24 +02:00
linsui
e538c34c32 checkupdates: set push ref to HEAD:refs/heads/branch_name 2025-05-22 12:12:24 +02:00
Hans-Christoph Steiner
e7060011aa Merge branch 'triple-t' into 'master'
Fix handling of Triple-T 1.0.0 graphics

Closes #1260

See merge request fdroid/fdroidserver!1652
2025-05-22 10:11:25 +00:00
Leo Heitmann Ruiz
5f534ea2cb Add test case for Triple-T 1.0.0 graphics 2025-05-22 11:57:57 +02:00
Leo Heitmann Ruiz
ffd4274503 Fix handling of Triple-T 1.0.0 graphics
Unlike screenshots, the featureGraphic, icon, promoGraphic, and tvBanner
should be placed directly in the locale directory instead of in a
dedicated subdirectory (in the F-Droid metadata structure). For version
1.0.0 of the Triple-T structure this currently isn't done. Instead, the
graphics are treated as screenshots are.

To illustrate:

en-US/listing/icon/icon.png
en-US/listing/featureGraphic/play_store_feature_graphic.png

Should end up as:

en-US/icon.png
en-US/featureGraphic.png

But instead they currently end up as:

en-US/icon/icon.png
en-US/featureGraphic/play_store_feature_graphic.png

This patch should fix it.

It seems the erroneous behavior was introduced in
a4169484fd

Closes #1260
2025-05-21 16:57:35 +00:00
Hans-Christoph Steiner
0a8f9ec5fc Merge branch 'SOURCE_DATE_EPOCH' into 'master'
set SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file

See merge request fdroid/fdroidserver!1653
2025-05-20 20:03:48 +00:00
Hans-Christoph Steiner
20b36f1970 SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file
https://reproducible-builds.org/docs/source-date-epoch
2025-05-19 16:31:40 +02:00
linsui
0b6e304922 Merge branch 'gradlew-fdroid-one-more-level' into 'master'
gradlew-fdroid: also search ../../gradle/ for wrapper files

See merge request fdroid/fdroidserver!1655
2025-05-19 08:44:11 +00:00
Hans-Christoph Steiner
9384c5ab70 gradlew-fdroid: also search ../../gradle/ for wrapper files
https://github.com/geteduroam/android-app/pull/139
2025-05-17 00:15:44 +02:00
linsui
7b6767eb50 Merge branch 'no-git-exec-in-update' into 'master'
update: never execute VCS e.g. git

See merge request fdroid/fdroidserver!1630
2025-05-16 07:00:36 +00:00
Hans-Christoph Steiner
4e7bda736c update: never execute VCS e.g. git
Package repos come from untrusted sources, in terms of the buildserver. They
should be handled in VMs and containers as much as possible to avoid
vulnerabilities.  As far as I could tell, `fdroid update` only has a single
place where it executes any VCS system: if there is .fdroid.yml present in
a package repo, then it will fetch the commit ID using git.

For better security properties, this implements a simple function to just
read the files to get that commit ID.  The function that executes git to do
the same thing is relabeled "unsafe".  That is used for status JSON
everywhere, but that runs on fdroiddata.git and fdroidserver.git, which are
trusted repos.

The unsafe version is also used in places where git.Repo() is needed for
other things.
2025-05-12 18:30:03 +02:00
Hans-Christoph Steiner
2a9c8e9644 Merge branch 'weblate' into 'master'
weblate

See merge request fdroid/fdroidserver!1654
2025-05-12 14:44:41 +00:00
M. Fatih Uluçam
da58061c80 Translated using Weblate: Turkish (tr) by "M. Fatih Uluçam" <mulucam@gmail.com>
Currently translated at 94.6% (548 of 579 strings)

Co-authored-by: M. Fatih Uluçam <mulucam@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
VfBFan
696df82999 Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: VfBFan <drop0815@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Laurent FAVOLE
cc61a3e9e3 Translated using Weblate: French (fr) by Laurent FAVOLE <laurentfavole03@gmail.com>
Currently translated at 99.1% (574 of 579 strings)

Co-authored-by: Laurent FAVOLE <laurentfavole03@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
ssantos
3b78b3cf06 Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Aindriú Mac Giolla Eoin
0e086f5e61 Translated using Weblate: Irish (ga) by Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Andrey
61943c3f06 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 98.4% (570 of 579 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Ihor Hordiichuk
eebbfedee5 Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Besnik Bleta
1a9ba8e956 Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 97.7% (566 of 579 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/
Translation: F-Droid/F-Droid Server
2025-05-12 16:29:00 +02:00
Fjuro
dd64d557f2
Translated using Weblate: Czech (cs) by Fjuro <fjuro@users.noreply.hosted.weblate.org>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:13 +02:00
Liner Seven
cd0b961e3c
Translated using Weblate: Japanese (ja) by Liner Seven <linour7gmekiblo@gmail.com>
Currently translated at 100.0% (579 of 579 strings)

Translated using Weblate: Japanese (ja) by Liner Seven <linour7gmekiblo@gmail.com>

Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Liner Seven <linour7gmekiblo@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:13 +02:00
C. Rüdinger
57ec6a93ed
Translated using Weblate: German (de) by "C. Rüdinger" <Mail-an-CR@web.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: C. Rüdinger <Mail-an-CR@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:13 +02:00
Ceeee
0e752f1ef0
Translated using Weblate: German (de) by Ceeee <marius.romanus@gmx.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Ceeee <marius.romanus@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:12 +02:00
VfBFan
13166fce05
Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: VfBFan <drop0815@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:12 +02:00
Igor Rückert
22af55fb6d
Translated using Weblate: Portuguese (Brazil) (pt_BR) by Igor Rückert <igorruckert@yahoo.com.br>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Igor Rückert <igorruckert@yahoo.com.br>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:12 +02:00
大王叫我来巡山
858edaaa4d
Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:12 +02:00
Максим Горпиніч
f2faeca949
Translated using Weblate: Ukrainian (uk) by Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Currently translated at 100.0% (579 of 579 strings)

Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/
Translation: F-Droid/F-Droid Server
2025-05-11 16:14:11 +02:00
linsui
9e51fa36e5 Merge branch 'upgradedebianvm' into 'master'
Use latest Bookworm images for makebuildserver

See merge request fdroid/fdroidserver!1651
2025-05-08 12:13:25 +00:00
Licaon_Kter
7924888e5a Use latest Bookworm images for makebuildserver 2025-05-08 12:13:25 +00:00
Michael Pöhn
b581d08b6f Merge branch 'optional_config' into 'master'
Make v2 localized config optional

See merge request fdroid/fdroidserver!1649
2025-04-28 11:14:40 +00:00
Jochen Sprickerhof
b83c1aace3
Make v2 localized config optional
Fixes:

Traceback (most recent call last):
  File "/home/fdroid/fdroidserver/fdroid", line 22, in <module>
    fdroidserver.__main__.main()
  File "/home/fdroid/fdroidserver/fdroidserver/__main__.py", line 222, in main
    raise e
  File "/home/fdroid/fdroidserver/fdroidserver/__main__.py", line 203, in main
    mod.main()
  File "/home/fdroid/fdroidserver/fdroidserver/update.py", line 2774, in main
    fdroidserver.index.make(archived_apps, archapks, repodirs[1], True)
  File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 132, in make
    make_v2(
  File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 728, in make_v2
    output["repo"] = v2_repo(repodict, repodir, archive)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 686, in v2_repo
    repo["icon"] = config["archive" if archive else "repo"]["icon"]
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
KeyError: 'icon'
2025-04-28 08:38:54 +02:00
linsui
561da8f7d1 Merge branch 'gradle' into 'master'
gradle v8.14

See merge request fdroid/fdroidserver!1648
2025-04-26 07:11:12 +00:00
linsui
b93fc6f9da gradle v8.14 2025-04-26 14:41:27 +08:00
Michael Pöhn
265adadaba Merge branch 'include-stages-in-update.json' into 'master'
update: include stages timing info in update.json

See merge request fdroid/fdroidserver!1644
2025-04-23 17:38:27 +00:00
Hans-Christoph Steiner
2a33857fd0
update: include stages timing info in update.json
!1627 missed this, so stages only get included in running.json.  That means
the stages info is only visible while update is running, making it hard to
use.
2025-04-23 19:26:50 +02:00
Hans-Christoph Steiner
3b360f6b80 Merge branch 'repo_key_sha256-valid' into 'master'
lint: repo_key_sha256 to list of valid config keys

See merge request fdroid/fdroidserver!1643
2025-04-16 12:00:33 +00:00
Hans-Christoph Steiner
004103357b gitlab-ci: metadata_v0 test expects no config 2025-04-16 11:11:57 +00:00
Hans-Christoph Steiner
56338cd7d0 repo_key_sha256 to list of valid config keys
fdroidserver!287
2025-04-16 11:11:57 +00:00
Hans-Christoph Steiner
a03cfa3fc2 Merge branch 'patch-1' into 'master'
Clarify libmagic needs to be installed separately

See merge request fdroid/fdroidserver!1640
2025-04-15 16:22:22 +00:00
Benson Muite
c4d46a187f Clarify libmagic needs to be installed separately
See installation instructions at https://pypi.org/project/python-magic/
2025-04-12 14:54:36 +03:00
Hans-Christoph Steiner
692f79ec7d Merge branch 'verify-json-output' into 'master'
`fdroid verify` JSON output

See merge request fdroid/fdroidserver!1632
2025-04-10 15:52:41 +00:00
Hans-Christoph Steiner
17e5a59704 verify: generate <appid>.json files that list all reports 2025-04-10 15:41:46 +00:00
Hans-Christoph Steiner
029636ed61 verify: write verified.json in function to ease testing 2025-04-10 15:41:46 +00:00
Hans-Christoph Steiner
d34d051329 Merge branch 'checkupdate' into 'master'
checkupdates: always print remote message of git push

See merge request fdroid/fdroidserver!1636
2025-04-09 09:58:53 +00:00
linsui
2aba6fd324 checkupdates: always print remote message of git push 2025-04-09 17:48:11 +08:00
Hans-Christoph Steiner
f7cc4812a2 Merge branch 'gitlab-ci-refactor-to-rules' into 'master'
gitlab-ci: migrate to rules: syntax and split up linters into standalone jobs

See merge request fdroid/fdroidserver!1614
2025-04-09 07:31:18 +00:00
Hans-Christoph Steiner
9bcd13bfdd gitlab-ci: add "lint" pre-stage before default "test" stage 2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
7f67a882e7 gitlab-ci: only run Python-only jobs when .py files change 2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
6ad79e3c06 gitlab-ci: move bandit to its own job 2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
3e67bee037 gitlab-ci: move pylint to its own job 2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
3b9d39ac61 gitlab-ci: move shellcheck to own job fenced by changes: 2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
aa9cc14991 gitlab-ci: refactor to rules: and ditch old only: syntax
Adding workflow: is required, otherwise there would be duplicate
pipelines for all users in the @fdroid group.  There would be "branch
pipelines" and "merge request pipelines".  Confusingly, only jobs with
rules: get duplicated.
2025-04-09 07:19:50 +00:00
Hans-Christoph Steiner
07d499ce1f Merge branch 'checkupdate' into 'master'
checkupdates: adjust log level

See merge request fdroid/fdroidserver!1635
2025-04-09 07:01:34 +00:00
linsui
a13dd109d3 checkupdates: adjust log level 2025-04-09 14:51:27 +08:00
Hans-Christoph Steiner
3582a12f18 Merge branch 'clearer-srclibs' into 'master'
vcs_git: clearer error messages for checkrepo()

See merge request fdroid/fdroidserver!1634
2025-04-03 10:25:11 +00:00
Michael Pöhn
69f9f52ba2 drop error prefix when raising VCSException in case retrieving git revision failed 2025-04-03 10:24:46 +00:00
Michael Pöhn
046c527ee8 vcs_git: clearer error messages for checkrepo()
This updates error messages the help identify issues when loading srclibs
and fixes pushing srclibs into build vms/containers.
2025-04-03 10:24:46 +00:00
Michael Pöhn
0d88a94192 metadata: rename srcdir -> srclibs_dir for clarity 2025-04-03 10:24:46 +00:00
Hans-Christoph Steiner
e6cff099f2
delete file I mistakenly included 2025-04-01 11:41:46 +02:00
Hans-Christoph Steiner
bb7394ab3c Merge branch 'start-integrating' into 'master'
start integrating

See merge request fdroid/fdroidserver!1631
2025-03-31 15:34:14 +00:00
Hans-Christoph Steiner
a011b34b97 black format and use returncode directly without != 0 2025-03-31 11:27:13 +02:00
Hans-Christoph Steiner
9a8d80ee6b purge dead code: apk_signer_fingerprint_short 2025-03-31 11:09:07 +02:00
Hans-Christoph Steiner
ef4bbe4612 Merge branch 'use-codeclimate-for-linting-tests' into 'master'
ci: use GitLab Code Quality for linting tests

See merge request fdroid/fdroidserver!1443
2025-03-26 21:33:31 +00:00
proletarius101
90b82ea7e6 ci: use GitLab Code Quality for linting tests 2025-03-26 21:33:31 +00:00
157 changed files with 5277 additions and 1557 deletions

View file

@ -1,3 +1,3 @@
[bandit]
skips: B110,B404,B408,B603,B607
skips: B110,B404,B408,B603,B607,B322
targets: .

View file

@ -1,5 +1,22 @@
---
# Use merge request pipelines when a merge request is open for the branch.
# Use branch pipelines when a merge request is not open for the branch.
# https://docs.gitlab.com/ci/yaml/workflow/#switch-between-branch-pipelines-and-merge-request-pipelines
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
stages:
- lint
- test # default for jobs that do not specify stage:
- deploy
variables:
pip: pip3 --timeout 100 --retries 10
# speed up git checkout phase
@ -50,6 +67,7 @@ metadata_v0:
- git checkout $RELEASE_COMMIT_ID
- cd ..
- git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git
- rm -f fdroiddata/config.yml # ignore config for this test
- cd fdroiddata
- ../tests/dump_internal_metadata_format.py
- cd ..
@ -80,12 +98,31 @@ metadata_v0:
# Ubuntu and other distros often lack https:// support
- grep Debian /etc/issue.net
&& { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }
# The official Debian docker images ship without ca-certificates,
# TLS certificates cannot be verified until that is installed. The
# following code turns off TLS verification, and enables HTTPS, so
# at least unverified TLS is used for apt-get instead of plain
# HTTP. Once ca-certificates is installed, the CA verification is
# enabled by removing this config. This set up makes the initial
# `apt-get update` and `apt-get install` look the same as verified
# TLS to the network observer and hides the metadata.
- echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates
- apt-get update
- apt-get install ca-certificates
- rm /etc/apt/apt.conf.d/99nocacertificates
- apt-get dist-upgrade
# For jobs that only need to run when there are changes to Python files.
.python-rules-changes: &python-rules-changes
rules:
- changes:
- .gitlab-ci.yml
- fdroid
- makebuildserver
- setup.py
- fdroidserver/*.py
- tests/*.py
# Since F-Droid uses Debian as its default platform, from production
# servers to CI to contributor machines, it is important to know when
@ -94,8 +131,8 @@ metadata_v0:
debian_testing:
image: debian:testing
<<: *apt-template
only:
- master@fdroid/fdroidserver
rules:
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script:
- apt-get install
aapt
@ -123,8 +160,8 @@ debian_testing:
ubuntu_lts_ppa:
image: ubuntu:latest
<<: *apt-template
only:
- master@fdroid/fdroidserver
rules:
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script:
- export ANDROID_HOME=/usr/lib/android-sdk
- apt-get install gnupg
@ -183,24 +220,9 @@ ubuntu_jammy_pip:
- LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind'
# The gradlew-fdroid tests are isolated from the rest of the test
# suite, so they run as their own job.
gradlew-fdroid:
image: debian:bookworm-slim
<<: *apt-template
only:
changes:
- .gitlab-ci.yml
- gradlew-fdroid
- tests/test_gradlew-fdroid
script:
- apt-get install ca-certificates curl default-jdk-headless shellcheck unzip
- shellcheck --severity=error --color gradlew-fdroid tests/test_gradlew-fdroid
- ./tests/test_gradlew-fdroid
# Run all the various linters and static analysis tools.
lint_format_bandit_checks:
hooks/pre-commit:
stage: lint
image: debian:bookworm-slim
variables:
LANG: C.UTF-8
@ -215,34 +237,60 @@ lint_format_bandit_checks:
make
pycodestyle
pyflakes3
pylint
python3-dev
python3-git
python3-nose
python3-pip
python3-yaml
shellcheck
- ./hooks/pre-commit
bandit:
image: debian:bookworm-slim
<<: *python-rules-changes
<<: *apt-template
script:
- apt-get install python3-pip
- $pip install --break-system-packages bandit
- export EXITVALUE=0
- function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; }
- ./hooks/pre-commit || set_error
- bandit
-r
-ii
--ini .bandit
|| set_error
- pylint --output-format=colorized --reports=n
- bandit -r -ii --ini .bandit
pylint:
stage: lint
image: debian:bookworm-slim
<<: *python-rules-changes
<<: *apt-template
script:
- apt-get install pylint python3-pip
- $pip install --break-system-packages pylint-gitlab
- pylint --output-format=colorized,pylint_gitlab.GitlabCodeClimateReporter:pylint-report.json
fdroid
makebuildserver
setup.py
fdroidserver/*.py
tests/*.py
|| set_error
- shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests
|| set_error
- exit $EXITVALUE
artifacts:
reports:
codequality: pylint-report.json
when: always
shellcheck:
stage: lint
image: debian:bookworm-slim
rules:
- changes:
- .gitlab-ci.yml
- hooks/install-hooks.sh
- hooks/pre-commit
- tests/run-tests
<<: *apt-template
script:
- apt-get install shellcheck
# TODO GitLab Code Quality report https://github.com/koalaman/shellcheck/issues/3155
- shellcheck --exclude SC2046,SC2090 --severity=warning --color
hooks/install-hooks.sh
hooks/pre-commit
tests/run-tests
# Check all the dependencies in Debian to mirror production. CVEs are
# generally fixed in the latest versions in pip/pypi.org, so it isn't
# so important to scan that kind of install in CI.
@ -250,10 +298,7 @@ lint_format_bandit_checks:
safety:
image: debian:bookworm-slim
rules:
# once only:/changes: are ported to rules:, this could be removed:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_PIPELINE_SOURCE == "push" && $SAFETY_API_KEY
- if: $SAFETY_API_KEY
changes:
- .gitlab-ci.yml
- .safety-policy.yml
@ -276,13 +321,10 @@ safety:
# TODO tests/*/*/*.yaml are not covered
yamllint:
stage: lint
image: debian:bookworm-slim
rules:
# once only:/changes: are ported to rules:, this could be removed:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
changes:
- changes:
- .gitlab-ci.yml
- .safety-policy.yml
- .yamllint
@ -303,8 +345,8 @@ yamllint:
tests/*/*/.*.yml
# Run all the various linters and static analysis tools.
locales:
stage: lint
image: debian:bookworm-slim
variables:
LANG: C.UTF-8
@ -323,6 +365,7 @@ locales:
black:
stage: lint
image: debian:bookworm-slim
<<: *apt-template
script:
@ -375,8 +418,8 @@ fedora_latest:
macOS:
tags:
- saas-macos-medium-m1
only:
- master@fdroid/fdroidserver
rules:
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script:
- export HOMEBREW_CURL_RETRIES=10
- brew update > /dev/null
@ -387,7 +430,7 @@ macOS:
- brew install --cask android-commandlinetools temurin # temurin is a JDK
# test suite dependencies
- brew install dash bash coreutils gnu-sed
- brew install bash coreutils gnu-sed
# TODO port tests/run-tests to POSIX and gsed, it has a couple GNU-isms like du --bytes
- export PATH="$(brew --prefix fdroidserver)/libexec/bin:$(brew --prefix coreutils)/libexec/gnubin:$PATH"
@ -404,53 +447,45 @@ macOS:
- echo "macOS sticks with bash 3.x because of licenses, so avoid new bash syntax"
- /bin/bash --version
- /bin/bash -n gradlew-fdroid tests/run-tests
- /bin/bash -n tests/run-tests
# test fdroidserver from git with current package's dependencies
- fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests
gradle:
image: debian:bookworm-slim
image: debian:trixie-slim
<<: *apt-template
variables:
GIT_DEPTH: 1000
rules:
- changes:
- .gitlab-ci.yml
- makebuildserver
script:
- apt-get install
ca-certificates
git
openssh-client
python3-bs4
python3-colorama
python3-git
python3-gitlab
python3-packaging
python3-requests
# if this is a merge request fork, then only check if relevant files changed
- if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then
git fetch https://gitlab.com/fdroid/fdroidserver.git;
for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do
test "$f" == "makebuildserver" && export CHANGED="yes";
test "$f" == "gradlew-fdroid" && export CHANGED="yes";
done;
test -z "$CHANGED" && exit;
fi
- ./tests/gradle-release-checksums.py
# Run an actual build in a simple, faked version of the buildserver guest VM.
fdroid build:
image: registry.gitlab.com/fdroid/fdroidserver:buildserver
only:
changes:
- .gitlab-ci.yml
- fdroidserver/build.py
- fdroidserver/common.py
- fdroidserver/exception.py
- fdroidserver/metadata.py
- fdroidserver/net.py
- fdroidserver/scanner.py
- fdroidserver/vmtools.py
rules:
- changes:
- .gitlab-ci.yml
- fdroidserver/build.py
- fdroidserver/common.py
- fdroidserver/exception.py
- fdroidserver/metadata.py
- fdroidserver/net.py
- fdroidserver/scanner.py
- fdroidserver/vmtools.py
# for the docker: job which depends on this one
- makebuildserver
- buildserver/*
cache:
key: "$CI_JOB_NAME"
paths:
@ -486,6 +521,8 @@ fdroid build:
env HOME=$home_vagrant
fdroid"
- git -C $home_vagrant/gradlew-fdroid pull
- chown -R vagrant $home_vagrant
- chown -R vagrant $fdroidserver/.git
- chown vagrant $fdroidserver/
@ -511,11 +548,11 @@ fdroid build:
plugin_fetchsrclibs:
image: debian:bookworm-slim
<<: *apt-template
only:
changes:
- .gitlab-ci.yml
- examples/fdroid_fetchsrclibs.py
- fdroidserver/__main__.py
rules:
- changes:
- .gitlab-ci.yml
- examples/fdroid_fetchsrclibs.py
- fdroidserver/__main__.py
script:
- apt-get install
curl
@ -555,8 +592,8 @@ plugin_fetchsrclibs:
servergitmirrors:
image: debian:bookworm-slim
<<: *apt-template
only:
- master@fdroid/fdroidserver
rules:
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script:
- apt-get install
default-jdk-headless
@ -598,6 +635,7 @@ servergitmirrors:
Build documentation:
image: debian:bookworm-slim
<<: *python-rules-changes
<<: *apt-template
script:
- apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver
@ -617,8 +655,8 @@ Build documentation:
Windows:
tags:
- windows
only:
- windows
rules:
- if: $CI_COMMIT_BRANCH == "windows"
script:
- Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
- choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath"
@ -669,7 +707,9 @@ pages:
artifacts:
paths:
- public
needs: ["Build documentation"]
needs:
- job: "Build documentation"
optional: true
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch
@ -681,13 +721,12 @@ pages:
docker:
dependencies:
- fdroid build
only:
changes:
- .gitlab-ci.yml
- makebuildserver
- buildserver/*
variables:
- $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid"
rules:
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
changes:
- .gitlab-ci.yml
- makebuildserver
- buildserver/*
image: docker:dind
services:
- docker:dind
@ -714,11 +753,12 @@ docker:
# PUBLISH is the signing server. It has a very minimal manual setup.
PUBLISH:
image: debian:bullseye-backports
image: debian:bookworm-backports
<<: *python-rules-changes
script:
- apt-get update
- apt-get -qy upgrade
- apt-get -qy install --no-install-recommends -t bullseye-backports
- apt-get -qy install --no-install-recommends -t bookworm-backports
androguard
apksigner
curl

View file

@ -0,0 +1 @@
https://f-droid.org/funding.json

View file

@ -4,6 +4,49 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [2.4.2] - 2025-06-24
### Fixed
* nightly: fix bug that clones nightly repo to wrong location
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1672
* Sync translations for all supported languages: es pl ru
## [2.4.1] - 2025-06-23
### Added
* build: Clearer error messages when working with Git.
* verify: generate <appid>.json files that list all reports
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1632
### Fixed
* deploy: use master branch when working complete git-mirror repo
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1666
* update: use ctime/mtime to control _strip_and_copy_image runs
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1665
* update: If categories.yml only has icon:, then add name:
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1659
* update: fix handling of Triple-T 1.0.0 graphics
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1652
* update: never execute any VCS e.g. git
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1630
* config: lazyload environment variables in config.yml
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1645
* config: make localized name/description/icon optional
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1649
* lint: add repo_key_sha256 to list of valid config keys
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1643
* build: calculate all combinations of gradle flavors
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1638
* build: set SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1653
* Sync translations for all supported languages: ca cs de fr ga ja pl pt pt_BR
pt_PT ru sq tr uk zh_Hans
### Removed
## [2.4.0] - 2025-03-25
### Added

View file

@ -20,6 +20,7 @@ include examples/template.yml
include examples/Vagrantfile.yaml
include gradlew-fdroid
include LICENSE
include locale/ba/LC_MESSAGES/fdroidserver.po
include locale/bo/LC_MESSAGES/fdroidserver.po
include locale/ca/LC_MESSAGES/fdroidserver.po
include locale/cs/LC_MESSAGES/fdroidserver.po
@ -803,6 +804,7 @@ include tests/source-files/firebase-allowlisted/app/build.gradle
include tests/source-files/firebase-allowlisted/build.gradle
include tests/source-files/firebase-suspect/app/build.gradle
include tests/source-files/firebase-suspect/build.gradle
include tests/source-files/flavor.test/build.gradle
include tests/source-files/info.guardianproject.ripple/build.gradle
include tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml
include tests/source-files/lockfile.test/flutter/pubspec.lock
@ -868,6 +870,10 @@ include tests/test_signatures.py
include tests/test_signindex.py
include tests/test_update.py
include tests/test_vcs.py
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/icon/icon.png
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/phoneScreenshots/1.png
include tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml
include tests/triple-t-2/build/org.piwigo.android/app/.gitignore
include tests/triple-t-2/build/org.piwigo.android/app/build.gradle
include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml

View file

@ -37,11 +37,22 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch
#
# Ensure fdroidserver's dependencies are marked manual before purging
# unneeded packages, otherwise, all its dependencies get purged.
#
# The official Debian docker images ship without ca-certificates, so
# TLS certificates cannot be verified until that is installed. The
# following code temporarily turns off TLS verification, and enables
# HTTPS, so at least unverified TLS is used for apt-get instead of
# plain HTTP. Once ca-certificates is installed, the CA verification
# is enabled by removing the newly created config file. This set up
# makes the initial `apt-get update` and `apt-get install` look the
# same as verified TLS to the network observer and hides the metadata.
RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \
&& mkdir -p /usr/share/man/man1 \
&& echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates \
&& find /etc/apt/sources.list* -type f -exec sed -i s,http:,https:, {} \; \
&& apt-get update \
&& apt-get install ca-certificates \
&& sed -i 's,http:,https:,' /etc/apt/sources.list.d/debian.sources \
&& rm /etc/apt/apt.conf.d/99nocacertificates \
&& apt-get upgrade \
&& apt-get dist-upgrade \
&& apt-get install openssh-client iproute2 python3 openssh-server sudo \

View file

@ -104,6 +104,7 @@ apt-get upgrade
apt-get update || apt-get update
packages="
androguard/bookworm-backports
apksigner
default-jdk-headless
default-jre-headless

View file

@ -25,7 +25,12 @@ fi
chmod -R a+rX /opt/gradle
test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin
ln -fs /home/vagrant/fdroidserver/gradlew-fdroid /opt/gradle/bin/gradle
git clone --depth 1 https://gitlab.com/fdroid/gradlew-fdroid.git /home/vagrant/gradlew-fdroid/
chmod 0755 /home/vagrant/gradlew-fdroid/gradlew-fdroid
chmod -R u+rwX,a+rX,go-w /home/vagrant/gradlew-fdroid/
ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /opt/gradle/bin/gradle
ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /usr/local/bin/
chown -h vagrant:vagrant /opt/gradle/bin/gradle
chown vagrant:vagrant /opt/gradle/versions
chmod 0755 /opt/gradle/versions

View file

@ -1,38 +0,0 @@
#!/usr/bin/env python3
#
# an fdroid plugin for setting up srclibs
#
# The 'fdroid build' gitlab-ci job uses --on-server, which does not
# set up the srclibs. This plugin does the missing setup.
import glob
import os
from argparse import ArgumentParser
from fdroidserver import _, common, scanner
fdroid_summary = 'Run scanner.scan_binary on APKs'
def main():
parser = ArgumentParser()
common.setup_global_opts(parser)
parser.add_argument("APK", nargs='*', help=_("Path to a signed or unsigned APK."))
options = common.parse_args(parser)
common.read_config()
if options.APK:
apks = options.APK
else:
apks = glob.glob(os.path.join('unsigned', '*.apk'))
errors = 0
for apk in apks:
print('Scanning', apk, '...')
if scanner.scan_binary(apk):
print("ERROR: Found blocklisted packages in:", apk)
errors += 1
exit(errors)
if __name__ == "__main__":
main()

View file

@ -12,6 +12,7 @@
#
import os
import sys
sys.path.insert(0, os.path.abspath('../../fdroidserver'))
# -- Project information -----------------------------------------------------

View file

@ -6,7 +6,6 @@ import argparse
import logging
from fdroidserver import _, common, metadata
from fdroidserver.exception import VCSException
fdroid_summary = 'reset app VCSs to the latest version'

View file

@ -4,6 +4,7 @@
import os
from argparse import ArgumentParser
from fdroidserver import common
from fdroidserver.common import FDroidPopen
from fdroidserver.exception import BuildException

View file

@ -4,6 +4,7 @@
import os
from argparse import ArgumentParser
from fdroidserver import common
from fdroidserver.common import FDroidPopen
from fdroidserver.exception import BuildException

View file

@ -4,6 +4,7 @@
#
from argparse import ArgumentParser
from fdroidserver import common, index
fdroid_summary = 'export the keystore in standard PEM format'

View file

@ -8,6 +8,7 @@
import argparse
import os
import pprint
from fdroidserver import _, common, metadata
fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`'

View file

@ -1,6 +1,7 @@
#!/usr/bin/env python3
from argparse import ArgumentParser
from fdroidserver import common
from fdroidserver.common import FDroidPopen
from fdroidserver.exception import BuildException

View file

@ -3,7 +3,6 @@ import glob
import os
import sys
# support running straight from git and standard installs
rootpaths = [
os.path.realpath(os.path.join(os.path.dirname(__file__), '..')),
@ -15,7 +14,10 @@ rootpaths = [
localedir = None
for rootpath in rootpaths:
if len(glob.glob(os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo'))) > 0:
found_mo = glob.glob(
os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo')
)
if len(found_mo) > 0:
localedir = os.path.join(rootpath, 'locale')
break
@ -24,39 +26,52 @@ gettext.textdomain('fdroidserver')
_ = gettext.gettext
from fdroidserver.exception import (FDroidException,
MetaDataException,
VerificationException) # NOQA: E402
from fdroidserver.exception import (
FDroidException,
MetaDataException,
VerificationException, # NOQA: E402
)
FDroidException # NOQA: B101
MetaDataException # NOQA: B101
VerificationException # NOQA: B101
from fdroidserver.common import (verify_apk_signature,
genkeystore as generate_keystore) # NOQA: E402
from fdroidserver.common import genkeystore as generate_keystore # NOQA: E402
from fdroidserver.common import verify_apk_signature
verify_apk_signature # NOQA: B101
generate_keystore # NOQA: B101
from fdroidserver.index import (download_repo_index,
download_repo_index_v1,
download_repo_index_v2,
get_mirror_service_urls,
make as make_index) # NOQA: E402
from fdroidserver.index import (
download_repo_index,
download_repo_index_v1,
download_repo_index_v2,
get_mirror_service_urls,
)
from fdroidserver.index import make as make_index # NOQA: E402
download_repo_index # NOQA: B101
download_repo_index_v1 # NOQA: B101
download_repo_index_v2 # NOQA: B101
get_mirror_service_urls # NOQA: B101
make_index # NOQA: B101
from fdroidserver.update import (process_apk,
process_apks,
scan_apk,
scan_repo_files) # NOQA: E402
from fdroidserver.update import (
process_apk,
process_apks,
scan_apk,
scan_repo_files, # NOQA: E402
)
process_apk # NOQA: B101
process_apks # NOQA: B101
scan_apk # NOQA: B101
scan_repo_files # NOQA: B101
from fdroidserver.deploy import (update_awsbucket,
update_servergitmirrors,
update_serverwebroots,
update_serverwebroot) # NOQA: E402
from fdroidserver.deploy import (
update_awsbucket,
update_servergitmirrors,
update_serverwebroot, # NOQA: E402
update_serverwebroots,
)
update_awsbucket # NOQA: B101
update_servergitmirrors # NOQA: B101
update_serverwebroots # NOQA: B101

View file

@ -18,20 +18,20 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import re
import sys
import importlib.metadata
import logging
import os
import pkgutil
import logging
import importlib.metadata
import git
import fdroidserver.common
import fdroidserver.metadata
from fdroidserver import _
import re
import sys
from argparse import ArgumentError
from collections import OrderedDict
import git
import fdroidserver.common
import fdroidserver.metadata
from fdroidserver import _
COMMANDS = OrderedDict([
("build", _("Build a package from source")),

View file

@ -68,9 +68,18 @@ import struct
import sys
import zipfile
import zlib
from collections import namedtuple
from typing import Any, BinaryIO, Callable, Dict, Iterable, Iterator, Optional, Tuple, Union
from typing import (
Any,
BinaryIO,
Callable,
Dict,
Iterable,
Iterator,
Optional,
Tuple,
Union,
)
__version__ = "1.1.1"
NAME = "apksigcopier"

View file

@ -28,22 +28,21 @@
# the F-Droid client.
import collections
import defusedxml.minidom
import git
import glob
import os
import json
import logging
import requests
import os
import shutil
import tempfile
import zipfile
from argparse import ArgumentParser
from typing import Optional
from . import _
from . import common
from . import deploy
import defusedxml.minidom
import git
import requests
from . import _, common, deploy
from .exception import FDroidException

View file

@ -18,31 +18,27 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import shutil
import argparse
import glob
import subprocess
import logging
import os
import posixpath
import re
import shutil
import subprocess
import tarfile
import threading
import traceback
import time
import requests
import tempfile
import argparse
import logging
import threading
import time
import traceback
from gettext import ngettext
from pathlib import Path
from . import _
from . import common
from . import net
from . import metadata
from . import scanner
from . import vmtools
import requests
from . import _, common, metadata, net, scanner, vmtools
from .common import FDroidPopen
from .exception import FDroidException, BuildException, VCSException
from .exception import BuildException, FDroidException, VCSException
try:
import paramiko
@ -155,9 +151,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
ftp.mkdir('fdroidserver')
ftp.chdir('fdroidserver')
ftp.put(os.path.join(serverpath, '..', 'fdroid'), 'fdroid')
ftp.put(os.path.join(serverpath, '..', 'gradlew-fdroid'), 'gradlew-fdroid')
ftp.chmod('fdroid', 0o755) # nosec B103 permissions are appropriate
ftp.chmod('gradlew-fdroid', 0o755) # nosec B103 permissions are appropriate
send_dir(os.path.join(serverpath))
ftp.chdir(homedir)
@ -479,7 +473,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
logging.critical("Android NDK '%s' is not a directory!" % ndk_path)
raise FDroidException()
common.set_FDroidPopen_env(build)
common.set_FDroidPopen_env(app, build)
# create ..._toolsversion.log when running in builder vm
if onserver:
@ -541,13 +535,13 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
if build.preassemble:
gradletasks += build.preassemble
flavours = build.gradle
if flavours == ['yes']:
flavours = []
flavors = build.gradle
if flavors == ['yes']:
flavors = []
flavours_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavours])
flavors_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavors])
gradletasks += ['assemble' + flavours_cmd + 'Release']
gradletasks += ['assemble' + flavors_cmd + 'Release']
cmd = [config['gradle']]
if build.gradleprops:
@ -721,8 +715,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
bindir = os.path.join(root_dir, 'bin')
if os.path.isdir(os.path.join(build_dir, '.git')):
import git
commit_id = common.get_head_commit_id(git.repo.Repo(build_dir))
commit_id = str(common.get_head_commit_id(build_dir))
else:
commit_id = build.commit
@ -764,11 +757,11 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
# really old path
os.path.join(root_dir, 'build', 'apk'),
]
# If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in
# a subdirectory corresponding to the flavour command used, but with different
# If we build with gradle flavors with gradle plugin >= 3.0 the APK will be in
# a subdirectory corresponding to the flavor command used, but with different
# capitalization.
if flavours_cmd:
apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavours_cmd, str.lower), 'release'))
if flavors_cmd:
apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavors_cmd, str.lower), 'release'))
for apks_dir in apk_dirs:
for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']:
apks = glob.glob(os.path.join(apks_dir, apkglob))

View file

@ -19,28 +19,30 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import configparser
import git
import copy
import logging
import os
import re
import urllib.request
import urllib.error
import time
import subprocess
import sys
from argparse import ArgumentParser
import time
import traceback
import logging
import copy
import urllib.error
import urllib.parse
import urllib.request
from argparse import ArgumentParser
from pathlib import Path
from typing import Optional
from . import _
from . import common
from . import metadata
from . import net
from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException
import git
from . import _, common, metadata, net
from .exception import (
FDroidException,
MetaDataException,
NoSubmodulesException,
VCSException,
)
# https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36
BOT_EMAIL = 'fdroidci@bubu1.eu'
@ -724,7 +726,7 @@ def checkout_appid_branch(appid):
try:
git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}')
except Exception as e:
logging.warning('"%s" branch not found on origin remote:\n\t%s', appid, e)
logging.debug('"%s" branch not found on origin remote:\n\t%s', appid, e)
if appid in git_repo.remotes.origin.refs:
start_point = f"origin/{appid}"
for commit in git_repo.iter_commits(
@ -749,7 +751,7 @@ def get_changes_versus_ref(git_repo, ref, f):
return changes
def push_commits(branch_name='checkupdates', verbose=False):
def push_commits(branch_name='checkupdates'):
"""Make git branch then push commits as merge request.
The appid is parsed from the actual file that was changed so that
@ -769,6 +771,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
* https://docs.gitlab.com/ee/user/project/push_options.html
"""
if branch_name != "checkupdates":
if callable(getattr(git.SymbolicReference, "_check_ref_name_valid", None)):
git.SymbolicReference._check_ref_name_valid(branch_name)
git_repo = git.Repo.init('.')
upstream_main = get_upstream_main_branch(git_repo)
files = set()
@ -783,6 +789,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
if not files:
return
# https://git-scm.com/docs/git-check-ref-format Git refname can't end with .lock
if branch_name.endswith(".lock"):
branch_name = f"{branch_name}_"
remote = git_repo.remotes.origin
if branch_name in remote.refs:
if not get_changes_versus_ref(git_repo, f'origin/{branch_name}', files[0]):
@ -806,21 +816,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
if current_version_only:
push_options.append('merge_request.draft')
progress = None
if verbose:
import clint.textui
progress_bar = clint.textui.progress.Bar()
class MyProgressPrinter(git.RemoteProgress):
def update(self, op_code, current, maximum=None, message=None):
if isinstance(maximum, float):
progress_bar.show(current, maximum)
progress = MyProgressPrinter()
progress = git.RemoteProgress()
pushinfos = remote.push(
branch_name,
f"HEAD:refs/heads/{branch_name}",
progress=progress,
force=True,
set_upstream=True,
@ -828,22 +827,22 @@ def push_commits(branch_name='checkupdates', verbose=False):
)
for pushinfo in pushinfos:
logging.info(pushinfo.summary)
# Show potentially useful messages from git remote
if progress:
for line in progress.other_lines:
logging.info(line)
if pushinfo.flags & (
git.remote.PushInfo.ERROR
| git.remote.PushInfo.REJECTED
| git.remote.PushInfo.REMOTE_FAILURE
| git.remote.PushInfo.REMOTE_REJECTED
):
# Show potentially useful messages from git remote
if progress:
for line in progress.other_lines:
if line.startswith('remote:'):
logging.debug(line)
raise FDroidException(
f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}'
)
else:
logging.debug(remote.url + ': ' + pushinfo.summary)
logging.info(remote.url + ': ' + pushinfo.summary)
def prune_empty_appid_branches(git_repo=None, main_branch='main'):
@ -953,7 +952,7 @@ def main():
exit_code = 1
if options.appid and options.merge_request:
push_commits(verbose=options.verbose)
push_commits()
prune_empty_appid_branches()
status_update_json(processed, failed)

View file

@ -52,52 +52,58 @@ environment variable to include.
"""
import ast
import base64
import copy
import difflib
from typing import List
import git
import filecmp
import glob
import io
import os
import sys
import re
import ast
import gzip
import hashlib
import io
import itertools
import json
import logging
import operator
import os
import re
import shutil
import socket
import stat
import subprocess
import time
import operator
import logging
import hashlib
import socket
import base64
import zipfile
import sys
import tempfile
import json
from pathlib import Path
import defusedxml.ElementTree as XMLElementTree
import time
import zipfile
from argparse import BooleanOptionalAction
from asn1crypto import cms
from base64 import urlsafe_b64encode
from binascii import hexlify
from datetime import datetime, timedelta, timezone
from pathlib import Path
from queue import Queue
from typing import List
from urllib.parse import urlparse, urlsplit, urlunparse
from zipfile import ZipFile
import defusedxml.ElementTree as XMLElementTree
import git
from asn1crypto import cms
import fdroidserver.metadata
from fdroidserver import _
from fdroidserver._yaml import yaml, config_dump
from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \
BuildException, VerificationException, MetaDataException
from .asynchronousfilereader import AsynchronousFileReader
from .looseversion import LooseVersion
from fdroidserver._yaml import config_dump, yaml
from fdroidserver.exception import (
BuildException,
FDroidException,
MetaDataException,
NoSubmodulesException,
VCSException,
VerificationException,
)
from . import apksigcopier, common
from .asynchronousfilereader import AsynchronousFileReader
from .looseversion import LooseVersion
# The path to this fdroidserver distribution
FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
@ -182,7 +188,7 @@ default_config = {
'scan_binary': False,
'ant': "ant",
'mvn3': "mvn",
'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'),
'gradle': shutil.which('gradlew-fdroid'),
'sync_from_local_copy_dir': False,
'allow_disabled_algorithms': False,
'keep_when_not_allowed': False,
@ -545,6 +551,60 @@ def config_type_check(path, data):
)
class _Config(dict):
def __init__(self, default={}):
super(_Config, self).__init__(default)
self.loaded = {}
def lazyget(self, key):
if key not in self.loaded:
value = super(_Config, self).__getitem__(key)
if key == 'serverwebroot':
roots = parse_list_of_dicts(value)
rootlist = []
for d in roots:
# since this is used with rsync, where trailing slashes have
# meaning, ensure there is always a trailing slash
rootstr = d.get('url')
if not rootstr:
logging.error('serverwebroot: has blank value!')
continue
if rootstr[-1] != '/':
rootstr += '/'
d['url'] = rootstr.replace('//', '/')
rootlist.append(d)
self.loaded[key] = rootlist
elif key == 'servergitmirrors':
self.loaded[key] = parse_list_of_dicts(value)
elif isinstance(value, dict) and 'env' in value and len(value) == 1:
var = value['env']
if var in os.environ:
self.loaded[key] = os.getenv(var)
else:
logging.error(
_(
'Environment variable {var} from {configname} is not set!'
).format(var=value['env'], configname=key)
)
self.loaded[key] = None
else:
self.loaded[key] = value
return self.loaded[key]
def __getitem__(self, key):
return self.lazyget(key)
def get(self, key, default=None, /):
try:
return self.lazyget(key)
except KeyError:
return default
def read_config():
"""Read the repository config.
@ -600,25 +660,7 @@ def read_config():
fill_config_defaults(config)
if 'serverwebroot' in config:
roots = parse_list_of_dicts(config['serverwebroot'])
rootlist = []
for d in roots:
# since this is used with rsync, where trailing slashes have
# meaning, ensure there is always a trailing slash
rootstr = d.get('url')
if not rootstr:
logging.error('serverwebroot: has blank value!')
continue
if rootstr[-1] != '/':
rootstr += '/'
d['url'] = rootstr.replace('//', '/')
rootlist.append(d)
config['serverwebroot'] = rootlist
if 'servergitmirrors' in config:
config['servergitmirrors'] = parse_list_of_dicts(config['servergitmirrors'])
limit = config['git_mirror_size_limit']
config['git_mirror_size_limit'] = parse_human_readable_size(limit)
@ -641,15 +683,7 @@ def read_config():
continue
elif isinstance(dictvalue, dict):
for k, v in dictvalue.items():
if k == 'env':
env = os.getenv(v)
if env:
config[configname] = env
else:
confignames_to_delete.add(configname)
logging.error(_('Environment variable {var} from {configname} is not set!')
.format(var=k, configname=configname))
else:
if k != 'env':
confignames_to_delete.add(configname)
logging.error(_('Unknown entry {key} in {configname}')
.format(key=k, configname=configname))
@ -669,6 +703,7 @@ def read_config():
)
)
config = _Config(config)
return config
@ -782,7 +817,10 @@ def load_localized_config(name, repodir):
icons_dir = os.path.join(repodir, 'icons')
if not os.path.exists(icons_dir):
os.makedirs(icons_dir, exist_ok=True)
shutil.copy(os.path.join("config", value), icons_dir)
src = os.path.join("config", value)
dest = os.path.join(icons_dir, os.path.basename(src))
if not os.path.exists(dest) or not filecmp.cmp(src, dest):
shutil.copy2(src, dest)
ret[afname][key][locale] = file_entry(
os.path.join(icons_dir, value)
)
@ -1201,6 +1239,25 @@ def get_src_tarball_name(appid, versionCode):
return f"{appid}_{versionCode}_src.tar.gz"
def get_source_date_epoch(build_dir):
"""Return timestamp suitable for the SOURCE_DATE_EPOCH variable.
https://reproducible-builds.org/docs/source-date-epoch/
"""
try:
return git.repo.Repo(build_dir).git.log(n=1, pretty='%ct')
except Exception as e:
logging.warning('%s: %s', e.__class__.__name__, build_dir)
build_dir = Path(build_dir)
appid = build_dir.name
data_dir = build_dir.parent.parent
metadata_file = f'metadata/{appid}.yml'
if (data_dir / '.git').exists() and (data_dir / metadata_file).exists():
repo = git.repo.Repo(data_dir)
return repo.git.log('-n1', '--pretty=%ct', '--', metadata_file)
def get_build_dir(app):
"""Get the dir that this app will be built in."""
if app.RepoType == 'srclib':
@ -1286,12 +1343,29 @@ def write_status_json(output, pretty=False, name=None):
rsync_status_file_to_repo(path, repo_subdir='status')
def get_head_commit_id(git_repo):
"""Get git commit ID for HEAD as a str."""
def get_head_commit_id(git_repo_dir):
"""Get git commit ID for HEAD as a str.
This only reads files, so it should be safe to use on untrusted
repos. It was created to avoid running the git executable, no
matter what. It uses a tiny subset of the git.Repo class to avoid
setting up the git executable.
"""
try:
return git_repo.head.commit.hexsha
except ValueError:
return "None"
if type(git_repo_dir) is git.Repo:
d = git_repo_dir.git_dir
else:
d = os.path.join(git_repo_dir, '.git')
repo = type(
'Repo',
(object,),
{'common_dir': d, 'git_dir': d, 're_hexsha_only': git.Repo.re_hexsha_only},
)()
return git.refs.symbolic.SymbolicReference.dereference_recursive(repo, 'HEAD')
except (FileNotFoundError, ValueError) as e:
msg = _("Cannot read {path}: {error}").format(path=os.getcwd(), error=str(e))
logging.debug(msg)
def setup_vcs(app):
@ -1318,6 +1392,7 @@ def getvcs(vcstype, remote, local):
"""
if vcstype == 'git':
return vcs_git(remote, local)
logging.warning(_("RepoType {type} is deprecated, please switch to git.").format(type=vcstype))
if vcstype == 'git-svn':
return vcs_gitsvn(remote, local)
if vcstype == 'hg':
@ -1523,10 +1598,15 @@ class vcs_git(vcs):
it! This is called as a safety check.
"""
p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False)
cmd = ['git', 'rev-parse', '--show-toplevel']
p = FDroidPopen(cmd, cwd=self.local, output=False)
result = p.output.rstrip()
if p.returncode > 0:
raise VCSException(
f"`{' '.join(cmd)}` failed, (in '{os.path.abspath(self.local)}') {result}"
)
if Path(result) != Path(self.local).resolve():
raise VCSException('Repository mismatch')
raise VCSException(f"Repository mismatch ('{self.local}' != '{result}')")
def gotorevisionx(self, rev):
if not os.path.exists(self.local):
@ -1946,7 +2026,7 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None):
return retrieve_string(app_dir, string, xmlfiles).replace('\n', ' ').strip()
def manifest_paths(app_dir, flavours):
def manifest_paths(app_dir, flavors):
"""Return list of existing files that will be used to find the highest vercode."""
possible_manifests = \
[Path(app_dir) / 'AndroidManifest.xml',
@ -1956,18 +2036,18 @@ def manifest_paths(app_dir, flavours):
Path(app_dir) / 'build-extras.gradle',
Path(app_dir) / 'build.gradle.kts']
for flavour in flavours:
if flavour == 'yes':
for flavor in flavors:
if flavor == 'yes':
continue
possible_manifests.append(
Path(app_dir) / 'src' / flavour / 'AndroidManifest.xml')
Path(app_dir) / 'src' / flavor / 'AndroidManifest.xml')
return [path for path in possible_manifests if path.is_file()]
def fetch_real_name(app_dir, flavours):
def fetch_real_name(app_dir, flavors):
"""Retrieve the package name. Returns the name, or None if not found."""
for path in manifest_paths(app_dir, flavours):
for path in manifest_paths(app_dir, flavors):
if not path.suffix == '.xml' or not path.is_file():
continue
logging.debug("fetch_real_name: Checking manifest at %s" % path)
@ -2085,17 +2165,17 @@ def parse_androidmanifests(paths, app):
vercode = None
package = None
flavours = None
flavors = None
temp_app_id = None
temp_version_name = None
if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle:
flavours = app['Builds'][-1].gradle
flavors = app['Builds'][-1].gradle
if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'):
with open(path, 'r', encoding='utf-8') as f:
android_plugin_file = False
inside_flavour_group = 0
inside_required_flavour = 0
inside_flavor_group = 0
inside_required_flavor = 0
for line in f:
if gradle_comment.match(line):
continue
@ -2110,8 +2190,8 @@ def parse_androidmanifests(paths, app):
if matches:
temp_version_name = matches
if inside_flavour_group > 0:
if inside_required_flavour > 1:
if inside_flavor_group > 0:
if inside_required_flavor > 1:
matches = psearch_g(line)
if matches:
s = matches.group(2)
@ -2141,29 +2221,29 @@ def parse_androidmanifests(paths, app):
if matches:
vercode = version_code_string_to_int(matches.group(1))
if inside_required_flavour > 0:
if inside_required_flavor > 0:
if '{' in line:
inside_required_flavour += 1
inside_required_flavor += 1
if '}' in line:
inside_required_flavour -= 1
if inside_required_flavour == 1:
inside_required_flavour -= 1
elif flavours:
for flavour in flavours:
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line):
inside_required_flavour = 2
inside_required_flavor -= 1
if inside_required_flavor == 1:
inside_required_flavor -= 1
elif flavors:
for flavor in flavors:
if re.match(r'.*[\'"\s]{flavor}[\'"\s].*\{{.*'.format(flavor=flavor), line):
inside_required_flavor = 2
break
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line):
inside_required_flavour = 1
if re.match(r'.*[\'"\s]{flavor}[\'"\s].*'.format(flavor=flavor), line):
inside_required_flavor = 1
break
if '{' in line:
inside_flavour_group += 1
inside_flavor_group += 1
if '}' in line:
inside_flavour_group -= 1
inside_flavor_group -= 1
else:
if "productFlavors" in line:
inside_flavour_group = 1
inside_flavor_group = 1
if not package:
matches = psearch_g(line)
if matches:
@ -2507,9 +2587,9 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
with open(path, 'w', encoding='iso-8859-1') as f:
f.write(props)
flavours = []
flavors = []
if build.build_method() == 'gradle':
flavours = build.gradle
flavors = build.gradle
if build.target:
n = build.target.split('-')[1]
@ -2531,7 +2611,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
# Insert version code and number into the manifest if necessary
if build.forceversion:
logging.info("Changing the version name")
for path in manifest_paths(root_dir, flavours):
for path in manifest_paths(root_dir, flavors):
if not os.path.isfile(path):
continue
if path.suffix == '.xml':
@ -2545,7 +2625,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
if build.forcevercode:
logging.info("Changing the version code")
for path in manifest_paths(root_dir, flavours):
for path in manifest_paths(root_dir, flavors):
if not path.is_file():
continue
if path.suffix == '.xml':
@ -2657,17 +2737,17 @@ def getpaths_map(build_dir, globpaths):
paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)]
if not paths[p]:
not_found_paths.append(p)
return paths, not_found_paths
def getpaths(build_dir, globpaths):
"""Extend via globbing the paths from a field and return them as a set."""
paths_map, not_found_paths = getpaths_map(build_dir, globpaths)
if not_found_paths:
raise FDroidException(
"Some glob paths did not match any files/dirs:\n"
+ "\n".join(not_found_paths)
)
return paths
def getpaths(build_dir, globpaths):
"""Extend via globbing the paths from a field and return them as a set."""
paths_map = getpaths_map(build_dir, globpaths)
paths = set()
for k, v in paths_map.items():
for p in v:
@ -2828,9 +2908,9 @@ def is_debuggable_or_testOnly(apkfile):
return False
try:
# these were moved in androguard 4.0
from androguard.core.axml import AXMLParser, format_value, START_TAG
from androguard.core.axml import START_TAG, AXMLParser, format_value
except ImportError:
from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG
from androguard.core.bytecodes.axml import START_TAG, AXMLParser, format_value
_androguard_logging_level()
with ZipFile(apkfile) as apk:
@ -2902,9 +2982,23 @@ def get_apk_id_androguard(apkfile):
try:
# these were moved in androguard 4.0
from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT
from androguard.core.axml import (
END_DOCUMENT,
END_TAG,
START_TAG,
TEXT,
AXMLParser,
format_value,
)
except ImportError:
from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT
from androguard.core.bytecodes.axml import (
END_DOCUMENT,
END_TAG,
START_TAG,
TEXT,
AXMLParser,
format_value,
)
_androguard_logging_level()
appid = None
@ -3180,12 +3274,16 @@ def remove_signing_keys(build_dir):
logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path))
def set_FDroidPopen_env(build=None):
def set_FDroidPopen_env(app=None, build=None):
"""Set up the environment variables for the build environment.
There is only a weak standard, the variables used by gradle, so also set
up the most commonly used environment variables for SDK and NDK. Also, if
there is no locale set, this will set the locale (e.g. LANG) to en_US.UTF-8.
If an App instance is provided, then the SOURCE_DATE_EPOCH
environment variable will be set based on that app's source repo.
"""
global env, orig_path
@ -3208,6 +3306,8 @@ def set_FDroidPopen_env(build=None):
if missinglocale:
env['LANG'] = 'en_US.UTF-8'
if app:
env['SOURCE_DATE_EPOCH'] = get_source_date_epoch(get_build_dir(app))
if build is not None:
path = build.ndk_path()
paths = orig_path.split(os.pathsep)
@ -3410,22 +3510,6 @@ def apk_signer_fingerprint(apk_path):
return signer_fingerprint(cert_encoded)
def apk_signer_fingerprint_short(apk_path):
"""Get 7 hex digit SHA-256 fingerprint string for the first signer from given APK.
Parameters
----------
apk_path
path to APK
Returns
-------
first 7 chars of the standard SHA-256 signer fingerprint
"""
return apk_signer_fingerprint(apk_path)[:7]
def metadata_get_sigdir(appid, vercode=None):
"""Get signature directory for app."""
if vercode:
@ -3958,11 +4042,13 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None):
f.extractall(path=os.path.join(apk2dir, 'content'))
if set_command_in_config('apktool'):
if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'],
cwd=apk1dir) != 0:
if subprocess.call(
[config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir
):
return "Failed to run apktool " + apk1
if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'],
cwd=apk2dir) != 0:
if subprocess.call(
[config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir
):
return "Failed to run apktool " + apk2
p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False)
@ -4790,6 +4876,20 @@ def calculate_archive_policy(app, default):
return archive_policy
def calculate_gradle_flavor_combination(flavors):
"""Calculate all combinations of gradle flavors."""
combination_lists = itertools.product(*[[flavor, ''] for flavor in flavors])
combinations = [
re.sub(
r' +\w',
lambda pat: pat.group(0)[-1].upper(),
' '.join(combination_list).strip(),
)
for combination_list in combination_lists
]
return combinations
FDROIDORG_MIRRORS = [
{
'isPrimary': True,

View file

@ -16,28 +16,28 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import glob
import hashlib
import json
import logging
import os
import pathlib
import re
import shutil
import subprocess
import sys
import time
import urllib
from typing import Dict, List
from git import Repo
import yaml
from argparse import ArgumentParser
import logging
import pathlib
import shutil
from typing import Dict, List
import git
import yaml
from git import Repo
import fdroidserver.github
from . import _
from . import common
from . import index
from . import _, common, index
from .exception import FDroidException
config = None
@ -349,8 +349,8 @@ def update_awsbucket_libcloud(repo_section, is_index_only=False):
import libcloud.security
libcloud.security.VERIFY_SSL_CERT = True
from libcloud.storage.types import Provider, ContainerDoesNotExistError
from libcloud.storage.providers import get_driver
from libcloud.storage.types import ContainerDoesNotExistError, Provider
if not config.get('awsaccesskeyid') or not config.get('awssecretkey'):
raise FDroidException(
@ -617,6 +617,13 @@ def update_servergitmirrors(servergitmirrors, repo_section):
For history, there is the archive section, and there is the binary
transparency log.
This will attempt to use the existing remote branch so that it does
not have to push all of the files in the repo each time. Old setups
or runs of `fdroid nightly` might use the "master" branch. For the
"index only" mode, it will recreate the branch from scratch each
time since usually all the files are changed. In any case, the
index files are small compared to the full repo.
"""
from clint.textui import progress
@ -687,7 +694,7 @@ def update_servergitmirrors(servergitmirrors, repo_section):
if is_index_only:
local_branch_name = 'index_only'
else:
local_branch_name = 'full'
local_branch_name = GIT_BRANCH
if local_branch_name in repo.heads:
repo.git.switch(local_branch_name)
else:
@ -847,9 +854,10 @@ def upload_to_android_observatory(repo_section):
def upload_apk_to_android_observatory(path):
# depend on requests and lxml only if users enable AO
import requests
from . import net
from lxml.html import fromstring
from . import net
apkfilename = os.path.basename(path)
r = requests.post(
'https://androidobservatory.org/',

View file

@ -35,6 +35,10 @@ class VCSException(FDroidException):
pass
class NoVersionCodeException(FDroidException):
pass
class NoSubmodulesException(VCSException):
pass

View file

@ -18,8 +18,8 @@
import json
import pathlib
import urllib.request
import urllib.parse
import urllib.request
class GithubApi:

View file

@ -16,14 +16,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import glob
from argparse import ArgumentParser
import logging
import os
import time
from argparse import ArgumentParser
from . import _
from . import common
from . import _, common
from .common import FDroidPopen
from .exception import FDroidException

View file

@ -342,7 +342,7 @@ def main():
app.AutoUpdateMode = 'Version'
app.UpdateCheckMode = 'Tags'
build.commit = common.get_head_commit_id(git_repo)
build.commit = common.get_head_commit_id(tmp_importer_dir)
# Extract some information...
paths = get_all_gradle_and_manifests(tmp_importer_dir)

View file

@ -30,6 +30,7 @@ these installed on the signing server.
"""
import calendar
import collections
import hashlib
import json
@ -41,20 +42,27 @@ import sys
import tempfile
import urllib.parse
import zipfile
import calendar
from binascii import hexlify, unhexlify
from datetime import datetime, timezone
from pathlib import Path
from xml.dom.minidom import Document
from . import _
from . import common
from . import metadata
from . import signindex
from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_publish_signer_fingerprints
from fdroidserver._yaml import yaml
from fdroidserver.common import (
ANTIFEATURES_CONFIG_NAME,
CATEGORIES_CONFIG_NAME,
CONFIG_CONFIG_NAME,
DEFAULT_LOCALE,
MIRRORS_CONFIG_NAME,
RELEASECHANNELS_CONFIG_NAME,
FDroidPopen,
FDroidPopenBytes,
load_publish_signer_fingerprints,
)
from fdroidserver.exception import FDroidException, VerificationException
from . import _, common, metadata, signindex
def make(apps, apks, repodir, archive):
"""Generate the repo index files.
@ -152,11 +160,6 @@ def _should_file_be_generated(path, magic_string):
def make_website(apps, repodir, repodict):
_ignored, repo_pubkey_fingerprint = extract_pubkey()
repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "")
link = repodict["address"]
link_fingerprinted = ('{link}?fingerprint={fingerprint}'
.format(link=link, fingerprint=repo_pubkey_fingerprint_stripped))
# do not change this string, as it will break updates for files with older versions of this string
autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file"
@ -168,6 +171,13 @@ def make_website(apps, repodir, repodict):
if _should_file_be_generated(html_file, autogenerate_comment):
import qrcode
_ignored, repo_pubkey_fingerprint = extract_pubkey()
repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "")
link = repodict["address"]
link_fingerprinted = '{link}?fingerprint={fingerprint}'.format(
link=link, fingerprint=repo_pubkey_fingerprint_stripped
)
qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png"))
with open(html_file, 'w') as f:
name = repodict["name"]
@ -585,7 +595,10 @@ def convert_version(version, app, repodir):
ver["file"]["ipfsCIDv1"] = ipfsCIDv1
if "srcname" in version:
ver["src"] = common.file_entry(os.path.join(repodir, version["srcname"]))
ver["src"] = common.file_entry(
os.path.join(repodir, version["srcname"]),
version["srcnameSha256"],
)
if "obbMainFile" in version:
ver["obbMainFile"] = common.file_entry(
@ -681,9 +694,13 @@ def v2_repo(repodict, repodir, archive):
config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir)
if config:
repo["name"] = config["archive" if archive else "repo"]["name"]
repo["description"] = config["archive" if archive else "repo"]["description"]
repo["icon"] = config["archive" if archive else "repo"]["icon"]
localized_config = config["archive" if archive else "repo"]
if "name" in localized_config:
repo["name"] = localized_config["name"]
if "description" in localized_config:
repo["description"] = localized_config["description"]
if "icon" in localized_config:
repo["icon"] = localized_config["icon"]
repo["address"] = repodict["address"]
if "mirrors" in repodict:
@ -769,7 +786,9 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, signer_fingerprints
# include definitions for "auto-defined" categories, e.g. just used in app metadata
for category in sorted(categories_used_by_apps):
if category not in output['repo'][CATEGORIES_CONFIG_NAME]:
output['repo'][CATEGORIES_CONFIG_NAME][category] = {"name": {DEFAULT_LOCALE: category}}
output['repo'][CATEGORIES_CONFIG_NAME][category] = dict()
if 'name' not in output['repo'][CATEGORIES_CONFIG_NAME][category]:
output['repo'][CATEGORIES_CONFIG_NAME][category]['name'] = {DEFAULT_LOCALE: category}
# do not include defined categories if no apps use them
for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())):
if category not in categories_used_by_apps:
@ -948,7 +967,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, signer_fingerprints
for k, v in sorted(package.items()):
if not v:
continue
if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'):
if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name', 'srcnameSha256'):
continue
if k == 'antiFeatures':
d[k] = sorted(v.keys())

View file

@ -19,16 +19,15 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import glob
import logging
import os
import re
import shutil
import socket
import sys
from argparse import ArgumentParser
import logging
from . import _
from . import common
from . import _, common
from .exception import FDroidException
config = {}

View file

@ -17,24 +17,21 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import os
import glob
import locale
import logging
import os
import sys
import termios
import tty
import defusedxml.ElementTree as XMLElementTree
from argparse import ArgumentParser, BooleanOptionalAction
from pathlib import Path
from urllib.parse import urlencode, urlparse, urlunparse
from . import _
from . import common, github, index, net
from .exception import FDroidException
import defusedxml.ElementTree as XMLElementTree
from . import _, common, github, index, net
from .exception import FDroidException
DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",)
MAVEN_CENTRAL_MIRRORS = [

View file

@ -24,9 +24,10 @@ import urllib.parse
from argparse import ArgumentParser
from pathlib import Path
from . import _, common, metadata, rewritemeta
from fdroidserver._yaml import yaml
from . import _, common, metadata, rewritemeta
config = None
@ -274,6 +275,7 @@ check_config_keys = (
'repo',
'repo_description',
'repo_icon',
'repo_key_sha256',
'repo_keyalias',
'repo_maxage',
'repo_name',

View file

@ -115,7 +115,7 @@ __license__ = "Python License 2.0"
# been done in the StrictVersion class above. This works great as long
# as everyone can go along with bondage and discipline. Hopefully a
# (large) subset of Python module programmers will agree that the
# particular flavour of bondage and discipline provided by StrictVersion
# particular flavor of bondage and discipline provided by StrictVersion
# provides enough benefit to be worth using, and will submit their
# version numbering scheme to its domination. The free-thinking
# anarchists in the lot will never give in, though, and something needs

View file

@ -18,20 +18,19 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import git
from pathlib import Path
import math
import platform
import os
import re
import logging
import ruamel.yaml
import math
import os
import platform
import re
from collections import OrderedDict
from pathlib import Path
from . import common
from . import _
from .exception import MetaDataException
import ruamel.yaml
from . import _, common
from ._yaml import yaml
from .exception import MetaDataException
srclibs = None
warnings_action = None
@ -538,10 +537,10 @@ def read_srclibs():
srclibs = {}
srcdir = Path('srclibs')
srcdir.mkdir(exist_ok=True)
srclibs_dir = Path('srclibs')
srclibs_dir.mkdir(exist_ok=True)
for metadatapath in sorted(srcdir.glob('*.yml')):
for metadatapath in sorted(srclibs_dir.glob('*.yml')):
srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath)
@ -658,14 +657,12 @@ def parse_metadata(metadatapath):
build_dir = common.get_build_dir(app)
metadata_in_repo = build_dir / '.fdroid.yml'
if metadata_in_repo.is_file():
try:
commit_id = common.get_head_commit_id(git.Repo(build_dir))
commit_id = common.get_head_commit_id(build_dir)
if commit_id is not None:
logging.debug(
_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)
)
# See https://github.com/PyCQA/pylint/issues/2856 .
# pylint: disable-next=no-member
except git.exc.InvalidGitRepositoryError:
else:
logging.debug(
_('Including metadata from {path}').format(path=metadata_in_repo)
)

View file

@ -7,13 +7,10 @@ import posixpath
import socket
import subprocess
import sys
from argparse import ArgumentParser
import urllib.parse
from argparse import ArgumentParser
from . import _
from . import common
from . import index
from . import update
from . import _, common, index, update
def _run_wget(path, urls, verbose=False):
@ -133,6 +130,7 @@ def main():
import io
import json
import zipfile
from . import net
url = _append_to_url_path(section, 'index-v1.jar')

View file

@ -21,10 +21,11 @@ import copy
import logging
import os
import random
import requests
import tempfile
import time
import urllib
import requests
import urllib3
from requests.adapters import HTTPAdapter, Retry

View file

@ -19,24 +19,25 @@
import base64
import datetime
import git
import hashlib
import inspect
import logging
import os
import paramiko
import platform
import shutil
import ssl
import subprocess
import sys
import tempfile
import yaml
from urllib.parse import urlparse
from argparse import ArgumentParser
from typing import Optional
from urllib.parse import urlparse
from . import _
from . import common
import git
import paramiko
import yaml
from . import _, common
from .exception import VCSException
# hard coded defaults for Android ~/.android/debug.keystore files
@ -176,7 +177,9 @@ def _ssh_key_from_debug_keystore(keystore: Optional[str] = None) -> str:
return ssh_private_key_file
def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[str] = None) -> str:
def get_repo_base_url(
clone_url: str, repo_git_base: str, force_type: Optional[str] = None
) -> str:
"""Generate the base URL for the F-Droid repository.
Parameters
@ -203,6 +206,41 @@ def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[s
sys.exit(1)
def clone_git_repo(clone_url, git_mirror_path):
"""Clone a git repo into the given path, failing if a password is required.
If GitPython's safe mode is present, this will use that. Otherwise,
this includes a very limited version of the safe mode just to ensure
this won't hang on password prompts.
https://github.com/gitpython-developers/GitPython/pull/2029
"""
logging.debug(_('cloning {url}').format(url=clone_url))
try:
sig = inspect.signature(git.Repo.clone_from)
if 'safe' in sig.parameters:
git.Repo.clone_from(clone_url, git_mirror_path, safe=True)
else:
git.Repo.clone_from(
clone_url,
git_mirror_path,
env={
'GIT_ASKPASS': '/bin/true',
'SSH_ASKPASS': '/bin/true',
'GIT_USERNAME': 'u',
'GIT_PASSWORD': 'p',
'GIT_HTTP_USERNAME': 'u',
'GIT_HTTP_PASSWORD': 'p',
'GIT_SSH': '/bin/false', # for git < 2.3
'GIT_TERMINAL_PROMPT': '0',
},
)
except git.exc.GitCommandError as e:
logging.warning(_('WARNING: only public git repos are supported!'))
raise VCSException(f'git clone {clone_url} failed:', str(e)) from e
def main():
"""Deploy to F-Droid repository or generate SSH private key from keystore.
@ -288,19 +326,27 @@ def main():
# we are in GitLab CI
repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY
clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='gitlab.com')
repo_base = get_repo_base_url(
clone_url, repo_git_base, force_type='gitlab.com'
)
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings'
deploy_key_url = (
f'{clone_url}/-/settings/repository#js-deploy-keys-settings'
)
git_user_name = os.getenv('GITLAB_USER_NAME')
git_user_email = os.getenv('GITLAB_USER_EMAIL')
elif 'TRAVIS_REPO_SLUG' in os.environ:
# we are in Travis CI
repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY
clone_url = 'https://github.com/' + repo_git_base
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
repo_base = get_repo_base_url(
clone_url, repo_git_base, force_type='github.com'
)
servergitmirror = 'git@github.com:' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
deploy_key_url = (
f'https://github.com/{repo_git_base}/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
)
git_user_name = repo_git_base
git_user_email = os.getenv('USER') + '@' + platform.node()
elif (
@ -309,23 +355,35 @@ def main():
and 'CIRCLE_PROJECT_REPONAME' in os.environ
):
# we are in Circle CI
repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME')
+ '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY)
repo_git_base = (
os.getenv('CIRCLE_PROJECT_USERNAME')
+ '/'
+ os.getenv('CIRCLE_PROJECT_REPONAME')
+ NIGHTLY
)
clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + NIGHTLY
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
repo_base = get_repo_base_url(
clone_url, repo_git_base, force_type='github.com'
)
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
deploy_key_url = (
f'https://github.com/{repo_git_base}/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
)
git_user_name = os.getenv('CIRCLE_USERNAME')
git_user_email = git_user_name + '@' + platform.node()
elif 'GITHUB_ACTIONS' in os.environ:
# we are in Github actions
repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY)
clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base)
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
repo_git_base = os.getenv('GITHUB_REPOSITORY') + NIGHTLY
clone_url = os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base
repo_base = get_repo_base_url(
clone_url, repo_git_base, force_type='github.com'
)
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
deploy_key_url = (
f'https://github.com/{repo_git_base}/settings/keys'
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
)
git_user_name = os.getenv('GITHUB_ACTOR')
git_user_email = git_user_name + '@' + platform.node()
else:
@ -338,14 +396,11 @@ def main():
git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo')
git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata')
if not os.path.isdir(git_mirror_repodir):
logging.debug(_('cloning {url}').format(url=clone_url))
vcs = common.getvcs('git', clone_url, git_mirror_path)
p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)])
if p.returncode != 0:
print('WARNING: only public git repos are supported!')
raise VCSException('git clone %s failed:' % clone_url, p.output)
clone_git_repo(clone_url, git_mirror_path)
if not os.path.isdir(git_mirror_repodir):
os.makedirs(git_mirror_repodir, mode=0o755)
if os.path.exists('LICENSE'):
shutil.copy2('LICENSE', git_mirror_path)
mirror_git_repo = git.Repo.init(git_mirror_path)
writer = mirror_git_repo.config_writer()
@ -364,9 +419,13 @@ You can use it with the [F-Droid](https://f-droid.org/) Android app.
[![{repo_url}]({repo_url}/icons/icon.png)](https://fdroid.link/#{repo_url})
Last updated: {date}'''.format(repo_git_base=repo_git_base,
repo_url=repo_url,
date=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC'))
Last updated: {date}'''.format(
repo_git_base=repo_git_base,
repo_url=repo_url,
date=datetime.datetime.now(datetime.timezone.utc).strftime(
'%Y-%m-%d %H:%M:%S UTC'
),
)
with open(readme_path, 'w') as fp:
fp.write(readme)
mirror_git_repo.git.add(all=True)
@ -427,10 +486,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base,
common.assert_config_keystore(config)
logging.debug(
_('Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}').format(
cibase=cibase,
repo_basedir=repo_basedir
)
_(
'Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}'
).format(cibase=cibase, repo_basedir=repo_basedir)
)
for root, dirs, files in os.walk(cibase):
@ -518,10 +576,16 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base,
if not os.path.exists(androiddir):
os.mkdir(androiddir)
logging.info(_('created {path}').format(path=androiddir))
logging.error(_('{path} does not exist! Create it by running:').format(path=options.keystore)
+ '\n keytool -genkey -v -keystore ' + options.keystore + ' -storepass android \\'
+ '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\'
+ '\n -dname "CN=Android Debug,O=Android,C=US"')
logging.error(
_('{path} does not exist! Create it by running:').format(
path=options.keystore
)
+ '\n keytool -genkey -v -keystore '
+ options.keystore
+ ' -storepass android \\'
+ '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\'
+ '\n -dname "CN=Android Debug,O=Android,C=US"'
)
sys.exit(1)
ssh_dir = os.path.join(os.getenv('HOME'), '.ssh')
privkey = _ssh_key_from_debug_keystore(options.keystore)

View file

@ -28,23 +28,21 @@ mostly reports success by moving an APK from unsigned/ to repo/
"""
import sys
import glob
import hashlib
import json
import logging
import os
import re
import shutil
import glob
import hashlib
from argparse import ArgumentParser
from collections import OrderedDict
import logging
from gettext import ngettext
import json
import sys
import time
import zipfile
from argparse import ArgumentParser
from collections import OrderedDict
from gettext import ngettext
from . import _
from . import common
from . import metadata
from . import _, common, metadata
from .common import FDroidPopen
from .exception import BuildException, FDroidException

View file

@ -17,8 +17,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from argparse import ArgumentParser
from . import common
from . import metadata
from . import common, metadata
def main():

View file

@ -17,16 +17,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from argparse import ArgumentParser
import logging
import io
import tempfile
import logging
import shutil
import tempfile
from argparse import ArgumentParser
from pathlib import Path
from . import _
from . import common
from . import metadata
from . import _, common, metadata
config = None

View file

@ -270,9 +270,10 @@ def get_gradle_compile_commands(build):
'runtimeOnly',
]
buildTypes = ['', 'release']
flavors = ['']
if build.gradle and build.gradle != ['yes']:
flavors += build.gradle
flavors = common.calculate_gradle_flavor_combination(build.gradle)
else:
flavors = ['']
return [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)]
@ -728,6 +729,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
'www.jitpack.io',
'repo.maven.apache.org/maven2',
'oss.jfrog.org/artifactory/oss-snapshot-local',
'central.sonatype.com/repository/maven-snapshots/',
'oss.sonatype.org/content/repositories/snapshots',
'oss.sonatype.org/content/repositories/releases',
'oss.sonatype.org/content/groups/public',
@ -749,8 +751,12 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
]
]
scanignore = common.getpaths_map(build_dir, build.scanignore)
scandelete = common.getpaths_map(build_dir, build.scandelete)
scanignore, scanignore_not_found_paths = common.getpaths_map(
build_dir, build.scanignore
)
scandelete, scandelete_not_found_paths = common.getpaths_map(
build_dir, build.scandelete
)
scanignore_worked = set()
scandelete_worked = set()
@ -1108,11 +1114,19 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
json_per_build,
)
for p in scanignore_not_found_paths:
logging.error(_("Non-exist scanignore path: %s") % p)
count += 1
for p in scanignore:
if p not in scanignore_worked:
logging.error(_('Unused scanignore path: %s') % p)
count += 1
for p in scandelete_not_found_paths:
logging.error(_("Non-exist scandelete path: %s") % p)
count += 1
for p in scandelete:
if p not in scandelete_worked:
logging.error(_('Unused scandelete path: %s') % p)
@ -2217,8 +2231,7 @@ SUSS_DEFAULT = r'''{
"https://www.android.com/gms/"
],
"gradle_signatures": [
"com.google.gms(?!.google-services)",
"com.google.android.gms(?!.oss-licenses-plugin)",
"com.google.android.gms(?!.(oss-licenses-plugin|strict-version-matcher-plugin))",
"com.google.android.ump",
"androidx.core:core-google-shortcuts",
"androidx.credentials:credentials-play-services-auth",
@ -2234,7 +2247,19 @@ SUSS_DEFAULT = r'''{
"com.yayandroid:locationmanager",
"(?<!org.microg.gms:)play-services",
"xyz.belvi.mobilevision:barcodescanner",
"com.google.api-client:google-api-client-android"
"com.google.api-client:google-api-client-android",
"com.google.maps.android:android-maps-utils",
"com.github.budowski:android-maps-utils",
"com.microsoft.identity:common",
"com.microsoft.identity.client:msal"
],
"gradle_signatures_negative_examples": [
"com.google.android.gms.oss-licenses-plugin",
"com.google.android.gms.strict-version-matcher-plugin"
],
"gradle_signatures_positive_examples": [
"com.google.android.gms:play-services-base",
"com.google.android.gms:play-services-oss-licenses"
],
"license": "NonFree",
"name": "Google Mobile Services"
@ -2934,6 +2959,16 @@ SUSS_DEFAULT = r'''{
"license": "NonFree",
"name": "Pushy"
},
"org.gradle.toolchains.foojay-resolver-convention": {
"documentation": [
"https://github.com/gradle/foojay-toolchains"
],
"gradle_signatures": [
"org.gradle.toolchains.foojay-resolver"
],
"license": "Apache-2.0",
"name": "Foojay Toolchains Plugin"
},
"org.mariuszgromada.math": {
"code_signatures": [
"org/mariuszgromada/math/mxparser/parsertokens/SyntaxStringBuilder",
@ -2966,7 +3001,7 @@ SUSS_DEFAULT = r'''{
"license": "NonFree"
}
},
"timestamp": 1733823271.362948,
"timestamp": 1747829076.702502,
"version": 1,
"last_updated": 1742401014.503398
"last_updated": 1750710966.431471
}'''

View file

@ -15,15 +15,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import logging
import os
import re
import sys
from argparse import ArgumentParser
import re
import os
import sys
import logging
from . import _
from . import common
from . import _, common
from .exception import FDroidException

View file

@ -17,15 +17,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import logging
import os
import time
import zipfile
from argparse import ArgumentParser
import logging
from . import _
from . import common
from . import metadata
from . import _, common, metadata
from .exception import FDroidException
config = None

View file

@ -28,8 +28,8 @@ Example
import os
import sys
import time
import threading
import time
class Tail(object):

View file

@ -20,25 +20,27 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import argparse
import sys
import os
import shutil
import copy
import filecmp
import glob
import logging
import re
import socket
import warnings
import zipfile
import hashlib
import json
import logging
import os
import re
import shutil
import socket
import sys
import time
import yaml
import copy
import warnings
import zipfile
from argparse import ArgumentParser
from datetime import datetime, timezone
from pathlib import Path
import asn1crypto.cms
import defusedxml.ElementTree as ElementTree
from datetime import datetime, timezone
from argparse import ArgumentParser
from pathlib import Path
import yaml
try:
from yaml import CSafeLoader as SafeLoader
@ -48,14 +50,13 @@ except ImportError:
import collections
from binascii import hexlify
from . import _
from . import common
from . import metadata
from .common import DEFAULT_LOCALE
from .exception import BuildException, FDroidException, VerificationException
from PIL import Image, PngImagePlugin
import fdroidserver.index
from PIL import Image, PngImagePlugin
from . import _, common, metadata
from .common import DEFAULT_LOCALE
from .exception import BuildException, FDroidException, NoVersionCodeException, VerificationException
if hasattr(Image, 'DecompressionBombWarning'):
warnings.simplefilter('error', Image.DecompressionBombWarning)
@ -133,7 +134,7 @@ def disabled_algorithms_allowed():
or common.default_config['allow_disabled_algorithms'])
def status_update_json(apps, apks):
def status_update_json(output, apps, apks):
"""Output a JSON file with metadata about this `fdroid update` run.
Parameters
@ -145,7 +146,6 @@ def status_update_json(apps, apks):
"""
logging.debug(_('Outputting JSON'))
output = common.setup_status_output(start_timestamp)
output['antiFeatures'] = dict()
output['disabled'] = []
output['archivePolicy0'] = []
@ -370,6 +370,12 @@ def get_cache():
v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])}
if 'added' in v:
v['added'] = datetime.fromtimestamp(v['added'], tz=timezone.utc)
if v.get('srcname') and not v.get('srcnameSha256'):
f = f'archive/{v["srcname"]}'
if not os.path.exists(f):
f = f'repo/{v["srcname"]}'
if os.path.exists(f):
v['srcnameSha256'] = common.sha256sum(f)
return apkcache
@ -801,14 +807,18 @@ def _strip_and_copy_image(in_file, outpath):
It is not used at all in the F-Droid ecosystem, so its much safer
just to remove it entirely.
This uses size+mtime to check for a new file since this process
actually modifies the resulting file to strip out the EXIF.
This only uses ctime/mtime to check for a new file since this
process actually modifies the resulting file to strip out the EXIF.
Therefore, whenever the file needs to be stripped, it will have a
newer ctime and most likely a different size. The mtime is copied
from the source to the destination, so it can be the same.
outpath can be path to either a file or dir. The dir that outpath
refers to must exist before calling this.
Potential source of Python code to strip JPEGs without dependencies:
http://www.fetidcascade.com/public/minimal_exif_writer.py
"""
logging.debug('copying %s %s', in_file, outpath)
@ -824,12 +834,11 @@ def _strip_and_copy_image(in_file, outpath):
else:
out_file = outpath
if os.path.exists(out_file):
in_stat = os.stat(in_file)
out_stat = os.stat(out_file)
if in_stat.st_size == out_stat.st_size \
and in_stat.st_mtime == out_stat.st_mtime:
return
if os.path.exists(out_file) and (
os.path.getmtime(in_file) <= os.path.getmtime(out_file)
and os.path.getctime(in_file) <= os.path.getctime(out_file)
):
return
extension = common.get_extension(in_file)[1]
if extension == 'png':
@ -1115,6 +1124,9 @@ def copy_triple_t_store_metadata(apps):
repofilename = os.path.basename(f)
if segments[-2] == 'listing':
locale = segments[-3]
if dirname in GRAPHIC_NAMES:
repofilename = dirname + '.' + extension
dirname = ''
elif segments[-4] == 'listings': # v2.x
locale = segments[-3]
if dirname in tt_graphic_names:
@ -1142,6 +1154,7 @@ def insert_localized_app_metadata(apps):
metadata/<locale>/
fastlane/metadata/android/<locale>/
<subdir>/fastlane/metadata/android/<locale>/
src/<buildFlavor>/fastlane/metadata/android/<locale>/
...as well as the /metadata/<packageName>/<locale> directory.
@ -1161,7 +1174,7 @@ def insert_localized_app_metadata(apps):
https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-apps-build-metadata-in-an-fdroiddata-collection
"""
sourcedirs = glob.glob(os.path.join('build', '[A-Za-z]*', 'src', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'))
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'))
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', '**', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'), recursive=True)
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'metadata', '[a-z][a-z]*'))
sourcedirs += glob.glob(os.path.join('metadata', '[A-Za-z]*', '[a-z][a-z]*'))
@ -1177,17 +1190,40 @@ def insert_localized_app_metadata(apps):
locale = segments[-1]
destdir = os.path.join('repo', packageName, locale)
# flavours specified in build receipt
build_flavours = ""
if (
apps[packageName]
and len(apps[packageName].get('Builds', [])) > 0
and 'gradle' in apps[packageName]['Builds'][-1]
):
build_flavours = apps[packageName]['Builds'][-1]['gradle']
builds = apps.get(packageName, {}).get('Builds', [])
found_in_subdir = (
builds
and len(segments) > 6
and segments[-4] == "fastlane"
and segments[-3] == "metadata"
and segments[-2] == "android"
and '/'.join(segments[2:-4]) == builds[-1].get('subdir')
)
if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavours:
logging.debug("ignoring due to wrong flavour")
# flavors specified in build receipt
build_flavors = []
if builds and 'gradle' in builds[-1] and builds[-1]['gradle'] != ['yes']:
build_flavors = common.calculate_gradle_flavor_combination(
builds[-1]['gradle']
)
found_in_flavor = (
len(segments) > 7
and segments[2] == 'src'
and segments[4] == "fastlane"
and segments[3] in build_flavors
)
if (
not found_in_subdir
and not found_in_flavor
and segments[0] == 'build'
and segments[2] not in ('metadata', 'fastlane')
):
logging.debug(
'Not scanning "{dir}" with unknown subdir or gradle flavor "{value}"'.format(
dir=os.path.relpath(root), value=segments[3]
)
)
continue
for f in files:
@ -1225,9 +1261,7 @@ def insert_localized_app_metadata(apps):
try:
versionCode = int(base)
locale = segments[-2]
if versionCode in [
a["versionCode"] for a in apps[packageName]["Builds"]
]:
if versionCode in [b["versionCode"] for b in builds]:
_set_localized_text_entry(
apps[packageName],
locale,
@ -1452,19 +1486,18 @@ def insert_localized_ios_app_metadata(apps_with_packages):
fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name)
# lookup icons, copy them and put them into app
icon_path = _get_ipa_icon(Path('build') / package_name)
icon_src = _get_ipa_icon(Path('build') / package_name)
icon_dest = Path('repo') / package_name / 'icon.png' # for now just assume png
icon_stat = os.stat(icon_path)
app['iconv2'] = {
DEFAULT_LOCALE: {
'name': str(icon_dest).lstrip('repo'),
'sha256': common.sha256sum(icon_dest),
'size': icon_stat.st_size,
'size': os.path.getsize(icon_src),
}
}
if not icon_dest.exists():
if not icon_dest.exists() or not filecmp.cmp(icon_src, icon_dest):
icon_dest.parent.mkdir(parents=True, exist_ok=True)
shutil.copy(icon_path, icon_dest)
shutil.copy2(icon_src, icon_dest)
def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False):
@ -1543,8 +1576,10 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False):
repo_file['packageName'] = m.group(1)
repo_file['versionCode'] = int(m.group(2))
srcfilename = name + b'_src.tar.gz'
if os.path.exists(os.path.join(repodir, srcfilename)):
srcpath = os.path.join(repodir, srcfilename)
if os.path.exists(srcpath):
repo_file['srcname'] = srcfilename.decode()
repo_file['srcnameSha256'] = common.sha256sum(srcpath.decode())
repo_file['size'] = stat.st_size
apkcache[name_utf8] = repo_file
@ -1766,6 +1801,7 @@ def scan_apk_androguard(apk, apkfile):
xml = apkobject.get_android_manifest_xml()
androidmanifest_xml = apkobject.xml['AndroidManifest.xml']
if len(xml.nsmap) > 0:
# one of them surely will be the Android one, or its corrupt
xmlns = common.XMLNS_ANDROID
@ -1775,8 +1811,12 @@ def scan_apk_androguard(apk, apkfile):
xmlns = '{}'
vcstr = androidmanifest_xml.get(xmlns + 'versionCode')
logging.debug("Version Code: %r (%s)" % (vcstr, apkfile))
if vcstr.startswith('0x'):
if not vcstr:
raise NoVersionCodeException(_("APK file {path} does not have a version code "
"in its manifest").format(path=apkfile))
elif vcstr.startswith('0x'):
apk['versionCode'] = int(vcstr, 16)
else:
apk['versionCode'] = int(vcstr)
@ -1924,6 +1964,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal
logging.warning(_("Skipping '{apkfilename}' with invalid signature!")
.format(apkfilename=apkfilename))
return True, None, False
except NoVersionCodeException:
logging.warning(_("Skipping '{apkfilename}' without versionCode!")
.format(apkfilename=apkfilename))
return True, None, False
if apps:
if apk['packageName'] in apps:
@ -1962,8 +2006,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal
apk['apkName'] = apkfilename
srcfilename = apkfilename[:-4] + "_src.tar.gz"
if os.path.exists(os.path.join(repodir, srcfilename)):
srcpath = os.path.join(repodir, srcfilename)
if os.path.exists(srcpath):
apk['srcname'] = srcfilename
apk['srcnameSha256'] = common.sha256sum(srcpath)
# verify the jar signature is correct, allow deprecated
# algorithms only if the APK is in the archive.
@ -2801,7 +2847,7 @@ def main():
output_status_stage(status_output, 'make_binary_transparency_log')
btlog.make_binary_transparency_log(repodirs)
status_update_json(apps, apks + archapks)
status_update_json(status_output, apps, apks + archapks)
logging.info(_("Finished"))

View file

@ -16,18 +16,17 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import os
import glob
import json
import logging
import requests
import os
import sys
from argparse import ArgumentParser
from collections import OrderedDict
from . import _
from . import common
from . import net
import requests
from . import _, common, net
from .exception import FDroidException
config = None
@ -58,8 +57,8 @@ def _add_diffoscope_info(d):
]
d['diffoscope']['External-Tools-Required'] = external_tools
from diffoscope.tools import OS_NAMES, get_current_os
from diffoscope.external_tools import EXTERNAL_TOOLS
from diffoscope.tools import OS_NAMES, get_current_os
current_os = get_current_os()
os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES)
@ -144,23 +143,44 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result):
with open(jsonfile, 'w') as fp:
json.dump(data, fp, sort_keys=True)
if output['verified']:
jsonfile = 'unsigned/verified.json'
data = get_verified_json(jsonfile)
packageName = output['local']['packageName']
appid, version_code = os.path.basename(unsigned_apk[:-4]).rsplit('_', 1)
appid_base = unsigned_apk.rsplit('_', 1)[0]
apkReports = sorted(
glob.glob(f'{appid_base}_[0-9]*.json'), # don't include <appid>.json
key=lambda s: int(s[:-9].rsplit('_', 1)[1]), # numeric sort by versionCode
)
with open(apkReports[-1]) as fp:
reports = json.load(fp)
appid_output = {'apkReports': apkReports}
most_recent = 0
for report_time, run in reports.items():
if float(report_time) > most_recent:
most_recent = float(report_time)
appid_output['lastRunVerified'] = run['verified']
with open(f'{appid_base}.json', 'w') as fp:
json.dump(appid_output, fp, cls=common.Encoder, sort_keys=True)
if packageName not in data['packages']:
data['packages'][packageName] = []
found = False
output_dump = json.dumps(output, sort_keys=True)
for p in data['packages'][packageName]:
if output_dump == json.dumps(p, sort_keys=True):
found = True
break
if not found:
data['packages'][packageName].insert(0, json.loads(output_dump))
with open(jsonfile, 'w') as fp:
json.dump(data, fp, cls=common.Encoder, sort_keys=True)
if output['verified']:
write_verified_json(output)
def write_verified_json(output):
jsonfile = 'unsigned/verified.json'
data = get_verified_json(jsonfile)
packageName = output['local']['packageName']
if packageName not in data['packages']:
data['packages'][packageName] = []
found = False
output_dump = json.dumps(output, sort_keys=True)
for p in data['packages'][packageName]:
if output_dump == json.dumps(p, sort_keys=True):
found = True
break
if not found:
data['packages'][packageName].insert(0, json.loads(output_dump))
with open(jsonfile, 'w') as fp:
json.dump(data, fp, cls=common.Encoder, sort_keys=True)
def main():

View file

@ -16,16 +16,16 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from os.path import isdir, isfile, basename, abspath, expanduser
import os
import json
import logging
import os
import shutil
import subprocess
import textwrap
import logging
from .common import FDroidException
import threading
from os.path import abspath, basename, expanduser, isdir, isfile
from .common import FDroidException
lock = threading.Lock()

View file

@ -1,308 +0,0 @@
#!/bin/bash
bindir="$(dirname $0)"
basedir="$(dirname $bindir)"
# Check if GRADLE_VERSION_DIR/CACHEDIR is set from environment
if [ -z "$GRADLE_VERSION_DIR" ]; then
gradle_version_dir="${basedir}/versions"
else
gradle_version_dir="$GRADLE_VERSION_DIR"
fi
BUILDSERVER_CACHEDIR=/vagrant/cache
if [ -n "$CACHEDIR" ]; then
cachedir="$CACHEDIR"
elif [ -d $BUILDSERVER_CACHEDIR ]; then
cachedir=$BUILDSERVER_CACHEDIR
fi
args=("$@")
run_gradle() {
if [ ! -d "${gradle_version_dir}/${v_found}" ]; then
download_gradle ${v_found}
fi
# shellcheck disable=SC2145
echo "Running ${gradle_version_dir}/${v_found}/bin/gradle ${args[@]}"
"${gradle_version_dir}/${v_found}/bin/gradle" "${args[@]}"
exit $?
}
download_gradle() {
URL="https://downloads.gradle.org/distributions/gradle-${1}-bin.zip"
shasum=$(get_sha $1)
if [ $? != 0 ]; then
echo "No hash for gradle version $1! Exiting..."
exit 1
fi
if [ -n "${cachedir}" ] && [ -e "${cachedir}/gradle-$1-bin.zip" ]; then
echo "Using cached ${cachedir}/gradle-$1-bin.zip ..."
gradle_zip="${cachedir}/gradle-$1-bin.zip"
else
echo "Downloading missing gradle version $1"
echo cachedir $cachedir
if [[ -n "${cachedir}" && ! -d "${cachedir}" ]]; then
mkdir -p "${cachedir}"
fi
if [[ -n "${cachedir}" && -d "${cachedir}" && -w "${cachedir}" ]]; then
tmpdir="${cachedir}"
else
tmpdir=$(mktemp -d)
fi
curl -o "${tmpdir}/gradle-$1-bin.zip" --silent --fail --show-error --location --retry 3 --retry-all-errors "${URL}"
gradle_zip="${tmpdir}/gradle-$1-bin.zip"
fi
echo "${shasum} ${gradle_zip}" | sha256sum -c -
if [ $? != 0 ]; then
echo "gradle download checksum mismatch! Exiting..."
exit 1
fi
mkdir -p "${gradle_version_dir}/"
unzip -q -d "${gradle_version_dir}" "${gradle_zip}"
mv "${gradle_version_dir}/gradle-$1" "${gradle_version_dir}/${v_found}"
}
get_sha() {
case $1 in
'0.7') echo '4e354fcb0d5c0b0e7789cd6ee900456edaf993f6dd890c4a1c217d90d2a6a6ad' ;;
'0.8') echo '940e623ea98e40ea9ad398770a6ebb91a61c0869d394dda81aa86b0f4f0025e7' ;;
'0.9') echo '994e46d4b467254a0f25ce92b602618331b9b3ac8b32a094fd84ff0e0ceec135' ;;
'0.9.1') echo '5d48cba95db031ec109ae9ab60561e960b6507046036e8191aa78572ec27e2a5' ;;
'0.9.2') echo 'f94d7642348c558fc05ab5fd6fb947fb1ed8fed5931ddb73dd04fb0de22d669b' ;;
'1.0') echo '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384' ;;
'1.1') echo '552c1fc9f3a1b9668b79cc447370f0263e664ffb6d5c6e1c21e77ce0c8a20d4c' ;;
'1.2') echo 'eb53da3704d24cabb7565f34a3bf16bcd863c4b0c139917606fb15d4f27c7bdf' ;;
'1.3') echo 'ada68561efbb9f1cae0f9063974cbde15c180351a2f92bc2f1106e39ddcae5ba' ;;
'1.4') echo 'cd99e85fbcd0ae8b99e81c9992a2f10cceb7b5f009c3720ef3a0078f4f92e94e' ;;
'1.5') echo 'a5511a0659caa47d9d74fd2844c9da43157d2f78e63a0223c6289d88f5aaecbe' ;;
'1.6') echo 'de3e89d2113923dcc2e0def62d69be0947ceac910abd38b75ec333230183fac4' ;;
'1.7') echo '360c97d51621b5a1ecf66748c718594e5f790ae4fbc1499543e0c006033c9d30' ;;
'1.8') echo 'a342bbfa15fd18e2482287da4959588f45a41b60910970a16e6d97959aea5703' ;;
'1.9') echo '097ddc2bcbc9da2bb08cbf6bf8079585e35ad088bafd42e8716bc96405db98e9' ;;
'1.10') echo '6e6db4fc595f27ceda059d23693b6f6848583950606112b37dfd0e97a0a0a4fe' ;;
'1.11') echo '07e235df824964f0e19e73ea2327ce345c44bcd06d44a0123d29ab287fc34091' ;;
'1.12') echo '8734b13a401f4311ee418173ed6ca8662d2b0a535be8ff2a43ecb1c13cd406ea' ;;
'2.0') echo 'a1eb880c8755333c4d33c4351b269bebe517002532d3142c0b6164c9e8c081c3' ;;
'2.1') echo '3eee4f9ea2ab0221b89f8e4747a96d4554d00ae46d8d633f11cfda60988bf878' ;;
'2.2') echo '91e5655fe11ef414449f218c4fa2985b3a49b7903c57556da109c84fa26e1dfb' ;;
'2.2.1') echo '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418' ;;
'2.3') echo '010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774' ;;
'2.4') echo 'c4eaecc621a81f567ded1aede4a5ddb281cc02a03a6a87c4f5502add8fc2f16f' ;;
'2.5') echo '3f953e0cb14bb3f9ebbe11946e84071547bf5dfd575d90cfe9cc4e788da38555' ;;
'2.6') echo '18a98c560af231dfa0d3f8e0802c20103ae986f12428bb0a6f5396e8f14e9c83' ;;
'2.7') echo 'cde43b90945b5304c43ee36e58aab4cc6fb3a3d5f9bd9449bb1709a68371cb06' ;;
'2.8') echo 'a88db9c2f104defdaa8011c58cf6cda6c114298ae3695ecfb8beb30da3a903cb' ;;
'2.9') echo 'c9159ec4362284c0a38d73237e224deae6139cbde0db4f0f44e1c7691dd3de2f' ;;
'2.10') echo '66406247f745fc6f05ab382d3f8d3e120c339f34ef54b86f6dc5f6efc18fbb13' ;;
'2.11') echo '8d7437082356c9fd6309a4479c8db307673965546daea445c6c72759cd6b1ed6' ;;
'2.12') echo 'e77064981906cd0476ff1e0de3e6fef747bd18e140960f1915cca8ff6c33ab5c' ;;
'2.13') echo '0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664' ;;
'2.14') echo '993b4f33b652c689e9721917d8e021cab6bbd3eae81b39ab2fd46fdb19a928d5' ;;
'2.14.1') echo 'cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39' ;;
'3.0') echo '39c906941a474444afbddc38144ed44166825acb0a57b0551dddb04bbf157f80' ;;
'3.1') echo 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc' ;;
'3.2') echo '5321b36837226dc0377047a328f12010f42c7bf88ee4a3b1cee0c11040082935' ;;
'3.2.1') echo '9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689' ;;
'3.3') echo 'c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292' ;;
'3.4') echo '72d0cd4dcdd5e3be165eb7cd7bbd25cf8968baf400323d9ab1bba622c3f72205' ;;
'3.4.1') echo 'db1db193d479cc1202be843f17e4526660cfb0b21b57d62f3a87f88c878af9b2' ;;
'3.5') echo '0b7450798c190ff76b9f9a3d02e18b33d94553f708ebc08ebe09bdf99111d110' ;;
'3.5.1') echo '8dce35f52d4c7b4a4946df73aa2830e76ba7148850753d8b5e94c5dc325ceef8' ;;
'4.0') echo '56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe' ;;
'4.0.1') echo 'd717e46200d1359893f891dab047fdab98784143ac76861b53c50dbd03b44fd4' ;;
'4.0.2') echo '79ac421342bd11f6a4f404e0988baa9c1f5fabf07e3c6fa65b0c15c1c31dda22' ;;
'4.1') echo 'd55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43' ;;
'4.2') echo '515dd63d32e55a9c05667809c5e40a947529de3054444ad274b3b75af5582eae' ;;
'4.2.1') echo 'b551cc04f2ca51c78dd14edb060621f0e5439bdfafa6fd167032a09ac708fbc0' ;;
'4.3') echo '8dcbf44eef92575b475dcb1ce12b5f19d38dc79e84c662670248dc8b8247654c' ;;
'4.3.1') echo '15ebe098ce0392a2d06d252bff24143cc88c4e963346582c8d88814758d93ac7' ;;
'4.4') echo 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f' ;;
'4.4.1') echo 'e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389' ;;
'4.5') echo '03f2a43a314ff0fb843a85ef68078e06d181c4549c1e5fb983f289382b59b5e3' ;;
'4.5.1') echo '3e2ea0d8b96605b7c528768f646e0975bd9822f06df1f04a64fd279b1a17805e' ;;
'4.6') echo '98bd5fd2b30e070517e03c51cbb32beee3e2ee1a84003a5a5d748996d4b1b915' ;;
'4.7') echo 'fca5087dc8b50c64655c000989635664a73b11b9bd3703c7d6cabd31b7dcdb04' ;;
'4.8') echo 'f3e29692a8faa94eb0b02ebf36fa263a642b3ae8694ef806c45c345b8683f1ba' ;;
'4.8.1') echo 'af334d994b5e69e439ab55b5d2b7d086da5ea6763d78054f49f147b06370ed71' ;;
'4.9') echo 'e66e69dce8173dd2004b39ba93586a184628bc6c28461bc771d6835f7f9b0d28' ;;
'4.10') echo '248cfd92104ce12c5431ddb8309cf713fe58de8e330c63176543320022f59f18' ;;
'4.10.1') echo 'e53ce3a01cf016b5d294eef20977ad4e3c13e761ac1e475f1ffad4c6141a92bd' ;;
'4.10.2') echo 'b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29' ;;
'4.10.3') echo '8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e' ;;
'5.0') echo '6157ac9f3410bc63644625b3b3e9e96c963afd7910ae0697792db57813ee79a6' ;;
'5.1') echo '7506638a380092a0406364c79d6c87d03d23017fc25a5770379d1ce23c3fcd4d' ;;
'5.1.1') echo '4953323605c5d7b89e97d0dc7779e275bccedefcdac090aec123375eae0cc798' ;;
'5.2') echo 'ff322863250159595e93b5a4d17a6f0d21c59a1a0497c1e1cf1d53826485503f' ;;
'5.2.1') echo '748c33ff8d216736723be4037085b8dc342c6a0f309081acf682c9803e407357' ;;
'5.3') echo 'bed2bdd3955be5a09ca7e0201e9d131f194f7f6c466e1795a733733ccfb09f25' ;;
'5.3.1') echo '1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436' ;;
'5.4') echo 'c8c17574245ecee9ed7fe4f6b593b696d1692d1adbfef425bef9b333e3a0e8de' ;;
'5.4.1') echo '7bdbad1e4f54f13c8a78abc00c26d44dd8709d4aedb704d913fb1bb78ac025dc' ;;
'5.5') echo '8d78b2ed63e7f07ad169c1186d119761c4773e681f332cfe1901045b1b0141bc' ;;
'5.5.1') echo '222a03fcf2fcaf3691767ce9549f78ebd4a77e73f9e23a396899fb70b420cd00' ;;
'5.6') echo '15c02ef5dd3631ec02ac52e8725703e0285d9a7eecbf4e5939aa9e924604d01d' ;;
'5.6.1') echo '0986244820e4a35d32d91df2ec4b768b5ba5d6c8246753794f85159f9963ec12' ;;
'5.6.2') echo '32fce6628848f799b0ad3205ae8db67d0d828c10ffe62b748a7c0d9f4a5d9ee0' ;;
'5.6.3') echo '60a6d8f687e3e7a4bc901cc6bc3db190efae0f02f0cc697e323e0f9336f224a3' ;;
'5.6.4') echo '1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d' ;;
'6.0') echo '5a3578b9f0bb162f5e08cf119f447dfb8fa950cedebb4d2a977e912a11a74b91' ;;
'6.0.1') echo 'd364b7098b9f2e58579a3603dc0a12a1991353ac58ed339316e6762b21efba44' ;;
'6.1') echo 'd0c43d14e1c70a48b82442f435d06186351a2d290d72afd5b8866f15e6d7038a' ;;
'6.1.1') echo '9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1' ;;
'6.2') echo 'b93a5f30d01195ec201e240f029c8b42d59c24086b8d1864112c83558e23cf8a' ;;
'6.2.1') echo 'a68ca7ba57f3404c3f6fc1f70a02d3a7d78652e6b46bbfaff83fc9a17168c279' ;;
'6.2.2') echo '0f6ba231b986276d8221d7a870b4d98e0df76e6daf1f42e7c0baec5032fb7d17' ;;
'6.3') echo '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768' ;;
'6.4') echo 'b888659f637887e759749f6226ddfcb1cb04f828c58c41279de73c463fdbacc9' ;;
'6.4.1') echo 'e58cdff0cee6d9b422dcd08ebeb3177bc44eaa09bd9a2e838ff74c408fe1cbcd' ;;
'6.5') echo '23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f' ;;
'6.5.1') echo '50a7d30529fa939721fe9268a0205142f3f2302bcac5fb45b27a3902e58db54a' ;;
'6.6') echo 'e6f83508f0970452f56197f610d13c5f593baaf43c0e3c6a571e5967be754025' ;;
'6.6.1') echo '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac' ;;
'6.7') echo '8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4' ;;
'6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;;
'6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;;
'6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;;
'6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;;
'6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;;
'6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;;
'6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;;
'6.9.2') echo '8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f' ;;
'6.9.3') echo 'dcf350b8ae1aa192fc299aed6efc77b43825d4fedb224c94118ae7faf5fb035d' ;;
'6.9.4') echo '3e240228538de9f18772a574e99a0ba959e83d6ef351014381acd9631781389a' ;;
'7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;;
'7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;;
'7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;;
'7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;;
'7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;;
'7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;;
'7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;;
'7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;;
'7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;;
'7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;;
'7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;;
'7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;;
'7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;;
'7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;;
'7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;;
'7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;;
'7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;;
'7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;;
'7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;;
'7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;;
'8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;;
'8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;;
'8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;;
'8.1') echo 'a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e' ;;
'8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;;
'8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;;
'8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;;
'8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;;
'8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;;
'8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;;
'8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;;
'8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;;
'8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;;
'8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;;
'8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;;
'8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;;
'8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;;
'8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;;
'8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;;
'8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;;
'8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;;
'8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;;
*) exit 1
esac
}
contains() {
local e
for e in $2; do
[[ $e == $1 ]] && return 0;
done
return 1
}
# key-value pairs of what gradle version (value) each gradle plugin version
# (key) should accept. plugin versions are actually prefixes and catch sub-
# versions as well. Pairs are taken from:
# https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0)
d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4)
# All gradle versions we know about
plugin_v=(8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7)
v_all=${plugin_v[@]}
# Earliest file takes priority
# Last key takes priority if there are duplicates (matching java.util.Properties)
for f in {.,..}/gradle/wrapper/gradle-wrapper.properties; do
[[ -f $f ]] || continue
while IFS='' read -r line || [ -n "$line" ]; do
line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds
if [[ $line == 'distributionUrl='* ]]; then
wrapper_ver=${line#*/gradle-}
wrapper_ver=${wrapper_ver%-*.zip}
fi
done < $f
[[ -n $wrapper_ver ]] && break
done
if [[ -n $wrapper_ver ]]; then
v_found=$wrapper_ver
echo "Found $v_found via distributionUrl"
run_gradle
fi
# Earliest takes priority
for f in {.,..}/build.gradle{,.kts}; do
[[ -f $f ]] || continue
while IFS='' read -r line || [ -n "$line" ]; do
line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds
if [[ -z "$plugin_pver" && $line == *'com.android.tools.build:gradle:'* ]]; then
plugin_pver=${line#*[\'\"]com.android.tools.build:gradle:}
plugin_pver=${plugin_pver%[\'\"]*}
elif [[ -z "$wrapper_ver" && $line == *'gradleVersion = '* ]]; then
wrapper_ver=${line#*gradleVersion*=*[\'\"]}
wrapper_ver=${wrapper_ver%[\'\"]*}
fi
done < $f
done
if [[ -n $wrapper_ver ]]; then
v_found=$wrapper_ver
echo "Found $v_found via gradleVersion"
run_gradle
fi
if [[ -n $plugin_pver ]]; then
i=0
match=false
for k in "${d_gradle_plugin_ver_k[@]}"; do
if [[ $plugin_pver == ${k}* ]]; then
plugin_ver=${d_plugin_min_gradle_v[$i]}
match=true
break
fi
let i++
done
if $match; then
v_found=$plugin_ver
echo "Found $v_found via gradle plugin version $k"
fi
fi
# Find the highest version available
for v in ${plugin_v[*]}; do
if contains $v "${v_all[*]}"; then
v_def=$v
break
fi
done
if [[ -z $v_found ]]; then
echo "No suitable gradle version found - defaulting to $v_def"
v_found=$v_def
fi
run_gradle

View file

@ -2,7 +2,7 @@
#
# Install all the client hooks
BASE_DIR="$(cd $(dirname $0); pwd -P)"
BASE_DIR="$(cd $(dirname $0) || exit; pwd -P)"
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
HOOK_DIR="$(git rev-parse --show-toplevel)/.git/hooks"

View file

@ -11,7 +11,7 @@ if [ -z "$files" ]; then
PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
PY_TEST_FILES="tests/test_*.py"
SH_FILES="hooks/pre-commit"
BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
BASH_FILES="jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
RB_FILES="buildserver/Vagrantfile"
YML_FILES=".*.yml .yamllint */*.yml */*.yaml"
else
@ -36,7 +36,7 @@ else
*.rb)
RB_FILES+=" $f"
;;
*.yml|.*.yml|.yamllint)
*.yml|*.yaml|.yamllint)
YML_FILES+=" $f"
;;
*)
@ -66,7 +66,7 @@ cmd_exists() {
}
find_command() {
for name in $@; do
for name in "$@"; do
for suff in "3" "-3" "-python3" ""; do
cmd=${name}${suff}
if cmd_exists $cmd; then

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2023-05-26 19:39+0000\n"
"Last-Translator: Mehrab Poladov <thepoladov@protonmail.com>\n"
"Language-Team: Azerbaijani <https://hosted.weblate.org/projects/f-droid/fdroidserver/az/>\n"
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1991,6 +2001,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-01-21 00:08+0000\n"
"Last-Translator: flac <flac_twin@keemail.me>\n"
"Language-Team: Belarusian <https://hosted.weblate.org/projects/f-droid/fdroidserver/be/>\n"
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1483,6 +1488,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Перайменуйце файлы APK, якія не адпавядаюць package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1996,6 +2006,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Папярэджваць аб магчымых памылках метададзеных"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.1b0\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-07-19 10:21+0000\n"
"Last-Translator: 109247019824 <stoyan@gmx.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/f-droid/fdroidserver/bg/>\n"
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1479,6 +1484,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1992,6 +2002,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2021-02-12 09:48+0000\n"
"Last-Translator: Oymate <dhruboadittya96@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/f-droid/fdroidserver/bn/>\n"
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1991,6 +2001,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-04-10 13:33+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Tibetan <https://hosted.weblate.org/projects/f-droid/fdroidserver/bo/>\n"
@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning"
msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "ཚགས་རྒྱབ་པའི་སྐབས་སུ་ནོར་སྐྱོན་ {} ཤོར་བས་བཟོ་སྐྲུན་བྱེད་ཐུབ་མེད།"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "ཀློག་མི་ཐུབ།{path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1499,6 +1504,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, fuzzy, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2015,6 +2025,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་སྐྱོན་སྲིད་པ་རྣམས་པ་ཉེན་བརྡ་གཏོང་།"

View file

@ -6,21 +6,21 @@
# Adrià Martín <adriamartinmor@gmail.com>, 2024.
# unmes <jordi.guiu.pujols@gmail.com>, 2024.
# Joan Pujolar <joan.pujolar@gmail.com>, 2024.
# Ecron <ecron_89@hotmail.com>, 2024.
# Ecron <ecron_89@hotmail.com>, 2024, 2025.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-01-30 12:31+0000\n"
"Last-Translator: pitroig <ona@riseup.net>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-05-16 16:36+0000\n"
"Last-Translator: Ecron <ecron_89@hotmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10-dev\n"
"X-Generator: Weblate 5.12-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -46,7 +46,7 @@ msgstr "\"%s/\" no té cap fitxer de metadades coincidents!"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "La clau «isPrimary» no s'hauria d'afegir a les rèpliques!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -307,7 +307,7 @@ msgstr "Sí automàtic a totes les demandes."
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}"
msgstr "Tipus d'entrada incorrecta \"{mirrortype}\" a la configuració de miralls: {mirror}"
msgstr "Tipus d'entrada incorrecta «{mirrortype}» a la configuració de les rèpliques: {mirror}"
#: ../fdroidserver/mirror.py
msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint="
@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "No es pot construir a causa d'un error {} en escanejar"
msgstr[1] "No es pot construir a causa d'errors {} en escanejar"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "No s'ha pogut llegir {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "S'està creant \"{path}\" per configurar s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "S'està llegint '{config_file}'"
msgstr "S'està creant un «{config_file}» buit"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -535,7 +540,7 @@ msgstr "S'està suprimint l'arxiu, el dipòsit és massa gran ({size} màxim {li
#: ../fdroidserver/deploy.py
#, python-brace-format
msgid "Deleting git-mirror history, repo is too big ({size} max {limit})"
msgstr "S'està suprimint l'historial del mirall de git, el dipòsit és massa gran ({size} màxim {limit})"
msgstr "S'està suprimint l'historial git-mirror, el dipòsit és massa gran ({size}, màxim {limit})"
#: ../fdroidserver/update.py
#, python-brace-format
@ -601,7 +606,7 @@ msgstr "No usis les sumes de verificació \"rsync\""
#: ../fdroidserver/install.py
msgid "Download F-Droid.apk using mirrors that leak less to the network"
msgstr "Baixeu l'F-Droid.apk amb els miralls que filtren menys dades a la xarxa"
msgstr "Baixeu l'F-Droid.apk amb les rèpliques que filtren menys dades a la xarxa"
#: ../fdroidserver/__main__.py
msgid "Download complete mirrors of small repos"
@ -657,12 +662,12 @@ msgstr "ERROR: {key} a {path} no és \"arxiu\" o \"dipòsit\"!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "ERROR: {key} no és una clau vàlida!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "ERROR: el valor de {key} hauria de ser del tipus {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "La variable d'entorn {var} de {configname} no està establerta!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "La variable d'entorn {var} de {configname} no està establerta!"
msgstr "La variable d'entorn {{env: {var}}} no està establerta!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "S'ignorarà l'element incorrecte al manifest: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} és obsolet, utilitzeu {newfile}"
msgstr "S'ignorarà el {oldfile} obsolet, utilitzeu {newfile}!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -956,11 +961,11 @@ msgstr "Inclou els fitxers .asc de signatura PGP a la rèplica"
#: ../fdroidserver/mirror.py
msgid "Include the build logs in the mirror"
msgstr "Inclou els registres de construcció al mirall"
msgstr "Inclou els registres de construcció en la rèplica"
#: ../fdroidserver/mirror.py
msgid "Include the source tarballs in the mirror"
msgstr "Inclou els arxius tar d'origen al mirall"
msgstr "Inclou els fitxers tarball del codi font en la rèplica"
#: ../fdroidserver/metadata.py
#, python-format
@ -1143,7 +1148,7 @@ msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP:
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "La configuració de la rèplica per a {url} conté la clau «isPrimary»!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1287,7 +1292,7 @@ msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:"
#: ../fdroidserver/deploy.py
msgid "Offline machine, skipping git mirror generation until `fdroid deploy`"
msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`"
msgstr "Màquina fora de línia, s'ometrà la generació de la rèplica git fins al `fdroid deploy`"
#: ../fdroidserver/deploy.py
msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..."
@ -1310,7 +1315,7 @@ msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Només accepta una clau única «env»"
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1471,7 +1476,7 @@ msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "No se signarà «{path}», el fitxer existeix a les dues carpetes {dir1} i {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1490,6 +1495,11 @@ msgstr "S'està suprimint {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1699,7 +1709,7 @@ msgstr "Mode de prova: posa la sortida només al directori tmp, i sempre constru
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "No s'ha instal·lat el paquet de Python «qrcode» (p. ex. apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2010,6 +2020,10 @@ msgstr "S'està verificant el paquet {path} l'apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "La clau de l'API VirusTotal no pot pujar fitxers més grans de 32 MB, utilitzeu {url} per pujar {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avisa de possibles errors a les metadades"
@ -2322,12 +2336,12 @@ msgstr "local_copy_dir ha de ser directori, no un fitxer!"
#: ../fdroidserver/index.py
#, python-format
msgid "mirror '%s' does not end with 'fdroid'!"
msgstr "el mirall '%s' no acaba amb 'fdroid'!"
msgstr "La rèplica «%s» no acaba amb «fdroid»!"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "mirrors set twice, in config.yml and {path}!"
msgstr "miralls establerts dues vegades, a config.yml i {path}!"
msgstr "rèpliques establertes dues vegades, a config.yml i {path}!"
#: /usr/lib/python3.11/argparse.py
msgid "mutually exclusive arguments must be optional"
@ -2597,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\".
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} és un duplicat de {path2}, elimineu-ne un!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-20 16:21+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
"Last-Translator: Fjuro <fjuro@users.noreply.hosted.weblate.org>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/>\n"
"Language: cs\n"
@ -366,6 +366,11 @@ msgstr[0] "Nelze sestavit kvůli {} chybě při skenování"
msgstr[1] "Nelze sestavit kvůli {} chybám při skenování"
msgstr[2] "Nelze sestavit kvůli {} chybám při skenování"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Chyba při čtení {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1474,7 +1479,7 @@ msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Odmítám podespat „{path}“, soubor existuje ve složce {dir1} i {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1493,6 +1498,11 @@ msgstr "Odebírání {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Přejmenovat soubory APK, které se neshodují s package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2014,6 +2024,10 @@ msgstr "Ověřování balíčku {path} pomocí apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než 32 MB, k nahrání {path} použijte {url}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Varovat ohledně možných chyb metadat"

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2021-01-16 21:23+0000\n"
"Last-Translator: Aled Powell <aled@aledpowell.cymru>\n"
"Language-Team: Welsh <https://hosted.weblate.org/projects/f-droid/fdroidserver/cy/>\n"
@ -357,6 +357,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1482,6 +1487,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2006,6 +2016,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Rhybuddio am wallau metaddata posib"

View file

@ -13,21 +13,21 @@
# TobiGr <tobigr@mail.de>, 2021.
# FW <weblate.scordium@slmail.me>, 2021.
# fossdd <fossdd@tutanota.com>, 2021.
# Ceeee <marius.romanus@gmx.de>, 2021.
# Ceeee <marius.romanus@gmx.de>, 2021, 2025.
# C. Rüdinger <Mail-an-CR@web.de>, 2021, 2022.
# VfBFan <drop0815@posteo.de>, 2021, 2023, 2024, 2025.
# Roman Leo <roman.leo@gmx.de>, 2021.
# Follpvosten <wolfi@karpador.xyz>, 2021.
# ssantos <ssantos@web.de>, 2022, 2023, 2024.
# "C. Rüdinger" <Mail-an-CR@web.de>, 2023.
# "C. Rüdinger" <Mail-an-CR@web.de>, 2023, 2025.
# VfBFan <VfBFan@users.noreply.hosted.weblate.org>, 2024.
# Maxi <maxitendo01@proton.me>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-21 08:45+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-04-29 10:16+0000\n"
"Last-Translator: VfBFan <drop0815@posteo.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/f-droid/fdroidserver/de/>\n"
"Language: de\n"
@ -35,7 +35,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11-dev\n"
"X-Generator: Weblate 5.12-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -378,6 +378,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist"
msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Lesen von {path} fehlgeschlagen: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -519,7 +524,7 @@ msgstr "Erstelle Ausgabeverzeichnis"
#: ../fdroidserver/index.py
msgid "Creating signed index with this key (SHA256):"
msgstr "Signierter Index mit diesem Schlüssel (SHA256) wird erstellt:"
msgstr "Signierter Index wird mit diesem Schlüssel (SHA256) erstellt:"
#: ../fdroidserver/publish.py ../fdroidserver/verify.py
msgid "Creating temporary directory"
@ -532,7 +537,7 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}"
msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}"
msgstr "CurrentVersionCode {cv} ist niedriger als ältester Build-Eintrag {versionCode}"
#: ../fdroidserver/nightly.py
msgid "DEBUG_KEYSTORE is not set or the value is incomplete"
@ -866,7 +871,7 @@ msgstr "Ungültige Datei bei %s gefunden"
#: ../fdroidserver/deploy.py
#, python-brace-format
msgid "Found {apkfilename} at {url}"
msgstr "{apkfilename} unter {url} gefunden"
msgstr "{apkfilename} gefunden auf {url}"
#: ../fdroidserver/scanner.py
#, python-brace-format
@ -930,7 +935,7 @@ msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werde
#: ../fdroidserver/deploy.py
#, python-brace-format
msgid "If this upload fails, try manually uploading to {url}"
msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen"
msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie ihn manuell auf {url} hochzuladen"
#: ../fdroidserver/metadata.py
#, python-brace-format
@ -1337,7 +1342,7 @@ msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld"
#: ../fdroidserver/verify.py
msgid "Output JSON report to file named after APK."
msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben."
msgstr "In Datei ausgegebener JSON-Bericht wird nach APK benannt."
#: ../fdroidserver/scanner.py
msgid "Output JSON to stdout."
@ -1486,7 +1491,7 @@ msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Eintragen von '{path}' abgelehnt, Datei ist sowohl in Ordner {dir1} als auch {dir2} vorhanden."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1505,6 +1510,11 @@ msgstr "Entferne {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1557,7 +1567,7 @@ msgstr "Ausführen von wget in {path}"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "SHA-256 of {url} does not match entry!"
msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!"
msgstr "SHA-256 der {url} stimmt nicht mit Eintrag überein!"
#: ../fdroidserver/build.py
msgid "Scan the resulting APK(s) for known non-free classes."
@ -1607,7 +1617,7 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:"
#: ../fdroidserver/nightly.py
msgid "Set maximum releases in repo before older ones are archived"
msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden"
msgstr "Setze maximale Veröffentlichungen im Repo, bevor ältere archiviert werden"
#: ../fdroidserver/build.py
#, python-brace-format
@ -1757,7 +1767,7 @@ msgstr "Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegel
#: ../fdroidserver/common.py
msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."
msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt."
msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe der Werkzeuge auf https://gitlab.com/fdroid aus dem Quellcode erstellt."
#: ../fdroidserver/import_subcommand.py
#, python-format
@ -1973,7 +1983,7 @@ msgstr "Verwende APK-Signatur v3"
#: ../fdroidserver/common.py
msgid "Using JAR Signature"
msgstr "Verwende JAR Signatur"
msgstr "Verwende JAR-Signatur"
#: ../fdroidserver/common.py
msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner"
@ -2025,6 +2035,10 @@ msgstr "Überprüfen des Pakets {path} mit apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Vor möglichen Metadaten-Fehlern warnen"
@ -2154,7 +2168,7 @@ msgstr "Mehrere Subparser-Argumente sind unzulässig"
#: /usr/lib/python3.11/argparse.py
#, python-format
msgid "cannot merge actions - two groups are named %r"
msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r"
msgstr "kann keine Aktionen zusammenführen zwei Gruppen heißen %r"
#: ../fdroidserver/nightly.py
msgid "cannot publish update, did you set the deploy key?"
@ -2528,8 +2542,8 @@ msgstr "ja"
#, python-brace-format
msgid "{0} app, {1} key aliases"
msgid_plural "{0} apps, {1} key aliases"
msgstr[0] "{0} app, {1} Schlüsselaliase"
msgstr[1] "{0} apps, {1} Schlüsselaliase"
msgstr[0] "{0} App, {1} Schlüssel-Aliase"
msgstr[1] "{0} Apps, {1} Schlüssel-Aliase"
#: ../fdroidserver/update.py
#, python-brace-format
@ -2557,7 +2571,7 @@ msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!"
#: ../fdroidserver/metadata.py ../fdroidserver/update.py
#, python-brace-format
msgid "{appid} from {path} is not a valid Java Package Name!"
msgstr "{appid} von {path} ist kein gültiger Java-Paketname!"
msgstr "{appid} aus {path} ist kein gültiger Java-Paketname!"
#: ../fdroidserver/update.py
#, python-brace-format
@ -2577,7 +2591,7 @@ msgstr "{appid}: unbekannte Extlib {path} im Build '{versionName}'"
#: ../fdroidserver/scanner.py
#, python-brace-format
msgid "{appid}: no builds specified, running on current source state"
msgstr "{appid}: keine builds angegeben, läuft auf dem aktuellen source-Stand"
msgstr "{appid}: Kein Build angegeben; verwende aktuellen Quellen-Stand"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -2627,7 +2641,7 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:"
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!"
msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!"
msgstr "{path} hat falsche Dateisignatur \"{pattern}\", möglicher Janus-Exploit!"
#: ../fdroidserver/deploy.py
#, python-brace-format

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-05-10 13:24+0000\n"
"Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/f-droid/fdroidserver/el/>\n"
@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1485,6 +1490,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1998,6 +2008,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Προειδοποίηση για πιθανά σφάλματα μετα-δεδομένων"

View file

@ -14,20 +14,21 @@
# Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>, 2022.
# gallegonovato <fran-carro@hotmail.es>, 2022, 2023, 2024.
# Nicolás Pérez <ccnicolasperez@gmail.com>, 2025.
# Swyter <swyterzone@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-16 22:47+0000\n"
"Last-Translator: Nicolás Pérez <ccnicolasperez@gmail.com>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-06-24 11:02+0000\n"
"Last-Translator: Swyter <swyterzone@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/f-droid/fdroidserver/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11-dev\n"
"X-Generator: Weblate 5.13-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -370,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "No se puede construir debido al error {} mientras se comprobaba"
msgstr[1] "No se puede construir debido a los errores {} mientras se comprobaba"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Fallo al leer {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -492,9 +498,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Creando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "Leyendo '{config_file}'"
msgstr "Creando el archivo vacío {config_file}"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -1497,6 +1503,11 @@ msgstr "Eliminando {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1811,7 +1822,7 @@ msgstr "Entrada desconocida {key} en {configname}"
#: ../fdroidserver/__main__.py
msgid "Unknown exception found!"
msgstr "¡Se encontró una excepción desconocida!"
msgstr "Se ha producido una excepción desconocida"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -1993,7 +2004,7 @@ msgstr "Usando s3cmd para sincronizar con: {url}"
#: ../fdroidserver/__main__.py
msgid "Valid commands are:"
msgstr "Los comandos válidos son:"
msgstr "Las órdenes válidas son:"
#: ../fdroidserver/verify.py
msgid "Verify against locally cached copy rather than redownloading."
@ -2017,6 +2028,10 @@ msgstr "Verificando el paquete {path} con apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. Use {url} para subir {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Alertar sobre posibles errores de metadatos"

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2021-04-10 21:26+0000\n"
"Last-Translator: Germe the fur star <FOSSgerme.deb@tuta.io>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/f-droid/fdroidserver/es_AR/>\n"
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "No se pudo empaquetar debido al {} error mientras se escaneaba"
msgstr[1] "No se pudo empaquetar debido a los {} errores mientras se escaneaba"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "No se puede reescribir \"{path}\""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1495,6 +1500,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renombrar archivos APK que no corresponden a package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2008,6 +2018,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Advertir sobre posibles errores en los metadatos"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2020-04-29 12:49+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Spanish (Mexico) <https://hosted.weblate.org/projects/f-droid/fdroidserver/es_MX/>\n"
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1483,6 +1488,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1996,6 +2006,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1477,6 +1482,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1990,6 +2000,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-11-26 15:16+0000\n"
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/>\n"
@ -356,6 +356,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "{path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1481,6 +1486,11 @@ msgstr "برداشتن {path}"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1994,6 +2004,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.4.0\n"
"Project-Id-Version: fdroidserver 2.4.2-3-gdcb804f7\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1479,6 +1484,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1992,6 +2002,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-01-31 14:19+0000\n"
"Last-Translator: Ricky Tigg <ricky.tigg@gmail.com>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/f-droid/fdroidserver/fi/>\n"
@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1480,6 +1485,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1993,6 +2003,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -42,20 +42,21 @@
# Lzebulon <lzebulon@crans.org>, 2024.
# Armand Camponovo <contact@camarm.dev>, 2024.
# Lula Bye <translate.cylinder716@passinbox.com>, 2025.
# Laurent FAVOLE <laurentfavole03@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-02 16:42+0000\n"
"Last-Translator: Lula Bye <translate.cylinder716@passinbox.com>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-04-11 17:20+0000\n"
"Last-Translator: Laurent FAVOLE <laurentfavole03@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.10.3-dev\n"
"X-Generator: Weblate 5.11-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -81,7 +82,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "La clé \"isPrimary\" ne devrait pas être ajoutée aux miroirs!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -398,6 +399,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Build impossible à cause de l'erreur lors de l'analyse"
msgstr[1] "Build impossible à cause des {} erreurs lors de l'analyse"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Erreur de lecture {path} : {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -520,9 +526,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Création de « {path} » pour configurer s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "Lecture de '{config_file}'"
msgstr "Création d'un fichier {config_file} vide"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -692,12 +698,12 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"."
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "ERREUR : {key} n'est pas une clé valide!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "ERREUR : la valeur de {key} devrait être du type {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -724,9 +730,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !"
msgstr "La variable d'environnement {{env: {var}}} n'est pas configurée!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -970,7 +976,7 @@ msgstr "Un mauvais élément du manifest est ignoré : %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} est obsolète, utilisez {newfile}"
msgstr "{oldfile} est obsolète et ignoré, {newfile} est utilisé!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1178,7 +1184,7 @@ msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "La configuration du miroir pour {url} contient la clé \"isPrimary\"!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1345,7 +1351,7 @@ msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, t
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "N'accepte qu'une seule clé \"env\""
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1506,7 +1512,7 @@ msgstr "Actualisation et mise en cache des règles et signature à partir du ré
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Signature de '{path}' refusée, le fichier existe à la fois dans les dossiers {dir1} et {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1525,6 +1531,11 @@ msgstr "Suppression de {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1734,7 +1745,7 @@ msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujour
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "Le paquet Python \"qrcode\" n'est pas installé (p. ex. apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -1960,9 +1971,8 @@ msgid "Uploading {apkfilename} to virustotal"
msgstr "Téléversement de {apkfilename} vers virustotal"
#: ../fdroidserver/lint.py
#, fuzzy
msgid "Use /HEAD instead of /master or /main to point at a file in the default branch"
msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut"
msgstr "Utiliser /HEAD plutôt que /master pour pointer vers un fichier dans la branche par défaut"
#: ../fdroidserver/update.py
msgid "Use `fdroid update -c` to create it."
@ -1982,9 +1992,9 @@ msgid "Using \"{path}\" for configuring s3cmd."
msgstr "Utiliser \"{path}\" pour configurer s3cmd."
#: ../fdroidserver/deploy.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Using \"{path}\" for syncing with remote storage."
msgstr "Utiliser \"{path}\" pour configurer un stockage distant."
msgstr "Utiliser \"{path}\" pour synchroniser avec un stockage distant."
#: ../fdroidserver/common.py
msgid "Using APK Signature v2"
@ -2039,21 +2049,24 @@ msgid "Verifying index signature:"
msgstr "Vérification de la signature d'index :"
#: ../fdroidserver/install.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Verifying package {path} with apksigner."
msgstr "Vérifier le paquet {path} avec apksigner."
msgstr "Vérification du paquet {path} avec apksigner."
#: ../fdroidserver/deploy.py
#, python-brace-format
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "LAPI de VirusTotal ne permet pas denvoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avertir de possibles erreurs dans les métadonnées"
#: ../fdroidserver/scanner.py
#, fuzzy
msgid "WebAssembly binary file"
msgstr "Fichier binaire WebAssembly"
@ -2090,7 +2103,7 @@ msgid "ZIP file archive"
msgstr "Archive ZIP"
#: ../fdroidserver/install.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "adb reports {serial} is \"{status}\"!"
msgstr "adb reporte que {serial} est \"{status}\"!"
@ -2110,9 +2123,9 @@ msgid "ambiguous option: %(option)s could match %(matches)s"
msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s"
#: ../fdroidserver/common.py
#, python-brace-format
#, fuzzy, python-brace-format
msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring."
msgstr ""
msgstr "apksigner dans build-tools;{version} accepte les APKs avec des signatures v3 invalides, ignoré"
#: ../fdroidserver/common.py
msgid "apksigner not found! Cannot sign or verify modern APKs"
@ -2216,9 +2229,8 @@ msgid "could not parse '{path}'"
msgstr "impossible de lire '{path}'"
#: ../fdroidserver/common.py
#, fuzzy
msgid "could not parse srclib spec (no name specified): '{}'"
msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée): '{}'"
msgstr "impossible d'analyser la spécification srclib (pas de nom spécifié) : '{}'"
#: ../fdroidserver/common.py
msgid "could not parse srclib spec (no ref specified): '{}'"
@ -2365,7 +2377,7 @@ msgid "mirror '%s' does not end with 'fdroid'!"
msgstr "le miroir «%s» ne se termine pas par «fdroid» !"
#: ../fdroidserver/index.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "mirrors set twice, in config.yml and {path}!"
msgstr "miroir configuré deux fois, dans config.yml et {path}!"
@ -2452,9 +2464,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete"
msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer"
#: ../fdroidserver/deploy.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "s3cmd syncs indexes from {path} to {url} and deletes removed"
msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer"
msgstr "s3cmd synchronise les index de {path} vers {url} et supprime ceux enlevés"
#: ../fdroidserver/scanner.py
#, python-brace-format
@ -2462,9 +2474,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'"
msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'"
#: ../fdroidserver/deploy.py
#, fuzzy
msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:"
msgstr "serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être voulez-vous dire :"
msgstr "serverwebroot : le chemin ne se termine pas par \"fdroid\", peut-être voulez-vous dire :"
#: ../fdroidserver/scanner.py
msgid "shared library"
@ -2510,7 +2521,6 @@ msgid "the following arguments are required: %s"
msgstr "les arguments suivants sont requis %s"
#: ../fdroidserver/install.py
#, fuzzy
msgid "true"
msgstr "vrai"
@ -2548,7 +2558,6 @@ msgid "virustotal.com is rate limiting, waiting to retry..."
msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..."
#: ../fdroidserver/install.py
#, fuzzy
msgid "yes"
msgstr "oui"
@ -2640,7 +2649,7 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} est un doublon de {path2}, supprimez-en un!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format
@ -2663,7 +2672,7 @@ msgid "{path} has been flagged by virustotal {count} times:"
msgstr "{path} a été signalé par virustotal {count} fois :"
#: ../fdroidserver/install.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "{path} has the wrong fingerprint ({fingerprint})!"
msgstr "{path} a la mauvaise empreinte ({fingerprint})!"

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2021-07-01 15:29+0000\n"
"Last-Translator: Vancha March <tjipkevdh@gmail.com>\n"
"Language-Team: Frisian <https://hosted.weblate.org/projects/f-droid/fdroidserver/fy/>\n"
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1991,6 +2001,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,8 +5,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-23 10:56+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-27 19:35+0000\n"
"Last-Translator: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>\n"
"Language-Team: Irish <https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/>\n"
"Language: ga\n"
@ -360,6 +360,11 @@ msgstr[2] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
msgstr[3] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
msgstr[4] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Theip ar léamh {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1468,7 +1473,7 @@ msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Ag diúltú '{path}' a shíniú, tá an comhad san fhillteán {dir1} agus {dir2} araon."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1487,6 +1492,11 @@ msgstr "Ag baint {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2010,6 +2020,10 @@ msgstr "Pacáiste {path} á fhíorú le apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Ní féidir le heochair API VirusTotal comhaid níos mó ná 32MB a uaslódáil, úsáid {url} chun {path} a uaslódáil."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2023-02-22 11:24+0000\n"
"Last-Translator: Saurmandal <saurmandal@protonmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/f-droid/fdroidserver/hi/>\n"
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1479,6 +1484,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1992,6 +2002,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-04-10 13:33+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/>\n"
@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor"
msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "A(z) {path} olvasása sikertelen: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1494,6 +1499,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2011,6 +2021,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Figyelmeztetés a lehetséges metaadat-hibákról"

View file

@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-20 16:21+0000\n"
"Last-Translator: Champ0999 <champ0999@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/f-droid/fdroidserver/it/>\n"
@ -375,6 +375,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Impossibile costruire a causa di un errore con {} durante la scansione"
msgstr[1] "Impossibile costruire a causa di errori con {} durante la scansione"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Impossibile leggere {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1504,6 +1509,11 @@ msgstr "Rimozione di {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2028,6 +2038,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, usa {url} per caricare {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avvisa riguardo possibili errori nei metadati"

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-02-08 06:22+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-04-30 04:07+0000\n"
"Last-Translator: Liner Seven <linour7gmekiblo@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/>\n"
"Language: ja\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.10-dev\n"
"X-Generator: Weblate 5.12-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -43,7 +43,7 @@ msgstr "「\"%s/」に合致するメタデータのファイルはありませ
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "\"isPrimary\" キーはミラーに追加すべきではありません!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -359,6 +359,11 @@ msgid "Can't build due to {} error while scanning"
msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "スキャン時に{}個のエラーが発生したためビルドできません"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "{path}を読み込めませんでした:{error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -481,9 +486,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "s3cmdの設定用に「{path}」を作成します。"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "「{config_file}」を読み込みます"
msgstr "素の {config_file} を作成"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -653,12 +658,12 @@ msgstr "エラー:{path}の{key}は「archive」でも「repo」でもあり
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "エラー:{key} が無効な値です!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "エラー:{key} の値は {t} 型でなければいけません!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -685,9 +690,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "{configname}の環境変数 {var} が設定されていません!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "{configname}の環境変数 {var} が設定されていません"
msgstr "環境変数{{env: {var}}}が未設定です"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -929,9 +934,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "manifestの正しくない要素を無視します%s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile}は非推奨です。{newfile}を使用してください"
msgstr "{oldfile}は非推奨です。{newfile}を使用してください"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1139,7 +1144,7 @@ msgstr "ZIPファイルの最大の再帰階層に到達しました%s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "{url} のミラー設定に \"isPrimary\" キーが含まれています!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1306,7 +1311,7 @@ msgstr "画像にはPNGとJPEGのみをサポートします。これが見つ
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "単一キー \"env\" のみを受け付けます"
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1467,7 +1472,7 @@ msgstr "スキャナーのルールと署名をネットワークから取得し
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "{dir1} と {dir2} のどちらにもファイルが存在するため、'{path}'への署名は拒否されました。"
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1486,6 +1491,11 @@ msgstr "{path} を削除"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1694,7 +1704,7 @@ msgstr "テストモード - 既に出力が存在する場合でも、一時デ
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "\"qrcode\"のPythonパッケージが未導入です( 例えば apt-get install python3-qrcode します)"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2005,6 +2015,10 @@ msgstr "apksignerを使用してパッケージ{path}を検証しています。
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotalのAPI鍵は32メガバイトより大きいファイルをアップロードできません。{url}から{path}をアップロードしてください。"
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "潜在的なメタデータのエラーに関して警告"
@ -2589,7 +2603,7 @@ msgstr "{name}「{section}/icons/{path}」がありません「config.yml」
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} は {path2} と重複しています、片方を除外してください!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2021-01-15 13:25+0000\n"
"Last-Translator: R_SACI <rgebbid@gmail.com>\n"
"Language-Team: Kabyle <https://hosted.weblate.org/projects/f-droid/fdroidserver/kab/>\n"
@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1482,6 +1487,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1995,6 +2005,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-09-06 14:57+0000\n"
"Last-Translator: Cxnfl1ct <wind0wso2o2@naver.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/>\n"
@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning"
msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1485,6 +1490,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1997,6 +2007,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "가능한 메타데이터 오류에 대해 경고합니다"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2023-06-23 14:52+0000\n"
"Last-Translator: abe1242 <abmdn1242@gmail.com>\n"
"Language-Team: Malayalam <https://hosted.weblate.org/projects/f-droid/fdroidserver/ml/>\n"
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1483,6 +1488,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1999,6 +2009,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2022-09-06 14:30+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/>\n"
@ -366,6 +366,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Kan ikke bygge som følge av {} feil under skanning"
msgstr[1] "Kan ikke bygge som følge av {} feiler under skanning"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Klarte ikke å lese {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, fuzzy, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1537,6 +1542,11 @@ msgstr "Fjerner {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2070,6 +2080,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk {url} for å laste opp {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Advar om mulige metadata-feil"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-01-03 09:07+0000\n"
"Last-Translator: Issa1553 <fairfull.playing@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/f-droid/fdroidserver/nl/>\n"
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1486,6 +1491,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Hernoem APK-bestanden die niet overeenkomen met pakket.naam_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1999,6 +2009,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Waarschuwen voor mogelijke metadata fouten"

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-11-26 10:54+0000\n"
"Last-Translator: Bård Sigurd Møller <git@bsmoller.no>\n"
"Language-Team: Norwegian Nynorsk <https://hosted.weblate.org/projects/f-droid/fdroidserver/nn/>\n"
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1991,6 +2001,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.3.3\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1477,6 +1482,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1990,6 +2000,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -2,13 +2,13 @@
#
# add completed translations from weblate to MANIFEST.in
import git
import json
import os
import re
import requests
import subprocess
import git
import requests
projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
localedir = os.path.join(projectbasedir, 'locale')

View file

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-13 20:43+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-06-24 12:05+0000\n"
"Last-Translator: WaldiS <sto@tutanota.de>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/>\n"
"Language: pl\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.11-dev\n"
"X-Generator: Weblate 5.13-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -45,7 +45,7 @@ msgstr "\"%s/\" nie ma pasującego pliku metadanych!"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "Klucz „isPrimary” nie powinien być dodawany do mirrorów!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -363,6 +363,11 @@ msgstr[0] "Nie można zbudować z powodu błędu {} podczas skanowania"
msgstr[1] "Nie można zbudować z powodu błędów {} podczas skanowania"
msgstr[2] "Nie można zbudować z powodu błędów {} podczas skanowania"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Błąd odczytu {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "Czytaj '{config_file}'"
msgstr "Tworzenie pustego pliku {config_file}"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -657,12 +662,12 @@ msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "BŁĄD: {key} nie jest prawidłowym kluczem!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "BŁĄD: wartość klucza {key} powinna być typu {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!"
msgstr "Zmienna środowiskowa{{env: {var}}} nie została ustawiona!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "Ignorowanie błędnego elementu w manifeście: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} jest przestarzałe, użyj {newfile}"
msgstr "{oldfile} jest przestarzałe, użyj {newfile}!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1143,7 +1148,7 @@ msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "Konfiguracja Mirror dla {url} zawiera klucz \"isPrimary\"!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1310,7 +1315,7 @@ msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Akceptowany jest tylko jeden klucz \"env\""
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1471,7 +1476,7 @@ msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Odmowa podpisania pliku {path}, ponieważ istnieje on zarówno w folderze {dir1}, jak i {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1490,6 +1495,11 @@ msgstr "Usuwanie „{path}”"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1700,7 +1710,7 @@ msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "Pakiet Pythona „qrcode” nie jest zainstalowany (np. apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2011,6 +2021,10 @@ msgstr "Weryfikacja pakietu {path} za pomocą apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB, użyj {url}, aby przesłać {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Ostrzegaj o możliwych błędach metadanych"
@ -2601,7 +2615,7 @@ msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\".
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} to duplikat {path2}, usuń jeden z nich!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-02 21:32+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-04-06 16:45+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/>\n"
"Language: pt\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.10.3-dev\n"
"X-Generator: Weblate 5.11-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -44,7 +44,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Não é possível construir devido a erro {} durante a digitalização"
msgstr[1] "Não é possível construir devido a erros {} durante a digitalização"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Falha de leitura {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -483,9 +488,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Criando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "A ler '{config_file}'"
msgstr "A criar '{config_file}' vazio"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -655,12 +660,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "ERRO: {key} não é uma chave válida!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "ERRO: o valor de {key} deve ser do tipo {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -687,9 +692,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "A variável de ambiente {var} de {configname} não está definida!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "A variável de ambiente {var} de {configname} não está definida!"
msgstr "A variável de ambiente {{env: {var} não está definida!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -931,9 +936,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "A ignorar o elemento mau no manifesto: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} está obsoleto, use {newfile}"
msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1141,7 +1146,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1308,7 +1313,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Aceita apenas uma única chave \"env\""
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1469,7 +1474,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1488,6 +1493,11 @@ msgstr "A remover {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1697,7 +1707,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "O pacote Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2008,6 +2018,10 @@ msgstr "A verificar o pacote {path} com apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avisar sobre possíveis erros de metadados"
@ -2595,7 +2609,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} é uma duplicata de {path2}, remova uma!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -19,9 +19,9 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-21 18:43+0000\n"
"Last-Translator: LucasMZ <git@lucasmz.dev>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
"Last-Translator: Igor Rückert <igorruckert@yahoo.com.br>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
@ -371,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Não é possível criar devido a {} erro durante a digitalização"
msgstr[1] "Não é possível criar devido a {} erros durante a digitalização"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Falha ao ler {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1479,7 +1484,7 @@ msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Recusando assinar '{path}', o arquivo existe nas pastas {dir1} e {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1498,6 +1503,11 @@ msgstr "Removendo {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2018,6 +2028,10 @@ msgstr "Verificando o pacote {path} com apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, utilize {url} para enviar para {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avisa sobre possíveis erros de metadados"

View file

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-02 21:32+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-05-30 07:19+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/>\n"
"Language: pt_PT\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.10.3-dev\n"
"X-Generator: Weblate 5.12-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -46,7 +46,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Não é possível construir devido a erro {} durante a digitalização"
msgstr[1] "Não é possível construir devido a erros {} durante a digitalização"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Falha de leitura {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Criando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "A ler '{config_file}'"
msgstr "A criar '{config_file}' vazio"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -657,12 +662,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "ERRO: {key} não é uma chave válida!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "ERRO: o valor de {key} deve ser do tipo {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "A variável de ambiente {var} de {configname} não está definida!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "A variável de ambiente {var} de {configname} não está definida!"
msgstr "A variável de ambiente {{env: {var} não está definida!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "A ignorar o elemento mau no manifesto: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} está obsoleto, use {newfile}"
msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1143,7 +1148,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1310,7 +1315,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Aceita apenas uma única chave \"env\""
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1471,7 +1476,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1490,6 +1495,11 @@ msgstr "A remover {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1699,7 +1709,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "O pacote de Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2010,6 +2020,10 @@ msgstr "A verificar o pacote {path} com apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avisar sobre possíveis erros de metadados"
@ -2597,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} é uma duplicata de {path2}, remova uma!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-12-02 17:00+0000\n"
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/>\n"
@ -362,6 +362,11 @@ msgstr[0] "Nu se poate construi din cauza unei erori {} în timpul scanării"
msgstr[1] "Nu se poate construi din cauza erorilor {} în timpul scanării"
msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "A eșuat citirea {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1489,6 +1494,11 @@ msgstr "Eliminarea lui {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2011,6 +2021,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utilizați {url} pentru a încărca {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Avertizează cu privire la posibile erori de metadate"

View file

@ -16,20 +16,21 @@
# gfbdrgng <hnaofegnp@hldrive.com>, 2024.
# neverender <audiolunaire@getgoogleoff.me>, 2024.
# Dmitry <dmitrydmitry761@gmail.com>, 2024.
# Artyom Rybakov <rib.artem@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-01-25 15:42+0000\n"
"Last-Translator: Golubev Alexander <fatzer2@gmail.com>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-06-24 10:15+0000\n"
"Last-Translator: Artyom Rybakov <rib.artem@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.10-dev\n"
"X-Generator: Weblate 5.13-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -55,7 +56,7 @@ msgstr "У \"%s/\" нет соответствующего файла метад
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "Ключ \"IsPrimary\" не следует добавлять в зеркала!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -373,6 +374,11 @@ msgstr[0] "Запустить сборку невозможно из-за {} о
msgstr[1] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных"
msgstr[2] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Не удалось распознать {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -495,9 +501,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Создание \"{path}\" для конфигурации s3cmd."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "Чтение '{config_file}'"
msgstr "Создание пустого '{config_file}'"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -667,12 +673,12 @@ msgstr "ОШИБКА: {key} в {path} должен быть или \"archive\",
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "ОШИБКА: {key} недействительный ключ!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "ОШИБКА: значение {key} должно быть типа {t}!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -699,9 +705,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "Переменная среды {var} из {configname} не установлена!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "Переменная среды {var} из {configname} не установлена!"
msgstr "Переменная среды {{env: {var}}} не установлена!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -943,9 +949,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "Проигнорировано: плохой элемент в манифесте: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} признан устаревшим; используйте {newfile}"
msgstr "Устаревший {oldfile} игнорируется, используйте {newfile}!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1153,7 +1159,7 @@ msgstr "Достигнута максимальная глубина рекур
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "Конфигурация зеркала для {url} содержит ключ \"IsPrimary\"!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1320,7 +1326,7 @@ msgstr "Допускаются изображения только в форма
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Принимает только один ключ \"env\""
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1481,7 +1487,7 @@ msgstr "Обновление и кэширование правил и сигн
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Отказываюсь подписывать '{path}', файл существует как в папке {dir1}, так и в папке {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1500,6 +1506,11 @@ msgstr "Удаление {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1710,7 +1721,7 @@ msgstr "Тестовый режим. Все собранное попадает
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "Пакет Python \"qrcode\" не установлен (например, apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2021,6 +2032,10 @@ msgstr "Проверка пакета {path} с помощью apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Через API VirusTotal нельзя загрузить файлы больше 32MB, загрузите {path} на {url} самостоятельно."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Предупреждать о возможных ошибках в метаданных"
@ -2611,7 +2626,7 @@ msgstr "{name}: \"{section}/icons/{path}\" не существует! Попра
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1} дублирует {path2}, удалите один!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -353,6 +353,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1992,6 +2002,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-21 08:45+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-26 21:33+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
"Language-Team: Albanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/>\n"
"Language: sq\n"
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Smontohet dot, për shkak të {} gabimi teksa skanohej"
msgstr[1] "Smontohet dot, për shkak të {} gabimeve teksa skanohej"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Su arrit të lexohej {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1466,7 +1471,7 @@ msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Spo pranohet të nënshkruhet '{path}', kartela ekziston te të dyja dosjet, {dir1} dhe {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1485,6 +1490,11 @@ msgstr "Po hiqet {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2006,6 +2016,10 @@ msgstr "Po verifikohet paketë {path} me apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Kyçi API VirusTotal smund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.1b0\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-12-30 22:00+0000\n"
"Last-Translator: Reno Tx <renotx@users.noreply.hosted.weblate.org>\n"
"Language-Team: Serbian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/>\n"
@ -361,6 +361,11 @@ msgstr[0] "Не може се изградити због {} грешке при
msgstr[1] "Не може се изградити због {} грешке приликом скенирања"
msgstr[2] "Не може се изградити због {} грешака приликом скенирања"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Није успело читање {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1488,6 +1493,11 @@ msgstr "Уклањање {path}"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Преименујте APK фајлове који не одговарају package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2009,6 +2019,10 @@ msgstr "Провера пакета {path} са apksigner."
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal API кључ не може отпремити датотеке веће од 32MB, користи {url} за отпремање {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Упозорење о могућим грешкама у метаподацима"

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-17 21:44+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/>\n"
@ -362,6 +362,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "{path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1487,6 +1492,11 @@ msgstr "Tar bort {path}''"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Byt namn på APK-filer som inte matchar paket.namn_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2000,6 +2010,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Visa varningar vid möjliga metadatafel"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.3a1\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2024-09-08 11:09+0000\n"
"Last-Translator: abelbiwott-dev <abelbiwott@outlook.com>\n"
"Language-Team: Swahili <https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/>\n"
@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Haiwezi kujenga kutokana na kosa la {} wakati wa uchanganuzi"
msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} wakati wa uchanganuzi"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Imeshindwa kusoma {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1486,6 +1491,11 @@ msgstr "Kuondoa {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Badilisha jina la faili za APK ambazo hazilingani na package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2007,6 +2017,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-01-20 14:04+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/>\n"
@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "ச்கேன் செய்யும் போது {} பிழை காரணமாக உருவாக்க முடியாது"
msgstr[1] "ச்கேன் செய்யும் போது {} பிழைகள் காரணமாக உருவாக்க முடியாது"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "தோல்வியுற்ற வாசிப்பு {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1487,6 +1492,11 @@ msgstr "{path} \"ஐ நீக்குதல்"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "தொகுப்புடன் பொருந்தாத APK கோப்புகளை மறுபெயரிடுங்கள். NAME_123.APK"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2007,6 +2017,10 @@ msgstr "Apksigner உடன் தொகுப்பு {path} ஐ சரிப
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "வைரச்டோட்டல் பநிஇ விசையை 32MB ஐ விட பெரிய கோப்புகளை பதிவேற்ற முடியாது, {path} பதிவேற்ற {url} ஐப் பயன்படுத்தவும்."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "சாத்தியமான மேனிலை தரவு பிழைகள் குறித்து எச்சரிக்கவும்"

View file

@ -4,20 +4,23 @@
# Orhan <orya@pm.me>, 2021.
# Oğuz Ersen <oguz@ersen.moe>, 2022, 2023, 2024.
# Bai <batuhanakkurt000@gmail.com>, 2023.
# "M. Fatih Uluçam" <mulucam@gmail.com>, 2025.
# Nuri KÜÇÜKLER <enatsek@gmail.com>, 2025.
# Bora Atıcı <boratici.acc@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2024-09-10 23:49+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-05-26 22:01+0000\n"
"Last-Translator: Bora Atıcı <boratici.acc@gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.8-dev\n"
"X-Generator: Weblate 5.12-dev\n"
#: ../fdroidserver/nightly.py
msgid ""
@ -43,7 +46,7 @@ msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!"
#: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr ""
msgstr "\"isPrimary\" anahtarı yansılara eklenmemelidir!"
#: ../fdroidserver/index.py
#, python-brace-format
@ -170,7 +173,7 @@ msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı"
#: ../fdroidserver/checkupdates.py
msgid "--merge-request only runs on a single appid!"
msgstr ""
msgstr "--merge-request yalnızca tek bir uygulama kimliğinde çalışır!"
#: ../fdroidserver/checkupdates.py
#, python-brace-format
@ -295,11 +298,11 @@ msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır."
#: ../fdroidserver/install.py
msgid "Automatic no to all prompts."
msgstr ""
msgstr "Bütün sorulara otomatik olarak hayır."
#: ../fdroidserver/install.py
msgid "Automatic yes to all prompts."
msgstr ""
msgstr "Bütün sorulara otomatik olarak evet."
#: ../fdroidserver/index.py
#, python-brace-format
@ -360,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "Tarama sırasında {} hata nedeniyle inşa edilemiyor"
msgstr[1] "Tarama sırasında {} hata nedeniyle inşa edilemiyor"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "{path} okunamadı: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -396,7 +404,7 @@ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işle
#: ../fdroidserver/common.py
msgid "Color the log output"
msgstr ""
msgstr "Günlük çıktısını renklendir"
#: ../fdroidserver/import_subcommand.py
msgid "Comma separated list of categories."
@ -413,7 +421,7 @@ msgstr "Değişiklikleri işle"
#: ../fdroidserver/checkupdates.py
msgid "Commit changes, push, then make a merge request"
msgstr ""
msgstr "Değişiklikleri uygula, yükle ve bir birleştirme isteği yap"
#: ../fdroidserver/metadata.py
#, python-brace-format
@ -482,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor."
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Creating empty {config_file}"
msgstr "'{config_file}' okunuyor"
msgstr "Boş {config_file} oluşturuluyor"
#: ../fdroidserver/publish.py
msgid "Creating log directory"
@ -598,7 +606,7 @@ msgstr "Rsync sağlama toplamlarını kullanma"
#: ../fdroidserver/install.py
msgid "Download F-Droid.apk using mirrors that leak less to the network"
msgstr ""
msgstr "F-Droid.apk'yı ağa az bilgi sızdıracak şekilde indir"
#: ../fdroidserver/__main__.py
msgid "Download complete mirrors of small repos"
@ -654,12 +662,12 @@ msgstr "HATA: {path} içindeki {key} \"archive\" veya \"repo\" değil!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key} not a valid key!"
msgstr ""
msgstr "HATA: {key} geçerli bir anahtar değil!"
#: ../fdroidserver/lint.py
#, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!"
msgstr ""
msgstr "Hata: {key} anahtarının değeri {t} tipinde olmalı!"
#: ../fdroidserver/lint.py
#, python-brace-format
@ -686,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!"
msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!"
msgstr "Ortam değişkeni {{env: {var}}} ayarlanmadı!"
#: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
@ -712,7 +720,7 @@ msgstr "APK'lardan imzaları ayıkla"
#: ../fdroidserver/install.py
msgid "F-Droid.apk could not be downloaded from any known source!"
msgstr ""
msgstr "F-Droid.apk bilinen kaynakların hiç birinden indirilemedi!"
#: ../fdroidserver/update.py
#, python-brace-format
@ -930,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "Manifestteki hatalı öğe yok sayılıyor: %s"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın"
msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın!"
#: ../fdroidserver/index.py
msgid "Ignoring package without metadata: "
@ -1140,7 +1148,7 @@ msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s"
#: ../fdroidserver/index.py
#, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr ""
msgstr "{url} için yansı yapılandırması \"isPrimary\" anahtarını içeriyor!"
#: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types."
@ -1173,7 +1181,7 @@ msgstr "Bağlı aygıt bulunamadı"
#: ../fdroidserver/install.py
msgid "No devices found for `adb install`! Please plug one in."
msgstr ""
msgstr "`adb install` için aygıt bulunamadı! Lütfen bir tane takın."
#: ../fdroidserver/index.py
msgid "No fingerprint in URL."
@ -1307,7 +1315,7 @@ msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\""
msgstr ""
msgstr "Sadece bir tane anahtar \"env\" kabul edilir"
#: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates"
@ -1377,7 +1385,7 @@ msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz"
#: ../fdroidserver/install.py
#, python-brace-format
msgid "Privacy mode was enabled based on your locale ({country_code})."
msgstr ""
msgstr "Yerel ayarınız ({country_code}) baz alınarak gizlilik kipi etkinleştirildi."
#: ../fdroidserver/scanner.py
#, python-format
@ -1468,11 +1476,11 @@ msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "'{path}' imzalanması reddedildi, dosya hem {dir1} hem de {dir2} dizininde yer alıyor."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
msgstr ""
msgstr "Başarıyla doğrulanmışsa, kaynak sıkıştırılmış dosyayı ve var olan bütün APK'ları kaldır."
#: ../fdroidserver/common.py
msgid "Removing specified files"
@ -1487,6 +1495,11 @@ msgstr "\"{path}\" kaldırılıyor"
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1503,7 +1516,7 @@ msgstr "Çıkışı uyarılara ve hatalara kısıtla"
#: ../fdroidserver/net.py
#, python-format
msgid "Retrying failed download: %s"
msgstr ""
msgstr "Başarısız indirme tekrar deneniyor: %s"
#: ../fdroidserver/__main__.py
msgid "Rewrite all the metadata files"
@ -1572,7 +1585,7 @@ msgstr[1] "Tarayıcı {} sorun buldu"
#: ../fdroidserver/scanner.py
msgid "Scanning APK for extra signing blocks."
msgstr ""
msgstr "APK'daki ekstra imzalama blokları taranıyor."
#: ../fdroidserver/scanner.py
msgid "Scanning APK with dexdump for known non-free classes."
@ -1696,7 +1709,7 @@ msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa e
#: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
msgstr ""
msgstr "\"qrcode\" Python paketi kurulu değil (yüklemek için: apt-get install python3-qrcode)!"
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py
@ -2000,20 +2013,24 @@ msgstr "İndeks imzası doğrulanıyor:"
#: ../fdroidserver/install.py
#, python-brace-format
msgid "Verifying package {path} with apksigner."
msgstr ""
msgstr "{path} paketi apksigner ile doğrulanıyor."
#: ../fdroidserver/deploy.py
#, python-brace-format
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal API anahtarı 32MB'den büyük dosyaları yükleyemiyor, {path} yüklemek için {url} kullanın."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Olası üst veri hataları hakkında uyar"
#: ../fdroidserver/scanner.py
msgid "WebAssembly binary file"
msgstr ""
msgstr "WebAssembly ikilik dosyası"
#: ../fdroidserver/update.py
msgid "When configured for signed indexes, create only unsigned indexes at this stage"
@ -2029,11 +2046,11 @@ msgstr "İmzalama veya doğrulama başarısız olduğunda, bir hata koduyla çı
#: ../fdroidserver/install.py
msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)"
msgstr ""
msgstr "F-Droid.apk'nın adb aracılığıyla indirilmesini ve yüklenmesini ister misiniz? (EVET/hayır)"
#: ../fdroidserver/install.py
msgid "Would you like to download the app(s) from f-droid.org? (YES/no)"
msgstr ""
msgstr "Uygulamaları f-droid.org adresinden indirmek ister misiniz? (EVET/hayır)"
#: ../fdroidserver/init.py
msgid "X.509 'Distinguished Name' used when generating keys"
@ -2050,7 +2067,7 @@ msgstr "ZIP dosya arşivi"
#: ../fdroidserver/install.py
#, python-brace-format
msgid "adb reports {serial} is \"{status}\"!"
msgstr ""
msgstr "adb {serial} için {status} durumunu veriyor!"
#: ../fdroidserver/nightly.py
#, python-brace-format
@ -2467,7 +2484,7 @@ msgstr "şu argümanlar gerekli: %s"
#: ../fdroidserver/install.py
msgid "true"
msgstr ""
msgstr "doğru"
#: /usr/lib/python3.11/argparse.py
#, python-format
@ -2504,7 +2521,7 @@ msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..."
#: ../fdroidserver/install.py
msgid "yes"
msgstr ""
msgstr "evet"
#: ../fdroidserver/publish.py
#, python-brace-format
@ -2594,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin."
#: ../fdroidserver/update.py
#, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr ""
msgstr "{path1}, {path2} 'in bir kopyasıdır, birini kaldırın!"
#: ../fdroidserver/import_subcommand.py
#, python-brace-format
@ -2619,7 +2636,7 @@ msgstr "{path} virustotal tarafından {count} defa işaretlendi:"
#: ../fdroidserver/install.py
#, python-brace-format
msgid "{path} has the wrong fingerprint ({fingerprint})!"
msgstr ""
msgstr "{path} yanlış {fingerprint} parmak izine sahip!"
#: ../fdroidserver/common.py
#, python-brace-format

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2020-10-29 08:32+0000\n"
"Last-Translator: Hakim Oubouali <hakim.oubouali.skr@gmail.com>\n"
"Language-Team: Central Atlas Tamazight <https://hosted.weblate.org/projects/f-droid/fdroidserver/tzm/>\n"
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1991,6 +2001,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2018-06-08 03:44+0000\n"
"Last-Translator: ۋولقان <nureliosman@gmail.com>\n"
"Language-Team: Uyghur <https://hosted.weblate.org/projects/f-droid/fdroidserver/ug/>\n"
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] ""
msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1480,6 +1485,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1993,6 +2003,10 @@ msgstr ""
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr ""

View file

@ -17,8 +17,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-24 14:02+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-27 19:35+0000\n"
"Last-Translator: Ihor Hordiichuk <igor_ck@outlook.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/>\n"
"Language: uk\n"
@ -370,6 +370,11 @@ msgstr[0] "Неможливо створити через {} помилку пі
msgstr[1] "Неможливо створити через {} помилки під час сканування"
msgstr[2] "Неможливо створити через {} помилок під час сканування"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "Не вдалося розпізнати {path}: {error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1478,7 +1483,7 @@ msgstr "Оновлення та кешування правил і сигнат
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "Відмова підписати '{path}', файл існує в теках {dir1} і {dir2}."
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1497,6 +1502,11 @@ msgstr "Вилучення {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2018,6 +2028,10 @@ msgstr "Перевірка пакета {path} за допомогою apksigner
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "Ключ API VirusTotal не може завантажити файли, розмір яких понад 32 МБ, використовуйте {url} для завантаження {path}."
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "Попереджати про можливі помилки метаданих"

View file

@ -39,8 +39,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
"PO-Revision-Date: 2025-03-21 03:03+0000\n"
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
"Last-Translator: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>\n"
"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/>\n"
"Language: zh_Hans\n"
@ -390,6 +390,11 @@ msgid "Can't build due to {} error while scanning"
msgid_plural "Can't build due to {} errors while scanning"
msgstr[0] "因扫描时的{}错误而无法构建"
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "读取 {path} 失败:{error}"
#: ../fdroidserver/rewritemeta.py
#, python-brace-format
msgid "Cannot rewrite \"{path}\""
@ -1498,7 +1503,7 @@ msgstr "刷新和缓存来自网络的扫描程序规则和签名"
#: ../fdroidserver/publish.py
#, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
msgstr ""
msgstr "拒绝签署 '{path}',文件同时存在于文件夹 {dir1} 和 {dir2}。"
#: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified."
@ -1517,6 +1522,11 @@ msgstr "删除 {path}\""
msgid "Rename APK files that do not match package.name_123.apk"
msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件"
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py
#, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore"
@ -2036,6 +2046,10 @@ msgstr "使用 apksigner 验证包 {path}。"
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。"
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors"
msgstr "警告元数据中可能存在的错误"

Some files were not shown because too many files have changed in this diff Show more