mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-09-13 14:32:28 +03:00
Compare commits
171 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
57244dec63 | ||
![]() |
2eb3986ecf | ||
![]() |
d4ad523dd2 | ||
![]() |
6fff73b678 | ||
![]() |
fbf8fc54db | ||
![]() |
f5f79ac1ea | ||
![]() |
97e9784d5d | ||
![]() |
d20a6a5dcf | ||
![]() |
058f0b7f6a | ||
![]() |
e07cdf5f0c | ||
![]() |
f9d111c8c1 | ||
![]() |
8b54e2b4cf | ||
![]() |
d594a683ab | ||
![]() |
7a98650ed3 | ||
![]() |
b19b8050db | ||
![]() |
6a3758d3c4 | ||
![]() |
546821fc3d | ||
![]() |
120a1655b4 | ||
![]() |
19d709edcd | ||
![]() |
5049645003 | ||
![]() |
e4b54c9768 | ||
![]() |
7988c54d00 | ||
![]() |
05c4bf2483 | ||
![]() |
7e219561b7 | ||
![]() |
6ad3c74bb4 | ||
![]() |
96c0d928da | ||
![]() |
ba5c78d45f | ||
![]() |
8f1411607a | ||
![]() |
97b0b0eaf8 | ||
![]() |
c6c4764b33 | ||
![]() |
7946acd52a | ||
![]() |
0a91b98aee | ||
![]() |
09a51a429b | ||
![]() |
47b5ecdc8c | ||
![]() |
909864a8c7 | ||
![]() |
47b9b24aef | ||
![]() |
f4f1c003a6 | ||
![]() |
51b55963a5 | ||
![]() |
52c1bcca70 | ||
![]() |
8a36e264b4 | ||
![]() |
d5d65cfabd | ||
![]() |
dcb804f70d | ||
![]() |
a0cae97155 | ||
![]() |
956cb11f91 | ||
![]() |
193ca5842c | ||
![]() |
a44364d661 | ||
![]() |
9fffe0aea4 | ||
![]() |
76eb0611a0 | ||
![]() |
e21fd0d167 | ||
![]() |
d5e554dcd6 | ||
![]() |
e3ee7ed42e | ||
![]() |
417ec9fe96 | ||
![]() |
a3cd45c3fb | ||
![]() |
d71fba164c | ||
![]() |
e177520379 | ||
![]() |
10f2a4c592 | ||
![]() |
6b6cc2379c | ||
![]() |
dcd5336138 | ||
![]() |
f953146505 | ||
![]() |
e110390b99 | ||
![]() |
fd3f71ad3c | ||
![]() |
336d5381ae | ||
![]() |
63298ad2ad | ||
![]() |
61777e273c | ||
![]() |
53bf6c7ce1 | ||
![]() |
51c973f15e | ||
![]() |
894fdb641e | ||
![]() |
d029095641 | ||
![]() |
85dba17d48 | ||
![]() |
57541eb52e | ||
![]() |
7e8976d9b0 | ||
![]() |
b6d7e8732b | ||
![]() |
2590f00ff0 | ||
![]() |
1135cee8b7 | ||
![]() |
76d711ba3c | ||
![]() |
b2057a1ce0 | ||
![]() |
ce018158ee | ||
![]() |
d398994ad3 | ||
![]() |
494d811846 | ||
![]() |
964861eb68 | ||
![]() |
8c14e44f63 | ||
![]() |
e1a8e1a08a | ||
![]() |
d5bc7a6942 | ||
![]() |
78e6b8f04c | ||
![]() |
59102fb07f | ||
![]() |
3cb6078059 | ||
![]() |
cd1630d2f5 | ||
![]() |
e44fd22199 | ||
![]() |
69003ae65b | ||
![]() |
d4a71cd572 | ||
![]() |
721de49104 | ||
![]() |
677301bc8a | ||
![]() |
f281068cbf | ||
![]() |
e98f0966e0 | ||
![]() |
0885cf3b49 | ||
![]() |
c70af2503c | ||
![]() |
bd10ee73c1 | ||
![]() |
cfc848771d | ||
![]() |
ac90d11906 | ||
![]() |
7cf1cd1f4c | ||
![]() |
2a939bf87f | ||
![]() |
a5d966bf0f | ||
![]() |
e957583337 | ||
![]() |
6c054f62ca | ||
![]() |
0ac750463f | ||
![]() |
8c9b0b3a2a | ||
![]() |
243a0475f9 | ||
![]() |
e538c34c32 | ||
![]() |
e7060011aa | ||
![]() |
5f534ea2cb | ||
![]() |
ffd4274503 | ||
![]() |
0a8f9ec5fc | ||
![]() |
20b36f1970 | ||
![]() |
0b6e304922 | ||
![]() |
9384c5ab70 | ||
![]() |
7b6767eb50 | ||
![]() |
4e7bda736c | ||
![]() |
2a9c8e9644 | ||
![]() |
da58061c80 | ||
![]() |
696df82999 | ||
![]() |
cc61a3e9e3 | ||
![]() |
3b78b3cf06 | ||
![]() |
0e086f5e61 | ||
![]() |
61943c3f06 | ||
![]() |
eebbfedee5 | ||
![]() |
1a9ba8e956 | ||
![]() |
dd64d557f2 | ||
![]() |
cd0b961e3c | ||
![]() |
57ec6a93ed | ||
![]() |
0e752f1ef0 | ||
![]() |
13166fce05 | ||
![]() |
22af55fb6d | ||
![]() |
858edaaa4d | ||
![]() |
f2faeca949 | ||
![]() |
9e51fa36e5 | ||
![]() |
7924888e5a | ||
![]() |
b581d08b6f | ||
![]() |
b83c1aace3 | ||
![]() |
561da8f7d1 | ||
![]() |
b93fc6f9da | ||
![]() |
265adadaba | ||
![]() |
2a33857fd0 | ||
![]() |
3b360f6b80 | ||
![]() |
004103357b | ||
![]() |
56338cd7d0 | ||
![]() |
a03cfa3fc2 | ||
![]() |
c4d46a187f | ||
![]() |
692f79ec7d | ||
![]() |
17e5a59704 | ||
![]() |
029636ed61 | ||
![]() |
d34d051329 | ||
![]() |
2aba6fd324 | ||
![]() |
f7cc4812a2 | ||
![]() |
9bcd13bfdd | ||
![]() |
7f67a882e7 | ||
![]() |
6ad79e3c06 | ||
![]() |
3e67bee037 | ||
![]() |
3b9d39ac61 | ||
![]() |
aa9cc14991 | ||
![]() |
07d499ce1f | ||
![]() |
a13dd109d3 | ||
![]() |
3582a12f18 | ||
![]() |
69f9f52ba2 | ||
![]() |
046c527ee8 | ||
![]() |
0d88a94192 | ||
![]() |
e6cff099f2 | ||
![]() |
bb7394ab3c | ||
![]() |
a011b34b97 | ||
![]() |
9a8d80ee6b | ||
![]() |
ef4bbe4612 | ||
![]() |
90b82ea7e6 |
157 changed files with 5277 additions and 1557 deletions
2
.bandit
2
.bandit
|
@ -1,3 +1,3 @@
|
|||
[bandit]
|
||||
skips: B110,B404,B408,B603,B607
|
||||
skips: B110,B404,B408,B603,B607,B322
|
||||
targets: .
|
||||
|
|
230
.gitlab-ci.yml
230
.gitlab-ci.yml
|
@ -1,5 +1,22 @@
|
|||
---
|
||||
|
||||
# Use merge request pipelines when a merge request is open for the branch.
|
||||
# Use branch pipelines when a merge request is not open for the branch.
|
||||
# https://docs.gitlab.com/ci/yaml/workflow/#switch-between-branch-pipelines-and-merge-request-pipelines
|
||||
workflow:
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
|
||||
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH
|
||||
|
||||
|
||||
stages:
|
||||
- lint
|
||||
- test # default for jobs that do not specify stage:
|
||||
- deploy
|
||||
|
||||
|
||||
variables:
|
||||
pip: pip3 --timeout 100 --retries 10
|
||||
# speed up git checkout phase
|
||||
|
@ -50,6 +67,7 @@ metadata_v0:
|
|||
- git checkout $RELEASE_COMMIT_ID
|
||||
- cd ..
|
||||
- git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git
|
||||
- rm -f fdroiddata/config.yml # ignore config for this test
|
||||
- cd fdroiddata
|
||||
- ../tests/dump_internal_metadata_format.py
|
||||
- cd ..
|
||||
|
@ -80,12 +98,31 @@ metadata_v0:
|
|||
# Ubuntu and other distros often lack https:// support
|
||||
- grep Debian /etc/issue.net
|
||||
&& { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }
|
||||
# The official Debian docker images ship without ca-certificates,
|
||||
# TLS certificates cannot be verified until that is installed. The
|
||||
# following code turns off TLS verification, and enables HTTPS, so
|
||||
# at least unverified TLS is used for apt-get instead of plain
|
||||
# HTTP. Once ca-certificates is installed, the CA verification is
|
||||
# enabled by removing this config. This set up makes the initial
|
||||
# `apt-get update` and `apt-get install` look the same as verified
|
||||
# TLS to the network observer and hides the metadata.
|
||||
- echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates
|
||||
- apt-get update
|
||||
- apt-get install ca-certificates
|
||||
- rm /etc/apt/apt.conf.d/99nocacertificates
|
||||
- apt-get dist-upgrade
|
||||
|
||||
# For jobs that only need to run when there are changes to Python files.
|
||||
.python-rules-changes: &python-rules-changes
|
||||
rules:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- fdroid
|
||||
- makebuildserver
|
||||
- setup.py
|
||||
- fdroidserver/*.py
|
||||
- tests/*.py
|
||||
|
||||
|
||||
# Since F-Droid uses Debian as its default platform, from production
|
||||
# servers to CI to contributor machines, it is important to know when
|
||||
|
@ -94,8 +131,8 @@ metadata_v0:
|
|||
debian_testing:
|
||||
image: debian:testing
|
||||
<<: *apt-template
|
||||
only:
|
||||
- master@fdroid/fdroidserver
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
|
||||
script:
|
||||
- apt-get install
|
||||
aapt
|
||||
|
@ -123,8 +160,8 @@ debian_testing:
|
|||
ubuntu_lts_ppa:
|
||||
image: ubuntu:latest
|
||||
<<: *apt-template
|
||||
only:
|
||||
- master@fdroid/fdroidserver
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
|
||||
script:
|
||||
- export ANDROID_HOME=/usr/lib/android-sdk
|
||||
- apt-get install gnupg
|
||||
|
@ -183,24 +220,9 @@ ubuntu_jammy_pip:
|
|||
- LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind'
|
||||
|
||||
|
||||
# The gradlew-fdroid tests are isolated from the rest of the test
|
||||
# suite, so they run as their own job.
|
||||
gradlew-fdroid:
|
||||
image: debian:bookworm-slim
|
||||
<<: *apt-template
|
||||
only:
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- gradlew-fdroid
|
||||
- tests/test_gradlew-fdroid
|
||||
script:
|
||||
- apt-get install ca-certificates curl default-jdk-headless shellcheck unzip
|
||||
- shellcheck --severity=error --color gradlew-fdroid tests/test_gradlew-fdroid
|
||||
- ./tests/test_gradlew-fdroid
|
||||
|
||||
|
||||
# Run all the various linters and static analysis tools.
|
||||
lint_format_bandit_checks:
|
||||
hooks/pre-commit:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
variables:
|
||||
LANG: C.UTF-8
|
||||
|
@ -215,34 +237,60 @@ lint_format_bandit_checks:
|
|||
make
|
||||
pycodestyle
|
||||
pyflakes3
|
||||
pylint
|
||||
python3-dev
|
||||
python3-git
|
||||
python3-nose
|
||||
python3-pip
|
||||
python3-yaml
|
||||
shellcheck
|
||||
- ./hooks/pre-commit
|
||||
|
||||
bandit:
|
||||
image: debian:bookworm-slim
|
||||
<<: *python-rules-changes
|
||||
<<: *apt-template
|
||||
script:
|
||||
- apt-get install python3-pip
|
||||
- $pip install --break-system-packages bandit
|
||||
- export EXITVALUE=0
|
||||
- function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; }
|
||||
- ./hooks/pre-commit || set_error
|
||||
- bandit
|
||||
-r
|
||||
-ii
|
||||
--ini .bandit
|
||||
|| set_error
|
||||
- pylint --output-format=colorized --reports=n
|
||||
- bandit -r -ii --ini .bandit
|
||||
|
||||
pylint:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
<<: *python-rules-changes
|
||||
<<: *apt-template
|
||||
script:
|
||||
- apt-get install pylint python3-pip
|
||||
- $pip install --break-system-packages pylint-gitlab
|
||||
- pylint --output-format=colorized,pylint_gitlab.GitlabCodeClimateReporter:pylint-report.json
|
||||
fdroid
|
||||
makebuildserver
|
||||
setup.py
|
||||
fdroidserver/*.py
|
||||
tests/*.py
|
||||
|| set_error
|
||||
- shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests
|
||||
|| set_error
|
||||
- exit $EXITVALUE
|
||||
artifacts:
|
||||
reports:
|
||||
codequality: pylint-report.json
|
||||
when: always
|
||||
|
||||
|
||||
shellcheck:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
rules:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- hooks/install-hooks.sh
|
||||
- hooks/pre-commit
|
||||
- tests/run-tests
|
||||
<<: *apt-template
|
||||
script:
|
||||
- apt-get install shellcheck
|
||||
# TODO GitLab Code Quality report https://github.com/koalaman/shellcheck/issues/3155
|
||||
- shellcheck --exclude SC2046,SC2090 --severity=warning --color
|
||||
hooks/install-hooks.sh
|
||||
hooks/pre-commit
|
||||
tests/run-tests
|
||||
|
||||
# Check all the dependencies in Debian to mirror production. CVEs are
|
||||
# generally fixed in the latest versions in pip/pypi.org, so it isn't
|
||||
# so important to scan that kind of install in CI.
|
||||
|
@ -250,10 +298,7 @@ lint_format_bandit_checks:
|
|||
safety:
|
||||
image: debian:bookworm-slim
|
||||
rules:
|
||||
# once only:/changes: are ported to rules:, this could be removed:
|
||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||
when: never
|
||||
- if: $CI_PIPELINE_SOURCE == "push" && $SAFETY_API_KEY
|
||||
- if: $SAFETY_API_KEY
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- .safety-policy.yml
|
||||
|
@ -276,13 +321,10 @@ safety:
|
|||
|
||||
# TODO tests/*/*/*.yaml are not covered
|
||||
yamllint:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
rules:
|
||||
# once only:/changes: are ported to rules:, this could be removed:
|
||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||
when: never
|
||||
- if: $CI_PIPELINE_SOURCE == "push"
|
||||
changes:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- .safety-policy.yml
|
||||
- .yamllint
|
||||
|
@ -303,8 +345,8 @@ yamllint:
|
|||
tests/*/*/.*.yml
|
||||
|
||||
|
||||
# Run all the various linters and static analysis tools.
|
||||
locales:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
variables:
|
||||
LANG: C.UTF-8
|
||||
|
@ -323,6 +365,7 @@ locales:
|
|||
|
||||
|
||||
black:
|
||||
stage: lint
|
||||
image: debian:bookworm-slim
|
||||
<<: *apt-template
|
||||
script:
|
||||
|
@ -375,8 +418,8 @@ fedora_latest:
|
|||
macOS:
|
||||
tags:
|
||||
- saas-macos-medium-m1
|
||||
only:
|
||||
- master@fdroid/fdroidserver
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
|
||||
script:
|
||||
- export HOMEBREW_CURL_RETRIES=10
|
||||
- brew update > /dev/null
|
||||
|
@ -387,7 +430,7 @@ macOS:
|
|||
- brew install --cask android-commandlinetools temurin # temurin is a JDK
|
||||
|
||||
# test suite dependencies
|
||||
- brew install dash bash coreutils gnu-sed
|
||||
- brew install bash coreutils gnu-sed
|
||||
# TODO port tests/run-tests to POSIX and gsed, it has a couple GNU-isms like du --bytes
|
||||
- export PATH="$(brew --prefix fdroidserver)/libexec/bin:$(brew --prefix coreutils)/libexec/gnubin:$PATH"
|
||||
|
||||
|
@ -404,53 +447,45 @@ macOS:
|
|||
|
||||
- echo "macOS sticks with bash 3.x because of licenses, so avoid new bash syntax"
|
||||
- /bin/bash --version
|
||||
- /bin/bash -n gradlew-fdroid tests/run-tests
|
||||
- /bin/bash -n tests/run-tests
|
||||
|
||||
# test fdroidserver from git with current package's dependencies
|
||||
- fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests
|
||||
|
||||
|
||||
gradle:
|
||||
image: debian:bookworm-slim
|
||||
image: debian:trixie-slim
|
||||
<<: *apt-template
|
||||
variables:
|
||||
GIT_DEPTH: 1000
|
||||
rules:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- makebuildserver
|
||||
script:
|
||||
- apt-get install
|
||||
ca-certificates
|
||||
git
|
||||
openssh-client
|
||||
python3-bs4
|
||||
python3-colorama
|
||||
python3-git
|
||||
python3-gitlab
|
||||
python3-packaging
|
||||
python3-requests
|
||||
# if this is a merge request fork, then only check if relevant files changed
|
||||
- if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then
|
||||
git fetch https://gitlab.com/fdroid/fdroidserver.git;
|
||||
for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do
|
||||
test "$f" == "makebuildserver" && export CHANGED="yes";
|
||||
test "$f" == "gradlew-fdroid" && export CHANGED="yes";
|
||||
done;
|
||||
test -z "$CHANGED" && exit;
|
||||
fi
|
||||
- ./tests/gradle-release-checksums.py
|
||||
|
||||
|
||||
# Run an actual build in a simple, faked version of the buildserver guest VM.
|
||||
fdroid build:
|
||||
image: registry.gitlab.com/fdroid/fdroidserver:buildserver
|
||||
only:
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- fdroidserver/build.py
|
||||
- fdroidserver/common.py
|
||||
- fdroidserver/exception.py
|
||||
- fdroidserver/metadata.py
|
||||
- fdroidserver/net.py
|
||||
- fdroidserver/scanner.py
|
||||
- fdroidserver/vmtools.py
|
||||
rules:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- fdroidserver/build.py
|
||||
- fdroidserver/common.py
|
||||
- fdroidserver/exception.py
|
||||
- fdroidserver/metadata.py
|
||||
- fdroidserver/net.py
|
||||
- fdroidserver/scanner.py
|
||||
- fdroidserver/vmtools.py
|
||||
# for the docker: job which depends on this one
|
||||
- makebuildserver
|
||||
- buildserver/*
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
|
@ -486,6 +521,8 @@ fdroid build:
|
|||
env HOME=$home_vagrant
|
||||
fdroid"
|
||||
|
||||
- git -C $home_vagrant/gradlew-fdroid pull
|
||||
|
||||
- chown -R vagrant $home_vagrant
|
||||
- chown -R vagrant $fdroidserver/.git
|
||||
- chown vagrant $fdroidserver/
|
||||
|
@ -511,11 +548,11 @@ fdroid build:
|
|||
plugin_fetchsrclibs:
|
||||
image: debian:bookworm-slim
|
||||
<<: *apt-template
|
||||
only:
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- examples/fdroid_fetchsrclibs.py
|
||||
- fdroidserver/__main__.py
|
||||
rules:
|
||||
- changes:
|
||||
- .gitlab-ci.yml
|
||||
- examples/fdroid_fetchsrclibs.py
|
||||
- fdroidserver/__main__.py
|
||||
script:
|
||||
- apt-get install
|
||||
curl
|
||||
|
@ -555,8 +592,8 @@ plugin_fetchsrclibs:
|
|||
servergitmirrors:
|
||||
image: debian:bookworm-slim
|
||||
<<: *apt-template
|
||||
only:
|
||||
- master@fdroid/fdroidserver
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
|
||||
script:
|
||||
- apt-get install
|
||||
default-jdk-headless
|
||||
|
@ -598,6 +635,7 @@ servergitmirrors:
|
|||
|
||||
Build documentation:
|
||||
image: debian:bookworm-slim
|
||||
<<: *python-rules-changes
|
||||
<<: *apt-template
|
||||
script:
|
||||
- apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver
|
||||
|
@ -617,8 +655,8 @@ Build documentation:
|
|||
Windows:
|
||||
tags:
|
||||
- windows
|
||||
only:
|
||||
- windows
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "windows"
|
||||
script:
|
||||
- Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
|
||||
- choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath"
|
||||
|
@ -669,7 +707,9 @@ pages:
|
|||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
needs: ["Build documentation"]
|
||||
needs:
|
||||
- job: "Build documentation"
|
||||
optional: true
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch
|
||||
|
||||
|
@ -681,13 +721,12 @@ pages:
|
|||
docker:
|
||||
dependencies:
|
||||
- fdroid build
|
||||
only:
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- makebuildserver
|
||||
- buildserver/*
|
||||
variables:
|
||||
- $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid"
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver"
|
||||
changes:
|
||||
- .gitlab-ci.yml
|
||||
- makebuildserver
|
||||
- buildserver/*
|
||||
image: docker:dind
|
||||
services:
|
||||
- docker:dind
|
||||
|
@ -714,11 +753,12 @@ docker:
|
|||
|
||||
# PUBLISH is the signing server. It has a very minimal manual setup.
|
||||
PUBLISH:
|
||||
image: debian:bullseye-backports
|
||||
image: debian:bookworm-backports
|
||||
<<: *python-rules-changes
|
||||
script:
|
||||
- apt-get update
|
||||
- apt-get -qy upgrade
|
||||
- apt-get -qy install --no-install-recommends -t bullseye-backports
|
||||
- apt-get -qy install --no-install-recommends -t bookworm-backports
|
||||
androguard
|
||||
apksigner
|
||||
curl
|
||||
|
|
1
.well-known/funding-manifest-urls
Normal file
1
.well-known/funding-manifest-urls
Normal file
|
@ -0,0 +1 @@
|
|||
https://f-droid.org/funding.json
|
43
CHANGELOG.md
43
CHANGELOG.md
|
@ -4,6 +4,49 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||
|
||||
## [2.4.2] - 2025-06-24
|
||||
|
||||
### Fixed
|
||||
|
||||
* nightly: fix bug that clones nightly repo to wrong location
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1672
|
||||
* Sync translations for all supported languages: es pl ru
|
||||
|
||||
## [2.4.1] - 2025-06-23
|
||||
|
||||
### Added
|
||||
|
||||
* build: Clearer error messages when working with Git.
|
||||
* verify: generate <appid>.json files that list all reports
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1632
|
||||
|
||||
### Fixed
|
||||
|
||||
* deploy: use master branch when working complete git-mirror repo
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1666
|
||||
* update: use ctime/mtime to control _strip_and_copy_image runs
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1665
|
||||
* update: If categories.yml only has icon:, then add name:
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1659
|
||||
* update: fix handling of Triple-T 1.0.0 graphics
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1652
|
||||
* update: never execute any VCS e.g. git
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1630
|
||||
* config: lazyload environment variables in config.yml
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1645
|
||||
* config: make localized name/description/icon optional
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1649
|
||||
* lint: add repo_key_sha256 to list of valid config keys
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1643
|
||||
* build: calculate all combinations of gradle flavors
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1638
|
||||
* build: set SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file
|
||||
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1653
|
||||
* Sync translations for all supported languages: ca cs de fr ga ja pl pt pt_BR
|
||||
pt_PT ru sq tr uk zh_Hans
|
||||
|
||||
### Removed
|
||||
|
||||
## [2.4.0] - 2025-03-25
|
||||
|
||||
### Added
|
||||
|
|
|
@ -20,6 +20,7 @@ include examples/template.yml
|
|||
include examples/Vagrantfile.yaml
|
||||
include gradlew-fdroid
|
||||
include LICENSE
|
||||
include locale/ba/LC_MESSAGES/fdroidserver.po
|
||||
include locale/bo/LC_MESSAGES/fdroidserver.po
|
||||
include locale/ca/LC_MESSAGES/fdroidserver.po
|
||||
include locale/cs/LC_MESSAGES/fdroidserver.po
|
||||
|
@ -803,6 +804,7 @@ include tests/source-files/firebase-allowlisted/app/build.gradle
|
|||
include tests/source-files/firebase-allowlisted/build.gradle
|
||||
include tests/source-files/firebase-suspect/app/build.gradle
|
||||
include tests/source-files/firebase-suspect/build.gradle
|
||||
include tests/source-files/flavor.test/build.gradle
|
||||
include tests/source-files/info.guardianproject.ripple/build.gradle
|
||||
include tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml
|
||||
include tests/source-files/lockfile.test/flutter/pubspec.lock
|
||||
|
@ -868,6 +870,10 @@ include tests/test_signatures.py
|
|||
include tests/test_signindex.py
|
||||
include tests/test_update.py
|
||||
include tests/test_vcs.py
|
||||
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png
|
||||
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/icon/icon.png
|
||||
include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/phoneScreenshots/1.png
|
||||
include tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml
|
||||
include tests/triple-t-2/build/org.piwigo.android/app/.gitignore
|
||||
include tests/triple-t-2/build/org.piwigo.android/app/build.gradle
|
||||
include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml
|
||||
|
|
|
@ -37,11 +37,22 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch
|
|||
#
|
||||
# Ensure fdroidserver's dependencies are marked manual before purging
|
||||
# unneeded packages, otherwise, all its dependencies get purged.
|
||||
#
|
||||
# The official Debian docker images ship without ca-certificates, so
|
||||
# TLS certificates cannot be verified until that is installed. The
|
||||
# following code temporarily turns off TLS verification, and enables
|
||||
# HTTPS, so at least unverified TLS is used for apt-get instead of
|
||||
# plain HTTP. Once ca-certificates is installed, the CA verification
|
||||
# is enabled by removing the newly created config file. This set up
|
||||
# makes the initial `apt-get update` and `apt-get install` look the
|
||||
# same as verified TLS to the network observer and hides the metadata.
|
||||
RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \
|
||||
&& mkdir -p /usr/share/man/man1 \
|
||||
&& echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates \
|
||||
&& find /etc/apt/sources.list* -type f -exec sed -i s,http:,https:, {} \; \
|
||||
&& apt-get update \
|
||||
&& apt-get install ca-certificates \
|
||||
&& sed -i 's,http:,https:,' /etc/apt/sources.list.d/debian.sources \
|
||||
&& rm /etc/apt/apt.conf.d/99nocacertificates \
|
||||
&& apt-get upgrade \
|
||||
&& apt-get dist-upgrade \
|
||||
&& apt-get install openssh-client iproute2 python3 openssh-server sudo \
|
||||
|
|
|
@ -104,6 +104,7 @@ apt-get upgrade
|
|||
apt-get update || apt-get update
|
||||
|
||||
packages="
|
||||
androguard/bookworm-backports
|
||||
apksigner
|
||||
default-jdk-headless
|
||||
default-jre-headless
|
||||
|
|
|
@ -25,7 +25,12 @@ fi
|
|||
chmod -R a+rX /opt/gradle
|
||||
|
||||
test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin
|
||||
ln -fs /home/vagrant/fdroidserver/gradlew-fdroid /opt/gradle/bin/gradle
|
||||
git clone --depth 1 https://gitlab.com/fdroid/gradlew-fdroid.git /home/vagrant/gradlew-fdroid/
|
||||
chmod 0755 /home/vagrant/gradlew-fdroid/gradlew-fdroid
|
||||
chmod -R u+rwX,a+rX,go-w /home/vagrant/gradlew-fdroid/
|
||||
ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /opt/gradle/bin/gradle
|
||||
ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /usr/local/bin/
|
||||
|
||||
chown -h vagrant:vagrant /opt/gradle/bin/gradle
|
||||
chown vagrant:vagrant /opt/gradle/versions
|
||||
chmod 0755 /opt/gradle/versions
|
||||
|
|
|
@ -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()
|
|
@ -12,6 +12,7 @@
|
|||
#
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.abspath('../../fdroidserver'))
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
|
|
@ -6,7 +6,6 @@ import argparse
|
|||
import logging
|
||||
|
||||
from fdroidserver import _, common, metadata
|
||||
|
||||
from fdroidserver.exception import VCSException
|
||||
|
||||
fdroid_summary = 'reset app VCSs to the latest version'
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
import os
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from fdroidserver import common
|
||||
from fdroidserver.common import FDroidPopen
|
||||
from fdroidserver.exception import BuildException
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
import os
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from fdroidserver import common
|
||||
from fdroidserver.common import FDroidPopen
|
||||
from fdroidserver.exception import BuildException
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#
|
||||
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from fdroidserver import common, index
|
||||
|
||||
fdroid_summary = 'export the keystore in standard PEM format'
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
import argparse
|
||||
import os
|
||||
import pprint
|
||||
|
||||
from fdroidserver import _, common, metadata
|
||||
|
||||
fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`'
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from fdroidserver import common
|
||||
from fdroidserver.common import FDroidPopen
|
||||
from fdroidserver.exception import BuildException
|
||||
|
|
|
@ -3,7 +3,6 @@ import glob
|
|||
import os
|
||||
import sys
|
||||
|
||||
|
||||
# support running straight from git and standard installs
|
||||
rootpaths = [
|
||||
os.path.realpath(os.path.join(os.path.dirname(__file__), '..')),
|
||||
|
@ -15,7 +14,10 @@ rootpaths = [
|
|||
|
||||
localedir = None
|
||||
for rootpath in rootpaths:
|
||||
if len(glob.glob(os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo'))) > 0:
|
||||
found_mo = glob.glob(
|
||||
os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo')
|
||||
)
|
||||
if len(found_mo) > 0:
|
||||
localedir = os.path.join(rootpath, 'locale')
|
||||
break
|
||||
|
||||
|
@ -24,39 +26,52 @@ gettext.textdomain('fdroidserver')
|
|||
_ = gettext.gettext
|
||||
|
||||
|
||||
from fdroidserver.exception import (FDroidException,
|
||||
MetaDataException,
|
||||
VerificationException) # NOQA: E402
|
||||
from fdroidserver.exception import (
|
||||
FDroidException,
|
||||
MetaDataException,
|
||||
VerificationException, # NOQA: E402
|
||||
)
|
||||
|
||||
FDroidException # NOQA: B101
|
||||
MetaDataException # NOQA: B101
|
||||
VerificationException # NOQA: B101
|
||||
|
||||
from fdroidserver.common import (verify_apk_signature,
|
||||
genkeystore as generate_keystore) # NOQA: E402
|
||||
from fdroidserver.common import genkeystore as generate_keystore # NOQA: E402
|
||||
from fdroidserver.common import verify_apk_signature
|
||||
|
||||
verify_apk_signature # NOQA: B101
|
||||
generate_keystore # NOQA: B101
|
||||
from fdroidserver.index import (download_repo_index,
|
||||
download_repo_index_v1,
|
||||
download_repo_index_v2,
|
||||
get_mirror_service_urls,
|
||||
make as make_index) # NOQA: E402
|
||||
from fdroidserver.index import (
|
||||
download_repo_index,
|
||||
download_repo_index_v1,
|
||||
download_repo_index_v2,
|
||||
get_mirror_service_urls,
|
||||
)
|
||||
from fdroidserver.index import make as make_index # NOQA: E402
|
||||
|
||||
download_repo_index # NOQA: B101
|
||||
download_repo_index_v1 # NOQA: B101
|
||||
download_repo_index_v2 # NOQA: B101
|
||||
get_mirror_service_urls # NOQA: B101
|
||||
make_index # NOQA: B101
|
||||
from fdroidserver.update import (process_apk,
|
||||
process_apks,
|
||||
scan_apk,
|
||||
scan_repo_files) # NOQA: E402
|
||||
from fdroidserver.update import (
|
||||
process_apk,
|
||||
process_apks,
|
||||
scan_apk,
|
||||
scan_repo_files, # NOQA: E402
|
||||
)
|
||||
|
||||
process_apk # NOQA: B101
|
||||
process_apks # NOQA: B101
|
||||
scan_apk # NOQA: B101
|
||||
scan_repo_files # NOQA: B101
|
||||
from fdroidserver.deploy import (update_awsbucket,
|
||||
update_servergitmirrors,
|
||||
update_serverwebroots,
|
||||
update_serverwebroot) # NOQA: E402
|
||||
from fdroidserver.deploy import (
|
||||
update_awsbucket,
|
||||
update_servergitmirrors,
|
||||
update_serverwebroot, # NOQA: E402
|
||||
update_serverwebroots,
|
||||
)
|
||||
|
||||
update_awsbucket # NOQA: B101
|
||||
update_servergitmirrors # NOQA: B101
|
||||
update_serverwebroots # NOQA: B101
|
||||
|
|
|
@ -18,20 +18,20 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import re
|
||||
import sys
|
||||
import importlib.metadata
|
||||
import logging
|
||||
import os
|
||||
import pkgutil
|
||||
import logging
|
||||
import importlib.metadata
|
||||
|
||||
import git
|
||||
import fdroidserver.common
|
||||
import fdroidserver.metadata
|
||||
from fdroidserver import _
|
||||
import re
|
||||
import sys
|
||||
from argparse import ArgumentError
|
||||
from collections import OrderedDict
|
||||
|
||||
import git
|
||||
|
||||
import fdroidserver.common
|
||||
import fdroidserver.metadata
|
||||
from fdroidserver import _
|
||||
|
||||
COMMANDS = OrderedDict([
|
||||
("build", _("Build a package from source")),
|
||||
|
|
|
@ -68,9 +68,18 @@ import struct
|
|||
import sys
|
||||
import zipfile
|
||||
import zlib
|
||||
|
||||
from collections import namedtuple
|
||||
from typing import Any, BinaryIO, Callable, Dict, Iterable, Iterator, Optional, Tuple, Union
|
||||
from typing import (
|
||||
Any,
|
||||
BinaryIO,
|
||||
Callable,
|
||||
Dict,
|
||||
Iterable,
|
||||
Iterator,
|
||||
Optional,
|
||||
Tuple,
|
||||
Union,
|
||||
)
|
||||
|
||||
__version__ = "1.1.1"
|
||||
NAME = "apksigcopier"
|
||||
|
|
|
@ -28,22 +28,21 @@
|
|||
# the F-Droid client.
|
||||
|
||||
import collections
|
||||
import defusedxml.minidom
|
||||
import git
|
||||
import glob
|
||||
import os
|
||||
import json
|
||||
import logging
|
||||
import requests
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
import zipfile
|
||||
from argparse import ArgumentParser
|
||||
from typing import Optional
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import deploy
|
||||
import defusedxml.minidom
|
||||
import git
|
||||
import requests
|
||||
|
||||
from . import _, common, deploy
|
||||
from .exception import FDroidException
|
||||
|
||||
|
||||
|
|
|
@ -18,31 +18,27 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import argparse
|
||||
import glob
|
||||
import subprocess
|
||||
import logging
|
||||
import os
|
||||
import posixpath
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import tarfile
|
||||
import threading
|
||||
import traceback
|
||||
import time
|
||||
import requests
|
||||
import tempfile
|
||||
import argparse
|
||||
import logging
|
||||
import threading
|
||||
import time
|
||||
import traceback
|
||||
from gettext import ngettext
|
||||
from pathlib import Path
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import net
|
||||
from . import metadata
|
||||
from . import scanner
|
||||
from . import vmtools
|
||||
import requests
|
||||
|
||||
from . import _, common, metadata, net, scanner, vmtools
|
||||
from .common import FDroidPopen
|
||||
from .exception import FDroidException, BuildException, VCSException
|
||||
from .exception import BuildException, FDroidException, VCSException
|
||||
|
||||
try:
|
||||
import paramiko
|
||||
|
@ -155,9 +151,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
|
|||
ftp.mkdir('fdroidserver')
|
||||
ftp.chdir('fdroidserver')
|
||||
ftp.put(os.path.join(serverpath, '..', 'fdroid'), 'fdroid')
|
||||
ftp.put(os.path.join(serverpath, '..', 'gradlew-fdroid'), 'gradlew-fdroid')
|
||||
ftp.chmod('fdroid', 0o755) # nosec B103 permissions are appropriate
|
||||
ftp.chmod('gradlew-fdroid', 0o755) # nosec B103 permissions are appropriate
|
||||
send_dir(os.path.join(serverpath))
|
||||
ftp.chdir(homedir)
|
||||
|
||||
|
@ -479,7 +473,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
logging.critical("Android NDK '%s' is not a directory!" % ndk_path)
|
||||
raise FDroidException()
|
||||
|
||||
common.set_FDroidPopen_env(build)
|
||||
common.set_FDroidPopen_env(app, build)
|
||||
|
||||
# create ..._toolsversion.log when running in builder vm
|
||||
if onserver:
|
||||
|
@ -541,13 +535,13 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
if build.preassemble:
|
||||
gradletasks += build.preassemble
|
||||
|
||||
flavours = build.gradle
|
||||
if flavours == ['yes']:
|
||||
flavours = []
|
||||
flavors = build.gradle
|
||||
if flavors == ['yes']:
|
||||
flavors = []
|
||||
|
||||
flavours_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavours])
|
||||
flavors_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavors])
|
||||
|
||||
gradletasks += ['assemble' + flavours_cmd + 'Release']
|
||||
gradletasks += ['assemble' + flavors_cmd + 'Release']
|
||||
|
||||
cmd = [config['gradle']]
|
||||
if build.gradleprops:
|
||||
|
@ -721,8 +715,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
bindir = os.path.join(root_dir, 'bin')
|
||||
|
||||
if os.path.isdir(os.path.join(build_dir, '.git')):
|
||||
import git
|
||||
commit_id = common.get_head_commit_id(git.repo.Repo(build_dir))
|
||||
commit_id = str(common.get_head_commit_id(build_dir))
|
||||
else:
|
||||
commit_id = build.commit
|
||||
|
||||
|
@ -764,11 +757,11 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
# really old path
|
||||
os.path.join(root_dir, 'build', 'apk'),
|
||||
]
|
||||
# If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in
|
||||
# a subdirectory corresponding to the flavour command used, but with different
|
||||
# If we build with gradle flavors with gradle plugin >= 3.0 the APK will be in
|
||||
# a subdirectory corresponding to the flavor command used, but with different
|
||||
# capitalization.
|
||||
if flavours_cmd:
|
||||
apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavours_cmd, str.lower), 'release'))
|
||||
if flavors_cmd:
|
||||
apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavors_cmd, str.lower), 'release'))
|
||||
for apks_dir in apk_dirs:
|
||||
for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']:
|
||||
apks = glob.glob(os.path.join(apks_dir, apkglob))
|
||||
|
|
|
@ -19,28 +19,30 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import configparser
|
||||
import git
|
||||
import copy
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
import time
|
||||
import subprocess
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
import time
|
||||
import traceback
|
||||
import logging
|
||||
import copy
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from . import net
|
||||
from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException
|
||||
import git
|
||||
|
||||
from . import _, common, metadata, net
|
||||
from .exception import (
|
||||
FDroidException,
|
||||
MetaDataException,
|
||||
NoSubmodulesException,
|
||||
VCSException,
|
||||
)
|
||||
|
||||
# https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36
|
||||
BOT_EMAIL = 'fdroidci@bubu1.eu'
|
||||
|
@ -724,7 +726,7 @@ def checkout_appid_branch(appid):
|
|||
try:
|
||||
git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}')
|
||||
except Exception as e:
|
||||
logging.warning('"%s" branch not found on origin remote:\n\t%s', appid, e)
|
||||
logging.debug('"%s" branch not found on origin remote:\n\t%s', appid, e)
|
||||
if appid in git_repo.remotes.origin.refs:
|
||||
start_point = f"origin/{appid}"
|
||||
for commit in git_repo.iter_commits(
|
||||
|
@ -749,7 +751,7 @@ def get_changes_versus_ref(git_repo, ref, f):
|
|||
return changes
|
||||
|
||||
|
||||
def push_commits(branch_name='checkupdates', verbose=False):
|
||||
def push_commits(branch_name='checkupdates'):
|
||||
"""Make git branch then push commits as merge request.
|
||||
|
||||
The appid is parsed from the actual file that was changed so that
|
||||
|
@ -769,6 +771,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
|
|||
* https://docs.gitlab.com/ee/user/project/push_options.html
|
||||
|
||||
"""
|
||||
if branch_name != "checkupdates":
|
||||
if callable(getattr(git.SymbolicReference, "_check_ref_name_valid", None)):
|
||||
git.SymbolicReference._check_ref_name_valid(branch_name)
|
||||
|
||||
git_repo = git.Repo.init('.')
|
||||
upstream_main = get_upstream_main_branch(git_repo)
|
||||
files = set()
|
||||
|
@ -783,6 +789,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
|
|||
if not files:
|
||||
return
|
||||
|
||||
# https://git-scm.com/docs/git-check-ref-format Git refname can't end with .lock
|
||||
if branch_name.endswith(".lock"):
|
||||
branch_name = f"{branch_name}_"
|
||||
|
||||
remote = git_repo.remotes.origin
|
||||
if branch_name in remote.refs:
|
||||
if not get_changes_versus_ref(git_repo, f'origin/{branch_name}', files[0]):
|
||||
|
@ -806,21 +816,10 @@ def push_commits(branch_name='checkupdates', verbose=False):
|
|||
if current_version_only:
|
||||
push_options.append('merge_request.draft')
|
||||
|
||||
progress = None
|
||||
if verbose:
|
||||
import clint.textui
|
||||
|
||||
progress_bar = clint.textui.progress.Bar()
|
||||
|
||||
class MyProgressPrinter(git.RemoteProgress):
|
||||
def update(self, op_code, current, maximum=None, message=None):
|
||||
if isinstance(maximum, float):
|
||||
progress_bar.show(current, maximum)
|
||||
|
||||
progress = MyProgressPrinter()
|
||||
progress = git.RemoteProgress()
|
||||
|
||||
pushinfos = remote.push(
|
||||
branch_name,
|
||||
f"HEAD:refs/heads/{branch_name}",
|
||||
progress=progress,
|
||||
force=True,
|
||||
set_upstream=True,
|
||||
|
@ -828,22 +827,22 @@ def push_commits(branch_name='checkupdates', verbose=False):
|
|||
)
|
||||
|
||||
for pushinfo in pushinfos:
|
||||
logging.info(pushinfo.summary)
|
||||
# Show potentially useful messages from git remote
|
||||
if progress:
|
||||
for line in progress.other_lines:
|
||||
logging.info(line)
|
||||
if pushinfo.flags & (
|
||||
git.remote.PushInfo.ERROR
|
||||
| git.remote.PushInfo.REJECTED
|
||||
| git.remote.PushInfo.REMOTE_FAILURE
|
||||
| git.remote.PushInfo.REMOTE_REJECTED
|
||||
):
|
||||
# Show potentially useful messages from git remote
|
||||
if progress:
|
||||
for line in progress.other_lines:
|
||||
if line.startswith('remote:'):
|
||||
logging.debug(line)
|
||||
raise FDroidException(
|
||||
f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}'
|
||||
)
|
||||
else:
|
||||
logging.debug(remote.url + ': ' + pushinfo.summary)
|
||||
logging.info(remote.url + ': ' + pushinfo.summary)
|
||||
|
||||
|
||||
def prune_empty_appid_branches(git_repo=None, main_branch='main'):
|
||||
|
@ -953,7 +952,7 @@ def main():
|
|||
exit_code = 1
|
||||
|
||||
if options.appid and options.merge_request:
|
||||
push_commits(verbose=options.verbose)
|
||||
push_commits()
|
||||
prune_empty_appid_branches()
|
||||
|
||||
status_update_json(processed, failed)
|
||||
|
|
|
@ -52,52 +52,58 @@ environment variable to include.
|
|||
|
||||
"""
|
||||
|
||||
import ast
|
||||
import base64
|
||||
import copy
|
||||
import difflib
|
||||
from typing import List
|
||||
import git
|
||||
import filecmp
|
||||
import glob
|
||||
import io
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import ast
|
||||
import gzip
|
||||
import hashlib
|
||||
import io
|
||||
import itertools
|
||||
import json
|
||||
import logging
|
||||
import operator
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import socket
|
||||
import stat
|
||||
import subprocess
|
||||
import time
|
||||
import operator
|
||||
import logging
|
||||
import hashlib
|
||||
import socket
|
||||
import base64
|
||||
import zipfile
|
||||
import sys
|
||||
import tempfile
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
import defusedxml.ElementTree as XMLElementTree
|
||||
|
||||
import time
|
||||
import zipfile
|
||||
from argparse import BooleanOptionalAction
|
||||
from asn1crypto import cms
|
||||
from base64 import urlsafe_b64encode
|
||||
from binascii import hexlify
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
from queue import Queue
|
||||
from typing import List
|
||||
from urllib.parse import urlparse, urlsplit, urlunparse
|
||||
from zipfile import ZipFile
|
||||
|
||||
import defusedxml.ElementTree as XMLElementTree
|
||||
import git
|
||||
from asn1crypto import cms
|
||||
|
||||
import fdroidserver.metadata
|
||||
from fdroidserver import _
|
||||
from fdroidserver._yaml import yaml, config_dump
|
||||
from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \
|
||||
BuildException, VerificationException, MetaDataException
|
||||
from .asynchronousfilereader import AsynchronousFileReader
|
||||
from .looseversion import LooseVersion
|
||||
from fdroidserver._yaml import config_dump, yaml
|
||||
from fdroidserver.exception import (
|
||||
BuildException,
|
||||
FDroidException,
|
||||
MetaDataException,
|
||||
NoSubmodulesException,
|
||||
VCSException,
|
||||
VerificationException,
|
||||
)
|
||||
|
||||
from . import apksigcopier, common
|
||||
|
||||
from .asynchronousfilereader import AsynchronousFileReader
|
||||
from .looseversion import LooseVersion
|
||||
|
||||
# The path to this fdroidserver distribution
|
||||
FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
|
||||
|
@ -182,7 +188,7 @@ default_config = {
|
|||
'scan_binary': False,
|
||||
'ant': "ant",
|
||||
'mvn3': "mvn",
|
||||
'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'),
|
||||
'gradle': shutil.which('gradlew-fdroid'),
|
||||
'sync_from_local_copy_dir': False,
|
||||
'allow_disabled_algorithms': False,
|
||||
'keep_when_not_allowed': False,
|
||||
|
@ -545,6 +551,60 @@ def config_type_check(path, data):
|
|||
)
|
||||
|
||||
|
||||
class _Config(dict):
|
||||
def __init__(self, default={}):
|
||||
super(_Config, self).__init__(default)
|
||||
self.loaded = {}
|
||||
|
||||
def lazyget(self, key):
|
||||
if key not in self.loaded:
|
||||
value = super(_Config, self).__getitem__(key)
|
||||
|
||||
if key == 'serverwebroot':
|
||||
roots = parse_list_of_dicts(value)
|
||||
rootlist = []
|
||||
for d in roots:
|
||||
# since this is used with rsync, where trailing slashes have
|
||||
# meaning, ensure there is always a trailing slash
|
||||
rootstr = d.get('url')
|
||||
if not rootstr:
|
||||
logging.error('serverwebroot: has blank value!')
|
||||
continue
|
||||
if rootstr[-1] != '/':
|
||||
rootstr += '/'
|
||||
d['url'] = rootstr.replace('//', '/')
|
||||
rootlist.append(d)
|
||||
self.loaded[key] = rootlist
|
||||
|
||||
elif key == 'servergitmirrors':
|
||||
self.loaded[key] = parse_list_of_dicts(value)
|
||||
|
||||
elif isinstance(value, dict) and 'env' in value and len(value) == 1:
|
||||
var = value['env']
|
||||
if var in os.environ:
|
||||
self.loaded[key] = os.getenv(var)
|
||||
else:
|
||||
logging.error(
|
||||
_(
|
||||
'Environment variable {var} from {configname} is not set!'
|
||||
).format(var=value['env'], configname=key)
|
||||
)
|
||||
self.loaded[key] = None
|
||||
else:
|
||||
self.loaded[key] = value
|
||||
|
||||
return self.loaded[key]
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.lazyget(key)
|
||||
|
||||
def get(self, key, default=None, /):
|
||||
try:
|
||||
return self.lazyget(key)
|
||||
except KeyError:
|
||||
return default
|
||||
|
||||
|
||||
def read_config():
|
||||
"""Read the repository config.
|
||||
|
||||
|
@ -600,25 +660,7 @@ def read_config():
|
|||
|
||||
fill_config_defaults(config)
|
||||
|
||||
if 'serverwebroot' in config:
|
||||
roots = parse_list_of_dicts(config['serverwebroot'])
|
||||
rootlist = []
|
||||
for d in roots:
|
||||
# since this is used with rsync, where trailing slashes have
|
||||
# meaning, ensure there is always a trailing slash
|
||||
rootstr = d.get('url')
|
||||
if not rootstr:
|
||||
logging.error('serverwebroot: has blank value!')
|
||||
continue
|
||||
if rootstr[-1] != '/':
|
||||
rootstr += '/'
|
||||
d['url'] = rootstr.replace('//', '/')
|
||||
rootlist.append(d)
|
||||
config['serverwebroot'] = rootlist
|
||||
|
||||
if 'servergitmirrors' in config:
|
||||
config['servergitmirrors'] = parse_list_of_dicts(config['servergitmirrors'])
|
||||
|
||||
limit = config['git_mirror_size_limit']
|
||||
config['git_mirror_size_limit'] = parse_human_readable_size(limit)
|
||||
|
||||
|
@ -641,15 +683,7 @@ def read_config():
|
|||
continue
|
||||
elif isinstance(dictvalue, dict):
|
||||
for k, v in dictvalue.items():
|
||||
if k == 'env':
|
||||
env = os.getenv(v)
|
||||
if env:
|
||||
config[configname] = env
|
||||
else:
|
||||
confignames_to_delete.add(configname)
|
||||
logging.error(_('Environment variable {var} from {configname} is not set!')
|
||||
.format(var=k, configname=configname))
|
||||
else:
|
||||
if k != 'env':
|
||||
confignames_to_delete.add(configname)
|
||||
logging.error(_('Unknown entry {key} in {configname}')
|
||||
.format(key=k, configname=configname))
|
||||
|
@ -669,6 +703,7 @@ def read_config():
|
|||
)
|
||||
)
|
||||
|
||||
config = _Config(config)
|
||||
return config
|
||||
|
||||
|
||||
|
@ -782,7 +817,10 @@ def load_localized_config(name, repodir):
|
|||
icons_dir = os.path.join(repodir, 'icons')
|
||||
if not os.path.exists(icons_dir):
|
||||
os.makedirs(icons_dir, exist_ok=True)
|
||||
shutil.copy(os.path.join("config", value), icons_dir)
|
||||
src = os.path.join("config", value)
|
||||
dest = os.path.join(icons_dir, os.path.basename(src))
|
||||
if not os.path.exists(dest) or not filecmp.cmp(src, dest):
|
||||
shutil.copy2(src, dest)
|
||||
ret[afname][key][locale] = file_entry(
|
||||
os.path.join(icons_dir, value)
|
||||
)
|
||||
|
@ -1201,6 +1239,25 @@ def get_src_tarball_name(appid, versionCode):
|
|||
return f"{appid}_{versionCode}_src.tar.gz"
|
||||
|
||||
|
||||
def get_source_date_epoch(build_dir):
|
||||
"""Return timestamp suitable for the SOURCE_DATE_EPOCH variable.
|
||||
|
||||
https://reproducible-builds.org/docs/source-date-epoch/
|
||||
|
||||
"""
|
||||
try:
|
||||
return git.repo.Repo(build_dir).git.log(n=1, pretty='%ct')
|
||||
except Exception as e:
|
||||
logging.warning('%s: %s', e.__class__.__name__, build_dir)
|
||||
build_dir = Path(build_dir)
|
||||
appid = build_dir.name
|
||||
data_dir = build_dir.parent.parent
|
||||
metadata_file = f'metadata/{appid}.yml'
|
||||
if (data_dir / '.git').exists() and (data_dir / metadata_file).exists():
|
||||
repo = git.repo.Repo(data_dir)
|
||||
return repo.git.log('-n1', '--pretty=%ct', '--', metadata_file)
|
||||
|
||||
|
||||
def get_build_dir(app):
|
||||
"""Get the dir that this app will be built in."""
|
||||
if app.RepoType == 'srclib':
|
||||
|
@ -1286,12 +1343,29 @@ def write_status_json(output, pretty=False, name=None):
|
|||
rsync_status_file_to_repo(path, repo_subdir='status')
|
||||
|
||||
|
||||
def get_head_commit_id(git_repo):
|
||||
"""Get git commit ID for HEAD as a str."""
|
||||
def get_head_commit_id(git_repo_dir):
|
||||
"""Get git commit ID for HEAD as a str.
|
||||
|
||||
This only reads files, so it should be safe to use on untrusted
|
||||
repos. It was created to avoid running the git executable, no
|
||||
matter what. It uses a tiny subset of the git.Repo class to avoid
|
||||
setting up the git executable.
|
||||
|
||||
"""
|
||||
try:
|
||||
return git_repo.head.commit.hexsha
|
||||
except ValueError:
|
||||
return "None"
|
||||
if type(git_repo_dir) is git.Repo:
|
||||
d = git_repo_dir.git_dir
|
||||
else:
|
||||
d = os.path.join(git_repo_dir, '.git')
|
||||
repo = type(
|
||||
'Repo',
|
||||
(object,),
|
||||
{'common_dir': d, 'git_dir': d, 're_hexsha_only': git.Repo.re_hexsha_only},
|
||||
)()
|
||||
return git.refs.symbolic.SymbolicReference.dereference_recursive(repo, 'HEAD')
|
||||
except (FileNotFoundError, ValueError) as e:
|
||||
msg = _("Cannot read {path}: {error}").format(path=os.getcwd(), error=str(e))
|
||||
logging.debug(msg)
|
||||
|
||||
|
||||
def setup_vcs(app):
|
||||
|
@ -1318,6 +1392,7 @@ def getvcs(vcstype, remote, local):
|
|||
"""
|
||||
if vcstype == 'git':
|
||||
return vcs_git(remote, local)
|
||||
logging.warning(_("RepoType {type} is deprecated, please switch to git.").format(type=vcstype))
|
||||
if vcstype == 'git-svn':
|
||||
return vcs_gitsvn(remote, local)
|
||||
if vcstype == 'hg':
|
||||
|
@ -1523,10 +1598,15 @@ class vcs_git(vcs):
|
|||
it! This is called as a safety check.
|
||||
|
||||
"""
|
||||
p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False)
|
||||
cmd = ['git', 'rev-parse', '--show-toplevel']
|
||||
p = FDroidPopen(cmd, cwd=self.local, output=False)
|
||||
result = p.output.rstrip()
|
||||
if p.returncode > 0:
|
||||
raise VCSException(
|
||||
f"`{' '.join(cmd)}` failed, (in '{os.path.abspath(self.local)}') {result}"
|
||||
)
|
||||
if Path(result) != Path(self.local).resolve():
|
||||
raise VCSException('Repository mismatch')
|
||||
raise VCSException(f"Repository mismatch ('{self.local}' != '{result}')")
|
||||
|
||||
def gotorevisionx(self, rev):
|
||||
if not os.path.exists(self.local):
|
||||
|
@ -1946,7 +2026,7 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None):
|
|||
return retrieve_string(app_dir, string, xmlfiles).replace('\n', ' ').strip()
|
||||
|
||||
|
||||
def manifest_paths(app_dir, flavours):
|
||||
def manifest_paths(app_dir, flavors):
|
||||
"""Return list of existing files that will be used to find the highest vercode."""
|
||||
possible_manifests = \
|
||||
[Path(app_dir) / 'AndroidManifest.xml',
|
||||
|
@ -1956,18 +2036,18 @@ def manifest_paths(app_dir, flavours):
|
|||
Path(app_dir) / 'build-extras.gradle',
|
||||
Path(app_dir) / 'build.gradle.kts']
|
||||
|
||||
for flavour in flavours:
|
||||
if flavour == 'yes':
|
||||
for flavor in flavors:
|
||||
if flavor == 'yes':
|
||||
continue
|
||||
possible_manifests.append(
|
||||
Path(app_dir) / 'src' / flavour / 'AndroidManifest.xml')
|
||||
Path(app_dir) / 'src' / flavor / 'AndroidManifest.xml')
|
||||
|
||||
return [path for path in possible_manifests if path.is_file()]
|
||||
|
||||
|
||||
def fetch_real_name(app_dir, flavours):
|
||||
def fetch_real_name(app_dir, flavors):
|
||||
"""Retrieve the package name. Returns the name, or None if not found."""
|
||||
for path in manifest_paths(app_dir, flavours):
|
||||
for path in manifest_paths(app_dir, flavors):
|
||||
if not path.suffix == '.xml' or not path.is_file():
|
||||
continue
|
||||
logging.debug("fetch_real_name: Checking manifest at %s" % path)
|
||||
|
@ -2085,17 +2165,17 @@ def parse_androidmanifests(paths, app):
|
|||
vercode = None
|
||||
package = None
|
||||
|
||||
flavours = None
|
||||
flavors = None
|
||||
temp_app_id = None
|
||||
temp_version_name = None
|
||||
if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle:
|
||||
flavours = app['Builds'][-1].gradle
|
||||
flavors = app['Builds'][-1].gradle
|
||||
|
||||
if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'):
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
android_plugin_file = False
|
||||
inside_flavour_group = 0
|
||||
inside_required_flavour = 0
|
||||
inside_flavor_group = 0
|
||||
inside_required_flavor = 0
|
||||
for line in f:
|
||||
if gradle_comment.match(line):
|
||||
continue
|
||||
|
@ -2110,8 +2190,8 @@ def parse_androidmanifests(paths, app):
|
|||
if matches:
|
||||
temp_version_name = matches
|
||||
|
||||
if inside_flavour_group > 0:
|
||||
if inside_required_flavour > 1:
|
||||
if inside_flavor_group > 0:
|
||||
if inside_required_flavor > 1:
|
||||
matches = psearch_g(line)
|
||||
if matches:
|
||||
s = matches.group(2)
|
||||
|
@ -2141,29 +2221,29 @@ def parse_androidmanifests(paths, app):
|
|||
if matches:
|
||||
vercode = version_code_string_to_int(matches.group(1))
|
||||
|
||||
if inside_required_flavour > 0:
|
||||
if inside_required_flavor > 0:
|
||||
if '{' in line:
|
||||
inside_required_flavour += 1
|
||||
inside_required_flavor += 1
|
||||
if '}' in line:
|
||||
inside_required_flavour -= 1
|
||||
if inside_required_flavour == 1:
|
||||
inside_required_flavour -= 1
|
||||
elif flavours:
|
||||
for flavour in flavours:
|
||||
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line):
|
||||
inside_required_flavour = 2
|
||||
inside_required_flavor -= 1
|
||||
if inside_required_flavor == 1:
|
||||
inside_required_flavor -= 1
|
||||
elif flavors:
|
||||
for flavor in flavors:
|
||||
if re.match(r'.*[\'"\s]{flavor}[\'"\s].*\{{.*'.format(flavor=flavor), line):
|
||||
inside_required_flavor = 2
|
||||
break
|
||||
if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line):
|
||||
inside_required_flavour = 1
|
||||
if re.match(r'.*[\'"\s]{flavor}[\'"\s].*'.format(flavor=flavor), line):
|
||||
inside_required_flavor = 1
|
||||
break
|
||||
|
||||
if '{' in line:
|
||||
inside_flavour_group += 1
|
||||
inside_flavor_group += 1
|
||||
if '}' in line:
|
||||
inside_flavour_group -= 1
|
||||
inside_flavor_group -= 1
|
||||
else:
|
||||
if "productFlavors" in line:
|
||||
inside_flavour_group = 1
|
||||
inside_flavor_group = 1
|
||||
if not package:
|
||||
matches = psearch_g(line)
|
||||
if matches:
|
||||
|
@ -2507,9 +2587,9 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
|||
with open(path, 'w', encoding='iso-8859-1') as f:
|
||||
f.write(props)
|
||||
|
||||
flavours = []
|
||||
flavors = []
|
||||
if build.build_method() == 'gradle':
|
||||
flavours = build.gradle
|
||||
flavors = build.gradle
|
||||
|
||||
if build.target:
|
||||
n = build.target.split('-')[1]
|
||||
|
@ -2531,7 +2611,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
|||
# Insert version code and number into the manifest if necessary
|
||||
if build.forceversion:
|
||||
logging.info("Changing the version name")
|
||||
for path in manifest_paths(root_dir, flavours):
|
||||
for path in manifest_paths(root_dir, flavors):
|
||||
if not os.path.isfile(path):
|
||||
continue
|
||||
if path.suffix == '.xml':
|
||||
|
@ -2545,7 +2625,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
|||
|
||||
if build.forcevercode:
|
||||
logging.info("Changing the version code")
|
||||
for path in manifest_paths(root_dir, flavours):
|
||||
for path in manifest_paths(root_dir, flavors):
|
||||
if not path.is_file():
|
||||
continue
|
||||
if path.suffix == '.xml':
|
||||
|
@ -2657,17 +2737,17 @@ def getpaths_map(build_dir, globpaths):
|
|||
paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)]
|
||||
if not paths[p]:
|
||||
not_found_paths.append(p)
|
||||
return paths, not_found_paths
|
||||
|
||||
|
||||
def getpaths(build_dir, globpaths):
|
||||
"""Extend via globbing the paths from a field and return them as a set."""
|
||||
paths_map, not_found_paths = getpaths_map(build_dir, globpaths)
|
||||
if not_found_paths:
|
||||
raise FDroidException(
|
||||
"Some glob paths did not match any files/dirs:\n"
|
||||
+ "\n".join(not_found_paths)
|
||||
)
|
||||
return paths
|
||||
|
||||
|
||||
def getpaths(build_dir, globpaths):
|
||||
"""Extend via globbing the paths from a field and return them as a set."""
|
||||
paths_map = getpaths_map(build_dir, globpaths)
|
||||
paths = set()
|
||||
for k, v in paths_map.items():
|
||||
for p in v:
|
||||
|
@ -2828,9 +2908,9 @@ def is_debuggable_or_testOnly(apkfile):
|
|||
return False
|
||||
try:
|
||||
# these were moved in androguard 4.0
|
||||
from androguard.core.axml import AXMLParser, format_value, START_TAG
|
||||
from androguard.core.axml import START_TAG, AXMLParser, format_value
|
||||
except ImportError:
|
||||
from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG
|
||||
from androguard.core.bytecodes.axml import START_TAG, AXMLParser, format_value
|
||||
_androguard_logging_level()
|
||||
|
||||
with ZipFile(apkfile) as apk:
|
||||
|
@ -2902,9 +2982,23 @@ def get_apk_id_androguard(apkfile):
|
|||
|
||||
try:
|
||||
# these were moved in androguard 4.0
|
||||
from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT
|
||||
from androguard.core.axml import (
|
||||
END_DOCUMENT,
|
||||
END_TAG,
|
||||
START_TAG,
|
||||
TEXT,
|
||||
AXMLParser,
|
||||
format_value,
|
||||
)
|
||||
except ImportError:
|
||||
from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT
|
||||
from androguard.core.bytecodes.axml import (
|
||||
END_DOCUMENT,
|
||||
END_TAG,
|
||||
START_TAG,
|
||||
TEXT,
|
||||
AXMLParser,
|
||||
format_value,
|
||||
)
|
||||
_androguard_logging_level()
|
||||
|
||||
appid = None
|
||||
|
@ -3180,12 +3274,16 @@ def remove_signing_keys(build_dir):
|
|||
logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path))
|
||||
|
||||
|
||||
def set_FDroidPopen_env(build=None):
|
||||
def set_FDroidPopen_env(app=None, build=None):
|
||||
"""Set up the environment variables for the build environment.
|
||||
|
||||
There is only a weak standard, the variables used by gradle, so also set
|
||||
up the most commonly used environment variables for SDK and NDK. Also, if
|
||||
there is no locale set, this will set the locale (e.g. LANG) to en_US.UTF-8.
|
||||
|
||||
If an App instance is provided, then the SOURCE_DATE_EPOCH
|
||||
environment variable will be set based on that app's source repo.
|
||||
|
||||
"""
|
||||
global env, orig_path
|
||||
|
||||
|
@ -3208,6 +3306,8 @@ def set_FDroidPopen_env(build=None):
|
|||
if missinglocale:
|
||||
env['LANG'] = 'en_US.UTF-8'
|
||||
|
||||
if app:
|
||||
env['SOURCE_DATE_EPOCH'] = get_source_date_epoch(get_build_dir(app))
|
||||
if build is not None:
|
||||
path = build.ndk_path()
|
||||
paths = orig_path.split(os.pathsep)
|
||||
|
@ -3410,22 +3510,6 @@ def apk_signer_fingerprint(apk_path):
|
|||
return signer_fingerprint(cert_encoded)
|
||||
|
||||
|
||||
def apk_signer_fingerprint_short(apk_path):
|
||||
"""Get 7 hex digit SHA-256 fingerprint string for the first signer from given APK.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
apk_path
|
||||
path to APK
|
||||
|
||||
Returns
|
||||
-------
|
||||
first 7 chars of the standard SHA-256 signer fingerprint
|
||||
|
||||
"""
|
||||
return apk_signer_fingerprint(apk_path)[:7]
|
||||
|
||||
|
||||
def metadata_get_sigdir(appid, vercode=None):
|
||||
"""Get signature directory for app."""
|
||||
if vercode:
|
||||
|
@ -3958,11 +4042,13 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None):
|
|||
f.extractall(path=os.path.join(apk2dir, 'content'))
|
||||
|
||||
if set_command_in_config('apktool'):
|
||||
if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'],
|
||||
cwd=apk1dir) != 0:
|
||||
if subprocess.call(
|
||||
[config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir
|
||||
):
|
||||
return "Failed to run apktool " + apk1
|
||||
if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'],
|
||||
cwd=apk2dir) != 0:
|
||||
if subprocess.call(
|
||||
[config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir
|
||||
):
|
||||
return "Failed to run apktool " + apk2
|
||||
|
||||
p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False)
|
||||
|
@ -4790,6 +4876,20 @@ def calculate_archive_policy(app, default):
|
|||
return archive_policy
|
||||
|
||||
|
||||
def calculate_gradle_flavor_combination(flavors):
|
||||
"""Calculate all combinations of gradle flavors."""
|
||||
combination_lists = itertools.product(*[[flavor, ''] for flavor in flavors])
|
||||
combinations = [
|
||||
re.sub(
|
||||
r' +\w',
|
||||
lambda pat: pat.group(0)[-1].upper(),
|
||||
' '.join(combination_list).strip(),
|
||||
)
|
||||
for combination_list in combination_lists
|
||||
]
|
||||
return combinations
|
||||
|
||||
|
||||
FDROIDORG_MIRRORS = [
|
||||
{
|
||||
'isPrimary': True,
|
||||
|
|
|
@ -16,28 +16,28 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import glob
|
||||
import hashlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import urllib
|
||||
from typing import Dict, List
|
||||
from git import Repo
|
||||
import yaml
|
||||
from argparse import ArgumentParser
|
||||
import logging
|
||||
import pathlib
|
||||
import shutil
|
||||
from typing import Dict, List
|
||||
|
||||
import git
|
||||
import yaml
|
||||
from git import Repo
|
||||
|
||||
import fdroidserver.github
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import index
|
||||
from . import _, common, index
|
||||
from .exception import FDroidException
|
||||
|
||||
config = None
|
||||
|
@ -349,8 +349,8 @@ def update_awsbucket_libcloud(repo_section, is_index_only=False):
|
|||
import libcloud.security
|
||||
|
||||
libcloud.security.VERIFY_SSL_CERT = True
|
||||
from libcloud.storage.types import Provider, ContainerDoesNotExistError
|
||||
from libcloud.storage.providers import get_driver
|
||||
from libcloud.storage.types import ContainerDoesNotExistError, Provider
|
||||
|
||||
if not config.get('awsaccesskeyid') or not config.get('awssecretkey'):
|
||||
raise FDroidException(
|
||||
|
@ -617,6 +617,13 @@ def update_servergitmirrors(servergitmirrors, repo_section):
|
|||
For history, there is the archive section, and there is the binary
|
||||
transparency log.
|
||||
|
||||
This will attempt to use the existing remote branch so that it does
|
||||
not have to push all of the files in the repo each time. Old setups
|
||||
or runs of `fdroid nightly` might use the "master" branch. For the
|
||||
"index only" mode, it will recreate the branch from scratch each
|
||||
time since usually all the files are changed. In any case, the
|
||||
index files are small compared to the full repo.
|
||||
|
||||
"""
|
||||
from clint.textui import progress
|
||||
|
||||
|
@ -687,7 +694,7 @@ def update_servergitmirrors(servergitmirrors, repo_section):
|
|||
if is_index_only:
|
||||
local_branch_name = 'index_only'
|
||||
else:
|
||||
local_branch_name = 'full'
|
||||
local_branch_name = GIT_BRANCH
|
||||
if local_branch_name in repo.heads:
|
||||
repo.git.switch(local_branch_name)
|
||||
else:
|
||||
|
@ -847,9 +854,10 @@ def upload_to_android_observatory(repo_section):
|
|||
def upload_apk_to_android_observatory(path):
|
||||
# depend on requests and lxml only if users enable AO
|
||||
import requests
|
||||
from . import net
|
||||
from lxml.html import fromstring
|
||||
|
||||
from . import net
|
||||
|
||||
apkfilename = os.path.basename(path)
|
||||
r = requests.post(
|
||||
'https://androidobservatory.org/',
|
||||
|
|
|
@ -35,6 +35,10 @@ class VCSException(FDroidException):
|
|||
pass
|
||||
|
||||
|
||||
class NoVersionCodeException(FDroidException):
|
||||
pass
|
||||
|
||||
|
||||
class NoSubmodulesException(VCSException):
|
||||
pass
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
import json
|
||||
import pathlib
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
|
||||
class GithubApi:
|
||||
|
|
|
@ -16,14 +16,13 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import glob
|
||||
from argparse import ArgumentParser
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import _, common
|
||||
from .common import FDroidPopen
|
||||
from .exception import FDroidException
|
||||
|
||||
|
|
|
@ -342,7 +342,7 @@ def main():
|
|||
|
||||
app.AutoUpdateMode = 'Version'
|
||||
app.UpdateCheckMode = 'Tags'
|
||||
build.commit = common.get_head_commit_id(git_repo)
|
||||
build.commit = common.get_head_commit_id(tmp_importer_dir)
|
||||
|
||||
# Extract some information...
|
||||
paths = get_all_gradle_and_manifests(tmp_importer_dir)
|
||||
|
|
|
@ -30,6 +30,7 @@ these installed on the signing server.
|
|||
|
||||
"""
|
||||
|
||||
import calendar
|
||||
import collections
|
||||
import hashlib
|
||||
import json
|
||||
|
@ -41,20 +42,27 @@ import sys
|
|||
import tempfile
|
||||
import urllib.parse
|
||||
import zipfile
|
||||
import calendar
|
||||
from binascii import hexlify, unhexlify
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from xml.dom.minidom import Document
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from . import signindex
|
||||
from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_publish_signer_fingerprints
|
||||
from fdroidserver._yaml import yaml
|
||||
from fdroidserver.common import (
|
||||
ANTIFEATURES_CONFIG_NAME,
|
||||
CATEGORIES_CONFIG_NAME,
|
||||
CONFIG_CONFIG_NAME,
|
||||
DEFAULT_LOCALE,
|
||||
MIRRORS_CONFIG_NAME,
|
||||
RELEASECHANNELS_CONFIG_NAME,
|
||||
FDroidPopen,
|
||||
FDroidPopenBytes,
|
||||
load_publish_signer_fingerprints,
|
||||
)
|
||||
from fdroidserver.exception import FDroidException, VerificationException
|
||||
|
||||
from . import _, common, metadata, signindex
|
||||
|
||||
|
||||
def make(apps, apks, repodir, archive):
|
||||
"""Generate the repo index files.
|
||||
|
@ -152,11 +160,6 @@ def _should_file_be_generated(path, magic_string):
|
|||
|
||||
|
||||
def make_website(apps, repodir, repodict):
|
||||
_ignored, repo_pubkey_fingerprint = extract_pubkey()
|
||||
repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "")
|
||||
link = repodict["address"]
|
||||
link_fingerprinted = ('{link}?fingerprint={fingerprint}'
|
||||
.format(link=link, fingerprint=repo_pubkey_fingerprint_stripped))
|
||||
# do not change this string, as it will break updates for files with older versions of this string
|
||||
autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file"
|
||||
|
||||
|
@ -168,6 +171,13 @@ def make_website(apps, repodir, repodict):
|
|||
|
||||
if _should_file_be_generated(html_file, autogenerate_comment):
|
||||
import qrcode
|
||||
|
||||
_ignored, repo_pubkey_fingerprint = extract_pubkey()
|
||||
repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "")
|
||||
link = repodict["address"]
|
||||
link_fingerprinted = '{link}?fingerprint={fingerprint}'.format(
|
||||
link=link, fingerprint=repo_pubkey_fingerprint_stripped
|
||||
)
|
||||
qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png"))
|
||||
with open(html_file, 'w') as f:
|
||||
name = repodict["name"]
|
||||
|
@ -585,7 +595,10 @@ def convert_version(version, app, repodir):
|
|||
ver["file"]["ipfsCIDv1"] = ipfsCIDv1
|
||||
|
||||
if "srcname" in version:
|
||||
ver["src"] = common.file_entry(os.path.join(repodir, version["srcname"]))
|
||||
ver["src"] = common.file_entry(
|
||||
os.path.join(repodir, version["srcname"]),
|
||||
version["srcnameSha256"],
|
||||
)
|
||||
|
||||
if "obbMainFile" in version:
|
||||
ver["obbMainFile"] = common.file_entry(
|
||||
|
@ -681,9 +694,13 @@ def v2_repo(repodict, repodir, archive):
|
|||
|
||||
config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir)
|
||||
if config:
|
||||
repo["name"] = config["archive" if archive else "repo"]["name"]
|
||||
repo["description"] = config["archive" if archive else "repo"]["description"]
|
||||
repo["icon"] = config["archive" if archive else "repo"]["icon"]
|
||||
localized_config = config["archive" if archive else "repo"]
|
||||
if "name" in localized_config:
|
||||
repo["name"] = localized_config["name"]
|
||||
if "description" in localized_config:
|
||||
repo["description"] = localized_config["description"]
|
||||
if "icon" in localized_config:
|
||||
repo["icon"] = localized_config["icon"]
|
||||
|
||||
repo["address"] = repodict["address"]
|
||||
if "mirrors" in repodict:
|
||||
|
@ -769,7 +786,9 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, signer_fingerprints
|
|||
# include definitions for "auto-defined" categories, e.g. just used in app metadata
|
||||
for category in sorted(categories_used_by_apps):
|
||||
if category not in output['repo'][CATEGORIES_CONFIG_NAME]:
|
||||
output['repo'][CATEGORIES_CONFIG_NAME][category] = {"name": {DEFAULT_LOCALE: category}}
|
||||
output['repo'][CATEGORIES_CONFIG_NAME][category] = dict()
|
||||
if 'name' not in output['repo'][CATEGORIES_CONFIG_NAME][category]:
|
||||
output['repo'][CATEGORIES_CONFIG_NAME][category]['name'] = {DEFAULT_LOCALE: category}
|
||||
# do not include defined categories if no apps use them
|
||||
for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())):
|
||||
if category not in categories_used_by_apps:
|
||||
|
@ -948,7 +967,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, signer_fingerprints
|
|||
for k, v in sorted(package.items()):
|
||||
if not v:
|
||||
continue
|
||||
if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'):
|
||||
if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name', 'srcnameSha256'):
|
||||
continue
|
||||
if k == 'antiFeatures':
|
||||
d[k] = sorted(v.keys())
|
||||
|
|
|
@ -19,16 +19,15 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import socket
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
import logging
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import _, common
|
||||
from .exception import FDroidException
|
||||
|
||||
config = {}
|
||||
|
|
|
@ -17,24 +17,21 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import os
|
||||
import glob
|
||||
import locale
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import termios
|
||||
import tty
|
||||
|
||||
import defusedxml.ElementTree as XMLElementTree
|
||||
|
||||
from argparse import ArgumentParser, BooleanOptionalAction
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlencode, urlparse, urlunparse
|
||||
|
||||
from . import _
|
||||
from . import common, github, index, net
|
||||
from .exception import FDroidException
|
||||
import defusedxml.ElementTree as XMLElementTree
|
||||
|
||||
from . import _, common, github, index, net
|
||||
from .exception import FDroidException
|
||||
|
||||
DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",)
|
||||
MAVEN_CENTRAL_MIRRORS = [
|
||||
|
|
|
@ -24,9 +24,10 @@ import urllib.parse
|
|||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
|
||||
from . import _, common, metadata, rewritemeta
|
||||
from fdroidserver._yaml import yaml
|
||||
|
||||
from . import _, common, metadata, rewritemeta
|
||||
|
||||
config = None
|
||||
|
||||
|
||||
|
@ -274,6 +275,7 @@ check_config_keys = (
|
|||
'repo',
|
||||
'repo_description',
|
||||
'repo_icon',
|
||||
'repo_key_sha256',
|
||||
'repo_keyalias',
|
||||
'repo_maxage',
|
||||
'repo_name',
|
||||
|
|
|
@ -115,7 +115,7 @@ __license__ = "Python License 2.0"
|
|||
# been done in the StrictVersion class above. This works great as long
|
||||
# as everyone can go along with bondage and discipline. Hopefully a
|
||||
# (large) subset of Python module programmers will agree that the
|
||||
# particular flavour of bondage and discipline provided by StrictVersion
|
||||
# particular flavor of bondage and discipline provided by StrictVersion
|
||||
# provides enough benefit to be worth using, and will submit their
|
||||
# version numbering scheme to its domination. The free-thinking
|
||||
# anarchists in the lot will never give in, though, and something needs
|
||||
|
|
|
@ -18,20 +18,19 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import git
|
||||
from pathlib import Path
|
||||
import math
|
||||
import platform
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
import ruamel.yaml
|
||||
import math
|
||||
import os
|
||||
import platform
|
||||
import re
|
||||
from collections import OrderedDict
|
||||
from pathlib import Path
|
||||
|
||||
from . import common
|
||||
from . import _
|
||||
from .exception import MetaDataException
|
||||
import ruamel.yaml
|
||||
|
||||
from . import _, common
|
||||
from ._yaml import yaml
|
||||
from .exception import MetaDataException
|
||||
|
||||
srclibs = None
|
||||
warnings_action = None
|
||||
|
@ -538,10 +537,10 @@ def read_srclibs():
|
|||
|
||||
srclibs = {}
|
||||
|
||||
srcdir = Path('srclibs')
|
||||
srcdir.mkdir(exist_ok=True)
|
||||
srclibs_dir = Path('srclibs')
|
||||
srclibs_dir.mkdir(exist_ok=True)
|
||||
|
||||
for metadatapath in sorted(srcdir.glob('*.yml')):
|
||||
for metadatapath in sorted(srclibs_dir.glob('*.yml')):
|
||||
srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath)
|
||||
|
||||
|
||||
|
@ -658,14 +657,12 @@ def parse_metadata(metadatapath):
|
|||
build_dir = common.get_build_dir(app)
|
||||
metadata_in_repo = build_dir / '.fdroid.yml'
|
||||
if metadata_in_repo.is_file():
|
||||
try:
|
||||
commit_id = common.get_head_commit_id(git.Repo(build_dir))
|
||||
commit_id = common.get_head_commit_id(build_dir)
|
||||
if commit_id is not None:
|
||||
logging.debug(
|
||||
_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)
|
||||
)
|
||||
# See https://github.com/PyCQA/pylint/issues/2856 .
|
||||
# pylint: disable-next=no-member
|
||||
except git.exc.InvalidGitRepositoryError:
|
||||
else:
|
||||
logging.debug(
|
||||
_('Including metadata from {path}').format(path=metadata_in_repo)
|
||||
)
|
||||
|
|
|
@ -7,13 +7,10 @@ import posixpath
|
|||
import socket
|
||||
import subprocess
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
import urllib.parse
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import index
|
||||
from . import update
|
||||
from . import _, common, index, update
|
||||
|
||||
|
||||
def _run_wget(path, urls, verbose=False):
|
||||
|
@ -133,6 +130,7 @@ def main():
|
|||
import io
|
||||
import json
|
||||
import zipfile
|
||||
|
||||
from . import net
|
||||
|
||||
url = _append_to_url_path(section, 'index-v1.jar')
|
||||
|
|
|
@ -21,10 +21,11 @@ import copy
|
|||
import logging
|
||||
import os
|
||||
import random
|
||||
import requests
|
||||
import tempfile
|
||||
import time
|
||||
import urllib
|
||||
|
||||
import requests
|
||||
import urllib3
|
||||
from requests.adapters import HTTPAdapter, Retry
|
||||
|
||||
|
|
|
@ -19,24 +19,25 @@
|
|||
|
||||
import base64
|
||||
import datetime
|
||||
import git
|
||||
import hashlib
|
||||
import inspect
|
||||
import logging
|
||||
import os
|
||||
import paramiko
|
||||
import platform
|
||||
import shutil
|
||||
import ssl
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import yaml
|
||||
from urllib.parse import urlparse
|
||||
from argparse import ArgumentParser
|
||||
from typing import Optional
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
import git
|
||||
import paramiko
|
||||
import yaml
|
||||
|
||||
from . import _, common
|
||||
from .exception import VCSException
|
||||
|
||||
# hard coded defaults for Android ~/.android/debug.keystore files
|
||||
|
@ -176,7 +177,9 @@ def _ssh_key_from_debug_keystore(keystore: Optional[str] = None) -> str:
|
|||
return ssh_private_key_file
|
||||
|
||||
|
||||
def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[str] = None) -> str:
|
||||
def get_repo_base_url(
|
||||
clone_url: str, repo_git_base: str, force_type: Optional[str] = None
|
||||
) -> str:
|
||||
"""Generate the base URL for the F-Droid repository.
|
||||
|
||||
Parameters
|
||||
|
@ -203,6 +206,41 @@ def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[s
|
|||
sys.exit(1)
|
||||
|
||||
|
||||
def clone_git_repo(clone_url, git_mirror_path):
|
||||
"""Clone a git repo into the given path, failing if a password is required.
|
||||
|
||||
If GitPython's safe mode is present, this will use that. Otherwise,
|
||||
this includes a very limited version of the safe mode just to ensure
|
||||
this won't hang on password prompts.
|
||||
|
||||
https://github.com/gitpython-developers/GitPython/pull/2029
|
||||
|
||||
"""
|
||||
logging.debug(_('cloning {url}').format(url=clone_url))
|
||||
try:
|
||||
sig = inspect.signature(git.Repo.clone_from)
|
||||
if 'safe' in sig.parameters:
|
||||
git.Repo.clone_from(clone_url, git_mirror_path, safe=True)
|
||||
else:
|
||||
git.Repo.clone_from(
|
||||
clone_url,
|
||||
git_mirror_path,
|
||||
env={
|
||||
'GIT_ASKPASS': '/bin/true',
|
||||
'SSH_ASKPASS': '/bin/true',
|
||||
'GIT_USERNAME': 'u',
|
||||
'GIT_PASSWORD': 'p',
|
||||
'GIT_HTTP_USERNAME': 'u',
|
||||
'GIT_HTTP_PASSWORD': 'p',
|
||||
'GIT_SSH': '/bin/false', # for git < 2.3
|
||||
'GIT_TERMINAL_PROMPT': '0',
|
||||
},
|
||||
)
|
||||
except git.exc.GitCommandError as e:
|
||||
logging.warning(_('WARNING: only public git repos are supported!'))
|
||||
raise VCSException(f'git clone {clone_url} failed:', str(e)) from e
|
||||
|
||||
|
||||
def main():
|
||||
"""Deploy to F-Droid repository or generate SSH private key from keystore.
|
||||
|
||||
|
@ -288,19 +326,27 @@ def main():
|
|||
# we are in GitLab CI
|
||||
repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY
|
||||
clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY
|
||||
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='gitlab.com')
|
||||
repo_base = get_repo_base_url(
|
||||
clone_url, repo_git_base, force_type='gitlab.com'
|
||||
)
|
||||
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
|
||||
deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings'
|
||||
deploy_key_url = (
|
||||
f'{clone_url}/-/settings/repository#js-deploy-keys-settings'
|
||||
)
|
||||
git_user_name = os.getenv('GITLAB_USER_NAME')
|
||||
git_user_email = os.getenv('GITLAB_USER_EMAIL')
|
||||
elif 'TRAVIS_REPO_SLUG' in os.environ:
|
||||
# we are in Travis CI
|
||||
repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY
|
||||
clone_url = 'https://github.com/' + repo_git_base
|
||||
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
|
||||
repo_base = get_repo_base_url(
|
||||
clone_url, repo_git_base, force_type='github.com'
|
||||
)
|
||||
servergitmirror = 'git@github.com:' + repo_git_base
|
||||
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
|
||||
deploy_key_url = (
|
||||
f'https://github.com/{repo_git_base}/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
|
||||
)
|
||||
git_user_name = repo_git_base
|
||||
git_user_email = os.getenv('USER') + '@' + platform.node()
|
||||
elif (
|
||||
|
@ -309,23 +355,35 @@ def main():
|
|||
and 'CIRCLE_PROJECT_REPONAME' in os.environ
|
||||
):
|
||||
# we are in Circle CI
|
||||
repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME')
|
||||
+ '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY)
|
||||
repo_git_base = (
|
||||
os.getenv('CIRCLE_PROJECT_USERNAME')
|
||||
+ '/'
|
||||
+ os.getenv('CIRCLE_PROJECT_REPONAME')
|
||||
+ NIGHTLY
|
||||
)
|
||||
clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + NIGHTLY
|
||||
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
|
||||
repo_base = get_repo_base_url(
|
||||
clone_url, repo_git_base, force_type='github.com'
|
||||
)
|
||||
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
|
||||
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
|
||||
deploy_key_url = (
|
||||
f'https://github.com/{repo_git_base}/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
|
||||
)
|
||||
git_user_name = os.getenv('CIRCLE_USERNAME')
|
||||
git_user_email = git_user_name + '@' + platform.node()
|
||||
elif 'GITHUB_ACTIONS' in os.environ:
|
||||
# we are in Github actions
|
||||
repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY)
|
||||
clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base)
|
||||
repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com')
|
||||
repo_git_base = os.getenv('GITHUB_REPOSITORY') + NIGHTLY
|
||||
clone_url = os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base
|
||||
repo_base = get_repo_base_url(
|
||||
clone_url, repo_git_base, force_type='github.com'
|
||||
)
|
||||
servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base
|
||||
deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys')
|
||||
deploy_key_url = (
|
||||
f'https://github.com/{repo_git_base}/settings/keys'
|
||||
+ '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
|
||||
)
|
||||
git_user_name = os.getenv('GITHUB_ACTOR')
|
||||
git_user_email = git_user_name + '@' + platform.node()
|
||||
else:
|
||||
|
@ -338,14 +396,11 @@ def main():
|
|||
git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo')
|
||||
git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata')
|
||||
if not os.path.isdir(git_mirror_repodir):
|
||||
logging.debug(_('cloning {url}').format(url=clone_url))
|
||||
vcs = common.getvcs('git', clone_url, git_mirror_path)
|
||||
p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)])
|
||||
if p.returncode != 0:
|
||||
print('WARNING: only public git repos are supported!')
|
||||
raise VCSException('git clone %s failed:' % clone_url, p.output)
|
||||
clone_git_repo(clone_url, git_mirror_path)
|
||||
if not os.path.isdir(git_mirror_repodir):
|
||||
os.makedirs(git_mirror_repodir, mode=0o755)
|
||||
if os.path.exists('LICENSE'):
|
||||
shutil.copy2('LICENSE', git_mirror_path)
|
||||
|
||||
mirror_git_repo = git.Repo.init(git_mirror_path)
|
||||
writer = mirror_git_repo.config_writer()
|
||||
|
@ -364,9 +419,13 @@ You can use it with the [F-Droid](https://f-droid.org/) Android app.
|
|||
|
||||
[](https://fdroid.link/#{repo_url})
|
||||
|
||||
Last updated: {date}'''.format(repo_git_base=repo_git_base,
|
||||
repo_url=repo_url,
|
||||
date=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC'))
|
||||
Last updated: {date}'''.format(
|
||||
repo_git_base=repo_git_base,
|
||||
repo_url=repo_url,
|
||||
date=datetime.datetime.now(datetime.timezone.utc).strftime(
|
||||
'%Y-%m-%d %H:%M:%S UTC'
|
||||
),
|
||||
)
|
||||
with open(readme_path, 'w') as fp:
|
||||
fp.write(readme)
|
||||
mirror_git_repo.git.add(all=True)
|
||||
|
@ -427,10 +486,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base,
|
|||
common.assert_config_keystore(config)
|
||||
|
||||
logging.debug(
|
||||
_('Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}').format(
|
||||
cibase=cibase,
|
||||
repo_basedir=repo_basedir
|
||||
)
|
||||
_(
|
||||
'Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}'
|
||||
).format(cibase=cibase, repo_basedir=repo_basedir)
|
||||
)
|
||||
|
||||
for root, dirs, files in os.walk(cibase):
|
||||
|
@ -518,10 +576,16 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base,
|
|||
if not os.path.exists(androiddir):
|
||||
os.mkdir(androiddir)
|
||||
logging.info(_('created {path}').format(path=androiddir))
|
||||
logging.error(_('{path} does not exist! Create it by running:').format(path=options.keystore)
|
||||
+ '\n keytool -genkey -v -keystore ' + options.keystore + ' -storepass android \\'
|
||||
+ '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\'
|
||||
+ '\n -dname "CN=Android Debug,O=Android,C=US"')
|
||||
logging.error(
|
||||
_('{path} does not exist! Create it by running:').format(
|
||||
path=options.keystore
|
||||
)
|
||||
+ '\n keytool -genkey -v -keystore '
|
||||
+ options.keystore
|
||||
+ ' -storepass android \\'
|
||||
+ '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\'
|
||||
+ '\n -dname "CN=Android Debug,O=Android,C=US"'
|
||||
)
|
||||
sys.exit(1)
|
||||
ssh_dir = os.path.join(os.getenv('HOME'), '.ssh')
|
||||
privkey = _ssh_key_from_debug_keystore(options.keystore)
|
||||
|
|
|
@ -28,23 +28,21 @@ mostly reports success by moving an APK from unsigned/ to repo/
|
|||
|
||||
"""
|
||||
|
||||
import sys
|
||||
import glob
|
||||
import hashlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import glob
|
||||
import hashlib
|
||||
from argparse import ArgumentParser
|
||||
from collections import OrderedDict
|
||||
import logging
|
||||
from gettext import ngettext
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
import zipfile
|
||||
from argparse import ArgumentParser
|
||||
from collections import OrderedDict
|
||||
from gettext import ngettext
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from . import _, common, metadata
|
||||
from .common import FDroidPopen
|
||||
from .exception import BuildException, FDroidException
|
||||
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from . import common
|
||||
from . import metadata
|
||||
|
||||
from . import common, metadata
|
||||
|
||||
|
||||
def main():
|
||||
|
|
|
@ -17,16 +17,14 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from argparse import ArgumentParser
|
||||
import logging
|
||||
import io
|
||||
import tempfile
|
||||
import logging
|
||||
import shutil
|
||||
import tempfile
|
||||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from . import _, common, metadata
|
||||
|
||||
config = None
|
||||
|
||||
|
|
|
@ -270,9 +270,10 @@ def get_gradle_compile_commands(build):
|
|||
'runtimeOnly',
|
||||
]
|
||||
buildTypes = ['', 'release']
|
||||
flavors = ['']
|
||||
if build.gradle and build.gradle != ['yes']:
|
||||
flavors += build.gradle
|
||||
flavors = common.calculate_gradle_flavor_combination(build.gradle)
|
||||
else:
|
||||
flavors = ['']
|
||||
|
||||
return [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)]
|
||||
|
||||
|
@ -728,6 +729,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
|
|||
'www.jitpack.io',
|
||||
'repo.maven.apache.org/maven2',
|
||||
'oss.jfrog.org/artifactory/oss-snapshot-local',
|
||||
'central.sonatype.com/repository/maven-snapshots/',
|
||||
'oss.sonatype.org/content/repositories/snapshots',
|
||||
'oss.sonatype.org/content/repositories/releases',
|
||||
'oss.sonatype.org/content/groups/public',
|
||||
|
@ -749,8 +751,12 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
|
|||
]
|
||||
]
|
||||
|
||||
scanignore = common.getpaths_map(build_dir, build.scanignore)
|
||||
scandelete = common.getpaths_map(build_dir, build.scandelete)
|
||||
scanignore, scanignore_not_found_paths = common.getpaths_map(
|
||||
build_dir, build.scanignore
|
||||
)
|
||||
scandelete, scandelete_not_found_paths = common.getpaths_map(
|
||||
build_dir, build.scandelete
|
||||
)
|
||||
|
||||
scanignore_worked = set()
|
||||
scandelete_worked = set()
|
||||
|
@ -1108,11 +1114,19 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None):
|
|||
json_per_build,
|
||||
)
|
||||
|
||||
for p in scanignore_not_found_paths:
|
||||
logging.error(_("Non-exist scanignore path: %s") % p)
|
||||
count += 1
|
||||
|
||||
for p in scanignore:
|
||||
if p not in scanignore_worked:
|
||||
logging.error(_('Unused scanignore path: %s') % p)
|
||||
count += 1
|
||||
|
||||
for p in scandelete_not_found_paths:
|
||||
logging.error(_("Non-exist scandelete path: %s") % p)
|
||||
count += 1
|
||||
|
||||
for p in scandelete:
|
||||
if p not in scandelete_worked:
|
||||
logging.error(_('Unused scandelete path: %s') % p)
|
||||
|
@ -2217,8 +2231,7 @@ SUSS_DEFAULT = r'''{
|
|||
"https://www.android.com/gms/"
|
||||
],
|
||||
"gradle_signatures": [
|
||||
"com.google.gms(?!.google-services)",
|
||||
"com.google.android.gms(?!.oss-licenses-plugin)",
|
||||
"com.google.android.gms(?!.(oss-licenses-plugin|strict-version-matcher-plugin))",
|
||||
"com.google.android.ump",
|
||||
"androidx.core:core-google-shortcuts",
|
||||
"androidx.credentials:credentials-play-services-auth",
|
||||
|
@ -2234,7 +2247,19 @@ SUSS_DEFAULT = r'''{
|
|||
"com.yayandroid:locationmanager",
|
||||
"(?<!org.microg.gms:)play-services",
|
||||
"xyz.belvi.mobilevision:barcodescanner",
|
||||
"com.google.api-client:google-api-client-android"
|
||||
"com.google.api-client:google-api-client-android",
|
||||
"com.google.maps.android:android-maps-utils",
|
||||
"com.github.budowski:android-maps-utils",
|
||||
"com.microsoft.identity:common",
|
||||
"com.microsoft.identity.client:msal"
|
||||
],
|
||||
"gradle_signatures_negative_examples": [
|
||||
"com.google.android.gms.oss-licenses-plugin",
|
||||
"com.google.android.gms.strict-version-matcher-plugin"
|
||||
],
|
||||
"gradle_signatures_positive_examples": [
|
||||
"com.google.android.gms:play-services-base",
|
||||
"com.google.android.gms:play-services-oss-licenses"
|
||||
],
|
||||
"license": "NonFree",
|
||||
"name": "Google Mobile Services"
|
||||
|
@ -2934,6 +2959,16 @@ SUSS_DEFAULT = r'''{
|
|||
"license": "NonFree",
|
||||
"name": "Pushy"
|
||||
},
|
||||
"org.gradle.toolchains.foojay-resolver-convention": {
|
||||
"documentation": [
|
||||
"https://github.com/gradle/foojay-toolchains"
|
||||
],
|
||||
"gradle_signatures": [
|
||||
"org.gradle.toolchains.foojay-resolver"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"name": "Foojay Toolchains Plugin"
|
||||
},
|
||||
"org.mariuszgromada.math": {
|
||||
"code_signatures": [
|
||||
"org/mariuszgromada/math/mxparser/parsertokens/SyntaxStringBuilder",
|
||||
|
@ -2966,7 +3001,7 @@ SUSS_DEFAULT = r'''{
|
|||
"license": "NonFree"
|
||||
}
|
||||
},
|
||||
"timestamp": 1733823271.362948,
|
||||
"timestamp": 1747829076.702502,
|
||||
"version": 1,
|
||||
"last_updated": 1742401014.503398
|
||||
"last_updated": 1750710966.431471
|
||||
}'''
|
||||
|
|
|
@ -15,15 +15,13 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
|
||||
import re
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import _, common
|
||||
from .exception import FDroidException
|
||||
|
||||
|
||||
|
|
|
@ -17,15 +17,13 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
import zipfile
|
||||
from argparse import ArgumentParser
|
||||
import logging
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from . import _, common, metadata
|
||||
from .exception import FDroidException
|
||||
|
||||
config = None
|
||||
|
|
|
@ -28,8 +28,8 @@ Example
|
|||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import threading
|
||||
import time
|
||||
|
||||
|
||||
class Tail(object):
|
||||
|
|
|
@ -20,25 +20,27 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
import shutil
|
||||
import copy
|
||||
import filecmp
|
||||
import glob
|
||||
import logging
|
||||
import re
|
||||
import socket
|
||||
import warnings
|
||||
import zipfile
|
||||
import hashlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import socket
|
||||
import sys
|
||||
import time
|
||||
import yaml
|
||||
import copy
|
||||
import warnings
|
||||
import zipfile
|
||||
from argparse import ArgumentParser
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
import asn1crypto.cms
|
||||
import defusedxml.ElementTree as ElementTree
|
||||
from datetime import datetime, timezone
|
||||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
import yaml
|
||||
|
||||
try:
|
||||
from yaml import CSafeLoader as SafeLoader
|
||||
|
@ -48,14 +50,13 @@ except ImportError:
|
|||
import collections
|
||||
from binascii import hexlify
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import metadata
|
||||
from .common import DEFAULT_LOCALE
|
||||
from .exception import BuildException, FDroidException, VerificationException
|
||||
from PIL import Image, PngImagePlugin
|
||||
|
||||
import fdroidserver.index
|
||||
|
||||
from PIL import Image, PngImagePlugin
|
||||
from . import _, common, metadata
|
||||
from .common import DEFAULT_LOCALE
|
||||
from .exception import BuildException, FDroidException, NoVersionCodeException, VerificationException
|
||||
|
||||
if hasattr(Image, 'DecompressionBombWarning'):
|
||||
warnings.simplefilter('error', Image.DecompressionBombWarning)
|
||||
|
@ -133,7 +134,7 @@ def disabled_algorithms_allowed():
|
|||
or common.default_config['allow_disabled_algorithms'])
|
||||
|
||||
|
||||
def status_update_json(apps, apks):
|
||||
def status_update_json(output, apps, apks):
|
||||
"""Output a JSON file with metadata about this `fdroid update` run.
|
||||
|
||||
Parameters
|
||||
|
@ -145,7 +146,6 @@ def status_update_json(apps, apks):
|
|||
|
||||
"""
|
||||
logging.debug(_('Outputting JSON'))
|
||||
output = common.setup_status_output(start_timestamp)
|
||||
output['antiFeatures'] = dict()
|
||||
output['disabled'] = []
|
||||
output['archivePolicy0'] = []
|
||||
|
@ -370,6 +370,12 @@ def get_cache():
|
|||
v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])}
|
||||
if 'added' in v:
|
||||
v['added'] = datetime.fromtimestamp(v['added'], tz=timezone.utc)
|
||||
if v.get('srcname') and not v.get('srcnameSha256'):
|
||||
f = f'archive/{v["srcname"]}'
|
||||
if not os.path.exists(f):
|
||||
f = f'repo/{v["srcname"]}'
|
||||
if os.path.exists(f):
|
||||
v['srcnameSha256'] = common.sha256sum(f)
|
||||
|
||||
return apkcache
|
||||
|
||||
|
@ -801,14 +807,18 @@ def _strip_and_copy_image(in_file, outpath):
|
|||
It is not used at all in the F-Droid ecosystem, so its much safer
|
||||
just to remove it entirely.
|
||||
|
||||
This uses size+mtime to check for a new file since this process
|
||||
actually modifies the resulting file to strip out the EXIF.
|
||||
This only uses ctime/mtime to check for a new file since this
|
||||
process actually modifies the resulting file to strip out the EXIF.
|
||||
Therefore, whenever the file needs to be stripped, it will have a
|
||||
newer ctime and most likely a different size. The mtime is copied
|
||||
from the source to the destination, so it can be the same.
|
||||
|
||||
outpath can be path to either a file or dir. The dir that outpath
|
||||
refers to must exist before calling this.
|
||||
|
||||
Potential source of Python code to strip JPEGs without dependencies:
|
||||
http://www.fetidcascade.com/public/minimal_exif_writer.py
|
||||
|
||||
"""
|
||||
logging.debug('copying %s %s', in_file, outpath)
|
||||
|
||||
|
@ -824,12 +834,11 @@ def _strip_and_copy_image(in_file, outpath):
|
|||
else:
|
||||
out_file = outpath
|
||||
|
||||
if os.path.exists(out_file):
|
||||
in_stat = os.stat(in_file)
|
||||
out_stat = os.stat(out_file)
|
||||
if in_stat.st_size == out_stat.st_size \
|
||||
and in_stat.st_mtime == out_stat.st_mtime:
|
||||
return
|
||||
if os.path.exists(out_file) and (
|
||||
os.path.getmtime(in_file) <= os.path.getmtime(out_file)
|
||||
and os.path.getctime(in_file) <= os.path.getctime(out_file)
|
||||
):
|
||||
return
|
||||
|
||||
extension = common.get_extension(in_file)[1]
|
||||
if extension == 'png':
|
||||
|
@ -1115,6 +1124,9 @@ def copy_triple_t_store_metadata(apps):
|
|||
repofilename = os.path.basename(f)
|
||||
if segments[-2] == 'listing':
|
||||
locale = segments[-3]
|
||||
if dirname in GRAPHIC_NAMES:
|
||||
repofilename = dirname + '.' + extension
|
||||
dirname = ''
|
||||
elif segments[-4] == 'listings': # v2.x
|
||||
locale = segments[-3]
|
||||
if dirname in tt_graphic_names:
|
||||
|
@ -1142,6 +1154,7 @@ def insert_localized_app_metadata(apps):
|
|||
|
||||
metadata/<locale>/
|
||||
fastlane/metadata/android/<locale>/
|
||||
<subdir>/fastlane/metadata/android/<locale>/
|
||||
src/<buildFlavor>/fastlane/metadata/android/<locale>/
|
||||
|
||||
...as well as the /metadata/<packageName>/<locale> directory.
|
||||
|
@ -1161,7 +1174,7 @@ def insert_localized_app_metadata(apps):
|
|||
https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-apps-build-metadata-in-an-fdroiddata-collection
|
||||
"""
|
||||
sourcedirs = glob.glob(os.path.join('build', '[A-Za-z]*', 'src', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'))
|
||||
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'))
|
||||
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', '**', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'), recursive=True)
|
||||
sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'metadata', '[a-z][a-z]*'))
|
||||
sourcedirs += glob.glob(os.path.join('metadata', '[A-Za-z]*', '[a-z][a-z]*'))
|
||||
|
||||
|
@ -1177,17 +1190,40 @@ def insert_localized_app_metadata(apps):
|
|||
locale = segments[-1]
|
||||
destdir = os.path.join('repo', packageName, locale)
|
||||
|
||||
# flavours specified in build receipt
|
||||
build_flavours = ""
|
||||
if (
|
||||
apps[packageName]
|
||||
and len(apps[packageName].get('Builds', [])) > 0
|
||||
and 'gradle' in apps[packageName]['Builds'][-1]
|
||||
):
|
||||
build_flavours = apps[packageName]['Builds'][-1]['gradle']
|
||||
builds = apps.get(packageName, {}).get('Builds', [])
|
||||
found_in_subdir = (
|
||||
builds
|
||||
and len(segments) > 6
|
||||
and segments[-4] == "fastlane"
|
||||
and segments[-3] == "metadata"
|
||||
and segments[-2] == "android"
|
||||
and '/'.join(segments[2:-4]) == builds[-1].get('subdir')
|
||||
)
|
||||
|
||||
if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavours:
|
||||
logging.debug("ignoring due to wrong flavour")
|
||||
# flavors specified in build receipt
|
||||
build_flavors = []
|
||||
if builds and 'gradle' in builds[-1] and builds[-1]['gradle'] != ['yes']:
|
||||
build_flavors = common.calculate_gradle_flavor_combination(
|
||||
builds[-1]['gradle']
|
||||
)
|
||||
found_in_flavor = (
|
||||
len(segments) > 7
|
||||
and segments[2] == 'src'
|
||||
and segments[4] == "fastlane"
|
||||
and segments[3] in build_flavors
|
||||
)
|
||||
|
||||
if (
|
||||
not found_in_subdir
|
||||
and not found_in_flavor
|
||||
and segments[0] == 'build'
|
||||
and segments[2] not in ('metadata', 'fastlane')
|
||||
):
|
||||
logging.debug(
|
||||
'Not scanning "{dir}" with unknown subdir or gradle flavor "{value}"'.format(
|
||||
dir=os.path.relpath(root), value=segments[3]
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
for f in files:
|
||||
|
@ -1225,9 +1261,7 @@ def insert_localized_app_metadata(apps):
|
|||
try:
|
||||
versionCode = int(base)
|
||||
locale = segments[-2]
|
||||
if versionCode in [
|
||||
a["versionCode"] for a in apps[packageName]["Builds"]
|
||||
]:
|
||||
if versionCode in [b["versionCode"] for b in builds]:
|
||||
_set_localized_text_entry(
|
||||
apps[packageName],
|
||||
locale,
|
||||
|
@ -1452,19 +1486,18 @@ def insert_localized_ios_app_metadata(apps_with_packages):
|
|||
fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name)
|
||||
|
||||
# lookup icons, copy them and put them into app
|
||||
icon_path = _get_ipa_icon(Path('build') / package_name)
|
||||
icon_src = _get_ipa_icon(Path('build') / package_name)
|
||||
icon_dest = Path('repo') / package_name / 'icon.png' # for now just assume png
|
||||
icon_stat = os.stat(icon_path)
|
||||
app['iconv2'] = {
|
||||
DEFAULT_LOCALE: {
|
||||
'name': str(icon_dest).lstrip('repo'),
|
||||
'sha256': common.sha256sum(icon_dest),
|
||||
'size': icon_stat.st_size,
|
||||
'size': os.path.getsize(icon_src),
|
||||
}
|
||||
}
|
||||
if not icon_dest.exists():
|
||||
if not icon_dest.exists() or not filecmp.cmp(icon_src, icon_dest):
|
||||
icon_dest.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy(icon_path, icon_dest)
|
||||
shutil.copy2(icon_src, icon_dest)
|
||||
|
||||
|
||||
def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False):
|
||||
|
@ -1543,8 +1576,10 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False):
|
|||
repo_file['packageName'] = m.group(1)
|
||||
repo_file['versionCode'] = int(m.group(2))
|
||||
srcfilename = name + b'_src.tar.gz'
|
||||
if os.path.exists(os.path.join(repodir, srcfilename)):
|
||||
srcpath = os.path.join(repodir, srcfilename)
|
||||
if os.path.exists(srcpath):
|
||||
repo_file['srcname'] = srcfilename.decode()
|
||||
repo_file['srcnameSha256'] = common.sha256sum(srcpath.decode())
|
||||
repo_file['size'] = stat.st_size
|
||||
|
||||
apkcache[name_utf8] = repo_file
|
||||
|
@ -1766,6 +1801,7 @@ def scan_apk_androguard(apk, apkfile):
|
|||
|
||||
xml = apkobject.get_android_manifest_xml()
|
||||
androidmanifest_xml = apkobject.xml['AndroidManifest.xml']
|
||||
|
||||
if len(xml.nsmap) > 0:
|
||||
# one of them surely will be the Android one, or its corrupt
|
||||
xmlns = common.XMLNS_ANDROID
|
||||
|
@ -1775,8 +1811,12 @@ def scan_apk_androguard(apk, apkfile):
|
|||
xmlns = '{}'
|
||||
|
||||
vcstr = androidmanifest_xml.get(xmlns + 'versionCode')
|
||||
logging.debug("Version Code: %r (%s)" % (vcstr, apkfile))
|
||||
|
||||
if vcstr.startswith('0x'):
|
||||
if not vcstr:
|
||||
raise NoVersionCodeException(_("APK file {path} does not have a version code "
|
||||
"in its manifest").format(path=apkfile))
|
||||
elif vcstr.startswith('0x'):
|
||||
apk['versionCode'] = int(vcstr, 16)
|
||||
else:
|
||||
apk['versionCode'] = int(vcstr)
|
||||
|
@ -1924,6 +1964,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal
|
|||
logging.warning(_("Skipping '{apkfilename}' with invalid signature!")
|
||||
.format(apkfilename=apkfilename))
|
||||
return True, None, False
|
||||
except NoVersionCodeException:
|
||||
logging.warning(_("Skipping '{apkfilename}' without versionCode!")
|
||||
.format(apkfilename=apkfilename))
|
||||
return True, None, False
|
||||
|
||||
if apps:
|
||||
if apk['packageName'] in apps:
|
||||
|
@ -1962,8 +2006,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal
|
|||
|
||||
apk['apkName'] = apkfilename
|
||||
srcfilename = apkfilename[:-4] + "_src.tar.gz"
|
||||
if os.path.exists(os.path.join(repodir, srcfilename)):
|
||||
srcpath = os.path.join(repodir, srcfilename)
|
||||
if os.path.exists(srcpath):
|
||||
apk['srcname'] = srcfilename
|
||||
apk['srcnameSha256'] = common.sha256sum(srcpath)
|
||||
|
||||
# verify the jar signature is correct, allow deprecated
|
||||
# algorithms only if the APK is in the archive.
|
||||
|
@ -2801,7 +2847,7 @@ def main():
|
|||
output_status_stage(status_output, 'make_binary_transparency_log')
|
||||
btlog.make_binary_transparency_log(repodirs)
|
||||
|
||||
status_update_json(apps, apks + archapks)
|
||||
status_update_json(status_output, apps, apks + archapks)
|
||||
|
||||
logging.info(_("Finished"))
|
||||
|
||||
|
|
|
@ -16,18 +16,17 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import os
|
||||
import glob
|
||||
import json
|
||||
import logging
|
||||
import requests
|
||||
import os
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
from collections import OrderedDict
|
||||
|
||||
from . import _
|
||||
from . import common
|
||||
from . import net
|
||||
import requests
|
||||
|
||||
from . import _, common, net
|
||||
from .exception import FDroidException
|
||||
|
||||
config = None
|
||||
|
@ -58,8 +57,8 @@ def _add_diffoscope_info(d):
|
|||
]
|
||||
d['diffoscope']['External-Tools-Required'] = external_tools
|
||||
|
||||
from diffoscope.tools import OS_NAMES, get_current_os
|
||||
from diffoscope.external_tools import EXTERNAL_TOOLS
|
||||
from diffoscope.tools import OS_NAMES, get_current_os
|
||||
|
||||
current_os = get_current_os()
|
||||
os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES)
|
||||
|
@ -144,23 +143,44 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result):
|
|||
with open(jsonfile, 'w') as fp:
|
||||
json.dump(data, fp, sort_keys=True)
|
||||
|
||||
if output['verified']:
|
||||
jsonfile = 'unsigned/verified.json'
|
||||
data = get_verified_json(jsonfile)
|
||||
packageName = output['local']['packageName']
|
||||
appid, version_code = os.path.basename(unsigned_apk[:-4]).rsplit('_', 1)
|
||||
appid_base = unsigned_apk.rsplit('_', 1)[0]
|
||||
apkReports = sorted(
|
||||
glob.glob(f'{appid_base}_[0-9]*.json'), # don't include <appid>.json
|
||||
key=lambda s: int(s[:-9].rsplit('_', 1)[1]), # numeric sort by versionCode
|
||||
)
|
||||
with open(apkReports[-1]) as fp:
|
||||
reports = json.load(fp)
|
||||
appid_output = {'apkReports': apkReports}
|
||||
most_recent = 0
|
||||
for report_time, run in reports.items():
|
||||
if float(report_time) > most_recent:
|
||||
most_recent = float(report_time)
|
||||
appid_output['lastRunVerified'] = run['verified']
|
||||
with open(f'{appid_base}.json', 'w') as fp:
|
||||
json.dump(appid_output, fp, cls=common.Encoder, sort_keys=True)
|
||||
|
||||
if packageName not in data['packages']:
|
||||
data['packages'][packageName] = []
|
||||
found = False
|
||||
output_dump = json.dumps(output, sort_keys=True)
|
||||
for p in data['packages'][packageName]:
|
||||
if output_dump == json.dumps(p, sort_keys=True):
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
data['packages'][packageName].insert(0, json.loads(output_dump))
|
||||
with open(jsonfile, 'w') as fp:
|
||||
json.dump(data, fp, cls=common.Encoder, sort_keys=True)
|
||||
if output['verified']:
|
||||
write_verified_json(output)
|
||||
|
||||
|
||||
def write_verified_json(output):
|
||||
jsonfile = 'unsigned/verified.json'
|
||||
data = get_verified_json(jsonfile)
|
||||
packageName = output['local']['packageName']
|
||||
|
||||
if packageName not in data['packages']:
|
||||
data['packages'][packageName] = []
|
||||
found = False
|
||||
output_dump = json.dumps(output, sort_keys=True)
|
||||
for p in data['packages'][packageName]:
|
||||
if output_dump == json.dumps(p, sort_keys=True):
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
data['packages'][packageName].insert(0, json.loads(output_dump))
|
||||
with open(jsonfile, 'w') as fp:
|
||||
json.dump(data, fp, cls=common.Encoder, sort_keys=True)
|
||||
|
||||
|
||||
def main():
|
||||
|
|
|
@ -16,16 +16,16 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from os.path import isdir, isfile, basename, abspath, expanduser
|
||||
import os
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import textwrap
|
||||
import logging
|
||||
from .common import FDroidException
|
||||
|
||||
import threading
|
||||
from os.path import abspath, basename, expanduser, isdir, isfile
|
||||
|
||||
from .common import FDroidException
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
|
|
308
gradlew-fdroid
308
gradlew-fdroid
|
@ -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
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# Install all the client hooks
|
||||
|
||||
BASE_DIR="$(cd $(dirname $0); pwd -P)"
|
||||
BASE_DIR="$(cd $(dirname $0) || exit; pwd -P)"
|
||||
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
|
||||
HOOK_DIR="$(git rev-parse --show-toplevel)/.git/hooks"
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ if [ -z "$files" ]; then
|
|||
PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
|
||||
PY_TEST_FILES="tests/test_*.py"
|
||||
SH_FILES="hooks/pre-commit"
|
||||
BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
|
||||
BASH_FILES="jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
|
||||
RB_FILES="buildserver/Vagrantfile"
|
||||
YML_FILES=".*.yml .yamllint */*.yml */*.yaml"
|
||||
else
|
||||
|
@ -36,7 +36,7 @@ else
|
|||
*.rb)
|
||||
RB_FILES+=" $f"
|
||||
;;
|
||||
*.yml|.*.yml|.yamllint)
|
||||
*.yml|*.yaml|.yamllint)
|
||||
YML_FILES+=" $f"
|
||||
;;
|
||||
*)
|
||||
|
@ -66,7 +66,7 @@ cmd_exists() {
|
|||
}
|
||||
|
||||
find_command() {
|
||||
for name in $@; do
|
||||
for name in "$@"; do
|
||||
for suff in "3" "-3" "-python3" ""; do
|
||||
cmd=${name}${suff}
|
||||
if cmd_exists $cmd; then
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2023-05-26 19:39+0000\n"
|
||||
"Last-Translator: Mehrab Poladov <thepoladov@protonmail.com>\n"
|
||||
"Language-Team: Azerbaijani <https://hosted.weblate.org/projects/f-droid/fdroidserver/az/>\n"
|
||||
|
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1991,6 +2001,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
2695
locale/ba/LC_MESSAGES/fdroidserver.po
Normal file
2695
locale/ba/LC_MESSAGES/fdroidserver.po
Normal file
File diff suppressed because it is too large
Load diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-01-21 00:08+0000\n"
|
||||
"Last-Translator: flac <flac_twin@keemail.me>\n"
|
||||
"Language-Team: Belarusian <https://hosted.weblate.org/projects/f-droid/fdroidserver/be/>\n"
|
||||
|
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1483,6 +1488,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Перайменуйце файлы APK, якія не адпавядаюць package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1996,6 +2006,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Папярэджваць аб магчымых памылках метададзеных"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.1b0\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-07-19 10:21+0000\n"
|
||||
"Last-Translator: 109247019824 <stoyan@gmx.com>\n"
|
||||
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/f-droid/fdroidserver/bg/>\n"
|
||||
|
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1479,6 +1484,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1992,6 +2002,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2021-02-12 09:48+0000\n"
|
||||
"Last-Translator: Oymate <dhruboadittya96@gmail.com>\n"
|
||||
"Language-Team: Bengali <https://hosted.weblate.org/projects/f-droid/fdroidserver/bn/>\n"
|
||||
|
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1991,6 +2001,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-04-10 13:33+0000\n"
|
||||
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
|
||||
"Language-Team: Tibetan <https://hosted.weblate.org/projects/f-droid/fdroidserver/bo/>\n"
|
||||
|
@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning"
|
|||
msgid_plural "Can't build due to {} errors while scanning"
|
||||
msgstr[0] "ཚགས་རྒྱབ་པའི་སྐབས་སུ་ནོར་སྐྱོན་ {} ཤོར་བས་བཟོ་སྐྲུན་བྱེད་ཐུབ་མེད།"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "ཀློག་མི་ཐུབ།{path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1499,6 +1504,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2015,6 +2025,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་སྐྱོན་སྲིད་པ་རྣམས་པ་ཉེན་བརྡ་གཏོང་།"
|
||||
|
|
|
@ -6,21 +6,21 @@
|
|||
# Adrià Martín <adriamartinmor@gmail.com>, 2024.
|
||||
# unmes <jordi.guiu.pujols@gmail.com>, 2024.
|
||||
# Joan Pujolar <joan.pujolar@gmail.com>, 2024.
|
||||
# Ecron <ecron_89@hotmail.com>, 2024.
|
||||
# Ecron <ecron_89@hotmail.com>, 2024, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-01-30 12:31+0000\n"
|
||||
"Last-Translator: pitroig <ona@riseup.net>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-05-16 16:36+0000\n"
|
||||
"Last-Translator: Ecron <ecron_89@hotmail.com>\n"
|
||||
"Language-Team: Catalan <https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.10-dev\n"
|
||||
"X-Generator: Weblate 5.12-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -46,7 +46,7 @@ msgstr "\"%s/\" no té cap fitxer de metadades coincidents!"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "La clau «isPrimary» no s'hauria d'afegir a les rèpliques!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -307,7 +307,7 @@ msgstr "Sí automàtic a totes les demandes."
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}"
|
||||
msgstr "Tipus d'entrada incorrecta \"{mirrortype}\" a la configuració de miralls: {mirror}"
|
||||
msgstr "Tipus d'entrada incorrecta «{mirrortype}» a la configuració de les rèpliques: {mirror}"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint="
|
||||
|
@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "No es pot construir a causa d'un error {} en escanejar"
|
||||
msgstr[1] "No es pot construir a causa d'errors {} en escanejar"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "No s'ha pogut llegir {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "S'està creant \"{path}\" per configurar s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "S'està llegint '{config_file}'"
|
||||
msgstr "S'està creant un «{config_file}» buit"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -535,7 +540,7 @@ msgstr "S'està suprimint l'arxiu, el dipòsit és massa gran ({size} màxim {li
|
|||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
msgid "Deleting git-mirror history, repo is too big ({size} max {limit})"
|
||||
msgstr "S'està suprimint l'historial del mirall de git, el dipòsit és massa gran ({size} màxim {limit})"
|
||||
msgstr "S'està suprimint l'historial git-mirror, el dipòsit és massa gran ({size}, màxim {limit})"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
|
@ -601,7 +606,7 @@ msgstr "No usis les sumes de verificació \"rsync\""
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Download F-Droid.apk using mirrors that leak less to the network"
|
||||
msgstr "Baixeu l'F-Droid.apk amb els miralls que filtren menys dades a la xarxa"
|
||||
msgstr "Baixeu l'F-Droid.apk amb les rèpliques que filtren menys dades a la xarxa"
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Download complete mirrors of small repos"
|
||||
|
@ -657,12 +662,12 @@ msgstr "ERROR: {key} a {path} no és \"arxiu\" o \"dipòsit\"!"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "ERROR: {key} no és una clau vàlida!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "ERROR: el valor de {key} hauria de ser del tipus {t}!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "La variable d'entorn {var} de {configname} no està establerta!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "La variable d'entorn {var} de {configname} no està establerta!"
|
||||
msgstr "La variable d'entorn {{env: {var}}} no està establerta!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "S'ignorarà l'element incorrecte al manifest: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} és obsolet, utilitzeu {newfile}"
|
||||
msgstr "S'ignorarà el {oldfile} obsolet, utilitzeu {newfile}!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -956,11 +961,11 @@ msgstr "Inclou els fitxers .asc de signatura PGP a la rèplica"
|
|||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Include the build logs in the mirror"
|
||||
msgstr "Inclou els registres de construcció al mirall"
|
||||
msgstr "Inclou els registres de construcció en la rèplica"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Include the source tarballs in the mirror"
|
||||
msgstr "Inclou els arxius tar d'origen al mirall"
|
||||
msgstr "Inclou els fitxers tarball del codi font en la rèplica"
|
||||
|
||||
#: ../fdroidserver/metadata.py
|
||||
#, python-format
|
||||
|
@ -1143,7 +1148,7 @@ msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP:
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "La configuració de la rèplica per a {url} conté la clau «isPrimary»!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1287,7 +1292,7 @@ msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:"
|
|||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Offline machine, skipping git mirror generation until `fdroid deploy`"
|
||||
msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`"
|
||||
msgstr "Màquina fora de línia, s'ometrà la generació de la rèplica git fins al `fdroid deploy`"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..."
|
||||
|
@ -1310,7 +1315,7 @@ msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}"
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Només accepta una clau única «env»"
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1471,7 +1476,7 @@ msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "No se signarà «{path}», el fitxer existeix a les dues carpetes {dir1} i {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1490,6 +1495,11 @@ msgstr "S'està suprimint {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1699,7 +1709,7 @@ msgstr "Mode de prova: posa la sortida només al directori tmp, i sempre constru
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "No s'ha instal·lat el paquet de Python «qrcode» (p. ex. apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2010,6 +2020,10 @@ msgstr "S'està verificant el paquet {path} l'apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "La clau de l'API VirusTotal no pot pujar fitxers més grans de 32 MB, utilitzeu {url} per pujar {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avisa de possibles errors a les metadades"
|
||||
|
@ -2322,12 +2336,12 @@ msgstr "local_copy_dir ha de ser directori, no un fitxer!"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-format
|
||||
msgid "mirror '%s' does not end with 'fdroid'!"
|
||||
msgstr "el mirall '%s' no acaba amb 'fdroid'!"
|
||||
msgstr "La rèplica «%s» no acaba amb «fdroid»!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "mirrors set twice, in config.yml and {path}!"
|
||||
msgstr "miralls establerts dues vegades, a config.yml i {path}!"
|
||||
msgstr "rèpliques establertes dues vegades, a config.yml i {path}!"
|
||||
|
||||
#: /usr/lib/python3.11/argparse.py
|
||||
msgid "mutually exclusive arguments must be optional"
|
||||
|
@ -2597,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\".
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} és un duplicat de {path2}, elimineu-ne un!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -13,8 +13,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-20 16:21+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
|
||||
"Last-Translator: Fjuro <fjuro@users.noreply.hosted.weblate.org>\n"
|
||||
"Language-Team: Czech <https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/>\n"
|
||||
"Language: cs\n"
|
||||
|
@ -366,6 +366,11 @@ msgstr[0] "Nelze sestavit kvůli {} chybě při skenování"
|
|||
msgstr[1] "Nelze sestavit kvůli {} chybám při skenování"
|
||||
msgstr[2] "Nelze sestavit kvůli {} chybám při skenování"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Chyba při čtení {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1474,7 +1479,7 @@ msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Odmítám podespat „{path}“, soubor existuje ve složce {dir1} i {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1493,6 +1498,11 @@ msgstr "Odebírání {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Přejmenovat soubory APK, které se neshodují s package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2014,6 +2024,10 @@ msgstr "Ověřování balíčku {path} pomocí apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než 32 MB, k nahrání {path} použijte {url}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Varovat ohledně možných chyb metadat"
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2021-01-16 21:23+0000\n"
|
||||
"Last-Translator: Aled Powell <aled@aledpowell.cymru>\n"
|
||||
"Language-Team: Welsh <https://hosted.weblate.org/projects/f-droid/fdroidserver/cy/>\n"
|
||||
|
@ -357,6 +357,11 @@ msgstr[3] ""
|
|||
msgstr[4] ""
|
||||
msgstr[5] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1482,6 +1487,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2006,6 +2016,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Rhybuddio am wallau metaddata posib"
|
||||
|
|
|
@ -13,21 +13,21 @@
|
|||
# TobiGr <tobigr@mail.de>, 2021.
|
||||
# FW <weblate.scordium@slmail.me>, 2021.
|
||||
# fossdd <fossdd@tutanota.com>, 2021.
|
||||
# Ceeee <marius.romanus@gmx.de>, 2021.
|
||||
# Ceeee <marius.romanus@gmx.de>, 2021, 2025.
|
||||
# C. Rüdinger <Mail-an-CR@web.de>, 2021, 2022.
|
||||
# VfBFan <drop0815@posteo.de>, 2021, 2023, 2024, 2025.
|
||||
# Roman Leo <roman.leo@gmx.de>, 2021.
|
||||
# Follpvosten <wolfi@karpador.xyz>, 2021.
|
||||
# ssantos <ssantos@web.de>, 2022, 2023, 2024.
|
||||
# "C. Rüdinger" <Mail-an-CR@web.de>, 2023.
|
||||
# "C. Rüdinger" <Mail-an-CR@web.de>, 2023, 2025.
|
||||
# VfBFan <VfBFan@users.noreply.hosted.weblate.org>, 2024.
|
||||
# Maxi <maxitendo01@proton.me>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-21 08:45+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-04-29 10:16+0000\n"
|
||||
"Last-Translator: VfBFan <drop0815@posteo.de>\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/f-droid/fdroidserver/de/>\n"
|
||||
"Language: de\n"
|
||||
|
@ -35,7 +35,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11-dev\n"
|
||||
"X-Generator: Weblate 5.12-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -378,6 +378,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist"
|
||||
msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Lesen von {path} fehlgeschlagen: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -519,7 +524,7 @@ msgstr "Erstelle Ausgabeverzeichnis"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Creating signed index with this key (SHA256):"
|
||||
msgstr "Signierter Index mit diesem Schlüssel (SHA256) wird erstellt:"
|
||||
msgstr "Signierter Index wird mit diesem Schlüssel (SHA256) erstellt:"
|
||||
|
||||
#: ../fdroidserver/publish.py ../fdroidserver/verify.py
|
||||
msgid "Creating temporary directory"
|
||||
|
@ -532,7 +537,7 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}"
|
||||
msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}"
|
||||
msgstr "CurrentVersionCode {cv} ist niedriger als ältester Build-Eintrag {versionCode}"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "DEBUG_KEYSTORE is not set or the value is incomplete"
|
||||
|
@ -866,7 +871,7 @@ msgstr "Ungültige Datei bei %s gefunden"
|
|||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
msgid "Found {apkfilename} at {url}"
|
||||
msgstr "{apkfilename} unter {url} gefunden"
|
||||
msgstr "{apkfilename} gefunden auf {url}"
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
#, python-brace-format
|
||||
|
@ -930,7 +935,7 @@ msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werde
|
|||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
msgid "If this upload fails, try manually uploading to {url}"
|
||||
msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen"
|
||||
msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie ihn manuell auf {url} hochzuladen"
|
||||
|
||||
#: ../fdroidserver/metadata.py
|
||||
#, python-brace-format
|
||||
|
@ -1337,7 +1342,7 @@ msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld"
|
|||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Output JSON report to file named after APK."
|
||||
msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben."
|
||||
msgstr "In Datei ausgegebener JSON-Bericht wird nach APK benannt."
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
msgid "Output JSON to stdout."
|
||||
|
@ -1486,7 +1491,7 @@ msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Eintragen von '{path}' abgelehnt, Datei ist sowohl in Ordner {dir1} als auch {dir2} vorhanden."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1505,6 +1510,11 @@ msgstr "Entferne {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1557,7 +1567,7 @@ msgstr "Ausführen von wget in {path}"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "SHA-256 of {url} does not match entry!"
|
||||
msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!"
|
||||
msgstr "SHA-256 der {url} stimmt nicht mit Eintrag überein!"
|
||||
|
||||
#: ../fdroidserver/build.py
|
||||
msgid "Scan the resulting APK(s) for known non-free classes."
|
||||
|
@ -1607,7 +1617,7 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:"
|
|||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "Set maximum releases in repo before older ones are archived"
|
||||
msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden"
|
||||
msgstr "Setze maximale Veröffentlichungen im Repo, bevor ältere archiviert werden"
|
||||
|
||||
#: ../fdroidserver/build.py
|
||||
#, python-brace-format
|
||||
|
@ -1757,7 +1767,7 @@ msgstr "Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegel
|
|||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."
|
||||
msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt."
|
||||
msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe der Werkzeuge auf https://gitlab.com/fdroid aus dem Quellcode erstellt."
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-format
|
||||
|
@ -1973,7 +1983,7 @@ msgstr "Verwende APK-Signatur v3"
|
|||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Using JAR Signature"
|
||||
msgstr "Verwende JAR Signatur"
|
||||
msgstr "Verwende JAR-Signatur"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner"
|
||||
|
@ -2025,6 +2035,10 @@ msgstr "Überprüfen des Pakets {path} mit apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Vor möglichen Metadaten-Fehlern warnen"
|
||||
|
@ -2154,7 +2168,7 @@ msgstr "Mehrere Subparser-Argumente sind unzulässig"
|
|||
#: /usr/lib/python3.11/argparse.py
|
||||
#, python-format
|
||||
msgid "cannot merge actions - two groups are named %r"
|
||||
msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r"
|
||||
msgstr "kann keine Aktionen zusammenführen – zwei Gruppen heißen %r"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "cannot publish update, did you set the deploy key?"
|
||||
|
@ -2528,8 +2542,8 @@ msgstr "ja"
|
|||
#, python-brace-format
|
||||
msgid "{0} app, {1} key aliases"
|
||||
msgid_plural "{0} apps, {1} key aliases"
|
||||
msgstr[0] "{0} app, {1} Schlüsselaliase"
|
||||
msgstr[1] "{0} apps, {1} Schlüsselaliase"
|
||||
msgstr[0] "{0} App, {1} Schlüssel-Aliase"
|
||||
msgstr[1] "{0} Apps, {1} Schlüssel-Aliase"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
|
@ -2557,7 +2571,7 @@ msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!"
|
|||
#: ../fdroidserver/metadata.py ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{appid} from {path} is not a valid Java Package Name!"
|
||||
msgstr "{appid} von {path} ist kein gültiger Java-Paketname!"
|
||||
msgstr "{appid} aus {path} ist kein gültiger Java-Paketname!"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
|
@ -2577,7 +2591,7 @@ msgstr "{appid}: unbekannte Extlib {path} im Build '{versionName}'"
|
|||
#: ../fdroidserver/scanner.py
|
||||
#, python-brace-format
|
||||
msgid "{appid}: no builds specified, running on current source state"
|
||||
msgstr "{appid}: keine builds angegeben, läuft auf dem aktuellen source-Stand"
|
||||
msgstr "{appid}: Kein Build angegeben; verwende aktuellen Quellen-Stand"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -2627,7 +2641,7 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:"
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!"
|
||||
msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!"
|
||||
msgstr "{path} hat falsche Dateisignatur \"{pattern}\", möglicher Janus-Exploit!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-05-10 13:24+0000\n"
|
||||
"Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>\n"
|
||||
"Language-Team: Greek <https://hosted.weblate.org/projects/f-droid/fdroidserver/el/>\n"
|
||||
|
@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1485,6 +1490,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1998,6 +2008,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Προειδοποίηση για πιθανά σφάλματα μετα-δεδομένων"
|
||||
|
|
|
@ -14,20 +14,21 @@
|
|||
# Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>, 2022.
|
||||
# gallegonovato <fran-carro@hotmail.es>, 2022, 2023, 2024.
|
||||
# Nicolás Pérez <ccnicolasperez@gmail.com>, 2025.
|
||||
# Swyter <swyterzone@gmail.com>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-16 22:47+0000\n"
|
||||
"Last-Translator: Nicolás Pérez <ccnicolasperez@gmail.com>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-06-24 11:02+0000\n"
|
||||
"Last-Translator: Swyter <swyterzone@gmail.com>\n"
|
||||
"Language-Team: Spanish <https://hosted.weblate.org/projects/f-droid/fdroidserver/es/>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11-dev\n"
|
||||
"X-Generator: Weblate 5.13-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -370,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "No se puede construir debido al error {} mientras se comprobaba"
|
||||
msgstr[1] "No se puede construir debido a los errores {} mientras se comprobaba"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Fallo al leer {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -492,9 +498,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Creando \"{path}\" para configurar s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "Leyendo '{config_file}'"
|
||||
msgstr "Creando el archivo vacío {config_file}"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -1497,6 +1503,11 @@ msgstr "Eliminando {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1811,7 +1822,7 @@ msgstr "Entrada desconocida {key} en {configname}"
|
|||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Unknown exception found!"
|
||||
msgstr "¡Se encontró una excepción desconocida!"
|
||||
msgstr "Se ha producido una excepción desconocida"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -1993,7 +2004,7 @@ msgstr "Usando s3cmd para sincronizar con: {url}"
|
|||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Valid commands are:"
|
||||
msgstr "Los comandos válidos son:"
|
||||
msgstr "Las órdenes válidas son:"
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Verify against locally cached copy rather than redownloading."
|
||||
|
@ -2017,6 +2028,10 @@ msgstr "Verificando el paquete {path} con apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. Use {url} para subir {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Alertar sobre posibles errores de metadatos"
|
||||
|
|
|
@ -10,7 +10,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2021-04-10 21:26+0000\n"
|
||||
"Last-Translator: Germe the fur star <FOSSgerme.deb@tuta.io>\n"
|
||||
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/f-droid/fdroidserver/es_AR/>\n"
|
||||
|
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "No se pudo empaquetar debido al {} error mientras se escaneaba"
|
||||
msgstr[1] "No se pudo empaquetar debido a los {} errores mientras se escaneaba"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "No se puede reescribir \"{path}\""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1495,6 +1500,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Renombrar archivos APK que no corresponden a package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2008,6 +2018,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Advertir sobre posibles errores en los metadatos"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2020-04-29 12:49+0000\n"
|
||||
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
|
||||
"Language-Team: Spanish (Mexico) <https://hosted.weblate.org/projects/f-droid/fdroidserver/es_MX/>\n"
|
||||
|
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1483,6 +1488,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1996,6 +2006,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
|
@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1477,6 +1482,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1990,6 +2000,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-11-26 15:16+0000\n"
|
||||
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
|
||||
"Language-Team: Persian <https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/>\n"
|
||||
|
@ -356,6 +356,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "{path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1481,6 +1486,11 @@ msgstr "برداشتن {path}"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1994,6 +2004,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.4.0\n"
|
||||
"Project-Id-Version: fdroidserver 2.4.2-3-gdcb804f7\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1479,6 +1484,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1992,6 +2002,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-01-31 14:19+0000\n"
|
||||
"Last-Translator: Ricky Tigg <ricky.tigg@gmail.com>\n"
|
||||
"Language-Team: Finnish <https://hosted.weblate.org/projects/f-droid/fdroidserver/fi/>\n"
|
||||
|
@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1480,6 +1485,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1993,6 +2003,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -42,20 +42,21 @@
|
|||
# Lzebulon <lzebulon@crans.org>, 2024.
|
||||
# Armand Camponovo <contact@camarm.dev>, 2024.
|
||||
# Lula Bye <translate.cylinder716@passinbox.com>, 2025.
|
||||
# Laurent FAVOLE <laurentfavole03@gmail.com>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-02 16:42+0000\n"
|
||||
"Last-Translator: Lula Bye <translate.cylinder716@passinbox.com>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-04-11 17:20+0000\n"
|
||||
"Last-Translator: Laurent FAVOLE <laurentfavole03@gmail.com>\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.10.3-dev\n"
|
||||
"X-Generator: Weblate 5.11-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -81,7 +82,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "La clé \"isPrimary\" ne devrait pas être ajoutée aux miroirs !"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -398,6 +399,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Build impossible à cause de l'erreur lors de l'analyse"
|
||||
msgstr[1] "Build impossible à cause des {} erreurs lors de l'analyse"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Erreur de lecture {path} : {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -520,9 +526,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Création de « {path} » pour configurer s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "Lecture de '{config_file}'"
|
||||
msgstr "Création d'un fichier {config_file} vide"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -692,12 +698,12 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"."
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "ERREUR : {key} n'est pas une clé valide !"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "ERREUR : la valeur de {key} devrait être du type {t} !"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -724,9 +730,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !"
|
||||
msgstr "La variable d'environnement {{env: {var}}} n'est pas configurée !"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -970,7 +976,7 @@ msgstr "Un mauvais élément du manifest est ignoré : %s"
|
|||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} est obsolète, utilisez {newfile}"
|
||||
msgstr "{oldfile} est obsolète et ignoré, {newfile} est utilisé !"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1178,7 +1184,7 @@ msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "La configuration du miroir pour {url} contient la clé \"isPrimary\" !"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1345,7 +1351,7 @@ msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, t
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "N'accepte qu'une seule clé \"env\""
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1506,7 +1512,7 @@ msgstr "Actualisation et mise en cache des règles et signature à partir du ré
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Signature de '{path}' refusée, le fichier existe à la fois dans les dossiers {dir1} et {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1525,6 +1531,11 @@ msgstr "Suppression de {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1734,7 +1745,7 @@ msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujour
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "Le paquet Python \"qrcode\" n'est pas installé (p. ex. apt-get install python3-qrcode) !"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -1960,9 +1971,8 @@ msgid "Uploading {apkfilename} to virustotal"
|
|||
msgstr "Téléversement de {apkfilename} vers virustotal"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, fuzzy
|
||||
msgid "Use /HEAD instead of /master or /main to point at a file in the default branch"
|
||||
msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut"
|
||||
msgstr "Utiliser /HEAD plutôt que /master pour pointer vers un fichier dans la branche par défaut"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
msgid "Use `fdroid update -c` to create it."
|
||||
|
@ -1982,9 +1992,9 @@ msgid "Using \"{path}\" for configuring s3cmd."
|
|||
msgstr "Utiliser \"{path}\" pour configurer s3cmd."
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Using \"{path}\" for syncing with remote storage."
|
||||
msgstr "Utiliser \"{path}\" pour configurer un stockage distant."
|
||||
msgstr "Utiliser \"{path}\" pour synchroniser avec un stockage distant."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Using APK Signature v2"
|
||||
|
@ -2039,21 +2049,24 @@ msgid "Verifying index signature:"
|
|||
msgstr "Vérification de la signature d'index :"
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Verifying package {path} with apksigner."
|
||||
msgstr "Vérifier le paquet {path} avec apksigner."
|
||||
msgstr "Vérification du paquet {path} avec apksigner."
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avertir de possibles erreurs dans les métadonnées"
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
#, fuzzy
|
||||
msgid "WebAssembly binary file"
|
||||
msgstr "Fichier binaire WebAssembly"
|
||||
|
||||
|
@ -2090,7 +2103,7 @@ msgid "ZIP file archive"
|
|||
msgstr "Archive ZIP"
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "adb reports {serial} is \"{status}\"!"
|
||||
msgstr "adb reporte que {serial} est \"{status}\" !"
|
||||
|
||||
|
@ -2110,9 +2123,9 @@ msgid "ambiguous option: %(option)s could match %(matches)s"
|
|||
msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring."
|
||||
msgstr ""
|
||||
msgstr "apksigner dans build-tools;{version} accepte les APKs avec des signatures v3 invalides, ignoré"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "apksigner not found! Cannot sign or verify modern APKs"
|
||||
|
@ -2216,9 +2229,8 @@ msgid "could not parse '{path}'"
|
|||
msgstr "impossible de lire '{path}'"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy
|
||||
msgid "could not parse srclib spec (no name specified): '{}'"
|
||||
msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'"
|
||||
msgstr "impossible d'analyser la spécification srclib (pas de nom spécifié) : '{}'"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "could not parse srclib spec (no ref specified): '{}'"
|
||||
|
@ -2365,7 +2377,7 @@ msgid "mirror '%s' does not end with 'fdroid'!"
|
|||
msgstr "le miroir «%s» ne se termine pas par «fdroid» !"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "mirrors set twice, in config.yml and {path}!"
|
||||
msgstr "miroir configuré deux fois, dans config.yml et {path} !"
|
||||
|
||||
|
@ -2452,9 +2464,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete"
|
|||
msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "s3cmd syncs indexes from {path} to {url} and deletes removed"
|
||||
msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer"
|
||||
msgstr "s3cmd synchronise les index de {path} vers {url} et supprime ceux enlevés"
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
#, python-brace-format
|
||||
|
@ -2462,9 +2474,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'"
|
|||
msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, fuzzy
|
||||
msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:"
|
||||
msgstr "serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être voulez-vous dire :"
|
||||
msgstr "serverwebroot : le chemin ne se termine pas par \"fdroid\", peut-être voulez-vous dire :"
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
msgid "shared library"
|
||||
|
@ -2510,7 +2521,6 @@ msgid "the following arguments are required: %s"
|
|||
msgstr "les arguments suivants sont requis %s"
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
#, fuzzy
|
||||
msgid "true"
|
||||
msgstr "vrai"
|
||||
|
||||
|
@ -2548,7 +2558,6 @@ msgid "virustotal.com is rate limiting, waiting to retry..."
|
|||
msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..."
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
#, fuzzy
|
||||
msgid "yes"
|
||||
msgstr "oui"
|
||||
|
||||
|
@ -2640,7 +2649,7 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} est un doublon de {path2}, supprimez-en un !"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
@ -2663,7 +2672,7 @@ msgid "{path} has been flagged by virustotal {count} times:"
|
|||
msgstr "{path} a été signalé par virustotal {count} fois :"
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "{path} has the wrong fingerprint ({fingerprint})!"
|
||||
msgstr "{path} a la mauvaise empreinte ({fingerprint}) !"
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2021-07-01 15:29+0000\n"
|
||||
"Last-Translator: Vancha March <tjipkevdh@gmail.com>\n"
|
||||
"Language-Team: Frisian <https://hosted.weblate.org/projects/f-droid/fdroidserver/fy/>\n"
|
||||
|
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1991,6 +2001,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,8 +5,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-23 10:56+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-27 19:35+0000\n"
|
||||
"Last-Translator: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>\n"
|
||||
"Language-Team: Irish <https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/>\n"
|
||||
"Language: ga\n"
|
||||
|
@ -360,6 +360,11 @@ msgstr[2] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
|
|||
msgstr[3] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
|
||||
msgstr[4] "Ní féidir tógáil de bharr {} earráidí agus an scanadh"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Theip ar léamh {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1468,7 +1473,7 @@ msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Ag diúltú '{path}' a shíniú, tá an comhad san fhillteán {dir1} agus {dir2} araon."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1487,6 +1492,11 @@ msgstr "Ag baint {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2010,6 +2020,10 @@ msgstr "Pacáiste {path} á fhíorú le apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Ní féidir le heochair API VirusTotal comhaid níos mó ná 32MB a uaslódáil, úsáid {url} chun {path} a uaslódáil."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2023-02-22 11:24+0000\n"
|
||||
"Last-Translator: Saurmandal <saurmandal@protonmail.com>\n"
|
||||
"Language-Team: Hindi <https://hosted.weblate.org/projects/f-droid/fdroidserver/hi/>\n"
|
||||
|
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1479,6 +1484,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1992,6 +2002,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-04-10 13:33+0000\n"
|
||||
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
|
||||
"Language-Team: Hungarian <https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/>\n"
|
||||
|
@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor"
|
||||
msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "A(z) {path} olvasása sikertelen: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1494,6 +1499,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2011,6 +2021,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Figyelmeztetés a lehetséges metaadat-hibákról"
|
||||
|
|
|
@ -22,7 +22,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-20 16:21+0000\n"
|
||||
"Last-Translator: Champ0999 <champ0999@users.noreply.hosted.weblate.org>\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/f-droid/fdroidserver/it/>\n"
|
||||
|
@ -375,6 +375,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Impossibile costruire a causa di un errore con {} durante la scansione"
|
||||
msgstr[1] "Impossibile costruire a causa di errori con {} durante la scansione"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Impossibile leggere {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1504,6 +1509,11 @@ msgstr "Rimozione di {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2028,6 +2038,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, usa {url} per caricare {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avvisa riguardo possibili errori nei metadati"
|
||||
|
|
|
@ -8,8 +8,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-02-08 06:22+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-04-30 04:07+0000\n"
|
||||
"Last-Translator: Liner Seven <linour7gmekiblo@gmail.com>\n"
|
||||
"Language-Team: Japanese <https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/>\n"
|
||||
"Language: ja\n"
|
||||
|
@ -17,7 +17,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.10-dev\n"
|
||||
"X-Generator: Weblate 5.12-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -43,7 +43,7 @@ msgstr "「\"%s/」に合致するメタデータのファイルはありませ
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "\"isPrimary\" キーはミラーに追加すべきではありません!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -359,6 +359,11 @@ msgid "Can't build due to {} error while scanning"
|
|||
msgid_plural "Can't build due to {} errors while scanning"
|
||||
msgstr[0] "スキャン時に{}個のエラーが発生したためビルドできません"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "{path}を読み込めませんでした:{error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -481,9 +486,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "s3cmdの設定用に「{path}」を作成します。"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "「{config_file}」を読み込みます"
|
||||
msgstr "素の {config_file} を作成"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -653,12 +658,12 @@ msgstr "エラー:{path}の{key}は「archive」でも「repo」でもあり
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "エラー:{key} が無効な値です!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "エラー:{key} の値は {t} 型でなければいけません!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -685,9 +690,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "{configname}の環境変数 {var} が設定されていません!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "{configname}の環境変数 {var} が設定されていません!"
|
||||
msgstr "環境変数{{env: {var}}}が未設定です!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -929,9 +934,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "manifestの正しくない要素を無視します:%s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile}は非推奨です。{newfile}を使用してください"
|
||||
msgstr "{oldfile}は非推奨です。{newfile}を使用してください!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1139,7 +1144,7 @@ msgstr "ZIPファイルの最大の再帰階層に到達しました:%s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "{url} のミラー設定に \"isPrimary\" キーが含まれています!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1306,7 +1311,7 @@ msgstr "画像にはPNGとJPEGのみをサポートします。これが見つ
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "単一キー \"env\" のみを受け付けます"
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1467,7 +1472,7 @@ msgstr "スキャナーのルールと署名をネットワークから取得し
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "{dir1} と {dir2} のどちらにもファイルが存在するため、'{path}'への署名は拒否されました。"
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1486,6 +1491,11 @@ msgstr "{path} を削除"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1694,7 +1704,7 @@ msgstr "テストモード - 既に出力が存在する場合でも、一時デ
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "\"qrcode\"のPythonパッケージが未導入です( 例えば apt-get install python3-qrcode します)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2005,6 +2015,10 @@ msgstr "apksignerを使用してパッケージ{path}を検証しています。
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotalのAPI鍵は32メガバイトより大きいファイルをアップロードできません。{url}から{path}をアップロードしてください。"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "潜在的なメタデータのエラーに関して警告"
|
||||
|
@ -2589,7 +2603,7 @@ msgstr "{name}「{section}/icons/{path}」がありません!「config.yml」
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} は {path2} と重複しています、片方を除外してください!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2021-01-15 13:25+0000\n"
|
||||
"Last-Translator: R_SACI <rgebbid@gmail.com>\n"
|
||||
"Language-Team: Kabyle <https://hosted.weblate.org/projects/f-droid/fdroidserver/kab/>\n"
|
||||
|
@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1482,6 +1487,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1995,6 +2005,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-09-06 14:57+0000\n"
|
||||
"Last-Translator: Cxnfl1ct <wind0wso2o2@naver.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/>\n"
|
||||
|
@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning"
|
|||
msgid_plural "Can't build due to {} errors while scanning"
|
||||
msgstr[0] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1485,6 +1490,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1997,6 +2007,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "가능한 메타데이터 오류에 대해 경고합니다"
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2023-06-23 14:52+0000\n"
|
||||
"Last-Translator: abe1242 <abmdn1242@gmail.com>\n"
|
||||
"Language-Team: Malayalam <https://hosted.weblate.org/projects/f-droid/fdroidserver/ml/>\n"
|
||||
|
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1483,6 +1488,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1999,6 +2009,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2022-09-06 14:30+0000\n"
|
||||
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/>\n"
|
||||
|
@ -366,6 +366,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Kan ikke bygge som følge av {} feil under skanning"
|
||||
msgstr[1] "Kan ikke bygge som følge av {} feiler under skanning"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Klarte ikke å lese {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1537,6 +1542,11 @@ msgstr "Fjerner {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2070,6 +2080,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk {url} for å laste opp {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Advar om mulige metadata-feil"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-01-03 09:07+0000\n"
|
||||
"Last-Translator: Issa1553 <fairfull.playing@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/f-droid/fdroidserver/nl/>\n"
|
||||
|
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1486,6 +1491,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Hernoem APK-bestanden die niet overeenkomen met pakket.naam_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1999,6 +2009,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Waarschuwen voor mogelijke metadata fouten"
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-11-26 10:54+0000\n"
|
||||
"Last-Translator: Bård Sigurd Møller <git@bsmoller.no>\n"
|
||||
"Language-Team: Norwegian Nynorsk <https://hosted.weblate.org/projects/f-droid/fdroidserver/nn/>\n"
|
||||
|
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1991,6 +2001,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.3.3\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
|
@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1477,6 +1482,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1990,6 +2000,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
#
|
||||
# add completed translations from weblate to MANIFEST.in
|
||||
|
||||
import git
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import requests
|
||||
import subprocess
|
||||
|
||||
import git
|
||||
import requests
|
||||
|
||||
projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
localedir = os.path.join(projectbasedir, 'locale')
|
||||
|
|
|
@ -10,8 +10,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-13 20:43+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-06-24 12:05+0000\n"
|
||||
"Last-Translator: WaldiS <sto@tutanota.de>\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/>\n"
|
||||
"Language: pl\n"
|
||||
|
@ -19,7 +19,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 5.11-dev\n"
|
||||
"X-Generator: Weblate 5.13-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -45,7 +45,7 @@ msgstr "\"%s/\" nie ma pasującego pliku metadanych!"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "Klucz „isPrimary” nie powinien być dodawany do mirrorów!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -363,6 +363,11 @@ msgstr[0] "Nie można zbudować z powodu błędu {} podczas skanowania"
|
|||
msgstr[1] "Nie można zbudować z powodu błędów {} podczas skanowania"
|
||||
msgstr[2] "Nie można zbudować z powodu błędów {} podczas skanowania"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Błąd odczytu {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "Czytaj '{config_file}'"
|
||||
msgstr "Tworzenie pustego pliku {config_file}"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -657,12 +662,12 @@ msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "BŁĄD: {key} nie jest prawidłowym kluczem!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "BŁĄD: wartość klucza {key} powinna być typu {t}!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!"
|
||||
msgstr "Zmienna środowiskowa{{env: {var}}} nie została ustawiona!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "Ignorowanie błędnego elementu w manifeście: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} jest przestarzałe, użyj {newfile}"
|
||||
msgstr "{oldfile} jest przestarzałe, użyj {newfile}!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1143,7 +1148,7 @@ msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "Konfiguracja Mirror dla {url} zawiera klucz \"isPrimary\"!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1310,7 +1315,7 @@ msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}"
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Akceptowany jest tylko jeden klucz \"env\""
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1471,7 +1476,7 @@ msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Odmowa podpisania pliku {path}, ponieważ istnieje on zarówno w folderze {dir1}, jak i {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1490,6 +1495,11 @@ msgstr "Usuwanie „{path}”"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1700,7 +1710,7 @@ msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "Pakiet Pythona „qrcode” nie jest zainstalowany (np. apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2011,6 +2021,10 @@ msgstr "Weryfikacja pakietu {path} za pomocą apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB, użyj {url}, aby przesłać {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Ostrzegaj o możliwych błędach metadanych"
|
||||
|
@ -2601,7 +2615,7 @@ msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\".
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} to duplikat {path2}, usuń jeden z nich!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -9,8 +9,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-02 21:32+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-04-06 16:45+0000\n"
|
||||
"Last-Translator: ssantos <ssantos@web.de>\n"
|
||||
"Language-Team: Portuguese <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/>\n"
|
||||
"Language: pt\n"
|
||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.10.3-dev\n"
|
||||
"X-Generator: Weblate 5.11-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -44,7 +44,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Não é possível construir devido a erro {} durante a digitalização"
|
||||
msgstr[1] "Não é possível construir devido a erros {} durante a digitalização"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Falha de leitura {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -483,9 +488,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Criando \"{path}\" para configurar s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "A ler '{config_file}'"
|
||||
msgstr "A criar '{config_file}' vazio"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -655,12 +660,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "ERRO: {key} não é uma chave válida!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "ERRO: o valor de {key} deve ser do tipo {t}!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -687,9 +692,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "A variável de ambiente {var} de {configname} não está definida!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "A variável de ambiente {var} de {configname} não está definida!"
|
||||
msgstr "A variável de ambiente {{env: {var} não está definida!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -931,9 +936,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "A ignorar o elemento mau no manifesto: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} está obsoleto, use {newfile}"
|
||||
msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1141,7 +1146,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1308,7 +1313,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}"
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Aceita apenas uma única chave \"env\""
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1469,7 +1474,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1488,6 +1493,11 @@ msgstr "A remover {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1697,7 +1707,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "O pacote Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2008,6 +2018,10 @@ msgstr "A verificar o pacote {path} com apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avisar sobre possíveis erros de metadados"
|
||||
|
@ -2595,7 +2609,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} é uma duplicata de {path2}, remova uma!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -19,9 +19,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-21 18:43+0000\n"
|
||||
"Last-Translator: LucasMZ <git@lucasmz.dev>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
|
||||
"Last-Translator: Igor Rückert <igorruckert@yahoo.com.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
@ -371,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Não é possível criar devido a {} erro durante a digitalização"
|
||||
msgstr[1] "Não é possível criar devido a {} erros durante a digitalização"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Falha ao ler {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1479,7 +1484,7 @@ msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Recusando assinar '{path}', o arquivo existe nas pastas {dir1} e {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1498,6 +1503,11 @@ msgstr "Removendo {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2018,6 +2028,10 @@ msgstr "Verificando o pacote {path} com apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, utilize {url} para enviar para {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avisa sobre possíveis erros de metadados"
|
||||
|
|
|
@ -11,8 +11,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-02 21:32+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-05-30 07:19+0000\n"
|
||||
"Last-Translator: ssantos <ssantos@web.de>\n"
|
||||
"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/>\n"
|
||||
"Language: pt_PT\n"
|
||||
|
@ -20,7 +20,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.10.3-dev\n"
|
||||
"X-Generator: Weblate 5.12-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -46,7 +46,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Não é possível construir devido a erro {} durante a digitalização"
|
||||
msgstr[1] "Não é possível construir devido a erros {} durante a digitalização"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Falha de leitura {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -485,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Criando \"{path}\" para configurar s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "A ler '{config_file}'"
|
||||
msgstr "A criar '{config_file}' vazio"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -657,12 +662,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "ERRO: {key} não é uma chave válida!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "ERRO: o valor de {key} deve ser do tipo {t}!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -689,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "A variável de ambiente {var} de {configname} não está definida!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "A variável de ambiente {var} de {configname} não está definida!"
|
||||
msgstr "A variável de ambiente {{env: {var} não está definida!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -933,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "A ignorar o elemento mau no manifesto: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} está obsoleto, use {newfile}"
|
||||
msgstr "A ignorar {oldfile} obsoleto, use {newfile}!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1143,7 +1148,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1310,7 +1315,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}"
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Aceita apenas uma única chave \"env\""
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1471,7 +1476,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1490,6 +1495,11 @@ msgstr "A remover {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1699,7 +1709,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "O pacote de Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2010,6 +2020,10 @@ msgstr "A verificar o pacote {path} com apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avisar sobre possíveis erros de metadados"
|
||||
|
@ -2597,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} é uma duplicata de {path2}, remova uma!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -9,7 +9,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-12-02 17:00+0000\n"
|
||||
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
|
||||
"Language-Team: Romanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/>\n"
|
||||
|
@ -362,6 +362,11 @@ msgstr[0] "Nu se poate construi din cauza unei erori {} în timpul scanării"
|
|||
msgstr[1] "Nu se poate construi din cauza erorilor {} în timpul scanării"
|
||||
msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "A eșuat citirea {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1489,6 +1494,11 @@ msgstr "Eliminarea lui {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2011,6 +2021,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utilizați {url} pentru a încărca {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Avertizează cu privire la posibile erori de metadate"
|
||||
|
|
|
@ -16,20 +16,21 @@
|
|||
# gfbdrgng <hnaofegnp@hldrive.com>, 2024.
|
||||
# neverender <audiolunaire@getgoogleoff.me>, 2024.
|
||||
# Dmitry <dmitrydmitry761@gmail.com>, 2024.
|
||||
# Artyom Rybakov <rib.artem@gmail.com>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-01-25 15:42+0000\n"
|
||||
"Last-Translator: Golubev Alexander <fatzer2@gmail.com>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-06-24 10:15+0000\n"
|
||||
"Last-Translator: Artyom Rybakov <rib.artem@gmail.com>\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 5.10-dev\n"
|
||||
"X-Generator: Weblate 5.13-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -55,7 +56,7 @@ msgstr "У \"%s/\" нет соответствующего файла метад
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "Ключ \"IsPrimary\" не следует добавлять в зеркала!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -373,6 +374,11 @@ msgstr[0] "Запустить сборку невозможно из-за {} о
|
|||
msgstr[1] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных"
|
||||
msgstr[2] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Не удалось распознать {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -495,9 +501,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "Создание \"{path}\" для конфигурации s3cmd."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "Чтение '{config_file}'"
|
||||
msgstr "Создание пустого '{config_file}'"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -667,12 +673,12 @@ msgstr "ОШИБКА: {key} в {path} должен быть или \"archive\",
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "ОШИБКА: {key} недействительный ключ!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "ОШИБКА: значение {key} должно быть типа {t}!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -699,9 +705,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "Переменная среды {var} из {configname} не установлена!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "Переменная среды {var} из {configname} не установлена!"
|
||||
msgstr "Переменная среды {{env: {var}}} не установлена!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -943,9 +949,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "Проигнорировано: плохой элемент в манифесте: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} признан устаревшим; используйте {newfile}"
|
||||
msgstr "Устаревший {oldfile} игнорируется, используйте {newfile}!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1153,7 +1159,7 @@ msgstr "Достигнута максимальная глубина рекур
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "Конфигурация зеркала для {url} содержит ключ \"IsPrimary\"!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1320,7 +1326,7 @@ msgstr "Допускаются изображения только в форма
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Принимает только один ключ \"env\""
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1481,7 +1487,7 @@ msgstr "Обновление и кэширование правил и сигн
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Отказываюсь подписывать '{path}', файл существует как в папке {dir1}, так и в папке {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1500,6 +1506,11 @@ msgstr "Удаление {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1710,7 +1721,7 @@ msgstr "Тестовый режим. Все собранное попадает
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "Пакет Python \"qrcode\" не установлен (например, apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2021,6 +2032,10 @@ msgstr "Проверка пакета {path} с помощью apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Через API VirusTotal нельзя загрузить файлы больше 32MB, загрузите {path} на {url} самостоятельно."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Предупреждать о возможных ошибках в метаданных"
|
||||
|
@ -2611,7 +2626,7 @@ msgstr "{name}: \"{section}/icons/{path}\" не существует! Попра
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1} дублирует {path2}, удалите один!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
|
@ -353,6 +353,11 @@ msgstr[0] ""
|
|||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1992,6 +2002,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -6,8 +6,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-21 08:45+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-26 21:33+0000\n"
|
||||
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
|
||||
"Language-Team: Albanian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/>\n"
|
||||
"Language: sq\n"
|
||||
|
@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "S’montohet dot, për shkak të {} gabimi teksa skanohej"
|
||||
msgstr[1] "S’montohet dot, për shkak të {} gabimeve teksa skanohej"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "S’u arrit të lexohej {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1466,7 +1471,7 @@ msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "S’po pranohet të nënshkruhet '{path}', kartela ekziston te të dyja dosjet, {dir1} dhe {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1485,6 +1490,11 @@ msgstr "Po hiqet {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2006,6 +2016,10 @@ msgstr "Po verifikohet paketë {path} me apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.1b0\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-12-30 22:00+0000\n"
|
||||
"Last-Translator: Reno Tx <renotx@users.noreply.hosted.weblate.org>\n"
|
||||
"Language-Team: Serbian <https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/>\n"
|
||||
|
@ -361,6 +361,11 @@ msgstr[0] "Не може се изградити због {} грешке при
|
|||
msgstr[1] "Не може се изградити због {} грешке приликом скенирања"
|
||||
msgstr[2] "Не може се изградити због {} грешака приликом скенирања"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Није успело читање {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1488,6 +1493,11 @@ msgstr "Уклањање {path}"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Преименујте APK фајлове који не одговарају package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2009,6 +2019,10 @@ msgstr "Провера пакета {path} са apksigner."
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal API кључ не може отпремити датотеке веће од 32MB, користи {url} за отпремање {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Упозорење о могућим грешкама у метаподацима"
|
||||
|
|
|
@ -10,7 +10,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-17 21:44+0000\n"
|
||||
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/>\n"
|
||||
|
@ -362,6 +362,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "{path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1487,6 +1492,11 @@ msgstr "Tar bort {path}''"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Byt namn på APK-filer som inte matchar paket.namn_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2000,6 +2010,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Visa varningar vid möjliga metadatafel"
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.3a1\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2024-09-08 11:09+0000\n"
|
||||
"Last-Translator: abelbiwott-dev <abelbiwott@outlook.com>\n"
|
||||
"Language-Team: Swahili <https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/>\n"
|
||||
|
@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Haiwezi kujenga kutokana na kosa la {} wakati wa uchanganuzi"
|
||||
msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} wakati wa uchanganuzi"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Imeshindwa kusoma {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1486,6 +1491,11 @@ msgstr "Kuondoa {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Badilisha jina la faili za APK ambazo hazilingani na package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2007,6 +2017,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-01-20 14:04+0000\n"
|
||||
"Last-Translator: Hans-Christoph Steiner <hans@guardianproject.info>\n"
|
||||
"Language-Team: Tamil <https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/>\n"
|
||||
|
@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "ச்கேன் செய்யும் போது {} பிழை காரணமாக உருவாக்க முடியாது"
|
||||
msgstr[1] "ச்கேன் செய்யும் போது {} பிழைகள் காரணமாக உருவாக்க முடியாது"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "தோல்வியுற்ற வாசிப்பு {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1487,6 +1492,11 @@ msgstr "{path} \"ஐ நீக்குதல்"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "தொகுப்புடன் பொருந்தாத APK கோப்புகளை மறுபெயரிடுங்கள். NAME_123.APK"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2007,6 +2017,10 @@ msgstr "Apksigner உடன் தொகுப்பு {path} ஐ சரிப
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "வைரச்டோட்டல் பநிஇ விசையை 32MB ஐ விட பெரிய கோப்புகளை பதிவேற்ற முடியாது, {path} பதிவேற்ற {url} ஐப் பயன்படுத்தவும்."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "சாத்தியமான மேனிலை தரவு பிழைகள் குறித்து எச்சரிக்கவும்"
|
||||
|
|
|
@ -4,20 +4,23 @@
|
|||
# Orhan <orya@pm.me>, 2021.
|
||||
# Oğuz Ersen <oguz@ersen.moe>, 2022, 2023, 2024.
|
||||
# Bai <batuhanakkurt000@gmail.com>, 2023.
|
||||
# "M. Fatih Uluçam" <mulucam@gmail.com>, 2025.
|
||||
# Nuri KÜÇÜKLER <enatsek@gmail.com>, 2025.
|
||||
# Bora Atıcı <boratici.acc@gmail.com>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2024-09-10 23:49+0000\n"
|
||||
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-05-26 22:01+0000\n"
|
||||
"Last-Translator: Bora Atıcı <boratici.acc@gmail.com>\n"
|
||||
"Language-Team: Turkish <https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.8-dev\n"
|
||||
"X-Generator: Weblate 5.12-dev\n"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid ""
|
||||
|
@ -43,7 +46,7 @@ msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!"
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "\"isPrimary\" key should not be added to mirrors!"
|
||||
msgstr ""
|
||||
msgstr "\"isPrimary\" anahtarı yansılara eklenmemelidir!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -170,7 +173,7 @@ msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı"
|
|||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "--merge-request only runs on a single appid!"
|
||||
msgstr ""
|
||||
msgstr "--merge-request yalnızca tek bir uygulama kimliğinde çalışır!"
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
#, python-brace-format
|
||||
|
@ -295,11 +298,11 @@ msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır."
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Automatic no to all prompts."
|
||||
msgstr ""
|
||||
msgstr "Bütün sorulara otomatik olarak hayır."
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Automatic yes to all prompts."
|
||||
msgstr ""
|
||||
msgstr "Bütün sorulara otomatik olarak evet."
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
|
@ -360,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] "Tarama sırasında {} hata nedeniyle inşa edilemiyor"
|
||||
msgstr[1] "Tarama sırasında {} hata nedeniyle inşa edilemiyor"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "{path} okunamadı: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -396,7 +404,7 @@ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işle
|
|||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Color the log output"
|
||||
msgstr ""
|
||||
msgstr "Günlük çıktısını renklendir"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
msgid "Comma separated list of categories."
|
||||
|
@ -413,7 +421,7 @@ msgstr "Değişiklikleri işle"
|
|||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Commit changes, push, then make a merge request"
|
||||
msgstr ""
|
||||
msgstr "Değişiklikleri uygula, yükle ve bir birleştirme isteği yap"
|
||||
|
||||
#: ../fdroidserver/metadata.py
|
||||
#, python-brace-format
|
||||
|
@ -482,9 +490,9 @@ msgid "Creating \"{path}\" for configuring s3cmd."
|
|||
msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Creating empty {config_file}"
|
||||
msgstr "'{config_file}' okunuyor"
|
||||
msgstr "Boş {config_file} oluşturuluyor"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
msgid "Creating log directory"
|
||||
|
@ -598,7 +606,7 @@ msgstr "Rsync sağlama toplamlarını kullanma"
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Download F-Droid.apk using mirrors that leak less to the network"
|
||||
msgstr ""
|
||||
msgstr "F-Droid.apk'yı ağa az bilgi sızdıracak şekilde indir"
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Download complete mirrors of small repos"
|
||||
|
@ -654,12 +662,12 @@ msgstr "HATA: {path} içindeki {key} \"archive\" veya \"repo\" değil!"
|
|||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key} not a valid key!"
|
||||
msgstr ""
|
||||
msgstr "HATA: {key} geçerli bir anahtar değil!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
msgid "ERROR: {key}'s value should be of type {t}!"
|
||||
msgstr ""
|
||||
msgstr "Hata: {key} anahtarının değeri {t} tipinde olmalı!"
|
||||
|
||||
#: ../fdroidserver/lint.py
|
||||
#, python-brace-format
|
||||
|
@ -686,9 +694,9 @@ msgid "Environment variable {var} from {configname} is not set!"
|
|||
msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Environment variable {{env: {var}}} is not set!"
|
||||
msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!"
|
||||
msgstr "Ortam değişkeni {{env: {var}}} ayarlanmadı!"
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)"
|
||||
|
@ -712,7 +720,7 @@ msgstr "APK'lardan imzaları ayıkla"
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "F-Droid.apk could not be downloaded from any known source!"
|
||||
msgstr ""
|
||||
msgstr "F-Droid.apk bilinen kaynakların hiç birinden indirilemedi!"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
|
@ -930,9 +938,9 @@ msgid "Ignoring bad element in manifest: %s"
|
|||
msgstr "Manifestteki hatalı öğe yok sayılıyor: %s"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Ignoring deprecated {oldfile}, use {newfile}!"
|
||||
msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın"
|
||||
msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın!"
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "Ignoring package without metadata: "
|
||||
|
@ -1140,7 +1148,7 @@ msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s"
|
|||
#: ../fdroidserver/index.py
|
||||
#, python-brace-format
|
||||
msgid "Mirror config for {url} contains \"isPrimary\" key!"
|
||||
msgstr ""
|
||||
msgstr "{url} için yansı yapılandırması \"isPrimary\" anahtarını içeriyor!"
|
||||
|
||||
#: ../fdroidserver/mirror.py
|
||||
msgid "Mirror the full repo and archive, all file types."
|
||||
|
@ -1173,7 +1181,7 @@ msgstr "Bağlı aygıt bulunamadı"
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "No devices found for `adb install`! Please plug one in."
|
||||
msgstr ""
|
||||
msgstr "`adb install` için aygıt bulunamadı! Lütfen bir tane takın."
|
||||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "No fingerprint in URL."
|
||||
|
@ -1307,7 +1315,7 @@ msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}"
|
|||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Only accepts a single key \"env\""
|
||||
msgstr ""
|
||||
msgstr "Sadece bir tane anahtar \"env\" kabul edilir"
|
||||
|
||||
#: ../fdroidserver/checkupdates.py
|
||||
msgid "Only process apps with auto-updates"
|
||||
|
@ -1377,7 +1385,7 @@ msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz"
|
|||
#: ../fdroidserver/install.py
|
||||
#, python-brace-format
|
||||
msgid "Privacy mode was enabled based on your locale ({country_code})."
|
||||
msgstr ""
|
||||
msgstr "Yerel ayarınız ({country_code}) baz alınarak gizlilik kipi etkinleştirildi."
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
#, python-format
|
||||
|
@ -1468,11 +1476,11 @@ msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "'{path}' imzalanması reddedildi, dosya hem {dir1} hem de {dir2} dizininde yer alıyor."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
msgstr ""
|
||||
msgstr "Başarıyla doğrulanmışsa, kaynak sıkıştırılmış dosyayı ve var olan bütün APK'ları kaldır."
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
msgid "Removing specified files"
|
||||
|
@ -1487,6 +1495,11 @@ msgstr "\"{path}\" kaldırılıyor"
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1503,7 +1516,7 @@ msgstr "Çıkışı uyarılara ve hatalara kısıtla"
|
|||
#: ../fdroidserver/net.py
|
||||
#, python-format
|
||||
msgid "Retrying failed download: %s"
|
||||
msgstr ""
|
||||
msgstr "Başarısız indirme tekrar deneniyor: %s"
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Rewrite all the metadata files"
|
||||
|
@ -1572,7 +1585,7 @@ msgstr[1] "Tarayıcı {} sorun buldu"
|
|||
|
||||
#: ../fdroidserver/scanner.py
|
||||
msgid "Scanning APK for extra signing blocks."
|
||||
msgstr ""
|
||||
msgstr "APK'daki ekstra imzalama blokları taranıyor."
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
msgid "Scanning APK with dexdump for known non-free classes."
|
||||
|
@ -1696,7 +1709,7 @@ msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa e
|
|||
|
||||
#: ../fdroidserver/index.py
|
||||
msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!"
|
||||
msgstr ""
|
||||
msgstr "\"qrcode\" Python paketi kurulu değil (yüklemek için: apt-get install python3-qrcode)!"
|
||||
|
||||
#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode
|
||||
#: ../fdroidserver/update.py
|
||||
|
@ -2000,20 +2013,24 @@ msgstr "İndeks imzası doğrulanıyor:"
|
|||
#: ../fdroidserver/install.py
|
||||
#, python-brace-format
|
||||
msgid "Verifying package {path} with apksigner."
|
||||
msgstr ""
|
||||
msgstr "{path} paketi apksigner ile doğrulanıyor."
|
||||
|
||||
#: ../fdroidserver/deploy.py
|
||||
#, python-brace-format
|
||||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal API anahtarı 32MB'den büyük dosyaları yükleyemiyor, {path} yüklemek için {url} kullanın."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Olası üst veri hataları hakkında uyar"
|
||||
|
||||
#: ../fdroidserver/scanner.py
|
||||
msgid "WebAssembly binary file"
|
||||
msgstr ""
|
||||
msgstr "WebAssembly ikilik dosyası"
|
||||
|
||||
#: ../fdroidserver/update.py
|
||||
msgid "When configured for signed indexes, create only unsigned indexes at this stage"
|
||||
|
@ -2029,11 +2046,11 @@ msgstr "İmzalama veya doğrulama başarısız olduğunda, bir hata koduyla çı
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)"
|
||||
msgstr ""
|
||||
msgstr "F-Droid.apk'nın adb aracılığıyla indirilmesini ve yüklenmesini ister misiniz? (EVET/hayır)"
|
||||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "Would you like to download the app(s) from f-droid.org? (YES/no)"
|
||||
msgstr ""
|
||||
msgstr "Uygulamaları f-droid.org adresinden indirmek ister misiniz? (EVET/hayır)"
|
||||
|
||||
#: ../fdroidserver/init.py
|
||||
msgid "X.509 'Distinguished Name' used when generating keys"
|
||||
|
@ -2050,7 +2067,7 @@ msgstr "ZIP dosya arşivi"
|
|||
#: ../fdroidserver/install.py
|
||||
#, python-brace-format
|
||||
msgid "adb reports {serial} is \"{status}\"!"
|
||||
msgstr ""
|
||||
msgstr "adb {serial} için {status} durumunu veriyor!"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
|
@ -2467,7 +2484,7 @@ msgstr "şu argümanlar gerekli: %s"
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "true"
|
||||
msgstr ""
|
||||
msgstr "doğru"
|
||||
|
||||
#: /usr/lib/python3.11/argparse.py
|
||||
#, python-format
|
||||
|
@ -2504,7 +2521,7 @@ msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..."
|
|||
|
||||
#: ../fdroidserver/install.py
|
||||
msgid "yes"
|
||||
msgstr ""
|
||||
msgstr "evet"
|
||||
|
||||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
|
@ -2594,7 +2611,7 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin."
|
|||
#: ../fdroidserver/update.py
|
||||
#, python-brace-format
|
||||
msgid "{path1} is a duplicate of {path2}, remove one!"
|
||||
msgstr ""
|
||||
msgstr "{path1}, {path2} 'in bir kopyasıdır, birini kaldırın!"
|
||||
|
||||
#: ../fdroidserver/import_subcommand.py
|
||||
#, python-brace-format
|
||||
|
@ -2619,7 +2636,7 @@ msgstr "{path} virustotal tarafından {count} defa işaretlendi:"
|
|||
#: ../fdroidserver/install.py
|
||||
#, python-brace-format
|
||||
msgid "{path} has the wrong fingerprint ({fingerprint})!"
|
||||
msgstr ""
|
||||
msgstr "{path} yanlış {fingerprint} parmak izine sahip!"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2020-10-29 08:32+0000\n"
|
||||
"Last-Translator: Hakim Oubouali <hakim.oubouali.skr@gmail.com>\n"
|
||||
"Language-Team: Central Atlas Tamazight <https://hosted.weblate.org/projects/f-droid/fdroidserver/tzm/>\n"
|
||||
|
@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,6 +1483,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1991,6 +2001,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2018-06-08 03:44+0000\n"
|
||||
"Last-Translator: ۋولقان <nureliosman@gmail.com>\n"
|
||||
"Language-Team: Uyghur <https://hosted.weblate.org/projects/f-droid/fdroidserver/ug/>\n"
|
||||
|
@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1480,6 +1485,11 @@ msgstr ""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -1993,6 +2003,10 @@ msgstr ""
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr ""
|
||||
|
|
|
@ -17,8 +17,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-24 14:02+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-27 19:35+0000\n"
|
||||
"Last-Translator: Ihor Hordiichuk <igor_ck@outlook.com>\n"
|
||||
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/>\n"
|
||||
"Language: uk\n"
|
||||
|
@ -370,6 +370,11 @@ msgstr[0] "Неможливо створити через {} помилку пі
|
|||
msgstr[1] "Неможливо створити через {} помилки під час сканування"
|
||||
msgstr[2] "Неможливо створити через {} помилок під час сканування"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "Не вдалося розпізнати {path}: {error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1478,7 +1483,7 @@ msgstr "Оновлення та кешування правил і сигнат
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "Відмова підписати '{path}', файл існує в теках {dir1} і {dir2}."
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1497,6 +1502,11 @@ msgstr "Вилучення {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2018,6 +2028,10 @@ msgstr "Перевірка пакета {path} за допомогою apksigner
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "Ключ API VirusTotal не може завантажити файли, розмір яких понад 32 МБ, використовуйте {url} для завантаження {path}."
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "Попереджати про можливі помилки метаданих"
|
||||
|
|
|
@ -39,8 +39,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: fdroidserver 0.9\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n"
|
||||
"POT-Creation-Date: 2025-03-25 11:36+0100\n"
|
||||
"PO-Revision-Date: 2025-03-21 03:03+0000\n"
|
||||
"POT-Creation-Date: 2025-06-25 09:52+0200\n"
|
||||
"PO-Revision-Date: 2025-03-26 10:00+0000\n"
|
||||
"Last-Translator: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>\n"
|
||||
"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/>\n"
|
||||
"Language: zh_Hans\n"
|
||||
|
@ -390,6 +390,11 @@ msgid "Can't build due to {} error while scanning"
|
|||
msgid_plural "Can't build due to {} errors while scanning"
|
||||
msgstr[0] "因扫描时的{}错误而无法构建"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cannot read {path}: {error}"
|
||||
msgstr "读取 {path} 失败:{error}"
|
||||
|
||||
#: ../fdroidserver/rewritemeta.py
|
||||
#, python-brace-format
|
||||
msgid "Cannot rewrite \"{path}\""
|
||||
|
@ -1498,7 +1503,7 @@ msgstr "刷新和缓存来自网络的扫描程序规则和签名"
|
|||
#: ../fdroidserver/publish.py
|
||||
#, python-brace-format
|
||||
msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder."
|
||||
msgstr ""
|
||||
msgstr "拒绝签署 '{path}',文件同时存在于文件夹 {dir1} 和 {dir2}。"
|
||||
|
||||
#: ../fdroidserver/verify.py
|
||||
msgid "Remove source tarball and any APKs if successfully verified."
|
||||
|
@ -1517,6 +1522,11 @@ msgstr "删除 {path}\""
|
|||
msgid "Rename APK files that do not match package.name_123.apk"
|
||||
msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件"
|
||||
|
||||
#: ../fdroidserver/common.py
|
||||
#, python-brace-format
|
||||
msgid "RepoType {type} is deprecated, please switch to git."
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
#, python-brace-format
|
||||
msgid "Resigning {apkfilename} with provided debug.keystore"
|
||||
|
@ -2036,6 +2046,10 @@ msgstr "使用 apksigner 验证包 {path}。"
|
|||
msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}."
|
||||
msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。"
|
||||
|
||||
#: ../fdroidserver/nightly.py
|
||||
msgid "WARNING: only public git repos are supported!"
|
||||
msgstr ""
|
||||
|
||||
#: ../fdroidserver/__main__.py
|
||||
msgid "Warn about possible metadata errors"
|
||||
msgstr "警告元数据中可能存在的错误"
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue