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] [bandit]
skips: B110,B404,B408,B603,B607 skips: B110,B404,B408,B603,B607,B322
targets: . 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: variables:
pip: pip3 --timeout 100 --retries 10 pip: pip3 --timeout 100 --retries 10
# speed up git checkout phase # speed up git checkout phase
@ -50,6 +67,7 @@ metadata_v0:
- git checkout $RELEASE_COMMIT_ID - git checkout $RELEASE_COMMIT_ID
- cd .. - cd ..
- git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git - git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git
- rm -f fdroiddata/config.yml # ignore config for this test
- cd fdroiddata - cd fdroiddata
- ../tests/dump_internal_metadata_format.py - ../tests/dump_internal_metadata_format.py
- cd .. - cd ..
@ -80,12 +98,31 @@ metadata_v0:
# Ubuntu and other distros often lack https:// support # Ubuntu and other distros often lack https:// support
- grep Debian /etc/issue.net - grep Debian /etc/issue.net
&& { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; } && { 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 - echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates
- apt-get update - apt-get update
- apt-get install ca-certificates - apt-get install ca-certificates
- rm /etc/apt/apt.conf.d/99nocacertificates - rm /etc/apt/apt.conf.d/99nocacertificates
- apt-get dist-upgrade - 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 # Since F-Droid uses Debian as its default platform, from production
# servers to CI to contributor machines, it is important to know when # servers to CI to contributor machines, it is important to know when
@ -94,8 +131,8 @@ metadata_v0:
debian_testing: debian_testing:
image: debian:testing image: debian:testing
<<: *apt-template <<: *apt-template
only: rules:
- master@fdroid/fdroidserver - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script: script:
- apt-get install - apt-get install
aapt aapt
@ -123,8 +160,8 @@ debian_testing:
ubuntu_lts_ppa: ubuntu_lts_ppa:
image: ubuntu:latest image: ubuntu:latest
<<: *apt-template <<: *apt-template
only: rules:
- master@fdroid/fdroidserver - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script: script:
- export ANDROID_HOME=/usr/lib/android-sdk - export ANDROID_HOME=/usr/lib/android-sdk
- apt-get install gnupg - apt-get install gnupg
@ -183,24 +220,9 @@ ubuntu_jammy_pip:
- LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind' - 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. # Run all the various linters and static analysis tools.
lint_format_bandit_checks: hooks/pre-commit:
stage: lint
image: debian:bookworm-slim image: debian:bookworm-slim
variables: variables:
LANG: C.UTF-8 LANG: C.UTF-8
@ -215,34 +237,60 @@ lint_format_bandit_checks:
make make
pycodestyle pycodestyle
pyflakes3 pyflakes3
pylint
python3-dev python3-dev
python3-git python3-git
python3-nose python3-nose
python3-pip python3-pip
python3-yaml 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 - $pip install --break-system-packages bandit
- export EXITVALUE=0 - bandit -r -ii --ini .bandit
- 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 pylint:
- bandit stage: lint
-r image: debian:bookworm-slim
-ii <<: *python-rules-changes
--ini .bandit <<: *apt-template
|| set_error script:
- pylint --output-format=colorized --reports=n - apt-get install pylint python3-pip
- $pip install --break-system-packages pylint-gitlab
- pylint --output-format=colorized,pylint_gitlab.GitlabCodeClimateReporter:pylint-report.json
fdroid fdroid
makebuildserver makebuildserver
setup.py setup.py
fdroidserver/*.py fdroidserver/*.py
tests/*.py tests/*.py
|| set_error artifacts:
- shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests reports:
|| set_error codequality: pylint-report.json
- exit $EXITVALUE 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 # 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 # generally fixed in the latest versions in pip/pypi.org, so it isn't
# so important to scan that kind of install in CI. # so important to scan that kind of install in CI.
@ -250,10 +298,7 @@ lint_format_bandit_checks:
safety: safety:
image: debian:bookworm-slim image: debian:bookworm-slim
rules: rules:
# once only:/changes: are ported to rules:, this could be removed: - if: $SAFETY_API_KEY
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_PIPELINE_SOURCE == "push" && $SAFETY_API_KEY
changes: changes:
- .gitlab-ci.yml - .gitlab-ci.yml
- .safety-policy.yml - .safety-policy.yml
@ -276,13 +321,10 @@ safety:
# TODO tests/*/*/*.yaml are not covered # TODO tests/*/*/*.yaml are not covered
yamllint: yamllint:
stage: lint
image: debian:bookworm-slim image: debian:bookworm-slim
rules: rules:
# once only:/changes: are ported to rules:, this could be removed: - changes:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
changes:
- .gitlab-ci.yml - .gitlab-ci.yml
- .safety-policy.yml - .safety-policy.yml
- .yamllint - .yamllint
@ -303,8 +345,8 @@ yamllint:
tests/*/*/.*.yml tests/*/*/.*.yml
# Run all the various linters and static analysis tools.
locales: locales:
stage: lint
image: debian:bookworm-slim image: debian:bookworm-slim
variables: variables:
LANG: C.UTF-8 LANG: C.UTF-8
@ -323,6 +365,7 @@ locales:
black: black:
stage: lint
image: debian:bookworm-slim image: debian:bookworm-slim
<<: *apt-template <<: *apt-template
script: script:
@ -375,8 +418,8 @@ fedora_latest:
macOS: macOS:
tags: tags:
- saas-macos-medium-m1 - saas-macos-medium-m1
only: rules:
- master@fdroid/fdroidserver - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script: script:
- export HOMEBREW_CURL_RETRIES=10 - export HOMEBREW_CURL_RETRIES=10
- brew update > /dev/null - brew update > /dev/null
@ -387,7 +430,7 @@ macOS:
- brew install --cask android-commandlinetools temurin # temurin is a JDK - brew install --cask android-commandlinetools temurin # temurin is a JDK
# test suite dependencies # 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 # 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" - 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" - echo "macOS sticks with bash 3.x because of licenses, so avoid new bash syntax"
- /bin/bash --version - /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 # test fdroidserver from git with current package's dependencies
- fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests
gradle: gradle:
image: debian:bookworm-slim image: debian:trixie-slim
<<: *apt-template <<: *apt-template
variables: rules:
GIT_DEPTH: 1000 - changes:
- .gitlab-ci.yml
- makebuildserver
script: script:
- apt-get install - apt-get install
ca-certificates ca-certificates
git git
openssh-client
python3-bs4
python3-colorama python3-colorama
python3-git
python3-gitlab
python3-packaging python3-packaging
python3-requests 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 - ./tests/gradle-release-checksums.py
# Run an actual build in a simple, faked version of the buildserver guest VM. # Run an actual build in a simple, faked version of the buildserver guest VM.
fdroid build: fdroid build:
image: registry.gitlab.com/fdroid/fdroidserver:buildserver image: registry.gitlab.com/fdroid/fdroidserver:buildserver
only: rules:
changes: - changes:
- .gitlab-ci.yml - .gitlab-ci.yml
- fdroidserver/build.py - fdroidserver/build.py
- fdroidserver/common.py - fdroidserver/common.py
- fdroidserver/exception.py - fdroidserver/exception.py
- fdroidserver/metadata.py - fdroidserver/metadata.py
- fdroidserver/net.py - fdroidserver/net.py
- fdroidserver/scanner.py - fdroidserver/scanner.py
- fdroidserver/vmtools.py - fdroidserver/vmtools.py
# for the docker: job which depends on this one
- makebuildserver
- buildserver/*
cache: cache:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
paths: paths:
@ -486,6 +521,8 @@ fdroid build:
env HOME=$home_vagrant env HOME=$home_vagrant
fdroid" fdroid"
- git -C $home_vagrant/gradlew-fdroid pull
- chown -R vagrant $home_vagrant - chown -R vagrant $home_vagrant
- chown -R vagrant $fdroidserver/.git - chown -R vagrant $fdroidserver/.git
- chown vagrant $fdroidserver/ - chown vagrant $fdroidserver/
@ -511,11 +548,11 @@ fdroid build:
plugin_fetchsrclibs: plugin_fetchsrclibs:
image: debian:bookworm-slim image: debian:bookworm-slim
<<: *apt-template <<: *apt-template
only: rules:
changes: - changes:
- .gitlab-ci.yml - .gitlab-ci.yml
- examples/fdroid_fetchsrclibs.py - examples/fdroid_fetchsrclibs.py
- fdroidserver/__main__.py - fdroidserver/__main__.py
script: script:
- apt-get install - apt-get install
curl curl
@ -555,8 +592,8 @@ plugin_fetchsrclibs:
servergitmirrors: servergitmirrors:
image: debian:bookworm-slim image: debian:bookworm-slim
<<: *apt-template <<: *apt-template
only: rules:
- master@fdroid/fdroidserver - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
script: script:
- apt-get install - apt-get install
default-jdk-headless default-jdk-headless
@ -598,6 +635,7 @@ servergitmirrors:
Build documentation: Build documentation:
image: debian:bookworm-slim image: debian:bookworm-slim
<<: *python-rules-changes
<<: *apt-template <<: *apt-template
script: script:
- apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver - apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver
@ -617,8 +655,8 @@ Build documentation:
Windows: Windows:
tags: tags:
- windows - windows
only: rules:
- windows - if: $CI_COMMIT_BRANCH == "windows"
script: script:
- Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
- choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath" - choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath"
@ -669,7 +707,9 @@ pages:
artifacts: artifacts:
paths: paths:
- public - public
needs: ["Build documentation"] needs:
- job: "Build documentation"
optional: true
rules: rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch
@ -681,13 +721,12 @@ pages:
docker: docker:
dependencies: dependencies:
- fdroid build - fdroid build
only: rules:
changes: - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
- .gitlab-ci.yml changes:
- makebuildserver - .gitlab-ci.yml
- buildserver/* - makebuildserver
variables: - buildserver/*
- $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid"
image: docker:dind image: docker:dind
services: services:
- docker:dind - docker:dind
@ -714,11 +753,12 @@ docker:
# PUBLISH is the signing server. It has a very minimal manual setup. # PUBLISH is the signing server. It has a very minimal manual setup.
PUBLISH: PUBLISH:
image: debian:bullseye-backports image: debian:bookworm-backports
<<: *python-rules-changes
script: script:
- apt-get update - apt-get update
- apt-get -qy upgrade - 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 androguard
apksigner apksigner
curl 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/) 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 ## [2.4.0] - 2025-03-25
### Added ### Added

View file

@ -20,6 +20,7 @@ include examples/template.yml
include examples/Vagrantfile.yaml include examples/Vagrantfile.yaml
include gradlew-fdroid include gradlew-fdroid
include LICENSE include LICENSE
include locale/ba/LC_MESSAGES/fdroidserver.po
include locale/bo/LC_MESSAGES/fdroidserver.po include locale/bo/LC_MESSAGES/fdroidserver.po
include locale/ca/LC_MESSAGES/fdroidserver.po include locale/ca/LC_MESSAGES/fdroidserver.po
include locale/cs/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-allowlisted/build.gradle
include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/app/build.gradle
include tests/source-files/firebase-suspect/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/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/.dart_tool/flutter_gen/pubspec.yaml
include tests/source-files/lockfile.test/flutter/pubspec.lock 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_signindex.py
include tests/test_update.py include tests/test_update.py
include tests/test_vcs.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/.gitignore
include tests/triple-t-2/build/org.piwigo.android/app/build.gradle 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 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 # Ensure fdroidserver's dependencies are marked manual before purging
# unneeded packages, otherwise, all its dependencies get purged. # 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 \ 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 \ && 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 update \
&& apt-get install ca-certificates \ && 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 upgrade \
&& apt-get dist-upgrade \ && apt-get dist-upgrade \
&& apt-get install openssh-client iproute2 python3 openssh-server sudo \ && 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 apt-get update || apt-get update
packages=" packages="
androguard/bookworm-backports
apksigner apksigner
default-jdk-headless default-jdk-headless
default-jre-headless default-jre-headless

View file

@ -25,7 +25,12 @@ fi
chmod -R a+rX /opt/gradle chmod -R a+rX /opt/gradle
test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin 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 -h vagrant:vagrant /opt/gradle/bin/gradle
chown vagrant:vagrant /opt/gradle/versions chown vagrant:vagrant /opt/gradle/versions
chmod 0755 /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 os
import sys import sys
sys.path.insert(0, os.path.abspath('../../fdroidserver')) sys.path.insert(0, os.path.abspath('../../fdroidserver'))
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,7 +3,6 @@ import glob
import os import os
import sys import sys
# support running straight from git and standard installs # support running straight from git and standard installs
rootpaths = [ rootpaths = [
os.path.realpath(os.path.join(os.path.dirname(__file__), '..')), os.path.realpath(os.path.join(os.path.dirname(__file__), '..')),
@ -15,7 +14,10 @@ rootpaths = [
localedir = None localedir = None
for rootpath in rootpaths: 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') localedir = os.path.join(rootpath, 'locale')
break break
@ -24,39 +26,52 @@ gettext.textdomain('fdroidserver')
_ = gettext.gettext _ = gettext.gettext
from fdroidserver.exception import (FDroidException, from fdroidserver.exception import (
MetaDataException, FDroidException,
VerificationException) # NOQA: E402 MetaDataException,
VerificationException, # NOQA: E402
)
FDroidException # NOQA: B101 FDroidException # NOQA: B101
MetaDataException # NOQA: B101 MetaDataException # NOQA: B101
VerificationException # NOQA: B101 VerificationException # NOQA: B101
from fdroidserver.common import (verify_apk_signature, from fdroidserver.common import genkeystore as generate_keystore # NOQA: E402
genkeystore as generate_keystore) # NOQA: E402 from fdroidserver.common import verify_apk_signature
verify_apk_signature # NOQA: B101 verify_apk_signature # NOQA: B101
generate_keystore # NOQA: B101 generate_keystore # NOQA: B101
from fdroidserver.index import (download_repo_index, from fdroidserver.index import (
download_repo_index_v1, download_repo_index,
download_repo_index_v2, download_repo_index_v1,
get_mirror_service_urls, download_repo_index_v2,
make as make_index) # NOQA: E402 get_mirror_service_urls,
)
from fdroidserver.index import make as make_index # NOQA: E402
download_repo_index # NOQA: B101 download_repo_index # NOQA: B101
download_repo_index_v1 # NOQA: B101 download_repo_index_v1 # NOQA: B101
download_repo_index_v2 # NOQA: B101 download_repo_index_v2 # NOQA: B101
get_mirror_service_urls # NOQA: B101 get_mirror_service_urls # NOQA: B101
make_index # NOQA: B101 make_index # NOQA: B101
from fdroidserver.update import (process_apk, from fdroidserver.update import (
process_apks, process_apk,
scan_apk, process_apks,
scan_repo_files) # NOQA: E402 scan_apk,
scan_repo_files, # NOQA: E402
)
process_apk # NOQA: B101 process_apk # NOQA: B101
process_apks # NOQA: B101 process_apks # NOQA: B101
scan_apk # NOQA: B101 scan_apk # NOQA: B101
scan_repo_files # NOQA: B101 scan_repo_files # NOQA: B101
from fdroidserver.deploy import (update_awsbucket, from fdroidserver.deploy import (
update_servergitmirrors, update_awsbucket,
update_serverwebroots, update_servergitmirrors,
update_serverwebroot) # NOQA: E402 update_serverwebroot, # NOQA: E402
update_serverwebroots,
)
update_awsbucket # NOQA: B101 update_awsbucket # NOQA: B101
update_servergitmirrors # NOQA: B101 update_servergitmirrors # NOQA: B101
update_serverwebroots # 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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import re import importlib.metadata
import sys import logging
import os import os
import pkgutil import pkgutil
import logging import re
import importlib.metadata import sys
import git
import fdroidserver.common
import fdroidserver.metadata
from fdroidserver import _
from argparse import ArgumentError from argparse import ArgumentError
from collections import OrderedDict from collections import OrderedDict
import git
import fdroidserver.common
import fdroidserver.metadata
from fdroidserver import _
COMMANDS = OrderedDict([ COMMANDS = OrderedDict([
("build", _("Build a package from source")), ("build", _("Build a package from source")),

View file

@ -68,9 +68,18 @@ import struct
import sys import sys
import zipfile import zipfile
import zlib import zlib
from collections import namedtuple 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" __version__ = "1.1.1"
NAME = "apksigcopier" NAME = "apksigcopier"

View file

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

View file

@ -18,31 +18,27 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os import argparse
import shutil
import glob import glob
import subprocess import logging
import os
import posixpath import posixpath
import re import re
import shutil
import subprocess
import tarfile import tarfile
import threading
import traceback
import time
import requests
import tempfile import tempfile
import argparse import threading
import logging import time
import traceback
from gettext import ngettext from gettext import ngettext
from pathlib import Path from pathlib import Path
from . import _ import requests
from . import common
from . import net from . import _, common, metadata, net, scanner, vmtools
from . import metadata
from . import scanner
from . import vmtools
from .common import FDroidPopen from .common import FDroidPopen
from .exception import FDroidException, BuildException, VCSException from .exception import BuildException, FDroidException, VCSException
try: try:
import paramiko import paramiko
@ -155,9 +151,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
ftp.mkdir('fdroidserver') ftp.mkdir('fdroidserver')
ftp.chdir('fdroidserver') ftp.chdir('fdroidserver')
ftp.put(os.path.join(serverpath, '..', 'fdroid'), 'fdroid') 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('fdroid', 0o755) # nosec B103 permissions are appropriate
ftp.chmod('gradlew-fdroid', 0o755) # nosec B103 permissions are appropriate
send_dir(os.path.join(serverpath)) send_dir(os.path.join(serverpath))
ftp.chdir(homedir) 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) logging.critical("Android NDK '%s' is not a directory!" % ndk_path)
raise FDroidException() raise FDroidException()
common.set_FDroidPopen_env(build) common.set_FDroidPopen_env(app, build)
# create ..._toolsversion.log when running in builder vm # create ..._toolsversion.log when running in builder vm
if onserver: if onserver:
@ -541,13 +535,13 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
if build.preassemble: if build.preassemble:
gradletasks += build.preassemble gradletasks += build.preassemble
flavours = build.gradle flavors = build.gradle
if flavours == ['yes']: if flavors == ['yes']:
flavours = [] 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']] cmd = [config['gradle']]
if build.gradleprops: 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') bindir = os.path.join(root_dir, 'bin')
if os.path.isdir(os.path.join(build_dir, '.git')): if os.path.isdir(os.path.join(build_dir, '.git')):
import git commit_id = str(common.get_head_commit_id(build_dir))
commit_id = common.get_head_commit_id(git.repo.Repo(build_dir))
else: else:
commit_id = build.commit 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 # really old path
os.path.join(root_dir, 'build', 'apk'), os.path.join(root_dir, 'build', 'apk'),
] ]
# If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in # If we build with gradle flavors with gradle plugin >= 3.0 the APK will be in
# a subdirectory corresponding to the flavour command used, but with different # a subdirectory corresponding to the flavor command used, but with different
# capitalization. # capitalization.
if flavours_cmd: if flavors_cmd:
apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavours_cmd, str.lower), 'release')) 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 apks_dir in apk_dirs:
for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']: for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']:
apks = glob.glob(os.path.join(apks_dir, apkglob)) 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import configparser import configparser
import git import copy
import logging
import os import os
import re import re
import urllib.request
import urllib.error
import time
import subprocess import subprocess
import sys import sys
from argparse import ArgumentParser import time
import traceback import traceback
import logging import urllib.error
import copy
import urllib.parse import urllib.parse
import urllib.request
from argparse import ArgumentParser
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
from . import _ import git
from . import common
from . import metadata
from . import net
from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException
from . import _, common, metadata, net
from .exception import (
FDroidException,
MetaDataException,
NoSubmodulesException,
VCSException,
)
# https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36 # https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36
BOT_EMAIL = 'fdroidci@bubu1.eu' BOT_EMAIL = 'fdroidci@bubu1.eu'
@ -724,7 +726,7 @@ def checkout_appid_branch(appid):
try: try:
git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}') git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}')
except Exception as e: 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: if appid in git_repo.remotes.origin.refs:
start_point = f"origin/{appid}" start_point = f"origin/{appid}"
for commit in git_repo.iter_commits( for commit in git_repo.iter_commits(
@ -749,7 +751,7 @@ def get_changes_versus_ref(git_repo, ref, f):
return changes 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. """Make git branch then push commits as merge request.
The appid is parsed from the actual file that was changed so that 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 * 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('.') git_repo = git.Repo.init('.')
upstream_main = get_upstream_main_branch(git_repo) upstream_main = get_upstream_main_branch(git_repo)
files = set() files = set()
@ -783,6 +789,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
if not files: if not files:
return 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 remote = git_repo.remotes.origin
if branch_name in remote.refs: if branch_name in remote.refs:
if not get_changes_versus_ref(git_repo, f'origin/{branch_name}', files[0]): 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: if current_version_only:
push_options.append('merge_request.draft') push_options.append('merge_request.draft')
progress = None progress = git.RemoteProgress()
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()
pushinfos = remote.push( pushinfos = remote.push(
branch_name, f"HEAD:refs/heads/{branch_name}",
progress=progress, progress=progress,
force=True, force=True,
set_upstream=True, set_upstream=True,
@ -828,22 +827,22 @@ def push_commits(branch_name='checkupdates', verbose=False):
) )
for pushinfo in pushinfos: 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 & ( if pushinfo.flags & (
git.remote.PushInfo.ERROR git.remote.PushInfo.ERROR
| git.remote.PushInfo.REJECTED | git.remote.PushInfo.REJECTED
| git.remote.PushInfo.REMOTE_FAILURE | git.remote.PushInfo.REMOTE_FAILURE
| git.remote.PushInfo.REMOTE_REJECTED | 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( raise FDroidException(
f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}'
) )
else: else:
logging.debug(remote.url + ': ' + pushinfo.summary) logging.info(remote.url + ': ' + pushinfo.summary)
def prune_empty_appid_branches(git_repo=None, main_branch='main'): def prune_empty_appid_branches(git_repo=None, main_branch='main'):
@ -953,7 +952,7 @@ def main():
exit_code = 1 exit_code = 1
if options.appid and options.merge_request: if options.appid and options.merge_request:
push_commits(verbose=options.verbose) push_commits()
prune_empty_appid_branches() prune_empty_appid_branches()
status_update_json(processed, failed) status_update_json(processed, failed)

View file

@ -52,52 +52,58 @@ environment variable to include.
""" """
import ast
import base64
import copy import copy
import difflib import difflib
from typing import List import filecmp
import git
import glob import glob
import io
import os
import sys
import re
import ast
import gzip import gzip
import hashlib
import io
import itertools
import json
import logging
import operator
import os
import re
import shutil import shutil
import socket
import stat import stat
import subprocess import subprocess
import time import sys
import operator
import logging
import hashlib
import socket
import base64
import zipfile
import tempfile import tempfile
import json import time
from pathlib import Path import zipfile
import defusedxml.ElementTree as XMLElementTree
from argparse import BooleanOptionalAction from argparse import BooleanOptionalAction
from asn1crypto import cms
from base64 import urlsafe_b64encode from base64 import urlsafe_b64encode
from binascii import hexlify from binascii import hexlify
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from pathlib import Path
from queue import Queue from queue import Queue
from typing import List
from urllib.parse import urlparse, urlsplit, urlunparse from urllib.parse import urlparse, urlsplit, urlunparse
from zipfile import ZipFile from zipfile import ZipFile
import defusedxml.ElementTree as XMLElementTree
import git
from asn1crypto import cms
import fdroidserver.metadata import fdroidserver.metadata
from fdroidserver import _ from fdroidserver import _
from fdroidserver._yaml import yaml, config_dump from fdroidserver._yaml import config_dump, yaml
from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ from fdroidserver.exception import (
BuildException, VerificationException, MetaDataException BuildException,
from .asynchronousfilereader import AsynchronousFileReader FDroidException,
from .looseversion import LooseVersion MetaDataException,
NoSubmodulesException,
VCSException,
VerificationException,
)
from . import apksigcopier, common from . import apksigcopier, common
from .asynchronousfilereader import AsynchronousFileReader
from .looseversion import LooseVersion
# The path to this fdroidserver distribution # The path to this fdroidserver distribution
FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
@ -182,7 +188,7 @@ default_config = {
'scan_binary': False, 'scan_binary': False,
'ant': "ant", 'ant': "ant",
'mvn3': "mvn", 'mvn3': "mvn",
'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), 'gradle': shutil.which('gradlew-fdroid'),
'sync_from_local_copy_dir': False, 'sync_from_local_copy_dir': False,
'allow_disabled_algorithms': False, 'allow_disabled_algorithms': False,
'keep_when_not_allowed': 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(): def read_config():
"""Read the repository config. """Read the repository config.
@ -600,25 +660,7 @@ def read_config():
fill_config_defaults(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: if 'servergitmirrors' in config:
config['servergitmirrors'] = parse_list_of_dicts(config['servergitmirrors'])
limit = config['git_mirror_size_limit'] limit = config['git_mirror_size_limit']
config['git_mirror_size_limit'] = parse_human_readable_size(limit) config['git_mirror_size_limit'] = parse_human_readable_size(limit)
@ -641,15 +683,7 @@ def read_config():
continue continue
elif isinstance(dictvalue, dict): elif isinstance(dictvalue, dict):
for k, v in dictvalue.items(): for k, v in dictvalue.items():
if k == 'env': 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:
confignames_to_delete.add(configname) confignames_to_delete.add(configname)
logging.error(_('Unknown entry {key} in {configname}') logging.error(_('Unknown entry {key} in {configname}')
.format(key=k, configname=configname)) .format(key=k, configname=configname))
@ -669,6 +703,7 @@ def read_config():
) )
) )
config = _Config(config)
return config return config
@ -782,7 +817,10 @@ def load_localized_config(name, repodir):
icons_dir = os.path.join(repodir, 'icons') icons_dir = os.path.join(repodir, 'icons')
if not os.path.exists(icons_dir): if not os.path.exists(icons_dir):
os.makedirs(icons_dir, exist_ok=True) 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( ret[afname][key][locale] = file_entry(
os.path.join(icons_dir, value) os.path.join(icons_dir, value)
) )
@ -1201,6 +1239,25 @@ def get_src_tarball_name(appid, versionCode):
return f"{appid}_{versionCode}_src.tar.gz" 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): def get_build_dir(app):
"""Get the dir that this app will be built in.""" """Get the dir that this app will be built in."""
if app.RepoType == 'srclib': 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') rsync_status_file_to_repo(path, repo_subdir='status')
def get_head_commit_id(git_repo): def get_head_commit_id(git_repo_dir):
"""Get git commit ID for HEAD as a str.""" """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: try:
return git_repo.head.commit.hexsha if type(git_repo_dir) is git.Repo:
except ValueError: d = git_repo_dir.git_dir
return "None" 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): def setup_vcs(app):
@ -1318,6 +1392,7 @@ def getvcs(vcstype, remote, local):
""" """
if vcstype == 'git': if vcstype == 'git':
return vcs_git(remote, local) return vcs_git(remote, local)
logging.warning(_("RepoType {type} is deprecated, please switch to git.").format(type=vcstype))
if vcstype == 'git-svn': if vcstype == 'git-svn':
return vcs_gitsvn(remote, local) return vcs_gitsvn(remote, local)
if vcstype == 'hg': if vcstype == 'hg':
@ -1523,10 +1598,15 @@ class vcs_git(vcs):
it! This is called as a safety check. 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() 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(): if Path(result) != Path(self.local).resolve():
raise VCSException('Repository mismatch') raise VCSException(f"Repository mismatch ('{self.local}' != '{result}')")
def gotorevisionx(self, rev): def gotorevisionx(self, rev):
if not os.path.exists(self.local): 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() 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.""" """Return list of existing files that will be used to find the highest vercode."""
possible_manifests = \ possible_manifests = \
[Path(app_dir) / 'AndroidManifest.xml', [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-extras.gradle',
Path(app_dir) / 'build.gradle.kts'] Path(app_dir) / 'build.gradle.kts']
for flavour in flavours: for flavor in flavors:
if flavour == 'yes': if flavor == 'yes':
continue continue
possible_manifests.append( 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()] 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.""" """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(): if not path.suffix == '.xml' or not path.is_file():
continue continue
logging.debug("fetch_real_name: Checking manifest at %s" % path) logging.debug("fetch_real_name: Checking manifest at %s" % path)
@ -2085,17 +2165,17 @@ def parse_androidmanifests(paths, app):
vercode = None vercode = None
package = None package = None
flavours = None flavors = None
temp_app_id = None temp_app_id = None
temp_version_name = None temp_version_name = None
if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: 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'): if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'):
with open(path, 'r', encoding='utf-8') as f: with open(path, 'r', encoding='utf-8') as f:
android_plugin_file = False android_plugin_file = False
inside_flavour_group = 0 inside_flavor_group = 0
inside_required_flavour = 0 inside_required_flavor = 0
for line in f: for line in f:
if gradle_comment.match(line): if gradle_comment.match(line):
continue continue
@ -2110,8 +2190,8 @@ def parse_androidmanifests(paths, app):
if matches: if matches:
temp_version_name = matches temp_version_name = matches
if inside_flavour_group > 0: if inside_flavor_group > 0:
if inside_required_flavour > 1: if inside_required_flavor > 1:
matches = psearch_g(line) matches = psearch_g(line)
if matches: if matches:
s = matches.group(2) s = matches.group(2)
@ -2141,29 +2221,29 @@ def parse_androidmanifests(paths, app):
if matches: if matches:
vercode = version_code_string_to_int(matches.group(1)) vercode = version_code_string_to_int(matches.group(1))
if inside_required_flavour > 0: if inside_required_flavor > 0:
if '{' in line: if '{' in line:
inside_required_flavour += 1 inside_required_flavor += 1
if '}' in line: if '}' in line:
inside_required_flavour -= 1 inside_required_flavor -= 1
if inside_required_flavour == 1: if inside_required_flavor == 1:
inside_required_flavour -= 1 inside_required_flavor -= 1
elif flavours: elif flavors:
for flavour in flavours: for flavor in flavors:
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): if re.match(r'.*[\'"\s]{flavor}[\'"\s].*\{{.*'.format(flavor=flavor), line):
inside_required_flavour = 2 inside_required_flavor = 2
break break
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): if re.match(r'.*[\'"\s]{flavor}[\'"\s].*'.format(flavor=flavor), line):
inside_required_flavour = 1 inside_required_flavor = 1
break break
if '{' in line: if '{' in line:
inside_flavour_group += 1 inside_flavor_group += 1
if '}' in line: if '}' in line:
inside_flavour_group -= 1 inside_flavor_group -= 1
else: else:
if "productFlavors" in line: if "productFlavors" in line:
inside_flavour_group = 1 inside_flavor_group = 1
if not package: if not package:
matches = psearch_g(line) matches = psearch_g(line)
if matches: 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: with open(path, 'w', encoding='iso-8859-1') as f:
f.write(props) f.write(props)
flavours = [] flavors = []
if build.build_method() == 'gradle': if build.build_method() == 'gradle':
flavours = build.gradle flavors = build.gradle
if build.target: if build.target:
n = build.target.split('-')[1] 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 # Insert version code and number into the manifest if necessary
if build.forceversion: if build.forceversion:
logging.info("Changing the version name") 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): if not os.path.isfile(path):
continue continue
if path.suffix == '.xml': if path.suffix == '.xml':
@ -2545,7 +2625,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
if build.forcevercode: if build.forcevercode:
logging.info("Changing the version code") 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(): if not path.is_file():
continue continue
if path.suffix == '.xml': 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)] paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)]
if not paths[p]: if not paths[p]:
not_found_paths.append(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: if not_found_paths:
raise FDroidException( raise FDroidException(
"Some glob paths did not match any files/dirs:\n" "Some glob paths did not match any files/dirs:\n"
+ "\n".join(not_found_paths) + "\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() paths = set()
for k, v in paths_map.items(): for k, v in paths_map.items():
for p in v: for p in v:
@ -2828,9 +2908,9 @@ def is_debuggable_or_testOnly(apkfile):
return False return False
try: try:
# these were moved in androguard 4.0 # 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: 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() _androguard_logging_level()
with ZipFile(apkfile) as apk: with ZipFile(apkfile) as apk:
@ -2902,9 +2982,23 @@ def get_apk_id_androguard(apkfile):
try: try:
# these were moved in androguard 4.0 # 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: 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() _androguard_logging_level()
appid = None appid = None
@ -3180,12 +3274,16 @@ def remove_signing_keys(build_dir):
logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path)) 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. """Set up the environment variables for the build environment.
There is only a weak standard, the variables used by gradle, so also set 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 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. 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 global env, orig_path
@ -3208,6 +3306,8 @@ def set_FDroidPopen_env(build=None):
if missinglocale: if missinglocale:
env['LANG'] = 'en_US.UTF-8' 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: if build is not None:
path = build.ndk_path() path = build.ndk_path()
paths = orig_path.split(os.pathsep) paths = orig_path.split(os.pathsep)
@ -3410,22 +3510,6 @@ def apk_signer_fingerprint(apk_path):
return signer_fingerprint(cert_encoded) 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): def metadata_get_sigdir(appid, vercode=None):
"""Get signature directory for app.""" """Get signature directory for app."""
if vercode: if vercode:
@ -3958,11 +4042,13 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None):
f.extractall(path=os.path.join(apk2dir, 'content')) f.extractall(path=os.path.join(apk2dir, 'content'))
if set_command_in_config('apktool'): if set_command_in_config('apktool'):
if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'], if subprocess.call(
cwd=apk1dir) != 0: [config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir
):
return "Failed to run apktool " + apk1 return "Failed to run apktool " + apk1
if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'], if subprocess.call(
cwd=apk2dir) != 0: [config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir
):
return "Failed to run apktool " + apk2 return "Failed to run apktool " + apk2
p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False) p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False)
@ -4790,6 +4876,20 @@ def calculate_archive_policy(app, default):
return archive_policy 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 = [ FDROIDORG_MIRRORS = [
{ {
'isPrimary': True, 'isPrimary': True,

View file

@ -16,28 +16,28 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import glob import glob
import hashlib import hashlib
import json import json
import logging
import os import os
import pathlib
import re import re
import shutil
import subprocess import subprocess
import sys
import time import time
import urllib import urllib
from typing import Dict, List
from git import Repo
import yaml
from argparse import ArgumentParser from argparse import ArgumentParser
import logging from typing import Dict, List
import pathlib
import shutil
import git import git
import yaml
from git import Repo
import fdroidserver.github import fdroidserver.github
from . import _ from . import _, common, index
from . import common
from . import index
from .exception import FDroidException from .exception import FDroidException
config = None config = None
@ -349,8 +349,8 @@ def update_awsbucket_libcloud(repo_section, is_index_only=False):
import libcloud.security import libcloud.security
libcloud.security.VERIFY_SSL_CERT = True libcloud.security.VERIFY_SSL_CERT = True
from libcloud.storage.types import Provider, ContainerDoesNotExistError
from libcloud.storage.providers import get_driver from libcloud.storage.providers import get_driver
from libcloud.storage.types import ContainerDoesNotExistError, Provider
if not config.get('awsaccesskeyid') or not config.get('awssecretkey'): if not config.get('awsaccesskeyid') or not config.get('awssecretkey'):
raise FDroidException( raise FDroidException(
@ -617,6 +617,13 @@ def update_servergitmirrors(servergitmirrors, repo_section):
For history, there is the archive section, and there is the binary For history, there is the archive section, and there is the binary
transparency log. 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 from clint.textui import progress
@ -687,7 +694,7 @@ def update_servergitmirrors(servergitmirrors, repo_section):
if is_index_only: if is_index_only:
local_branch_name = 'index_only' local_branch_name = 'index_only'
else: else:
local_branch_name = 'full' local_branch_name = GIT_BRANCH
if local_branch_name in repo.heads: if local_branch_name in repo.heads:
repo.git.switch(local_branch_name) repo.git.switch(local_branch_name)
else: else:
@ -847,9 +854,10 @@ def upload_to_android_observatory(repo_section):
def upload_apk_to_android_observatory(path): def upload_apk_to_android_observatory(path):
# depend on requests and lxml only if users enable AO # depend on requests and lxml only if users enable AO
import requests import requests
from . import net
from lxml.html import fromstring from lxml.html import fromstring
from . import net
apkfilename = os.path.basename(path) apkfilename = os.path.basename(path)
r = requests.post( r = requests.post(
'https://androidobservatory.org/', 'https://androidobservatory.org/',

View file

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

View file

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

View file

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

View file

@ -342,7 +342,7 @@ def main():
app.AutoUpdateMode = 'Version' app.AutoUpdateMode = 'Version'
app.UpdateCheckMode = 'Tags' 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... # Extract some information...
paths = get_all_gradle_and_manifests(tmp_importer_dir) 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 collections
import hashlib import hashlib
import json import json
@ -41,20 +42,27 @@ import sys
import tempfile import tempfile
import urllib.parse import urllib.parse
import zipfile import zipfile
import calendar
from binascii import hexlify, unhexlify from binascii import hexlify, unhexlify
from datetime import datetime, timezone from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from xml.dom.minidom import Document 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._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 fdroidserver.exception import FDroidException, VerificationException
from . import _, common, metadata, signindex
def make(apps, apks, repodir, archive): def make(apps, apks, repodir, archive):
"""Generate the repo index files. """Generate the repo index files.
@ -152,11 +160,6 @@ def _should_file_be_generated(path, magic_string):
def make_website(apps, repodir, repodict): 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 # 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" 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): if _should_file_be_generated(html_file, autogenerate_comment):
import qrcode 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")) qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png"))
with open(html_file, 'w') as f: with open(html_file, 'w') as f:
name = repodict["name"] name = repodict["name"]
@ -585,7 +595,10 @@ def convert_version(version, app, repodir):
ver["file"]["ipfsCIDv1"] = ipfsCIDv1 ver["file"]["ipfsCIDv1"] = ipfsCIDv1
if "srcname" in version: 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: if "obbMainFile" in version:
ver["obbMainFile"] = common.file_entry( ver["obbMainFile"] = common.file_entry(
@ -681,9 +694,13 @@ def v2_repo(repodict, repodir, archive):
config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir) config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir)
if config: if config:
repo["name"] = config["archive" if archive else "repo"]["name"] localized_config = config["archive" if archive else "repo"]
repo["description"] = config["archive" if archive else "repo"]["description"] if "name" in localized_config:
repo["icon"] = config["archive" if archive else "repo"]["icon"] 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"] repo["address"] = repodict["address"]
if "mirrors" in repodict: 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 # include definitions for "auto-defined" categories, e.g. just used in app metadata
for category in sorted(categories_used_by_apps): for category in sorted(categories_used_by_apps):
if category not in output['repo'][CATEGORIES_CONFIG_NAME]: 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 # do not include defined categories if no apps use them
for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())):
if category not in categories_used_by_apps: 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()): for k, v in sorted(package.items()):
if not v: if not v:
continue continue
if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'): if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name', 'srcnameSha256'):
continue continue
if k == 'antiFeatures': if k == 'antiFeatures':
d[k] = sorted(v.keys()) d[k] = sorted(v.keys())

View file

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

View file

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

View file

@ -24,9 +24,10 @@ import urllib.parse
from argparse import ArgumentParser from argparse import ArgumentParser
from pathlib import Path from pathlib import Path
from . import _, common, metadata, rewritemeta
from fdroidserver._yaml import yaml from fdroidserver._yaml import yaml
from . import _, common, metadata, rewritemeta
config = None config = None
@ -274,6 +275,7 @@ check_config_keys = (
'repo', 'repo',
'repo_description', 'repo_description',
'repo_icon', 'repo_icon',
'repo_key_sha256',
'repo_keyalias', 'repo_keyalias',
'repo_maxage', 'repo_maxage',
'repo_name', '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 # been done in the StrictVersion class above. This works great as long
# as everyone can go along with bondage and discipline. Hopefully a # as everyone can go along with bondage and discipline. Hopefully a
# (large) subset of Python module programmers will agree that the # (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 # provides enough benefit to be worth using, and will submit their
# version numbering scheme to its domination. The free-thinking # version numbering scheme to its domination. The free-thinking
# anarchists in the lot will never give in, though, and something needs # 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 # 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/>. # 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 logging
import ruamel.yaml import math
import os
import platform
import re
from collections import OrderedDict from collections import OrderedDict
from pathlib import Path
from . import common import ruamel.yaml
from . import _
from .exception import MetaDataException from . import _, common
from ._yaml import yaml from ._yaml import yaml
from .exception import MetaDataException
srclibs = None srclibs = None
warnings_action = None warnings_action = None
@ -538,10 +537,10 @@ def read_srclibs():
srclibs = {} srclibs = {}
srcdir = Path('srclibs') srclibs_dir = Path('srclibs')
srcdir.mkdir(exist_ok=True) 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) srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath)
@ -658,14 +657,12 @@ def parse_metadata(metadatapath):
build_dir = common.get_build_dir(app) build_dir = common.get_build_dir(app)
metadata_in_repo = build_dir / '.fdroid.yml' metadata_in_repo = build_dir / '.fdroid.yml'
if metadata_in_repo.is_file(): if metadata_in_repo.is_file():
try: commit_id = common.get_head_commit_id(build_dir)
commit_id = common.get_head_commit_id(git.Repo(build_dir)) if commit_id is not None:
logging.debug( logging.debug(
_('Including metadata from %s@%s') % (metadata_in_repo, commit_id) _('Including metadata from %s@%s') % (metadata_in_repo, commit_id)
) )
# See https://github.com/PyCQA/pylint/issues/2856 . else:
# pylint: disable-next=no-member
except git.exc.InvalidGitRepositoryError:
logging.debug( logging.debug(
_('Including metadata from {path}').format(path=metadata_in_repo) _('Including metadata from {path}').format(path=metadata_in_repo)
) )

View file

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

View file

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

View file

@ -19,24 +19,25 @@
import base64 import base64
import datetime import datetime
import git
import hashlib import hashlib
import inspect
import logging import logging
import os import os
import paramiko
import platform import platform
import shutil import shutil
import ssl import ssl
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
import yaml
from urllib.parse import urlparse
from argparse import ArgumentParser from argparse import ArgumentParser
from typing import Optional from typing import Optional
from urllib.parse import urlparse
from . import _ import git
from . import common import paramiko
import yaml
from . import _, common
from .exception import VCSException from .exception import VCSException
# hard coded defaults for Android ~/.android/debug.keystore files # 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 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. """Generate the base URL for the F-Droid repository.
Parameters Parameters
@ -203,6 +206,41 @@ def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[s
sys.exit(1) 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(): def main():
"""Deploy to F-Droid repository or generate SSH private key from keystore. """Deploy to F-Droid repository or generate SSH private key from keystore.
@ -288,19 +326,27 @@ def main():
# we are in GitLab CI # we are in GitLab CI
repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY
clone_url = os.getenv('CI_PROJECT_URL') + 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 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_name = os.getenv('GITLAB_USER_NAME')
git_user_email = os.getenv('GITLAB_USER_EMAIL') git_user_email = os.getenv('GITLAB_USER_EMAIL')
elif 'TRAVIS_REPO_SLUG' in os.environ: elif 'TRAVIS_REPO_SLUG' in os.environ:
# we are in Travis CI # we are in Travis CI
repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY
clone_url = 'https://github.com/' + repo_git_base 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 servergitmirror = 'git@github.com:' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' deploy_key_url = (
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') 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_name = repo_git_base
git_user_email = os.getenv('USER') + '@' + platform.node() git_user_email = os.getenv('USER') + '@' + platform.node()
elif ( elif (
@ -309,23 +355,35 @@ def main():
and 'CIRCLE_PROJECT_REPONAME' in os.environ and 'CIRCLE_PROJECT_REPONAME' in os.environ
): ):
# we are in Circle CI # we are in Circle CI
repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME') repo_git_base = (
+ '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY) os.getenv('CIRCLE_PROJECT_USERNAME')
+ '/'
+ os.getenv('CIRCLE_PROJECT_REPONAME')
+ NIGHTLY
)
clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + 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 servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' deploy_key_url = (
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') 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_name = os.getenv('CIRCLE_USERNAME')
git_user_email = git_user_name + '@' + platform.node() git_user_email = git_user_name + '@' + platform.node()
elif 'GITHUB_ACTIONS' in os.environ: elif 'GITHUB_ACTIONS' in os.environ:
# we are in Github actions # we are in Github actions
repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY) repo_git_base = os.getenv('GITHUB_REPOSITORY') + NIGHTLY
clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base) 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_base = get_repo_base_url(
clone_url, repo_git_base, force_type='github.com'
)
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' deploy_key_url = (
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') 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_name = os.getenv('GITHUB_ACTOR')
git_user_email = git_user_name + '@' + platform.node() git_user_email = git_user_name + '@' + platform.node()
else: else:
@ -338,14 +396,11 @@ def main():
git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo')
git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata')
if not os.path.isdir(git_mirror_repodir): if not os.path.isdir(git_mirror_repodir):
logging.debug(_('cloning {url}').format(url=clone_url)) clone_git_repo(clone_url, git_mirror_path)
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)
if not os.path.isdir(git_mirror_repodir): if not os.path.isdir(git_mirror_repodir):
os.makedirs(git_mirror_repodir, mode=0o755) 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) mirror_git_repo = git.Repo.init(git_mirror_path)
writer = mirror_git_repo.config_writer() 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}) [![{repo_url}]({repo_url}/icons/icon.png)](https://fdroid.link/#{repo_url})
Last updated: {date}'''.format(repo_git_base=repo_git_base, Last updated: {date}'''.format(
repo_url=repo_url, repo_git_base=repo_git_base,
date=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')) 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: with open(readme_path, 'w') as fp:
fp.write(readme) fp.write(readme)
mirror_git_repo.git.add(all=True) 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) common.assert_config_keystore(config)
logging.debug( logging.debug(
_('Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}').format( _(
cibase=cibase, 'Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}'
repo_basedir=repo_basedir ).format(cibase=cibase, repo_basedir=repo_basedir)
)
) )
for root, dirs, files in os.walk(cibase): 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): if not os.path.exists(androiddir):
os.mkdir(androiddir) os.mkdir(androiddir)
logging.info(_('created {path}').format(path=androiddir)) logging.info(_('created {path}').format(path=androiddir))
logging.error(_('{path} does not exist! Create it by running:').format(path=options.keystore) logging.error(
+ '\n keytool -genkey -v -keystore ' + options.keystore + ' -storepass android \\' _('{path} does not exist! Create it by running:').format(
+ '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\' path=options.keystore
+ '\n -dname "CN=Android Debug,O=Android,C=US"') )
+ '\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) sys.exit(1)
ssh_dir = os.path.join(os.getenv('HOME'), '.ssh') ssh_dir = os.path.join(os.getenv('HOME'), '.ssh')
privkey = _ssh_key_from_debug_keystore(options.keystore) 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 os
import re import re
import shutil import shutil
import glob import sys
import hashlib
from argparse import ArgumentParser
from collections import OrderedDict
import logging
from gettext import ngettext
import json
import time import time
import zipfile import zipfile
from argparse import ArgumentParser
from collections import OrderedDict
from gettext import ngettext
from . import _ from . import _, common, metadata
from . import common
from . import metadata
from .common import FDroidPopen from .common import FDroidPopen
from .exception import BuildException, FDroidException from .exception import BuildException, FDroidException

View file

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

View file

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

View file

@ -270,9 +270,10 @@ def get_gradle_compile_commands(build):
'runtimeOnly', 'runtimeOnly',
] ]
buildTypes = ['', 'release'] buildTypes = ['', 'release']
flavors = ['']
if build.gradle and build.gradle != ['yes']: 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)] 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', 'www.jitpack.io',
'repo.maven.apache.org/maven2', 'repo.maven.apache.org/maven2',
'oss.jfrog.org/artifactory/oss-snapshot-local', 'oss.jfrog.org/artifactory/oss-snapshot-local',
'central.sonatype.com/repository/maven-snapshots/',
'oss.sonatype.org/content/repositories/snapshots', 'oss.sonatype.org/content/repositories/snapshots',
'oss.sonatype.org/content/repositories/releases', 'oss.sonatype.org/content/repositories/releases',
'oss.sonatype.org/content/groups/public', '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) scanignore, scanignore_not_found_paths = common.getpaths_map(
scandelete = common.getpaths_map(build_dir, build.scandelete) build_dir, build.scanignore
)
scandelete, scandelete_not_found_paths = common.getpaths_map(
build_dir, build.scandelete
)
scanignore_worked = set() scanignore_worked = set()
scandelete_worked = set() scandelete_worked = set()
@ -1108,11 +1114,19 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
json_per_build, json_per_build,
) )
for p in scanignore_not_found_paths:
logging.error(_("Non-exist scanignore path: %s") % p)
count += 1
for p in scanignore: for p in scanignore:
if p not in scanignore_worked: if p not in scanignore_worked:
logging.error(_('Unused scanignore path: %s') % p) logging.error(_('Unused scanignore path: %s') % p)
count += 1 count += 1
for p in scandelete_not_found_paths:
logging.error(_("Non-exist scandelete path: %s") % p)
count += 1
for p in scandelete: for p in scandelete:
if p not in scandelete_worked: if p not in scandelete_worked:
logging.error(_('Unused scandelete path: %s') % p) logging.error(_('Unused scandelete path: %s') % p)
@ -2217,8 +2231,7 @@ SUSS_DEFAULT = r'''{
"https://www.android.com/gms/" "https://www.android.com/gms/"
], ],
"gradle_signatures": [ "gradle_signatures": [
"com.google.gms(?!.google-services)", "com.google.android.gms(?!.(oss-licenses-plugin|strict-version-matcher-plugin))",
"com.google.android.gms(?!.oss-licenses-plugin)",
"com.google.android.ump", "com.google.android.ump",
"androidx.core:core-google-shortcuts", "androidx.core:core-google-shortcuts",
"androidx.credentials:credentials-play-services-auth", "androidx.credentials:credentials-play-services-auth",
@ -2234,7 +2247,19 @@ SUSS_DEFAULT = r'''{
"com.yayandroid:locationmanager", "com.yayandroid:locationmanager",
"(?<!org.microg.gms:)play-services", "(?<!org.microg.gms:)play-services",
"xyz.belvi.mobilevision:barcodescanner", "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", "license": "NonFree",
"name": "Google Mobile Services" "name": "Google Mobile Services"
@ -2934,6 +2959,16 @@ SUSS_DEFAULT = r'''{
"license": "NonFree", "license": "NonFree",
"name": "Pushy" "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": { "org.mariuszgromada.math": {
"code_signatures": [ "code_signatures": [
"org/mariuszgromada/math/mxparser/parsertokens/SyntaxStringBuilder", "org/mariuszgromada/math/mxparser/parsertokens/SyntaxStringBuilder",
@ -2966,7 +3001,7 @@ SUSS_DEFAULT = r'''{
"license": "NonFree" "license": "NonFree"
} }
}, },
"timestamp": 1733823271.362948, "timestamp": 1747829076.702502,
"version": 1, "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 # 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/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
import logging
import os
import re
import sys
from argparse import ArgumentParser from argparse import ArgumentParser
import re from . import _, common
import os
import sys
import logging
from . import _
from . import common
from .exception import FDroidException from .exception import FDroidException

View file

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

View file

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

View file

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

View file

@ -16,18 +16,17 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import os
import glob import glob
import json import json
import logging import logging
import requests import os
import sys
from argparse import ArgumentParser from argparse import ArgumentParser
from collections import OrderedDict from collections import OrderedDict
from . import _ import requests
from . import common
from . import net from . import _, common, net
from .exception import FDroidException from .exception import FDroidException
config = None config = None
@ -58,8 +57,8 @@ def _add_diffoscope_info(d):
] ]
d['diffoscope']['External-Tools-Required'] = external_tools 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.external_tools import EXTERNAL_TOOLS
from diffoscope.tools import OS_NAMES, get_current_os
current_os = get_current_os() current_os = get_current_os()
os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES) 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: with open(jsonfile, 'w') as fp:
json.dump(data, fp, sort_keys=True) json.dump(data, fp, sort_keys=True)
if output['verified']: appid, version_code = os.path.basename(unsigned_apk[:-4]).rsplit('_', 1)
jsonfile = 'unsigned/verified.json' appid_base = unsigned_apk.rsplit('_', 1)[0]
data = get_verified_json(jsonfile) apkReports = sorted(
packageName = output['local']['packageName'] 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']: if output['verified']:
data['packages'][packageName] = [] write_verified_json(output)
found = False
output_dump = json.dumps(output, sort_keys=True)
for p in data['packages'][packageName]: def write_verified_json(output):
if output_dump == json.dumps(p, sort_keys=True): jsonfile = 'unsigned/verified.json'
found = True data = get_verified_json(jsonfile)
break packageName = output['local']['packageName']
if not found:
data['packages'][packageName].insert(0, json.loads(output_dump)) if packageName not in data['packages']:
with open(jsonfile, 'w') as fp: data['packages'][packageName] = []
json.dump(data, fp, cls=common.Encoder, sort_keys=True) 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(): def main():

View file

@ -16,16 +16,16 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # 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 json
import logging
import os
import shutil import shutil
import subprocess import subprocess
import textwrap import textwrap
import logging
from .common import FDroidException
import threading import threading
from os.path import abspath, basename, expanduser, isdir, isfile
from .common import FDroidException
lock = threading.Lock() 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 # 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_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" 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_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
PY_TEST_FILES="tests/test_*.py" PY_TEST_FILES="tests/test_*.py"
SH_FILES="hooks/pre-commit" 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" RB_FILES="buildserver/Vagrantfile"
YML_FILES=".*.yml .yamllint */*.yml */*.yaml" YML_FILES=".*.yml .yamllint */*.yml */*.yaml"
else else
@ -36,7 +36,7 @@ else
*.rb) *.rb)
RB_FILES+=" $f" RB_FILES+=" $f"
;; ;;
*.yml|.*.yml|.yamllint) *.yml|*.yaml|.yamllint)
YML_FILES+=" $f" YML_FILES+=" $f"
;; ;;
*) *)
@ -66,7 +66,7 @@ cmd_exists() {
} }
find_command() { find_command() {
for name in $@; do for name in "$@"; do
for suff in "3" "-3" "-python3" ""; do for suff in "3" "-3" "-python3" ""; do
cmd=${name}${suff} cmd=${name}${suff}
if cmd_exists $cmd; then if cmd_exists $cmd; then

View file

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

File diff suppressed because it is too large Load diff

View file

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

View file

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

View file

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

View file

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

View file

@ -6,21 +6,21 @@
# Adrià Martín <adriamartinmor@gmail.com>, 2024. # Adrià Martín <adriamartinmor@gmail.com>, 2024.
# unmes <jordi.guiu.pujols@gmail.com>, 2024. # unmes <jordi.guiu.pujols@gmail.com>, 2024.
# Joan Pujolar <joan.pujolar@gmail.com>, 2024. # Joan Pujolar <joan.pujolar@gmail.com>, 2024.
# Ecron <ecron_89@hotmail.com>, 2024. # Ecron <ecron_89@hotmail.com>, 2024, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-30 12:31+0000\n" "PO-Revision-Date: 2025-05-16 16:36+0000\n"
"Last-Translator: pitroig <ona@riseup.net>\n" "Last-Translator: Ecron <ecron_89@hotmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/>\n"
"Language: ca\n" "Language: ca\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -46,7 +46,7 @@ msgstr "\"%s/\" no té cap fitxer de metadades coincidents!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" 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 #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
@ -307,7 +307,7 @@ msgstr "Sí automàtic a totes les demandes."
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" 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 #: ../fdroidserver/mirror.py
msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" 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[0] "No es pot construir a causa d'un error {} en escanejar"
msgstr[1] "No es pot construir a causa d'errors {} 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "S'està creant \"{path}\" per configurar s3cmd." msgstr "S'està creant \"{path}\" per configurar s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "S'està llegint '{config_file}'" msgstr "S'està creant un «{config_file}» buit"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" 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 #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format
msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
@ -601,7 +606,7 @@ msgstr "No usis les sumes de verificació \"rsync\""
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "Download F-Droid.apk using mirrors that leak less to the network" 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 #: ../fdroidserver/__main__.py
msgid "Download complete mirrors of small repos" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "ERROR: {key} no és una clau vàlida!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, 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!" msgstr "La variable d'entorn {var} de {configname} no està establerta!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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" msgstr "S'ignorarà l'element incorrecte al manifest: %s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} és obsolet, utilitzeu {newfile}" msgstr "S'ignorarà el {oldfile} obsolet, utilitzeu {newfile}!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -956,11 +961,11 @@ msgstr "Inclou els fitxers .asc de signatura PGP a la rèplica"
#: ../fdroidserver/mirror.py #: ../fdroidserver/mirror.py
msgid "Include the build logs in the mirror" 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 #: ../fdroidserver/mirror.py
msgid "Include the source tarballs in the mirror" 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 #: ../fdroidserver/metadata.py
#, python-format #, python-format
@ -1143,7 +1148,7 @@ msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP:
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" 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 #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." 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 #: ../fdroidserver/deploy.py
msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" 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 #: ../fdroidserver/deploy.py
msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "Només accepta una clau única «env»"
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avisa de possibles errors a les metadades" 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 #: ../fdroidserver/index.py
#, python-format #, python-format
msgid "mirror '%s' does not end with 'fdroid'!" 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 #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "mirrors set twice, in config.yml and {path}!" 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 #: /usr/lib/python3.11/argparse.py
msgid "mutually exclusive arguments must be optional" msgid "mutually exclusive arguments must be optional"
@ -2597,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\".
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr "" msgstr "{path1} és un duplicat de {path2}, elimineu-ne un!"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, python-brace-format

View file

@ -13,8 +13,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2025-03-26 10:00+0000\n"
"Last-Translator: Fjuro <fjuro@users.noreply.hosted.weblate.org>\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-Team: Czech <https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/>\n"
"Language: 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[1] "Nelze sestavit kvůli {} chybám při skenování"
msgstr[2] "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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Varovat ohledně možných chyb metadat" msgstr "Varovat ohledně možných chyb metadat"

View file

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

View file

@ -13,21 +13,21 @@
# TobiGr <tobigr@mail.de>, 2021. # TobiGr <tobigr@mail.de>, 2021.
# FW <weblate.scordium@slmail.me>, 2021. # FW <weblate.scordium@slmail.me>, 2021.
# fossdd <fossdd@tutanota.com>, 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. # C. Rüdinger <Mail-an-CR@web.de>, 2021, 2022.
# VfBFan <drop0815@posteo.de>, 2021, 2023, 2024, 2025. # VfBFan <drop0815@posteo.de>, 2021, 2023, 2024, 2025.
# Roman Leo <roman.leo@gmx.de>, 2021. # Roman Leo <roman.leo@gmx.de>, 2021.
# Follpvosten <wolfi@karpador.xyz>, 2021. # Follpvosten <wolfi@karpador.xyz>, 2021.
# ssantos <ssantos@web.de>, 2022, 2023, 2024. # 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. # VfBFan <VfBFan@users.noreply.hosted.weblate.org>, 2024.
# Maxi <maxitendo01@proton.me>, 2024. # Maxi <maxitendo01@proton.me>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-21 08:45+0000\n" "PO-Revision-Date: 2025-04-29 10:16+0000\n"
"Last-Translator: VfBFan <drop0815@posteo.de>\n" "Last-Translator: VfBFan <drop0815@posteo.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/f-droid/fdroidserver/de/>\n" "Language-Team: German <https://hosted.weblate.org/projects/f-droid/fdroidserver/de/>\n"
"Language: de\n" "Language: de\n"
@ -35,7 +35,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: ../fdroidserver/nightly.py
msgid "" 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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -519,7 +524,7 @@ msgstr "Erstelle Ausgabeverzeichnis"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "Creating signed index with this key (SHA256):" 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 #: ../fdroidserver/publish.py ../fdroidserver/verify.py
msgid "Creating temporary directory" msgid "Creating temporary directory"
@ -532,7 +537,7 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" 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 #: ../fdroidserver/nightly.py
msgid "DEBUG_KEYSTORE is not set or the value is incomplete" 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 #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format
msgid "Found {apkfilename} at {url}" msgid "Found {apkfilename} at {url}"
msgstr "{apkfilename} unter {url} gefunden" msgstr "{apkfilename} gefunden auf {url}"
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
#, python-brace-format #, 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 #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format
msgid "If this upload fails, try manually uploading to {url}" 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 #: ../fdroidserver/metadata.py
#, python-brace-format #, python-brace-format
@ -1337,7 +1342,7 @@ msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld"
#: ../fdroidserver/verify.py #: ../fdroidserver/verify.py
msgid "Output JSON report to file named after APK." 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 #: ../fdroidserver/scanner.py
msgid "Output JSON to stdout." msgid "Output JSON to stdout."
@ -1486,7 +1491,7 @@ msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1557,7 +1567,7 @@ msgstr "Ausführen von wget in {path}"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "SHA-256 of {url} does not match entry!" 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 #: ../fdroidserver/build.py
msgid "Scan the resulting APK(s) for known non-free classes." 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 #: ../fdroidserver/nightly.py
msgid "Set maximum releases in repo before older ones are archived" 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 #: ../fdroidserver/build.py
#, python-brace-format #, python-brace-format
@ -1757,7 +1767,7 @@ msgstr "Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegel
#: ../fdroidserver/common.py #: ../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." 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 #: ../fdroidserver/import_subcommand.py
#, python-format #, python-format
@ -1973,7 +1983,7 @@ msgstr "Verwende APK-Signatur v3"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Using JAR Signature" msgid "Using JAR Signature"
msgstr "Verwende JAR Signatur" msgstr "Verwende JAR-Signatur"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" 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}." 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." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Vor möglichen Metadaten-Fehlern warnen" msgstr "Vor möglichen Metadaten-Fehlern warnen"
@ -2154,7 +2168,7 @@ msgstr "Mehrere Subparser-Argumente sind unzulässig"
#: /usr/lib/python3.11/argparse.py #: /usr/lib/python3.11/argparse.py
#, python-format #, python-format
msgid "cannot merge actions - two groups are named %r" 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 #: ../fdroidserver/nightly.py
msgid "cannot publish update, did you set the deploy key?" msgid "cannot publish update, did you set the deploy key?"
@ -2528,8 +2542,8 @@ msgstr "ja"
#, python-brace-format #, python-brace-format
msgid "{0} app, {1} key aliases" msgid "{0} app, {1} key aliases"
msgid_plural "{0} apps, {1} key aliases" msgid_plural "{0} apps, {1} key aliases"
msgstr[0] "{0} app, {1} Schlüsselaliase" msgstr[0] "{0} App, {1} Schlüssel-Aliase"
msgstr[1] "{0} apps, {1} Schlüsselaliase" msgstr[1] "{0} Apps, {1} Schlüssel-Aliase"
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
@ -2557,7 +2571,7 @@ msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!"
#: ../fdroidserver/metadata.py ../fdroidserver/update.py #: ../fdroidserver/metadata.py ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{appid} from {path} is not a valid Java Package Name!" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
@ -2577,7 +2591,7 @@ msgstr "{appid}: unbekannte Extlib {path} im Build '{versionName}'"
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
#, python-brace-format #, python-brace-format
msgid "{appid}: no builds specified, running on current source state" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
@ -2627,7 +2641,7 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:"
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" 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 #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format

View file

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

View file

@ -14,20 +14,21 @@
# Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>, 2022. # Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>, 2022.
# gallegonovato <fran-carro@hotmail.es>, 2022, 2023, 2024. # gallegonovato <fran-carro@hotmail.es>, 2022, 2023, 2024.
# Nicolás Pérez <ccnicolasperez@gmail.com>, 2025. # Nicolás Pérez <ccnicolasperez@gmail.com>, 2025.
# Swyter <swyterzone@gmail.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-16 22:47+0000\n" "PO-Revision-Date: 2025-06-24 11:02+0000\n"
"Last-Translator: Nicolás Pérez <ccnicolasperez@gmail.com>\n" "Last-Translator: Swyter <swyterzone@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/f-droid/fdroidserver/es/>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/f-droid/fdroidserver/es/>\n"
"Language: es\n" "Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: ../fdroidserver/nightly.py
msgid "" 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[0] "No se puede construir debido al error {} mientras se comprobaba"
msgstr[1] "No se puede construir debido a los errores {} 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -492,9 +498,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Creando \"{path}\" para configurar s3cmd." msgstr "Creando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "Leyendo '{config_file}'" msgstr "Creando el archivo vacío {config_file}"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -1497,6 +1503,11 @@ msgstr "Eliminando {path}\""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1811,7 +1822,7 @@ msgstr "Entrada desconocida {key} en {configname}"
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Unknown exception found!" msgid "Unknown exception found!"
msgstr "¡Se encontró una excepción desconocida!" msgstr "Se ha producido una excepción desconocida"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
@ -1993,7 +2004,7 @@ msgstr "Usando s3cmd para sincronizar con: {url}"
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Valid commands are:" msgid "Valid commands are:"
msgstr "Los comandos válidos son:" msgstr "Las órdenes válidas son:"
#: ../fdroidserver/verify.py #: ../fdroidserver/verify.py
msgid "Verify against locally cached copy rather than redownloading." 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Alertar sobre posibles errores de metadatos" msgstr "Alertar sobre posibles errores de metadatos"

View file

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2021-04-10 21:26+0000\n"
"Last-Translator: Germe the fur star <FOSSgerme.deb@tuta.io>\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" "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[0] "No se pudo empaquetar debido al {} error mientras se escaneaba"
msgstr[1] "No se pudo empaquetar debido a los {} errores 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1495,6 +1500,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Renombrar archivos APK que no corresponden a 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Advertir sobre posibles errores en los metadatos" msgstr "Advertir sobre posibles errores en los metadatos"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2020-04-29 12:49+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\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" "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[0] ""
msgstr[1] "" msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1483,6 +1488,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "" msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "" msgstr ""

View file

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

View file

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

View file

@ -5,9 +5,9 @@
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" 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" "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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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[0] ""
msgstr[1] "" msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1479,6 +1484,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "" msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "" msgstr ""

View file

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

View file

@ -42,20 +42,21 @@
# Lzebulon <lzebulon@crans.org>, 2024. # Lzebulon <lzebulon@crans.org>, 2024.
# Armand Camponovo <contact@camarm.dev>, 2024. # Armand Camponovo <contact@camarm.dev>, 2024.
# Lula Bye <translate.cylinder716@passinbox.com>, 2025. # Lula Bye <translate.cylinder716@passinbox.com>, 2025.
# Laurent FAVOLE <laurentfavole03@gmail.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-02 16:42+0000\n" "PO-Revision-Date: 2025-04-11 17:20+0000\n"
"Last-Translator: Lula Bye <translate.cylinder716@passinbox.com>\n" "Last-Translator: Laurent FAVOLE <laurentfavole03@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/>\n" "Language-Team: French <https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -81,7 +82,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" 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 #: ../fdroidserver/index.py
#, python-brace-format #, 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[0] "Build impossible à cause de l'erreur lors de l'analyse"
msgstr[1] "Build impossible à cause des {} erreurs 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -520,9 +526,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Création de « {path} » pour configurer s3cmd." msgstr "Création de « {path} » pour configurer s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "Lecture de '{config_file}'" msgstr "Création d'un fichier {config_file} vide"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -692,12 +698,12 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"."
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "ERREUR : {key} n'est pas une clé valide!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, 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 !" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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 #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, fuzzy, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" 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 #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -1178,7 +1184,7 @@ msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr "" msgstr "La configuration du miroir pour {url} contient la clé \"isPrimary\"!"
#: ../fdroidserver/mirror.py #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "N'accepte qu'une seule clé \"env\""
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
@ -1960,9 +1971,8 @@ msgid "Uploading {apkfilename} to virustotal"
msgstr "Téléversement de {apkfilename} vers virustotal" msgstr "Téléversement de {apkfilename} vers virustotal"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, fuzzy
msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" 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 #: ../fdroidserver/update.py
msgid "Use `fdroid update -c` to create it." msgid "Use `fdroid update -c` to create it."
@ -1982,9 +1992,9 @@ msgid "Using \"{path}\" for configuring s3cmd."
msgstr "Utiliser \"{path}\" pour configurer s3cmd." msgstr "Utiliser \"{path}\" pour configurer s3cmd."
#: ../fdroidserver/deploy.py #: ../fdroidserver/deploy.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Using \"{path}\" for syncing with remote storage." 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 #: ../fdroidserver/common.py
msgid "Using APK Signature v2" msgid "Using APK Signature v2"
@ -2039,21 +2049,24 @@ msgid "Verifying index signature:"
msgstr "Vérification de la signature d'index :" msgstr "Vérification de la signature d'index :"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Verifying package {path} with apksigner." 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 #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avertir de possibles erreurs dans les métadonnées" msgstr "Avertir de possibles erreurs dans les métadonnées"
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
#, fuzzy
msgid "WebAssembly binary file" msgid "WebAssembly binary file"
msgstr "Fichier binaire WebAssembly" msgstr "Fichier binaire WebAssembly"
@ -2090,7 +2103,7 @@ msgid "ZIP file archive"
msgstr "Archive ZIP" msgstr "Archive ZIP"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "adb reports {serial} is \"{status}\"!" msgid "adb reports {serial} is \"{status}\"!"
msgstr "adb reporte que {serial} est \"{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" msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, python-brace-format #, fuzzy, python-brace-format
msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." 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 #: ../fdroidserver/common.py
msgid "apksigner not found! Cannot sign or verify modern APKs" msgid "apksigner not found! Cannot sign or verify modern APKs"
@ -2216,9 +2229,8 @@ msgid "could not parse '{path}'"
msgstr "impossible de lire '{path}'" msgstr "impossible de lire '{path}'"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy
msgid "could not parse srclib spec (no name specified): '{}'" 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 #: ../fdroidserver/common.py
msgid "could not parse srclib spec (no ref specified): '{}'" 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» !" msgstr "le miroir «%s» ne se termine pas par «fdroid» !"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "mirrors set twice, in config.yml and {path}!" msgid "mirrors set twice, in config.yml and {path}!"
msgstr "miroir configuré deux fois, dans config.yml et {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" msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer"
#: ../fdroidserver/deploy.py #: ../fdroidserver/deploy.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" 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 #: ../fdroidserver/scanner.py
#, python-brace-format #, 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}'" msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'"
#: ../fdroidserver/deploy.py #: ../fdroidserver/deploy.py
#, fuzzy
msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" 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 #: ../fdroidserver/scanner.py
msgid "shared library" msgid "shared library"
@ -2510,7 +2521,6 @@ msgid "the following arguments are required: %s"
msgstr "les arguments suivants sont requis %s" msgstr "les arguments suivants sont requis %s"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, fuzzy
msgid "true" msgid "true"
msgstr "vrai" 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..." msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..."
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, fuzzy
msgid "yes" msgid "yes"
msgstr "oui" msgstr "oui"
@ -2640,7 +2649,7 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr "" msgstr "{path1} est un doublon de {path2}, supprimez-en un!"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, 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 :" msgstr "{path} a été signalé par virustotal {count} fois :"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "{path} has the wrong fingerprint ({fingerprint})!" msgid "{path} has the wrong fingerprint ({fingerprint})!"
msgstr "{path} a la mauvaise empreinte ({fingerprint})!" msgstr "{path} a la mauvaise empreinte ({fingerprint})!"

View file

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

View file

@ -5,8 +5,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-23 10:56+0000\n" "PO-Revision-Date: 2025-03-27 19:35+0000\n"
"Last-Translator: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>\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-Team: Irish <https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/>\n"
"Language: 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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann" msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann"

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2024-04-10 13:33+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n" "Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/>\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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1494,6 +1499,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Figyelmeztetés a lehetséges metaadat-hibákról" msgstr "Figyelmeztetés a lehetséges metaadat-hibákról"

View file

@ -22,7 +22,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2025-03-20 16:21+0000\n"
"Last-Translator: Champ0999 <champ0999@users.noreply.hosted.weblate.org>\n" "Last-Translator: Champ0999 <champ0999@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/f-droid/fdroidserver/it/>\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[0] "Impossibile costruire a causa di un errore con {} durante la scansione"
msgstr[1] "Impossibile costruire a causa di errori 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1504,6 +1509,11 @@ msgstr "Rimozione di {path}\""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avvisa riguardo possibili errori nei metadati" msgstr "Avvisa riguardo possibili errori nei metadati"

View file

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

View file

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

View file

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

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2022-09-06 14:30+0000\n"
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\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" "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[0] "Kan ikke bygge som følge av {} feil under skanning"
msgstr[1] "Kan ikke bygge som følge av {} feiler 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 #: ../fdroidserver/rewritemeta.py
#, fuzzy, python-brace-format #, fuzzy, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1537,6 +1542,11 @@ msgstr "Fjerner {path}\""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Advar om mulige metadata-feil" msgstr "Advar om mulige metadata-feil"

View file

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

View file

@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2024-11-26 10:54+0000\n"
"Last-Translator: Bård Sigurd Møller <git@bsmoller.no>\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" "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[0] ""
msgstr[1] "" msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "" msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "" msgstr ""

View file

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

View file

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

View file

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-13 20:43+0000\n" "PO-Revision-Date: 2025-06-24 12:05+0000\n"
"Last-Translator: WaldiS <sto@tutanota.de>\n" "Last-Translator: WaldiS <sto@tutanota.de>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/>\n"
"Language: pl\n" "Language: pl\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -45,7 +45,7 @@ msgstr "\"%s/\" nie ma pasującego pliku metadanych!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr "" msgstr "Klucz „isPrimary” nie powinien być dodawany do mirrorów!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, 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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd." msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "Czytaj '{config_file}'" msgstr "Tworzenie pustego pliku {config_file}"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -657,12 +662,12 @@ msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "BŁĄD: {key} nie jest prawidłowym kluczem!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" msgid "ERROR: {key}'s value should be of type {t}!"
msgstr "" msgstr "BŁĄD: wartość klucza {key} powinna być typu {t}!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, 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!" msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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" msgstr "Ignorowanie błędnego elementu w manifeście: %s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" 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 #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -1143,7 +1148,7 @@ msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" msgid "Mirror config for {url} contains \"isPrimary\" key!"
msgstr "" msgstr "Konfiguracja Mirror dla {url} zawiera klucz \"isPrimary\"!"
#: ../fdroidserver/mirror.py #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "Akceptowany jest tylko jeden klucz \"env\""
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Ostrzegaj o możliwych błędach metadanych" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr "" msgstr "{path1} to duplikat {path2}, usuń jeden z nich!"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, python-brace-format

View file

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-02 21:32+0000\n" "PO-Revision-Date: 2025-04-06 16:45+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n" "Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/>\n"
"Language: pt\n" "Language: pt\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -44,7 +44,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr "" msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, 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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -483,9 +488,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Criando \"{path}\" para configurar s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "A ler '{config_file}'" msgstr "A criar '{config_file}' vazio"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -655,12 +660,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "ERRO: {key} não é uma chave válida!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, 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!" msgstr "A variável de ambiente {var} de {configname} não está definida!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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" msgstr "A ignorar o elemento mau no manifesto: %s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} está obsoleto, use {newfile}" msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -1141,7 +1146,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" 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 #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "Aceita apenas uma única chave \"env\""
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avisar sobre possíveis erros de metadados" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr "" msgstr "{path1} é uma duplicata de {path2}, remova uma!"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, python-brace-format

View file

@ -19,9 +19,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-21 18:43+0000\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n"
"Last-Translator: LucasMZ <git@lucasmz.dev>\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-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"MIME-Version: 1.0\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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1479,7 +1484,7 @@ msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avisa sobre possíveis erros de metadados" msgstr "Avisa sobre possíveis erros de metadados"

View file

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-02 21:32+0000\n" "PO-Revision-Date: 2025-05-30 07:19+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n" "Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/>\n"
"Language: pt_PT\n" "Language: pt_PT\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -46,7 +46,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr "" msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, 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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "Criando \"{path}\" para configurar s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "A ler '{config_file}'" msgstr "A criar '{config_file}' vazio"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -657,12 +662,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "ERRO: {key} não é uma chave válida!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, 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!" msgstr "A variável de ambiente {var} de {configname} não está definida!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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" msgstr "A ignorar o elemento mau no manifesto: %s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" msgid "Ignoring deprecated {oldfile}, use {newfile}!"
msgstr "{oldfile} está obsoleto, use {newfile}" msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -1143,7 +1148,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" 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 #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "Aceita apenas uma única chave \"env\""
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avisar sobre possíveis erros de metadados" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" msgid "{path1} is a duplicate of {path2}, remove one!"
msgstr "" msgstr "{path1} é uma duplicata de {path2}, remova uma!"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, python-brace-format

View file

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2024-12-02 17:00+0000\n"
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n" "Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/>\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[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" 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1489,6 +1494,11 @@ msgstr "Eliminarea lui {path}\""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Avertizează cu privire la posibile erori de metadate" msgstr "Avertizează cu privire la posibile erori de metadate"

View file

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

View file

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

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-21 08:45+0000\n" "PO-Revision-Date: 2025-03-26 21:33+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n" "Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
"Language-Team: Albanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/>\n" "Language-Team: Albanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/>\n"
"Language: 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[0] "Smontohet dot, për shkak të {} gabimi teksa skanohej"
msgstr[1] "Smontohet dot, për shkak të {} gabimeve 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1466,7 +1471,7 @@ msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash"

View file

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

View file

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2025-03-17 21:44+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n" "Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/>\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[0] ""
msgstr[1] "" msgstr[1] ""
#: ../fdroidserver/common.py
#, fuzzy, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr "{path}: {error}"
#: ../fdroidserver/rewritemeta.py #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1487,6 +1492,11 @@ msgstr "Tar bort {path}''"
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Visa varningar vid möjliga metadatafel" msgstr "Visa varningar vid möjliga metadatafel"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 2.3a1\n" "Project-Id-Version: fdroidserver 2.3a1\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2024-09-08 11:09+0000\n"
"Last-Translator: abelbiwott-dev <abelbiwott@outlook.com>\n" "Last-Translator: abelbiwott-dev <abelbiwott@outlook.com>\n"
"Language-Team: Swahili <https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/>\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[0] "Haiwezi kujenga kutokana na kosa la {} wakati wa uchanganuzi"
msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} 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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1486,6 +1491,11 @@ msgstr "Kuondoa {path}\""
msgid "Rename APK files that do not match package.name_123.apk" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." 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}." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea" msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea"

View file

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

View file

@ -4,20 +4,23 @@
# Orhan <orya@pm.me>, 2021. # Orhan <orya@pm.me>, 2021.
# Oğuz Ersen <oguz@ersen.moe>, 2022, 2023, 2024. # Oğuz Ersen <oguz@ersen.moe>, 2022, 2023, 2024.
# Bai <batuhanakkurt000@gmail.com>, 2023. # 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 "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 0.9\n" "Project-Id-Version: fdroidserver 0.9\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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-10 23:49+0000\n" "PO-Revision-Date: 2025-05-26 22:01+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\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-Team: Turkish <https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/>\n"
"Language: tr\n" "Language: tr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: ../fdroidserver/nightly.py
msgid "" msgid ""
@ -43,7 +46,7 @@ msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
msgid "\"isPrimary\" key should not be added to mirrors!" msgid "\"isPrimary\" key should not be added to mirrors!"
msgstr "" msgstr "\"isPrimary\" anahtarı yansılara eklenmemelidir!"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
@ -170,7 +173,7 @@ msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı"
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "--merge-request only runs on a single appid!" 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 #: ../fdroidserver/checkupdates.py
#, python-brace-format #, python-brace-format
@ -295,11 +298,11 @@ msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır."
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "Automatic no to all prompts." msgid "Automatic no to all prompts."
msgstr "" msgstr "Bütün sorulara otomatik olarak hayır."
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "Automatic yes to all prompts." msgid "Automatic yes to all prompts."
msgstr "" msgstr "Bütün sorulara otomatik olarak evet."
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, 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[0] "Tarama sırasında {} hata nedeniyle inşa edilemiyor"
msgstr[1] "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 #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -396,7 +404,7 @@ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işle
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Color the log output" msgid "Color the log output"
msgstr "" msgstr "Günlük çıktısını renklendir"
#: ../fdroidserver/import_subcommand.py #: ../fdroidserver/import_subcommand.py
msgid "Comma separated list of categories." msgid "Comma separated list of categories."
@ -413,7 +421,7 @@ msgstr "Değişiklikleri işle"
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Commit changes, push, then make a merge request" 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 #: ../fdroidserver/metadata.py
#, python-brace-format #, python-brace-format
@ -482,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor." msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor."
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Creating empty {config_file}" msgid "Creating empty {config_file}"
msgstr "'{config_file}' okunuyor" msgstr "Boş {config_file} oluşturuluyor"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
msgid "Creating log directory" msgid "Creating log directory"
@ -598,7 +606,7 @@ msgstr "Rsync sağlama toplamlarını kullanma"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "Download F-Droid.apk using mirrors that leak less to the network" 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 #: ../fdroidserver/__main__.py
msgid "Download complete mirrors of small repos" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key} not a valid key!" msgid "ERROR: {key} not a valid key!"
msgstr "" msgstr "HATA: {key} geçerli bir anahtar değil!"
#: ../fdroidserver/lint.py #: ../fdroidserver/lint.py
#, python-brace-format #, python-brace-format
msgid "ERROR: {key}'s value should be of type {t}!" 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 #: ../fdroidserver/lint.py
#, python-brace-format #, 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!" msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Environment variable {{env: {var}}} is not set!" 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 #: ../fdroidserver/deploy.py
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" 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 #: ../fdroidserver/install.py
msgid "F-Droid.apk could not be downloaded from any known source!" 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 #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
@ -930,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
msgstr "Manifestteki hatalı öğe yok sayılıyor: %s" msgstr "Manifestteki hatalı öğe yok sayılıyor: %s"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, fuzzy, python-brace-format #, python-brace-format
msgid "Ignoring deprecated {oldfile}, use {newfile}!" 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 #: ../fdroidserver/index.py
msgid "Ignoring package without metadata: " msgid "Ignoring package without metadata: "
@ -1140,7 +1148,7 @@ msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s"
#: ../fdroidserver/index.py #: ../fdroidserver/index.py
#, python-brace-format #, python-brace-format
msgid "Mirror config for {url} contains \"isPrimary\" key!" 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 #: ../fdroidserver/mirror.py
msgid "Mirror the full repo and archive, all file types." msgid "Mirror the full repo and archive, all file types."
@ -1173,7 +1181,7 @@ msgstr "Bağlı aygıt bulunamadı"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "No devices found for `adb install`! Please plug one in." 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 #: ../fdroidserver/index.py
msgid "No fingerprint in URL." 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
msgid "Only accepts a single key \"env\"" msgid "Only accepts a single key \"env\""
msgstr "" msgstr "Sadece bir tane anahtar \"env\" kabul edilir"
#: ../fdroidserver/checkupdates.py #: ../fdroidserver/checkupdates.py
msgid "Only process apps with auto-updates" 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 #: ../fdroidserver/install.py
#, python-brace-format #, python-brace-format
msgid "Privacy mode was enabled based on your locale ({country_code})." 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 #: ../fdroidserver/scanner.py
#, python-format #, python-format
@ -1468,11 +1476,11 @@ msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." 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 #: ../fdroidserver/verify.py
msgid "Remove source tarball and any APKs if successfully verified." 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 #: ../fdroidserver/common.py
msgid "Removing specified files" 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" 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" 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 #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" msgid "Resigning {apkfilename} with provided debug.keystore"
@ -1503,7 +1516,7 @@ msgstr "Çıkışı uyarılara ve hatalara kısıtla"
#: ../fdroidserver/net.py #: ../fdroidserver/net.py
#, python-format #, python-format
msgid "Retrying failed download: %s" msgid "Retrying failed download: %s"
msgstr "" msgstr "Başarısız indirme tekrar deneniyor: %s"
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Rewrite all the metadata files" msgid "Rewrite all the metadata files"
@ -1572,7 +1585,7 @@ msgstr[1] "Tarayıcı {} sorun buldu"
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
msgid "Scanning APK for extra signing blocks." msgid "Scanning APK for extra signing blocks."
msgstr "" msgstr "APK'daki ekstra imzalama blokları taranıyor."
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
msgid "Scanning APK with dexdump for known non-free classes." 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 #: ../fdroidserver/index.py
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" 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 #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
@ -2000,20 +2013,24 @@ msgstr "İndeks imzası doğrulanıyor:"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, python-brace-format #, python-brace-format
msgid "Verifying package {path} with apksigner." msgid "Verifying package {path} with apksigner."
msgstr "" msgstr "{path} paketi apksigner ile doğrulanıyor."
#: ../fdroidserver/deploy.py #: ../fdroidserver/deploy.py
#, python-brace-format #, python-brace-format
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." 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." 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 #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "Olası üst veri hataları hakkında uyar" msgstr "Olası üst veri hataları hakkında uyar"
#: ../fdroidserver/scanner.py #: ../fdroidserver/scanner.py
msgid "WebAssembly binary file" msgid "WebAssembly binary file"
msgstr "" msgstr "WebAssembly ikilik dosyası"
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
msgid "When configured for signed indexes, create only unsigned indexes at this stage" 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 #: ../fdroidserver/install.py
msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" 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 #: ../fdroidserver/install.py
msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" 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 #: ../fdroidserver/init.py
msgid "X.509 'Distinguished Name' used when generating keys" msgid "X.509 'Distinguished Name' used when generating keys"
@ -2050,7 +2067,7 @@ msgstr "ZIP dosya arşivi"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, python-brace-format #, python-brace-format
msgid "adb reports {serial} is \"{status}\"!" msgid "adb reports {serial} is \"{status}\"!"
msgstr "" msgstr "adb {serial} için {status} durumunu veriyor!"
#: ../fdroidserver/nightly.py #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
@ -2467,7 +2484,7 @@ msgstr "şu argümanlar gerekli: %s"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "true" msgid "true"
msgstr "" msgstr "doğru"
#: /usr/lib/python3.11/argparse.py #: /usr/lib/python3.11/argparse.py
#, python-format #, python-format
@ -2504,7 +2521,7 @@ msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..."
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
msgid "yes" msgid "yes"
msgstr "" msgstr "evet"
#: ../fdroidserver/publish.py #: ../fdroidserver/publish.py
#, python-brace-format #, python-brace-format
@ -2594,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin."
#: ../fdroidserver/update.py #: ../fdroidserver/update.py
#, python-brace-format #, python-brace-format
msgid "{path1} is a duplicate of {path2}, remove one!" 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 #: ../fdroidserver/import_subcommand.py
#, python-brace-format #, python-brace-format
@ -2619,7 +2636,7 @@ msgstr "{path} virustotal tarafından {count} defa işaretlendi:"
#: ../fdroidserver/install.py #: ../fdroidserver/install.py
#, python-brace-format #, python-brace-format
msgid "{path} has the wrong fingerprint ({fingerprint})!" msgid "{path} has the wrong fingerprint ({fingerprint})!"
msgstr "" msgstr "{path} yanlış {fingerprint} parmak izine sahip!"
#: ../fdroidserver/common.py #: ../fdroidserver/common.py
#, python-brace-format #, python-brace-format

View file

@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n"
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\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" "PO-Revision-Date: 2020-10-29 08:32+0000\n"
"Last-Translator: Hakim Oubouali <hakim.oubouali.skr@gmail.com>\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" "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[0] ""
msgstr[1] "" msgstr[1] ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "Cannot read {path}: {error}"
msgstr ""
#: ../fdroidserver/rewritemeta.py #: ../fdroidserver/rewritemeta.py
#, python-brace-format #, python-brace-format
msgid "Cannot rewrite \"{path}\"" msgid "Cannot rewrite \"{path}\""
@ -1478,6 +1483,11 @@ msgstr ""
msgid "Rename APK files that do not match package.name_123.apk" msgid "Rename APK files that do not match package.name_123.apk"
msgstr "" msgstr ""
#: ../fdroidserver/common.py
#, python-brace-format
msgid "RepoType {type} is deprecated, please switch to git."
msgstr ""
#: ../fdroidserver/nightly.py #: ../fdroidserver/nightly.py
#, python-brace-format #, python-brace-format
msgid "Resigning {apkfilename} with provided debug.keystore" 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}." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
msgstr "" msgstr ""
#: ../fdroidserver/nightly.py
msgid "WARNING: only public git repos are supported!"
msgstr ""
#: ../fdroidserver/__main__.py #: ../fdroidserver/__main__.py
msgid "Warn about possible metadata errors" msgid "Warn about possible metadata errors"
msgstr "" msgstr ""

View file

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

View file

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

View file

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

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