diff options
94 files changed, 6821 insertions, 2308 deletions
@@ -1,10 +1,9 @@ -conf/config dummy-data.sql* po/*.mo po/*.po~ po/POTFILES -scripts/git-integration/__pycache__/ -scripts/git-integration/templates/ web/locale/*/ aur.git/ -git-interface/git-auth.sh +__pycache__/ +*.py[cod] +test/test-results/ @@ -4,7 +4,7 @@ Setup on Arch Linux 1) Clone the AUR project: $ cd /srv/http/ - $ git clone git://projects.archlinux.org/aurweb.git + $ git clone git://git.archlinux.org/aurweb.git 2) Setup a web server with PHP and MySQL. Configure the web server to redirect all URLs to /index.php/foo/bar/. The following block can be used with nginx: @@ -30,47 +30,44 @@ Setup on Arch Linux } } -3) Copy conf/config.proto to conf/config and adjust the configuration (pay - attention to disable_http_login, enable_maintenance and aur_location). +3) Copy conf/config.proto to /etc/aurweb/config and adjust the configuration + (pay attention to disable_http_login, enable_maintenance and aur_location). 4) Create a new MySQL database and a user and import the AUR SQL schema: $ mysql -uaur -p AUR </srv/http/aurweb/schema/aur-schema.sql -5) Create a new user: +5) Install Python modules and dependencies: + + # pacman -S python-mysql-connector python-pygit2 python-srcinfo + # python3 setup.py install + +6) Create a new user: # useradd -U -d /srv/http/aurweb -c 'AUR user' aur -6) Initialize the Git repository: +7) Initialize the Git repository: # mkdir /srv/http/aurweb/aur.git/ # cd /srv/http/aurweb/aur.git/ # git init --bare # git config --local transfer.hideRefs '^refs/' - # git config --local transfer.hideRefs '!refs/' - # ln -s ../../git-interface/git-update.py hooks/update + # git config --local --add transfer.hideRefs '!refs/' + # git config --local --add transfer.hideRefs '!HEAD' + # ln -s /usr/local/bin/aurweb-git-update hooks/update # chown -R aur . -7) Install needed Python modules: - - # pacman -S python-mysql-connector python-pygit2 python-srcinfo - -8) Install the git-auth wrapper script: - - # cd /srv/http/aurweb/git-interface/ - # make && make install - -9) Configure sshd(8) for the AUR. Add the following lines at the end of your +8) Configure sshd(8) for the AUR. Add the following lines at the end of your sshd_config(5) and restart the sshd. Note that OpenSSH 6.9 or newer is needed! Match User aur PasswordAuthentication no - AuthorizedKeysCommand /usr/local/bin/aur-git-auth "%t" "%k" + AuthorizedKeysCommand /usr/local/bin/aurweb-git-auth "%t" "%k" AuthorizedKeysCommandUser aur -10) If you want to enable smart HTTP support with nginx and fcgiwrap, you can - use the following directives: +9) If you want to enable smart HTTP support with nginx and fcgiwrap, you can + use the following directives: location ~ "^/([a-z0-9][a-z0-9.+_-]*?)(\.git)?/(git-(receive|upload)-pack|HEAD|info/refs|objects/(info/(http-)?alternates|packs)|[0-9a-f]{2}/[0-9a-f]{38}|pack/pack-[0-9a-f]{40}\.(pack|idx))$" { fastcgi_pass unix:/run/fcgiwrap.sock; @@ -1,40 +1,45 @@ aurweb ====== -aurweb is a framework for hosting the Arch User Repository (AUR), a collection +aurweb is a hosting platform for the Arch User Repository (AUR), a collection of packaging scripts that are created and submitted by the Arch Linux -community. The scripts contained in the repository (PKGBUILDs) can be built -using makepkg and installed via the Arch Linux package manager pacman. The -aurweb project aims to provide the necessary web interface, database schema, -and scripts for a multi-lingual community-driven repository. - -Functionality -------------- - -* Users may submit source packages that contain a PKGBUILD. -* User accounts with varying permission levels (User, Trusted User, Developer). -* Ability to search for specific submitted packages. -* Display package information by parsing meta-data provided with the packages. -* Users can make comments on package information page. -* Mark packages as out-of-date. -* Vote for well-done and popular user submitted packages. -* Trusted User and Developer can search for and modify accounts. +community. The scripts contained in the repository can be built using `makepkg` +and installed using the Arch Linux package manager `pacman`. + +The aurweb project includes + +* A web interface to search for packaging scripts and display package details. +* A SSH/Git interface to submit and update packages and package meta data. +* Community features such as comments, votes, package flagging and requests. +* Editing/deletion of packages and accounts by Trusted Users and Developers. * Area for Trusted Users to post AUR-related proposals and vote on them. Directory Layout ---------------- +aurweb:: + aurweb Python modules. + +conf:: + Configuration and configuration templates. + doc:: - aurweb documentation. + Project documentation. po:: Translation files for strings in the aurweb interface. +schema:: + Schema for the SQL database. Script for dummy data generation. + scripts:: - aurblup package blacklist tool. Scripts for AUR maintenance. + Scripts for AUR maintenance. + +test:: + Test suite and test cases. -support:: - Schema for SQL database. Script for dummy data generation. +upgrading:: + Instructions for upgrading setups from one release to another. web:: Web interface for the AUR. @@ -42,10 +47,10 @@ web:: Links ----- -* The repository is hosted at git://projects.archlinux.org/aurweb.git -- see - doc/CodingGuidelines for information on submitting patches. +* The repository is hosted at git://git.archlinux.org/aurweb.git -- see + doc/CodingGuidelines for information on the patch submission process. -* Discovered bugs can be submitted to the aurweb bug tracker: +* Bugs can (and should) be submitted to the aurweb bug tracker: https://bugs.archlinux.org/index.php?project=2 * Questions, comments, and patches related to aurweb can be sent to the AUR diff --git a/aurweb/__init__.py b/aurweb/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/aurweb/__init__.py diff --git a/aurweb/config.py b/aurweb/config.py new file mode 100644 index 00000000..a52d9422 --- /dev/null +++ b/aurweb/config.py @@ -0,0 +1,30 @@ +import configparser +import os + +_parser = None + + +def _get_parser(): + global _parser + + if not _parser: + _parser = configparser.RawConfigParser() + if 'AUR_CONFIG' in os.environ: + path = os.environ.get('AUR_CONFIG') + else: + path = "/etc/aurweb/config" + _parser.read(path) + + return _parser + + +def get(section, option): + return _get_parser().get(section, option) + + +def getboolean(section, option): + return _get_parser().getboolean(section, option) + + +def getint(section, option): + return _get_parser().getint(section, option) diff --git a/aurweb/db.py b/aurweb/db.py new file mode 100644 index 00000000..0b581970 --- /dev/null +++ b/aurweb/db.py @@ -0,0 +1,51 @@ +import mysql.connector +import sqlite3 + +import aurweb.config + + +class Connection: + _conn = None + _paramstyle = None + + def __init__(self): + aur_db_backend = aurweb.config.get('database', 'backend') + + if aur_db_backend == 'mysql': + aur_db_host = aurweb.config.get('database', 'host') + aur_db_name = aurweb.config.get('database', 'name') + aur_db_user = aurweb.config.get('database', 'user') + aur_db_pass = aurweb.config.get('database', 'password') + aur_db_socket = aurweb.config.get('database', 'socket') + self._conn = mysql.connector.connect(host=aur_db_host, + user=aur_db_user, + passwd=aur_db_pass, + db=aur_db_name, + unix_socket=aur_db_socket, + buffered=True) + self._paramstyle = mysql.connector.paramstyle + elif aur_db_backend == 'sqlite': + aur_db_name = aurweb.config.get('database', 'name') + self._conn = sqlite3.connect(aur_db_name) + self._paramstyle = sqlite3.paramstyle + else: + raise ValueError('unsupported database backend') + + def execute(self, query, params=()): + if self._paramstyle in ('format', 'pyformat'): + query = query.replace('%', '%%').replace('?', '%s') + elif self._paramstyle == 'qmark': + pass + else: + raise ValueError('unsupported paramstyle') + + cur = self._conn.cursor() + cur.execute(query, params) + + return cur + + def commit(self): + self._conn.commit() + + def close(self): + self._conn.close() diff --git a/aurweb/git/__init__.py b/aurweb/git/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/aurweb/git/__init__.py diff --git a/aurweb/git/auth.py b/aurweb/git/auth.py new file mode 100755 index 00000000..022b0fff --- /dev/null +++ b/aurweb/git/auth.py @@ -0,0 +1,62 @@ +#!/usr/bin/python3 + +import shlex +import re +import sys + +import aurweb.config +import aurweb.db + + +def format_command(env_vars, command, ssh_opts, ssh_key): + environment = '' + for key, var in env_vars.items(): + environment += '{}={} '.format(key, shlex.quote(var)) + + command = shlex.quote(command) + command = '{}{}'.format(environment, command) + + # The command is being substituted into an authorized_keys line below, + # so we need to escape the double quotes. + command = command.replace('"', '\\"') + msg = 'command="{}",{} {}'.format(command, ssh_opts, ssh_key) + return msg + + +def main(): + valid_keytypes = aurweb.config.get('auth', 'valid-keytypes').split() + username_regex = aurweb.config.get('auth', 'username-regex') + git_serve_cmd = aurweb.config.get('auth', 'git-serve-cmd') + ssh_opts = aurweb.config.get('auth', 'ssh-options') + + keytype = sys.argv[1] + keytext = sys.argv[2] + if keytype not in valid_keytypes: + exit(1) + + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT Users.Username, Users.AccountTypeID FROM Users " + "INNER JOIN SSHPubKeys ON SSHPubKeys.UserID = Users.ID " + "WHERE SSHPubKeys.PubKey = ? AND Users.Suspended = 0", + (keytype + " " + keytext,)) + + row = cur.fetchone() + if not row or cur.fetchone(): + exit(1) + + user, account_type = row + if not re.match(username_regex, user): + exit(1) + + env_vars = { + 'AUR_USER': user, + 'AUR_PRIVILEGED': '1' if account_type > 1 else '0', + } + key = keytype + ' ' + keytext + + print(format_command(env_vars, git_serve_cmd, ssh_opts, key)) + + +if __name__ == '__main__': + main() diff --git a/aurweb/git/serve.py b/aurweb/git/serve.py new file mode 100755 index 00000000..476aea86 --- /dev/null +++ b/aurweb/git/serve.py @@ -0,0 +1,451 @@ +#!/usr/bin/python3 + +import os +import re +import shlex +import subprocess +import sys +import time + +import aurweb.config +import aurweb.db + +notify_cmd = aurweb.config.get('notifications', 'notify-cmd') + +repo_path = aurweb.config.get('serve', 'repo-path') +repo_regex = aurweb.config.get('serve', 'repo-regex') +git_shell_cmd = aurweb.config.get('serve', 'git-shell-cmd') +git_update_cmd = aurweb.config.get('serve', 'git-update-cmd') +ssh_cmdline = aurweb.config.get('serve', 'ssh-cmdline') + +enable_maintenance = aurweb.config.getboolean('options', 'enable-maintenance') +maintenance_exc = aurweb.config.get('options', 'maintenance-exceptions').split() + + +def pkgbase_from_name(pkgbase): + conn = aurweb.db.Connection() + cur = conn.execute("SELECT ID FROM PackageBases WHERE Name = ?", [pkgbase]) + + row = cur.fetchone() + return row[0] if row else None + + +def pkgbase_exists(pkgbase): + return pkgbase_from_name(pkgbase) is not None + + +def list_repos(user): + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + + cur = conn.execute("SELECT Name, PackagerUID FROM PackageBases " + + "WHERE MaintainerUID = ?", [userid]) + for row in cur: + print((' ' if row[1] else '*') + row[0]) + conn.close() + + +def create_pkgbase(pkgbase, user): + if not re.match(repo_regex, pkgbase): + die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) + if pkgbase_exists(pkgbase): + die('{:s}: package base already exists: {:s}'.format(action, pkgbase)) + + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + + now = int(time.time()) + cur = conn.execute("INSERT INTO PackageBases (Name, SubmittedTS, " + + "ModifiedTS, SubmitterUID, MaintainerUID) VALUES " + + "(?, ?, ?, ?, ?)", [pkgbase, now, now, userid, userid]) + pkgbase_id = cur.lastrowid + + cur = conn.execute("INSERT INTO PackageNotifications " + + "(PackageBaseID, UserID) VALUES (?, ?)", + [pkgbase_id, userid]) + + conn.commit() + conn.close() + + +def pkgbase_adopt(pkgbase, user, privileged): + pkgbase_id = pkgbase_from_name(pkgbase) + if not pkgbase_id: + die('{:s}: package base not found: {:s}'.format(action, pkgbase)) + + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT ID FROM PackageBases WHERE ID = ? AND " + + "MaintainerUID IS NULL", [pkgbase_id]) + if not privileged and not cur.fetchone(): + die('{:s}: permission denied: {:s}'.format(action, user)) + + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + + cur = conn.execute("UPDATE PackageBases SET MaintainerUID = ? " + + "WHERE ID = ?", [userid, pkgbase_id]) + + cur = conn.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " + + "PackageBaseID = ? AND UserID = ?", + [pkgbase_id, userid]) + if cur.fetchone()[0] == 0: + cur = conn.execute("INSERT INTO PackageNotifications " + + "(PackageBaseID, UserID) VALUES (?, ?)", + [pkgbase_id, userid]) + conn.commit() + + subprocess.Popen((notify_cmd, 'adopt', str(pkgbase_id), str(userid))) + + conn.close() + + +def pkgbase_get_comaintainers(pkgbase): + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT UserName FROM PackageComaintainers " + + "INNER JOIN Users " + + "ON Users.ID = PackageComaintainers.UsersID " + + "INNER JOIN PackageBases " + + "ON PackageBases.ID = PackageComaintainers.PackageBaseID " + + "WHERE PackageBases.Name = ? " + + "ORDER BY Priority ASC", [pkgbase]) + + return [row[0] for row in cur.fetchall()] + + +def pkgbase_set_comaintainers(pkgbase, userlist, user, privileged): + pkgbase_id = pkgbase_from_name(pkgbase) + if not pkgbase_id: + die('{:s}: package base not found: {:s}'.format(action, pkgbase)) + + if not privileged and not pkgbase_has_full_access(pkgbase, user): + die('{:s}: permission denied: {:s}'.format(action, user)) + + conn = aurweb.db.Connection() + + userlist_old = set(pkgbase_get_comaintainers(pkgbase)) + + uids_old = set() + for olduser in userlist_old: + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", + [olduser]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + uids_old.add(userid) + + uids_new = set() + for newuser in userlist: + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", + [newuser]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + uids_new.add(userid) + + uids_add = uids_new - uids_old + uids_rem = uids_old - uids_new + + i = 1 + for userid in uids_new: + if userid in uids_add: + cur = conn.execute("INSERT INTO PackageComaintainers " + + "(PackageBaseID, UsersID, Priority) " + + "VALUES (?, ?, ?)", [pkgbase_id, userid, i]) + subprocess.Popen((notify_cmd, 'comaintainer-add', str(pkgbase_id), + str(userid))) + else: + cur = conn.execute("UPDATE PackageComaintainers " + + "SET Priority = ? " + + "WHERE PackageBaseID = ? AND UsersID = ?", + [i, pkgbase_id, userid]) + i += 1 + + for userid in uids_rem: + cur = conn.execute("DELETE FROM PackageComaintainers " + + "WHERE PackageBaseID = ? AND UsersID = ?", + [pkgbase_id, userid]) + subprocess.Popen((notify_cmd, 'comaintainer-remove', + str(pkgbase_id), str(userid))) + + conn.commit() + conn.close() + + +def pkgreq_by_pkgbase(pkgbase_id, reqtype): + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT PackageRequests.ID FROM PackageRequests " + + "INNER JOIN RequestTypes ON " + + "RequestTypes.ID = PackageRequests.ReqTypeID " + + "WHERE PackageRequests.Status = 0 " + + "AND PackageRequests.PackageBaseID = ?" + + "AND RequestTypes.Name = ?", [pkgbase_id, reqtype]) + + return [row[0] for row in cur.fetchall()] + + +def pkgreq_close(reqid, reason, comments, autoclose=False): + statusmap = {'accepted': 2, 'rejected': 3} + if reason not in statusmap: + die('{:s}: invalid reason: {:s}'.format(action, reason)) + status = statusmap[reason] + + conn = aurweb.db.Connection() + + if autoclose: + userid = 0 + else: + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + + conn.execute("UPDATE PackageRequests SET Status = ?, ClosureComment = ? " + + "WHERE ID = ?", [status, comments, reqid]) + conn.commit() + conn.close() + + subprocess.Popen((notify_cmd, 'request-close', str(userid), str(reqid), + reason)).wait() + + +def pkgbase_disown(pkgbase, user, privileged): + pkgbase_id = pkgbase_from_name(pkgbase) + if not pkgbase_id: + die('{:s}: package base not found: {:s}'.format(action, pkgbase)) + + initialized_by_owner = pkgbase_has_full_access(pkgbase, user) + if not privileged and not initialized_by_owner: + die('{:s}: permission denied: {:s}'.format(action, user)) + + # TODO: Support disowning package bases via package request. + + # Scan through pending orphan requests and close them. + comment = 'The user {:s} disowned the package.'.format(user) + for reqid in pkgreq_by_pkgbase(pkgbase_id, 'orphan'): + pkgreq_close(reqid, 'accepted', comment, True) + + comaintainers = [] + new_maintainer_userid = None + + conn = aurweb.db.Connection() + + # Make the first co-maintainer the new maintainer, unless the action was + # enforced by a Trusted User. + if initialized_by_owner: + comaintainers = pkgbase_get_comaintainers(pkgbase) + if len(comaintainers) > 0: + new_maintainer = comaintainers[0] + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", + [new_maintainer]) + new_maintainer_userid = cur.fetchone()[0] + comaintainers.remove(new_maintainer) + + pkgbase_set_comaintainers(pkgbase, comaintainers, user, privileged) + cur = conn.execute("UPDATE PackageBases SET MaintainerUID = ? " + + "WHERE ID = ?", [new_maintainer_userid, pkgbase_id]) + + conn.commit() + + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + if userid == 0: + die('{:s}: unknown user: {:s}'.format(action, user)) + + subprocess.Popen((notify_cmd, 'disown', str(pkgbase_id), str(userid))) + + conn.close() + + +def pkgbase_set_keywords(pkgbase, keywords): + pkgbase_id = pkgbase_from_name(pkgbase) + if not pkgbase_id: + die('{:s}: package base not found: {:s}'.format(action, pkgbase)) + + conn = aurweb.db.Connection() + + conn.execute("DELETE FROM PackageKeywords WHERE PackageBaseID = ?", + [pkgbase_id]) + for keyword in keywords: + conn.execute("INSERT INTO PackageKeywords (PackageBaseID, Keyword) " + + "VALUES (?, ?)", [pkgbase_id, keyword]) + + conn.commit() + conn.close() + + +def pkgbase_has_write_access(pkgbase, user): + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT COUNT(*) FROM PackageBases " + + "LEFT JOIN PackageComaintainers " + + "ON PackageComaintainers.PackageBaseID = PackageBases.ID " + + "INNER JOIN Users " + + "ON Users.ID = PackageBases.MaintainerUID " + + "OR PackageBases.MaintainerUID IS NULL " + + "OR Users.ID = PackageComaintainers.UsersID " + + "WHERE Name = ? AND Username = ?", [pkgbase, user]) + return cur.fetchone()[0] > 0 + + +def pkgbase_has_full_access(pkgbase, user): + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT COUNT(*) FROM PackageBases " + + "INNER JOIN Users " + + "ON Users.ID = PackageBases.MaintainerUID " + + "WHERE Name = ? AND Username = ?", [pkgbase, user]) + return cur.fetchone()[0] > 0 + + +def die(msg): + sys.stderr.write("{:s}\n".format(msg)) + exit(1) + + +def die_with_help(msg): + die(msg + "\nTry `{:s} help` for a list of commands.".format(ssh_cmdline)) + + +def warn(msg): + sys.stderr.write("warning: {:s}\n".format(msg)) + + +def usage(cmds): + sys.stderr.write("Commands:\n") + colwidth = max([len(cmd) for cmd in cmds.keys()]) + 4 + for key in sorted(cmds): + sys.stderr.write(" " + key.ljust(colwidth) + cmds[key] + "\n") + exit(0) + + +def main(): + user = os.environ.get('AUR_USER') + privileged = (os.environ.get('AUR_PRIVILEGED', '0') == '1') + ssh_cmd = os.environ.get('SSH_ORIGINAL_COMMAND') + ssh_client = os.environ.get('SSH_CLIENT') + + if not ssh_cmd: + die_with_help("Interactive shell is disabled.") + cmdargv = shlex.split(ssh_cmd) + action = cmdargv[0] + remote_addr = ssh_client.split(' ')[0] if ssh_client else None + + if enable_maintenance: + if remote_addr not in maintenance_exc: + die("The AUR is down due to maintenance. We will be back soon.") + + if action == 'git' and cmdargv[1] in ('upload-pack', 'receive-pack'): + action = action + '-' + cmdargv[1] + del cmdargv[1] + + if action == 'git-upload-pack' or action == 'git-receive-pack': + if len(cmdargv) < 2: + die_with_help("{:s}: missing path".format(action)) + + path = cmdargv[1].rstrip('/') + if not path.startswith('/'): + path = '/' + path + if not path.endswith('.git'): + path = path + '.git' + pkgbase = path[1:-4] + if not re.match(repo_regex, pkgbase): + die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) + + if action == 'git-receive-pack' and pkgbase_exists(pkgbase): + if not privileged and not pkgbase_has_write_access(pkgbase, user): + die('{:s}: permission denied: {:s}'.format(action, user)) + + os.environ["AUR_USER"] = user + os.environ["AUR_PKGBASE"] = pkgbase + os.environ["GIT_NAMESPACE"] = pkgbase + cmd = action + " '" + repo_path + "'" + os.execl(git_shell_cmd, git_shell_cmd, '-c', cmd) + elif action == 'set-keywords': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + pkgbase_set_keywords(cmdargv[1], cmdargv[2:]) + elif action == 'list-repos': + if len(cmdargv) > 1: + die_with_help("{:s}: too many arguments".format(action)) + list_repos(user) + elif action == 'setup-repo': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + if len(cmdargv) > 2: + die_with_help("{:s}: too many arguments".format(action)) + warn('{:s} is deprecated. ' + 'Use `git push` to create new repositories.'.format(action)) + create_pkgbase(cmdargv[1], user) + elif action == 'restore': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + if len(cmdargv) > 2: + die_with_help("{:s}: too many arguments".format(action)) + + pkgbase = cmdargv[1] + if not re.match(repo_regex, pkgbase): + die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) + + if pkgbase_exists(pkgbase): + die('{:s}: package base exists: {:s}'.format(action, pkgbase)) + create_pkgbase(pkgbase, user) + + os.environ["AUR_USER"] = user + os.environ["AUR_PKGBASE"] = pkgbase + os.execl(git_update_cmd, git_update_cmd, 'restore') + elif action == 'adopt': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + if len(cmdargv) > 2: + die_with_help("{:s}: too many arguments".format(action)) + + pkgbase = cmdargv[1] + pkgbase_adopt(pkgbase, user, privileged) + elif action == 'disown': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + if len(cmdargv) > 2: + die_with_help("{:s}: too many arguments".format(action)) + + pkgbase = cmdargv[1] + pkgbase_disown(pkgbase, user, privileged) + elif action == 'set-comaintainers': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + + pkgbase = cmdargv[1] + userlist = cmdargv[2:] + pkgbase_set_comaintainers(pkgbase, userlist, user, privileged) + elif action == 'help': + cmds = { + "adopt <name>": "Adopt a package base.", + "disown <name>": "Disown a package base.", + "help": "Show this help message and exit.", + "list-repos": "List all your repositories.", + "restore <name>": "Restore a deleted package base.", + "set-comaintainers <name> [...]": "Set package base co-maintainers.", + "set-keywords <name> [...]": "Change package base keywords.", + "setup-repo <name>": "Create a repository (deprecated).", + "git-receive-pack": "Internal command used with Git.", + "git-upload-pack": "Internal command used with Git.", + } + usage(cmds) + else: + die_with_help("invalid command: {:s}".format(action)) + + +if __name__ == '__main__': + main() diff --git a/aurweb/git/update.py b/aurweb/git/update.py new file mode 100755 index 00000000..3b84eb5d --- /dev/null +++ b/aurweb/git/update.py @@ -0,0 +1,423 @@ +#!/usr/bin/python3 + +import os +import pygit2 +import re +import subprocess +import sys +import time + +import srcinfo.parse +import srcinfo.utils + +import aurweb.config +import aurweb.db + +notify_cmd = aurweb.config.get('notifications', 'notify-cmd') + +repo_path = aurweb.config.get('serve', 'repo-path') +repo_regex = aurweb.config.get('serve', 'repo-regex') + +max_blob_size = aurweb.config.getint('update', 'max-blob-size') + + +def size_humanize(num): + for unit in ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB']: + if abs(num) < 2048.0: + if isinstance(num, int): + return "{}{}".format(num, unit) + else: + return "{:.2f}{}".format(num, unit) + num /= 1024.0 + return "{:.2f}{}".format(num, 'YiB') + + +def extract_arch_fields(pkginfo, field): + values = [] + + if field in pkginfo: + for val in pkginfo[field]: + values.append({"value": val, "arch": None}) + + for arch in ['i686', 'x86_64']: + if field + '_' + arch in pkginfo: + for val in pkginfo[field + '_' + arch]: + values.append({"value": val, "arch": arch}) + + return values + + +def parse_dep(depstring): + dep, _, desc = depstring.partition(': ') + depname = re.sub(r'(<|=|>).*', '', dep) + depcond = dep[len(depname):] + + if (desc): + return (depname + ': ' + desc, depcond) + else: + return (depname, depcond) + + +def create_pkgbase(conn, pkgbase, user): + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + userid = cur.fetchone()[0] + + now = int(time.time()) + cur = conn.execute("INSERT INTO PackageBases (Name, SubmittedTS, " + + "ModifiedTS, SubmitterUID, MaintainerUID) VALUES " + + "(?, ?, ?, ?, ?)", [pkgbase, now, now, userid, userid]) + pkgbase_id = cur.lastrowid + + cur = conn.execute("INSERT INTO PackageNotifications " + + "(PackageBaseID, UserID) VALUES (?, ?)", + [pkgbase_id, userid]) + + conn.commit() + + return pkgbase_id + + +def save_metadata(metadata, conn, user): + # Obtain package base ID and previous maintainer. + pkgbase = metadata['pkgbase'] + cur = conn.execute("SELECT ID, MaintainerUID FROM PackageBases " + "WHERE Name = ?", [pkgbase]) + (pkgbase_id, maintainer_uid) = cur.fetchone() + was_orphan = not maintainer_uid + + # Obtain the user ID of the new maintainer. + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + user_id = int(cur.fetchone()[0]) + + # Update package base details and delete current packages. + now = int(time.time()) + conn.execute("UPDATE PackageBases SET ModifiedTS = ?, " + + "PackagerUID = ?, OutOfDateTS = NULL WHERE ID = ?", + [now, user_id, pkgbase_id]) + conn.execute("UPDATE PackageBases SET MaintainerUID = ? " + + "WHERE ID = ? AND MaintainerUID IS NULL", + [user_id, pkgbase_id]) + for table in ('Sources', 'Depends', 'Relations', 'Licenses', 'Groups'): + conn.execute("DELETE FROM Package" + table + " WHERE EXISTS (" + + "SELECT * FROM Packages " + + "WHERE Packages.PackageBaseID = ? AND " + + "Package" + table + ".PackageID = Packages.ID)", + [pkgbase_id]) + conn.execute("DELETE FROM Packages WHERE PackageBaseID = ?", [pkgbase_id]) + + for pkgname in srcinfo.utils.get_package_names(metadata): + pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) + + if 'epoch' in pkginfo and int(pkginfo['epoch']) > 0: + ver = '{:d}:{:s}-{:s}'.format(int(pkginfo['epoch']), + pkginfo['pkgver'], + pkginfo['pkgrel']) + else: + ver = '{:s}-{:s}'.format(pkginfo['pkgver'], pkginfo['pkgrel']) + + for field in ('pkgdesc', 'url'): + if field not in pkginfo: + pkginfo[field] = None + + # Create a new package. + cur = conn.execute("INSERT INTO Packages (PackageBaseID, Name, " + + "Version, Description, URL) " + + "VALUES (?, ?, ?, ?, ?)", + [pkgbase_id, pkginfo['pkgname'], ver, + pkginfo['pkgdesc'], pkginfo['url']]) + conn.commit() + pkgid = cur.lastrowid + + # Add package sources. + for source_info in extract_arch_fields(pkginfo, 'source'): + conn.execute("INSERT INTO PackageSources (PackageID, Source, " + + "SourceArch) VALUES (?, ?, ?)", + [pkgid, source_info['value'], source_info['arch']]) + + # Add package dependencies. + for deptype in ('depends', 'makedepends', + 'checkdepends', 'optdepends'): + cur = conn.execute("SELECT ID FROM DependencyTypes WHERE Name = ?", + [deptype]) + deptypeid = cur.fetchone()[0] + for dep_info in extract_arch_fields(pkginfo, deptype): + depname, depcond = parse_dep(dep_info['value']) + deparch = dep_info['arch'] + conn.execute("INSERT INTO PackageDepends (PackageID, " + + "DepTypeID, DepName, DepCondition, DepArch) " + + "VALUES (?, ?, ?, ?, ?)", + [pkgid, deptypeid, depname, depcond, deparch]) + + # Add package relations (conflicts, provides, replaces). + for reltype in ('conflicts', 'provides', 'replaces'): + cur = conn.execute("SELECT ID FROM RelationTypes WHERE Name = ?", + [reltype]) + reltypeid = cur.fetchone()[0] + for rel_info in extract_arch_fields(pkginfo, reltype): + relname, relcond = parse_dep(rel_info['value']) + relarch = rel_info['arch'] + conn.execute("INSERT INTO PackageRelations (PackageID, " + + "RelTypeID, RelName, RelCondition, RelArch) " + + "VALUES (?, ?, ?, ?, ?)", + [pkgid, reltypeid, relname, relcond, relarch]) + + # Add package licenses. + if 'license' in pkginfo: + for license in pkginfo['license']: + cur = conn.execute("SELECT ID FROM Licenses WHERE Name = ?", + [license]) + row = cur.fetchone() + if row: + licenseid = row[0] + else: + cur = conn.execute("INSERT INTO Licenses (Name) " + + "VALUES (?)", [license]) + conn.commit() + licenseid = cur.lastrowid + conn.execute("INSERT INTO PackageLicenses (PackageID, " + + "LicenseID) VALUES (?, ?)", + [pkgid, licenseid]) + + # Add package groups. + if 'groups' in pkginfo: + for group in pkginfo['groups']: + cur = conn.execute("SELECT ID FROM Groups WHERE Name = ?", + [group]) + row = cur.fetchone() + if row: + groupid = row[0] + else: + cur = conn.execute("INSERT INTO Groups (Name) VALUES (?)", + [group]) + conn.commit() + groupid = cur.lastrowid + conn.execute("INSERT INTO PackageGroups (PackageID, " + "GroupID) VALUES (?, ?)", [pkgid, groupid]) + + # Add user to notification list on adoption. + if was_orphan: + cur = conn.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " + + "PackageBaseID = ? AND UserID = ?", + [pkgbase_id, user_id]) + if cur.fetchone()[0] == 0: + conn.execute("INSERT INTO PackageNotifications " + + "(PackageBaseID, UserID) VALUES (?, ?)", + [pkgbase_id, user_id]) + + conn.commit() + + +def update_notify(conn, user, pkgbase_id): + # Obtain the user ID of the new maintainer. + cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user]) + user_id = int(cur.fetchone()[0]) + + # Execute the notification script. + subprocess.Popen((notify_cmd, 'update', str(user_id), str(pkgbase_id))) + + +def die(msg): + sys.stderr.write("error: {:s}\n".format(msg)) + exit(1) + + +def warn(msg): + sys.stderr.write("warning: {:s}\n".format(msg)) + + +def die_commit(msg, commit): + sys.stderr.write("error: The following error " + + "occurred when parsing commit\n") + sys.stderr.write("error: {:s}:\n".format(commit)) + sys.stderr.write("error: {:s}\n".format(msg)) + exit(1) + + +def main(): + repo = pygit2.Repository(repo_path) + + user = os.environ.get("AUR_USER") + pkgbase = os.environ.get("AUR_PKGBASE") + privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1') + warn_or_die = warn if privileged else die + + if len(sys.argv) == 2 and sys.argv[1] == "restore": + if 'refs/heads/' + pkgbase not in repo.listall_references(): + die('{:s}: repository not found: {:s}'.format(sys.argv[1], + pkgbase)) + refname = "refs/heads/master" + branchref = 'refs/heads/' + pkgbase + sha1_old = sha1_new = repo.lookup_reference(branchref).target + elif len(sys.argv) == 4: + refname, sha1_old, sha1_new = sys.argv[1:4] + else: + die("invalid arguments") + + if refname != "refs/heads/master": + die("pushing to a branch other than master is restricted") + + conn = aurweb.db.Connection() + + # Detect and deny non-fast-forwards. + if sha1_old != "0" * 40 and not privileged: + walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL) + walker.hide(sha1_new) + if next(walker, None) is not None: + die("denying non-fast-forward (you should pull first)") + + # Prepare the walker that validates new commits. + walker = repo.walk(sha1_new, pygit2.GIT_SORT_TOPOLOGICAL) + if sha1_old != "0" * 40: + walker.hide(sha1_old) + + # Validate all new commits. + for commit in walker: + for fname in ('.SRCINFO', 'PKGBUILD'): + if fname not in commit.tree: + die_commit("missing {:s}".format(fname), str(commit.id)) + + for treeobj in commit.tree: + blob = repo[treeobj.id] + + if isinstance(blob, pygit2.Tree): + die_commit("the repository must not contain subdirectories", + str(commit.id)) + + if not isinstance(blob, pygit2.Blob): + die_commit("not a blob object: {:s}".format(treeobj), + str(commit.id)) + + if blob.size > max_blob_size: + die_commit("maximum blob size ({:s}) exceeded".format( + size_humanize(max_blob_size)), str(commit.id)) + + metadata_raw = repo[commit.tree['.SRCINFO'].id].data.decode() + (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw) + if errors: + sys.stderr.write("error: The following errors occurred " + "when parsing .SRCINFO in commit\n") + sys.stderr.write("error: {:s}:\n".format(str(commit.id))) + for error in errors: + for err in error['error']: + sys.stderr.write("error: line {:d}: {:s}\n".format( + error['line'], err)) + exit(1) + + metadata_pkgbase = metadata['pkgbase'] + if not re.match(repo_regex, metadata_pkgbase): + die_commit('invalid pkgbase: {:s}'.format(metadata_pkgbase), + str(commit.id)) + + for pkgname in set(metadata['packages'].keys()): + pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) + + for field in ('pkgver', 'pkgrel', 'pkgname'): + if field not in pkginfo: + die_commit('missing mandatory field: {:s}'.format(field), + str(commit.id)) + + if 'epoch' in pkginfo and not pkginfo['epoch'].isdigit(): + die_commit('invalid epoch: {:s}'.format(pkginfo['epoch']), + str(commit.id)) + + if not re.match(r'[a-z0-9][a-z0-9\.+_-]*$', pkginfo['pkgname']): + die_commit('invalid package name: {:s}'.format( + pkginfo['pkgname']), str(commit.id)) + + max_len = {'pkgname': 255, 'pkgdesc': 255, 'url': 8000} + for field in max_len.keys(): + if field in pkginfo and len(pkginfo[field]) > max_len[field]: + die_commit('{:s} field too long: {:s}'.format(field, + pkginfo[field]), str(commit.id)) + + for field in ('install', 'changelog'): + if field in pkginfo and not pkginfo[field] in commit.tree: + die_commit('missing {:s} file: {:s}'.format(field, + pkginfo[field]), str(commit.id)) + + for field in extract_arch_fields(pkginfo, 'source'): + fname = field['value'] + if len(fname) > 8000: + die_commit('source entry too long: {:s}'.format(fname), + str(commit.id)) + if "://" in fname or "lp:" in fname: + continue + if fname not in commit.tree: + die_commit('missing source file: {:s}'.format(fname), + str(commit.id)) + + # Display a warning if .SRCINFO is unchanged. + if sha1_old not in ("0000000000000000000000000000000000000000", sha1_new): + srcinfo_id_old = repo[sha1_old].tree['.SRCINFO'].id + srcinfo_id_new = repo[sha1_new].tree['.SRCINFO'].id + if srcinfo_id_old == srcinfo_id_new: + warn(".SRCINFO unchanged. " + "The package database will not be updated!") + + # Read .SRCINFO from the HEAD commit. + metadata_raw = repo[repo[sha1_new].tree['.SRCINFO'].id].data.decode() + (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw) + + # Ensure that the package base name matches the repository name. + metadata_pkgbase = metadata['pkgbase'] + if metadata_pkgbase != pkgbase: + die('invalid pkgbase: {:s}, expected {:s}'.format(metadata_pkgbase, + pkgbase)) + + # Ensure that packages are neither blacklisted nor overwritten. + pkgbase = metadata['pkgbase'] + cur = conn.execute("SELECT ID FROM PackageBases WHERE Name = ?", [pkgbase]) + row = cur.fetchone() + pkgbase_id = row[0] if row else 0 + + cur = conn.execute("SELECT Name FROM PackageBlacklist") + blacklist = [row[0] for row in cur.fetchall()] + + cur = conn.execute("SELECT Name, Repo FROM OfficialProviders") + providers = dict(cur.fetchall()) + + for pkgname in srcinfo.utils.get_package_names(metadata): + pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) + pkgname = pkginfo['pkgname'] + + if pkgname in blacklist: + warn_or_die('package is blacklisted: {:s}'.format(pkgname)) + if pkgname in providers: + warn_or_die('package already provided by [{:s}]: {:s}'.format( + providers[pkgname], pkgname)) + + cur = conn.execute("SELECT COUNT(*) FROM Packages WHERE Name = ? " + + "AND PackageBaseID <> ?", [pkgname, pkgbase_id]) + if cur.fetchone()[0] > 0: + die('cannot overwrite package: {:s}'.format(pkgname)) + + # Create a new package base if it does not exist yet. + if pkgbase_id == 0: + pkgbase_id = create_pkgbase(conn, pkgbase, user) + + # Store package base details in the database. + save_metadata(metadata, conn, user) + + # Create (or update) a branch with the name of the package base for better + # accessibility. + branchref = 'refs/heads/' + pkgbase + repo.create_reference(branchref, sha1_new, True) + + # Work around a Git bug: The HEAD ref is not updated when using + # gitnamespaces. This can be removed once the bug fix is included in Git + # mainline. See + # http://git.661346.n2.nabble.com/PATCH-receive-pack-Create-a-HEAD-ref-for-ref-namespace-td7632149.html + # for details. + headref = 'refs/namespaces/' + pkgbase + '/HEAD' + repo.create_reference(headref, sha1_new, True) + + # Send package update notifications. + update_notify(conn, user, pkgbase_id) + + # Close the database. + cur.close() + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/__init__.py b/aurweb/scripts/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/aurweb/scripts/__init__.py diff --git a/aurweb/scripts/aurblup.py b/aurweb/scripts/aurblup.py new file mode 100755 index 00000000..1b6de2f0 --- /dev/null +++ b/aurweb/scripts/aurblup.py @@ -0,0 +1,55 @@ +#!/usr/bin/python3 + +import pyalpm +import re + +import aurweb.config +import aurweb.db + +db_path = aurweb.config.get('aurblup', 'db-path') +sync_dbs = aurweb.config.get('aurblup', 'sync-dbs').split(' ') +server = aurweb.config.get('aurblup', 'server') + + +def main(): + blacklist = set() + providers = set() + repomap = dict() + + h = pyalpm.Handle("/", db_path) + for sync_db in sync_dbs: + repo = h.register_syncdb(sync_db, pyalpm.SIG_DATABASE_OPTIONAL) + repo.servers = [server.replace("%s", sync_db)] + t = h.init_transaction() + repo.update(False) + t.release() + + for pkg in repo.pkgcache: + blacklist.add(pkg.name) + [blacklist.add(x) for x in pkg.replaces] + providers.add((pkg.name, pkg.name)) + repomap[(pkg.name, pkg.name)] = repo.name + for provision in pkg.provides: + provisionname = re.sub(r'(<|=|>).*', '', provision) + providers.add((pkg.name, provisionname)) + repomap[(pkg.name, provisionname)] = repo.name + + conn = aurweb.db.Connection() + + cur = conn.execute("SELECT Name, Provides FROM OfficialProviders") + oldproviders = set(cur.fetchall()) + + for pkg, provides in providers.difference(oldproviders): + repo = repomap[(pkg, provides)] + conn.execute("INSERT INTO OfficialProviders (Name, Repo, Provides) " + "VALUES (?, ?, ?)", [pkg, repo, provides]) + for pkg, provides in oldproviders.difference(providers): + conn.execute("DELETE FROM OfficialProviders " + "WHERE Name = ? AND Provides = ?", [pkg, provides]) + + conn.commit() + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/mkpkglists.py b/aurweb/scripts/mkpkglists.py new file mode 100755 index 00000000..8a0f2e9d --- /dev/null +++ b/aurweb/scripts/mkpkglists.py @@ -0,0 +1,38 @@ +#!/usr/bin/python3 + +import datetime +import gzip + +import aurweb.config +import aurweb.db + +packagesfile = aurweb.config.get('mkpkglists', 'packagesfile') +pkgbasefile = aurweb.config.get('mkpkglists', 'pkgbasefile') + + +def main(): + conn = aurweb.db.Connection() + + datestr = datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT") + pkglist_header = "# AUR package list, generated on " + datestr + pkgbaselist_header = "# AUR package base list, generated on " + datestr + + with gzip.open(packagesfile, "w") as f: + f.write(bytes(pkglist_header + "\n", "UTF-8")) + cur = conn.execute("SELECT Packages.Name FROM Packages " + + "INNER JOIN PackageBases " + + "ON PackageBases.ID = Packages.PackageBaseID " + + "WHERE PackageBases.PackagerUID IS NOT NULL") + f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()]) + + with gzip.open(pkgbasefile, "w") as f: + f.write(bytes(pkgbaselist_header + "\n", "UTF-8")) + cur = conn.execute("SELECT Name FROM PackageBases " + + "WHERE PackagerUID IS NOT NULL") + f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()]) + + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/notify.py b/aurweb/scripts/notify.py new file mode 100755 index 00000000..ddd6e49b --- /dev/null +++ b/aurweb/scripts/notify.py @@ -0,0 +1,455 @@ +#!/usr/bin/python3 + +import email.mime.text +import subprocess +import sys +import textwrap + +import aurweb.config +import aurweb.db + +aur_location = aurweb.config.get('options', 'aur_location') +aur_request_ml = aurweb.config.get('options', 'aur_request_ml') + +sendmail = aurweb.config.get('notifications', 'sendmail') +sender = aurweb.config.get('notifications', 'sender') +reply_to = aurweb.config.get('notifications', 'reply-to') + + +def headers_cc(cclist): + return {'Cc': str.join(', ', cclist)} + + +def headers_msgid(thread_id): + return {'Message-ID': thread_id} + + +def headers_reply(thread_id): + return {'In-Reply-To': thread_id, 'References': thread_id} + + +def send_notification(to, subject, body, refs, headers={}): + wrapped = '' + for line in body.splitlines(): + wrapped += textwrap.fill(line, break_long_words=False) + '\n' + if refs: + body = wrapped + '\n' + refs + else: + body = wrapped + + for recipient in to: + msg = email.mime.text.MIMEText(body, 'plain', 'utf-8') + msg['Subject'] = subject + msg['From'] = sender + msg['Reply-to'] = reply_to + msg['To'] = recipient + + for key, value in headers.items(): + msg[key] = value + + p = subprocess.Popen([sendmail, '-t', '-oi'], stdin=subprocess.PIPE) + p.communicate(msg.as_bytes()) + + +def username_from_id(conn, uid): + cur = conn.execute('SELECT UserName FROM Users WHERE ID = ?', [uid]) + return cur.fetchone()[0] + + +def pkgbase_from_id(conn, pkgbase_id): + cur = conn.execute('SELECT Name FROM PackageBases WHERE ID = ?', + [pkgbase_id]) + return cur.fetchone()[0] + + +def pkgbase_from_pkgreq(conn, reqid): + cur = conn.execute('SELECT PackageBaseID FROM PackageRequests ' + + 'WHERE ID = ?', [reqid]) + return cur.fetchone()[0] + + +def get_user_email(conn, uid): + cur = conn.execute('SELECT Email FROM Users WHERE ID = ?', [uid]) + return cur.fetchone()[0] + + +def get_maintainer_email(conn, pkgbase_id): + cur = conn.execute('SELECT Users.Email FROM Users ' + + 'INNER JOIN PackageBases ' + + 'ON PackageBases.MaintainerUID = Users.ID WHERE ' + + 'PackageBases.ID = ?', [pkgbase_id]) + return cur.fetchone()[0] + + +def get_recipients(conn, pkgbase_id, uid): + cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' + + 'INNER JOIN PackageNotifications ' + + 'ON PackageNotifications.UserID = Users.ID WHERE ' + + 'PackageNotifications.UserID != ? AND ' + + 'PackageNotifications.PackageBaseID = ?', + [uid, pkgbase_id]) + return [row[0] for row in cur.fetchall()] + + +def get_comment_recipients(conn, pkgbase_id, uid): + cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' + + 'INNER JOIN PackageNotifications ' + + 'ON PackageNotifications.UserID = Users.ID WHERE ' + + 'Users.CommentNotify = 1 AND ' + + 'PackageNotifications.UserID != ? AND ' + + 'PackageNotifications.PackageBaseID = ?', + [uid, pkgbase_id]) + return [row[0] for row in cur.fetchall()] + + +def get_update_recipients(conn, pkgbase_id, uid): + cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' + + 'INNER JOIN PackageNotifications ' + + 'ON PackageNotifications.UserID = Users.ID WHERE ' + + 'Users.UpdateNotify = 1 AND ' + + 'PackageNotifications.UserID != ? AND ' + + 'PackageNotifications.PackageBaseID = ?', + [uid, pkgbase_id]) + return [row[0] for row in cur.fetchall()] + + +def get_ownership_recipients(conn, pkgbase_id, uid): + cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' + + 'INNER JOIN PackageNotifications ' + + 'ON PackageNotifications.UserID = Users.ID WHERE ' + + 'Users.OwnershipNotify = 1 AND ' + + 'PackageNotifications.UserID != ? AND ' + + 'PackageNotifications.PackageBaseID = ?', + [uid, pkgbase_id]) + return [row[0] for row in cur.fetchall()] + + +def get_request_recipients(conn, reqid): + cur = conn.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' + + 'INNER JOIN PackageBases ' + + 'ON PackageBases.ID = PackageRequests.PackageBaseID ' + + 'INNER JOIN Users ' + + 'ON Users.ID = PackageRequests.UsersID ' + + 'OR Users.ID = PackageBases.MaintainerUID ' + + 'WHERE PackageRequests.ID = ?', [reqid]) + return [row[0] for row in cur.fetchall()] + + +def get_tu_vote_reminder_recipients(conn, vote_id): + cur = conn.execute('SELECT Users.Email FROM Users ' + + 'WHERE AccountTypeID = 2 ' + + 'EXCEPT SELECT Users.Email FROM Users ' + + 'INNER JOIN TU_Votes ' + + 'ON TU_Votes.UserID = Users.ID ' + + 'WHERE TU_Votes.VoteID = ?', [vote_id]) + return [row[0] for row in cur.fetchall()] + + +def get_comment(conn, comment_id): + cur = conn.execute('SELECT Comments FROM PackageComments WHERE ID = ?', + [comment_id]) + return cur.fetchone()[0] + + +def get_flagger_comment(conn, pkgbase_id): + cur = conn.execute('SELECT FlaggerComment FROM PackageBases WHERE ID = ?', + [pkgbase_id]) + return cur.fetchone()[0] + + +def get_request_comment(conn, reqid): + cur = conn.execute('SELECT Comments FROM PackageRequests WHERE ID = ?', + [reqid]) + return cur.fetchone()[0] + + +def get_request_closure_comment(conn, reqid): + cur = conn.execute('SELECT ClosureComment FROM PackageRequests ' + + 'WHERE ID = ?', [reqid]) + return cur.fetchone()[0] + + +def send_resetkey(conn, uid): + cur = conn.execute('SELECT UserName, Email, ResetKey FROM Users ' + + 'WHERE ID = ?', [uid]) + username, to, resetkey = cur.fetchone() + + subject = 'AUR Password Reset' + body = 'A password reset request was submitted for the account %s ' \ + 'associated with your email address. If you wish to reset your ' \ + 'password follow the link [1] below, otherwise ignore this ' \ + 'message and nothing will happen.' % (username) + refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey + + send_notification([to], subject, body, refs) + + +def welcome(conn, uid): + cur = conn.execute('SELECT UserName, Email, ResetKey FROM Users ' + + 'WHERE ID = ?', [uid]) + username, to, resetkey = cur.fetchone() + + subject = 'Welcome to the Arch User Repository' + body = 'Welcome to the Arch User Repository! In order to set an initial ' \ + 'password for your new account, please click the link [1] below. ' \ + 'If the link does not work, try copying and pasting it into your ' \ + 'browser.' + refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey + + send_notification([to], subject, body, refs) + + +def comment(conn, uid, pkgbase_id, comment_id): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = get_comment_recipients(conn, pkgbase_id, uid) + text = get_comment(conn, comment_id) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Comment for %s' % (pkgbase) + body = '%s [1] added the following comment to %s [2]:' % (user, pkgbase) + body += '\n\n' + text + '\n\n' + body += 'If you no longer wish to receive notifications about this ' \ + 'package, please go to the package page [2] and select "%s".' % \ + ('Disable notifications') + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>' + headers = headers_reply(thread_id) + + send_notification(to, subject, body, refs, headers) + + +def update(conn, uid, pkgbase_id): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = get_update_recipients(conn, pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Package Update: %s' % (pkgbase) + body = '%s [1] pushed a new commit to %s [2].' % (user, pkgbase) + body += '\n\n' + body += 'If you no longer wish to receive notifications about this ' \ + 'package, please go to the package page [2] and select "%s".' % \ + ('Disable notifications') + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>' + headers = headers_reply(thread_id) + + send_notification(to, subject, body, refs, headers) + + +def flag(conn, uid, pkgbase_id): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = [get_maintainer_email(conn, pkgbase_id)] + text = get_flagger_comment(conn, pkgbase_id) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Out-of-date Notification for %s' % (pkgbase) + body = 'Your package %s [1] has been flagged out-of-date by %s [2]:' % \ + (pkgbase, user) + body += '\n\n' + text + refs = '[1] ' + pkgbase_uri + '\n' + refs += '[2] ' + user_uri + + send_notification(to, subject, body, refs) + + +def adopt(conn, pkgbase_id, uid): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = get_ownership_recipients(conn, pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Ownership Notification for %s' % (pkgbase) + body = 'The package %s [1] was adopted by %s [2].' % (pkgbase, user) + refs = '[1] ' + pkgbase_uri + '\n' + refs += '[2] ' + user_uri + + send_notification(to, subject, body, refs) + + +def disown(conn, pkgbase_id, uid): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = get_ownership_recipients(conn, pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Ownership Notification for %s' % (pkgbase) + body = 'The package %s [1] was disowned by %s [2].' % (pkgbase, user) + refs = '[1] ' + pkgbase_uri + '\n' + refs += '[2] ' + user_uri + + send_notification(to, subject, body, refs) + + +def comaintainer_add(conn, pkgbase_id, uid): + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = [get_user_email(conn, uid)] + + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase) + body = 'You were added to the co-maintainer list of %s [1].' % (pkgbase) + refs = '[1] ' + pkgbase_uri + '\n' + + send_notification(to, subject, body, refs) + + +def comaintainer_remove(conn, pkgbase_id, uid): + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = [get_user_email(conn, uid)] + + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase) + body = ('You were removed from the co-maintainer list of %s [1].' % + (pkgbase)) + refs = '[1] ' + pkgbase_uri + '\n' + + send_notification(to, subject, body, refs) + + +def delete(conn, uid, old_pkgbase_id, new_pkgbase_id=None): + user = username_from_id(conn, uid) + old_pkgbase = pkgbase_from_id(conn, old_pkgbase_id) + if new_pkgbase_id: + new_pkgbase = pkgbase_from_id(conn, new_pkgbase_id) + to = get_recipients(conn, old_pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + old_pkgbase + '/' + + subject = 'AUR Package deleted: %s' % (old_pkgbase) + if new_pkgbase_id: + new_pkgbase_uri = aur_location + '/pkgbase/' + new_pkgbase + '/' + body = '%s [1] merged %s [2] into %s [3].\n\n' \ + 'If you no longer wish receive notifications about the new ' \ + 'package, please go to [3] and click "%s".' %\ + (user, old_pkgbase, new_pkgbase, 'Disable notifications') + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + '\n' + refs += '[3] ' + new_pkgbase_uri + else: + body = '%s [1] deleted %s [2].\n\n' \ + 'You will no longer receive notifications about this ' \ + 'package.' % (user, old_pkgbase) + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + + send_notification(to, subject, body, refs) + + +def request_open(conn, uid, reqid, reqtype, pkgbase_id, merge_into=None): + user = username_from_id(conn, uid) + pkgbase = pkgbase_from_id(conn, pkgbase_id) + to = [aur_request_ml] + cc = get_request_recipients(conn, reqid) + text = get_request_comment(conn, reqid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = '[PRQ#%d] %s Request for %s' % \ + (int(reqid), reqtype.title(), pkgbase) + if merge_into: + merge_into_uri = aur_location + '/pkgbase/' + merge_into + '/' + body = '%s [1] filed a request to merge %s [2] into %s [3]:' % \ + (user, pkgbase, merge_into) + body += '\n\n' + text + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + '\n' + refs += '[3] ' + merge_into_uri + else: + body = '%s [1] filed a %s request for %s [2]:' % \ + (user, reqtype, pkgbase) + body += '\n\n' + text + refs = '[1] ' + user_uri + '\n' + refs += '[2] ' + pkgbase_uri + '\n' + thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>' + # Use a deterministic Message-ID for the first email referencing a request. + headers = headers_msgid(thread_id) + headers.update(headers_cc(cc)) + + send_notification(to, subject, body, refs, headers) + + +def request_close(conn, uid, reqid, reason): + to = [aur_request_ml] + cc = get_request_recipients(conn, reqid) + text = get_request_closure_comment(conn, reqid) + + subject = '[PRQ#%d] Request %s' % (int(reqid), reason.title()) + if int(uid): + user = username_from_id(conn, uid) + user_uri = aur_location + '/account/' + user + '/' + body = 'Request #%d has been %s by %s [1]' % (int(reqid), reason, user) + refs = '[1] ' + user_uri + else: + body = 'Request #%d has been %s automatically by the Arch User ' \ + 'Repository package request system' % (int(reqid), reason) + refs = None + if text.strip() == '': + body += '.' + else: + body += ':\n\n' + text + thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>' + headers = headers_reply(thread_id) + headers.update(headers_cc(cc)) + + send_notification(to, subject, body, refs, headers) + + +def tu_vote_reminder(conn, vote_id): + to = get_tu_vote_reminder_recipients(conn, vote_id) + + vote_uri = aur_location + '/tu/?id=' + vote_id + + subject = 'TU Vote Reminder: Proposal %d' % (int(vote_id)) + body = 'Please remember to cast your vote on proposal %d [1]. ' \ + 'The voting period ends in less than 48 hours.' % (int(vote_id)) + refs = '[1] ' + vote_uri + + send_notification(to, subject, body, refs) + + +def main(): + action = sys.argv[1] + action_map = { + 'send-resetkey': send_resetkey, + 'welcome': welcome, + 'comment': comment, + 'update': update, + 'flag': flag, + 'adopt': adopt, + 'disown': disown, + 'comaintainer-add': comaintainer_add, + 'comaintainer-remove': comaintainer_remove, + 'delete': delete, + 'request-open': request_open, + 'request-close': request_close, + 'tu-vote-reminder': tu_vote_reminder, + } + + conn = aurweb.db.Connection() + + action_map[action](conn, *sys.argv[2:]) + + conn.commit() + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/pkgmaint.py b/aurweb/scripts/pkgmaint.py new file mode 100755 index 00000000..3ad9ed8d --- /dev/null +++ b/aurweb/scripts/pkgmaint.py @@ -0,0 +1,20 @@ +#!/usr/bin/python3 + +import time + +import aurweb.db + + +def main(): + conn = aurweb.db.Connection() + + limit_to = int(time.time()) - 86400 + conn.execute("DELETE FROM PackageBases WHERE " + + "SubmittedTS < ? AND PackagerUID IS NULL", [limit_to]) + + conn.commit() + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/popupdate.py b/aurweb/scripts/popupdate.py new file mode 100755 index 00000000..58cd0185 --- /dev/null +++ b/aurweb/scripts/popupdate.py @@ -0,0 +1,26 @@ +#!/usr/bin/python3 + +import time + +import aurweb.db + + +def main(): + conn = aurweb.db.Connection() + + conn.execute("UPDATE PackageBases SET NumVotes = (" + + "SELECT COUNT(*) FROM PackageVotes " + + "WHERE PackageVotes.PackageBaseID = PackageBases.ID)") + + now = int(time.time()) + conn.execute("UPDATE PackageBases SET Popularity = (" + + "SELECT COALESCE(SUM(POWER(0.98, (? - VoteTS) / 86400)), 0.0) " + + "FROM PackageVotes WHERE PackageVotes.PackageBaseID = " + + "PackageBases.ID AND NOT VoteTS IS NULL)", [now]) + + conn.commit() + conn.close() + + +if __name__ == '__main__': + main() diff --git a/aurweb/scripts/tuvotereminder.py b/aurweb/scripts/tuvotereminder.py new file mode 100755 index 00000000..97b1d12e --- /dev/null +++ b/aurweb/scripts/tuvotereminder.py @@ -0,0 +1,28 @@ +#!/usr/bin/python3 + +import subprocess +import time + +import aurweb.config +import aurweb.db + +notify_cmd = aurweb.config.get('notifications', 'notify-cmd') + + +def main(): + conn = aurweb.db.Connection() + + now = int(time.time()) + filter_from = now + 500 + filter_to = now + 172800 + + cur = conn.execute("SELECT ID FROM TU_VoteInfo " + + "WHERE End >= ? AND End <= ?", + [filter_from, filter_to]) + + for vote_id in [row[0] for row in cur.fetchall()]: + subprocess.Popen((notify_cmd, 'tu-vote-reminder', str(vote_id))).wait() + + +if __name__ == '__main__': + main() diff --git a/conf/config.proto b/conf/config.proto index 64af774d..96fad807 100644 --- a/conf/config.proto +++ b/conf/config.proto @@ -1,5 +1,5 @@ [database] -dsn_prefix = mysql +backend = mysql host = localhost socket = /var/run/mysqld/mysqld.sock name = AUR @@ -46,17 +46,24 @@ RSA = SHA256:Ju+yWiMb/2O+gKQ9RJCDqvRg7l+Q95KFAeqM5sr6l2s [auth] valid-keytypes = ssh-rsa ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519 username-regex = [a-zA-Z0-9]+[.\-_]?[a-zA-Z0-9]+$ -git-serve-cmd = /srv/http/aurweb/git-interface/git-serve.py -ssh-options = no-port-forwarding,no-X11-forwarding,no-pty +git-serve-cmd = /usr/local/bin/aurweb-git-serve +ssh-options = restrict [serve] repo-path = /srv/http/aurweb/aur.git/ repo-regex = [a-z0-9][a-z0-9.+_-]*$ git-shell-cmd = /usr/bin/git-shell -git-update-cmd = /srv/http/aurweb/git-interface/git-update.py +git-update-cmd = /usr/local/bin/aurweb-git-update ssh-cmdline = ssh aur@aur.archlinux.org +[update] +max-blob-size = 256000 + [aurblup] db-path = /srv/http/aurweb/aurblup/ sync-dbs = core extra community multilib testing community-testing -servers = ftp://mirrors.kernel.org/archlinux/%s/os/x86_64 +server = ftp://mirrors.kernel.org/archlinux/%s/os/x86_64 + +[mkpkglists] +packagesfile = /srv/http/aurweb/web/html/packages.gz +pkgbasefile = /srv/http/aurweb/web/html/pkgbase.gz diff --git a/doc/git-interface.txt b/doc/git-interface.txt index 4a24eeff..14ff0c5d 100644 --- a/doc/git-interface.txt +++ b/doc/git-interface.txt @@ -22,15 +22,15 @@ Authentication: git-auth Pushing to package repositories is possible via SSH. In order to access the SSH interface, users first need to add an SSH public key to their account using the web interface. Authentication is performed by the git-auth -AuthorizedKeysCommand script (see sshd_config(5) for details) that looks up the -public key in the AUR user table. Using this concept of "virtual users", there -is no need to create separate UNIX accounts for each registered AUR user. +AuthorizedKeysCommand script (see sshd_config(5) for details) which looks up +the public key in the AUR user table. Using this concept of "virtual users", +there is no need to create separate UNIX accounts for each registered AUR user. If the public key is found, the corresponding authorized_keys line is printed to stdout. If the public key does not exist, the login is denied. The authorized_keys line also contains a forced command such that authenticated users cannot access anything on the server except for the aurweb SSH interface. -The forced command can be configured in the aurweb configuration file and +The forced command can be configured in the aurweb configuration file and it usually points to the git-serve program. The INSTALL file in the top-level directory contains detailed instructions on @@ -43,17 +43,18 @@ The git-serve command, the "aurweb shell", provides different subcommands: * The help command shows a list of available commands. * The list-repos command lists all repositories of the authenticated user. +* The set-keywords command modifies the keywords assigned to a package base. * The setup-repo command can be used to create a new repository. * The restore command can be used to restore a deleted package base. * The git-{receive,upload}-pack commands are redirected to git-shell(1). -The requested command is extracted from the SSH_ORIGINAL_COMMAND environment -variable which is usually set by the SSH daemon. If no command is specified, -git-serve displays a message that aurweb does not provide an interactive shell. +The command is extracted from the SSH_ORIGINAL_COMMAND environment variable +which is usually set by the SSH daemon. If no command is specified, git-serve +displays a message stating that aurweb does not provide an interactive shell. When invoking git-shell(1), the git-serve command also redirects all paths to the shared Git repository and sets up the GIT_NAMESPACE environment variable -such that Git updates the right namespaced branch. +such that Git updates the correct namespaced branch. The Update Hook: git-update --------------------------- @@ -62,7 +63,7 @@ The Git update hook, called git-update, performs several subtasks: * Prevent from creating branches or tags other than master. * Deny non-fast-forwards, except for Trusted Users and Developers. -* Check each new commit (validate meta data, impose file size limits, ...) +* Verify each new commit (validate meta data, impose file size limits, ...) * Update package base information and package information in the database. * Update the named branch and the namespaced HEAD ref of the package. @@ -74,9 +75,8 @@ Accessing Git repositories via HTTP Git repositories can also be accessed via HTTP by configuring the web server to forward specific requests to git-http-backend(1). Note that, since Git -namespaces are used internally, the web server also needs to rewrite URIs and -setup the GIT_NAMESPACE environment variable accordingly before forwarding a -request. +namespaces are used internally, the web server needs to rewrite URIs and setup +the GIT_NAMESPACE environment variable accordingly before forwarding a request. An example configuration for nginx and fcgiwrap can be found in the INSTALL instructions in the top-level directory. @@ -86,10 +86,11 @@ Further Configuration When using Git namespaces, Git advertises refs outside the current namespace as so-called "have" lines. This is normally used to reduce traffic but it has the -opposite effect in the case of aurweb: Many essentially useless lines are -transferred to the Git client during `git push` operations. - -In order to omit these advertisements, add the strings "^refs/" and "!refs/" to -the transfer.hideRefs configuration setting. Note that the order of these -patterns is important ("^refs/" must come first) and that Git 2.7 or newer is -required for them to work. +opposite effect in the case of aurweb: Most of the refs transferred to the +client during `git push` operations belong to branches of other package bases +and are essentially useless. + +In order to omit these advertisements, one can add the strings "^refs/", +"!refs/" and "!HEAD" to the transfer.hideRefs configuration setting. Note that +the order of these patterns is important ("^refs/" must come first) and that +Git 2.7 or newer is required for them to work. diff --git a/doc/i18n.txt b/doc/i18n.txt index d5b67644..a1c21fe6 100644 --- a/doc/i18n.txt +++ b/doc/i18n.txt @@ -21,7 +21,7 @@ strings for the translation to be usable, and it may have to be disabled. 1. Check out the aurweb source using git: -$ git clone git://projects.archlinux.org/aurweb.git aurweb-git +$ git clone git://git.archlinux.org/aurweb.git aurweb-git 2. Go into the "po/" directory in the aurweb source and run msginit(1) to create a initial translation file from our translation catalog: diff --git a/git-interface/Makefile b/git-interface/Makefile deleted file mode 100644 index 88657904..00000000 --- a/git-interface/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -GIT_INTERFACE_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) - -include config.mk - -git-auth.sh: - sed 's#%GIT_INTERFACE_DIR%#$(GIT_INTERFACE_DIR)#' <git-auth.sh.in >git-auth.sh - chmod +x git-auth.sh - -install: git-auth.sh - install -Dm0755 git-auth.sh "$(DESTDIR)$(PREFIX)/bin/aur-git-auth" - -uninstall: - rm -f "$(DESTDIR)$(PREFIX)/bin/aur-git-auth" - -clean: - rm -f git-auth.sh - -.PHONY: install uninstall clean diff --git a/git-interface/config.mk b/git-interface/config.mk deleted file mode 100644 index 4d794a1c..00000000 --- a/git-interface/config.mk +++ /dev/null @@ -1 +0,0 @@ -PREFIX = /usr/local diff --git a/git-interface/git-auth.py b/git-interface/git-auth.py deleted file mode 100755 index 83bd20c0..00000000 --- a/git-interface/git-auth.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import shlex -import os -import re -import sys - - -def format_command(env_vars, command, ssh_opts, ssh_key): - environment = '' - for key, var in env_vars.items(): - environment += '{}={} '.format(key, shlex.quote(var)) - - command = shlex.quote(command) - command = '{}{}'.format(environment, command) - - # The command is being substituted into an authorized_keys line below, - # so we need to escape the double quotes. - command = command.replace('"', '\\"') - msg = 'command="{}",{} {}'.format(command, ssh_opts, ssh_key) - return msg - - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -valid_keytypes = config.get('auth', 'valid-keytypes').split() -username_regex = config.get('auth', 'username-regex') -git_serve_cmd = config.get('auth', 'git-serve-cmd') -ssh_opts = config.get('auth', 'ssh-options') - -keytype = sys.argv[1] -keytext = sys.argv[2] -if keytype not in valid_keytypes: - exit(1) - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) - -cur = db.cursor() -cur.execute("SELECT Users.Username, Users.AccountTypeID FROM Users " + - "INNER JOIN SSHPubKeys ON SSHPubKeys.UserID = Users.ID " - "WHERE SSHPubKeys.PubKey = %s AND Users.Suspended = 0", - (keytype + " " + keytext,)) - -if cur.rowcount != 1: - exit(1) - -user, account_type = cur.fetchone() -if not re.match(username_regex, user): - exit(1) - - -env_vars = { - 'AUR_USER': user, - 'AUR_PRIVILEGED': '1' if account_type > 1 else '0', -} -key = keytype + ' ' + keytext - -print(format_command(env_vars, git_serve_cmd, ssh_opts, key)) diff --git a/git-interface/git-auth.sh.in b/git-interface/git-auth.sh.in deleted file mode 100644 index 223816ac..00000000 --- a/git-interface/git-auth.sh.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -%GIT_INTERFACE_DIR%/git-auth.py "$1" "$2" diff --git a/git-interface/git-serve.py b/git-interface/git-serve.py deleted file mode 100755 index 35c6b3a8..00000000 --- a/git-interface/git-serve.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import os -import re -import shlex -import sys - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -repo_path = config.get('serve', 'repo-path') -repo_regex = config.get('serve', 'repo-regex') -git_shell_cmd = config.get('serve', 'git-shell-cmd') -git_update_cmd = config.get('serve', 'git-update-cmd') -ssh_cmdline = config.get('serve', 'ssh-cmdline') - -enable_maintenance = config.getboolean('options', 'enable-maintenance') -maintenance_exc = config.get('options', 'maintenance-exceptions').split() - - -def pkgbase_from_name(pkgbase): - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket) - cur = db.cursor() - cur.execute("SELECT ID FROM PackageBases WHERE Name = %s", [pkgbase]) - db.close() - - row = cur.fetchone() - return row[0] if row else None - - -def pkgbase_exists(pkgbase): - return pkgbase_from_name(pkgbase) is not None - - -def list_repos(user): - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket) - cur = db.cursor() - - cur.execute("SELECT ID FROM Users WHERE Username = %s ", [user]) - userid = cur.fetchone()[0] - if userid == 0: - die('{:s}: unknown user: {:s}'.format(action, user)) - - cur.execute("SELECT Name, PackagerUID FROM PackageBases " + - "WHERE MaintainerUID = %s ", [userid]) - for row in cur: - print((' ' if row[1] else '*') + row[0]) - db.close() - - -def create_pkgbase(pkgbase, user): - if not re.match(repo_regex, pkgbase): - die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) - if pkgbase_exists(pkgbase): - die('{:s}: package base already exists: {:s}'.format(action, pkgbase)) - - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket) - cur = db.cursor() - - cur.execute("SELECT ID FROM Users WHERE Username = %s ", [user]) - userid = cur.fetchone()[0] - if userid == 0: - die('{:s}: unknown user: {:s}'.format(action, user)) - - cur.execute("INSERT INTO PackageBases (Name, SubmittedTS, ModifiedTS, " + - "SubmitterUID, MaintainerUID) VALUES (%s, UNIX_TIMESTAMP(), " + - "UNIX_TIMESTAMP(), %s, %s)", [pkgbase, userid, userid]) - pkgbase_id = cur.lastrowid - - cur.execute("INSERT INTO PackageNotifications (PackageBaseID, UserID) " + - "VALUES (%s, %s)", [pkgbase_id, userid]) - - db.commit() - db.close() - - -def pkgbase_set_keywords(pkgbase, keywords): - pkgbase_id = pkgbase_from_name(pkgbase) - if not pkgbase_id: - die('{:s}: package base not found: {:s}'.format(action, pkgbase)) - - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket) - cur = db.cursor() - - cur.execute("DELETE FROM PackageKeywords WHERE PackageBaseID = %s", - [pkgbase_id]) - for keyword in keywords: - cur.execute("INSERT INTO PackageKeywords (PackageBaseID, Keyword) " - "VALUES (%s, %s)", [pkgbase_id, keyword]) - - db.commit() - db.close() - - -def check_permissions(pkgbase, user): - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) - cur = db.cursor() - - if os.environ.get('AUR_PRIVILEGED', '0') == '1': - return True - - cur.execute("SELECT COUNT(*) FROM PackageBases " + - "LEFT JOIN PackageComaintainers " + - "ON PackageComaintainers.PackageBaseID = PackageBases.ID " + - "INNER JOIN Users ON Users.ID = PackageBases.MaintainerUID " + - "OR PackageBases.MaintainerUID IS NULL " + - "OR Users.ID = PackageComaintainers.UsersID " + - "WHERE Name = %s AND Username = %s", [pkgbase, user]) - return cur.fetchone()[0] > 0 - - -def die(msg): - sys.stderr.write("{:s}\n".format(msg)) - exit(1) - - -def die_with_help(msg): - die(msg + "\nTry `{:s} help` for a list of commands.".format(ssh_cmdline)) - - -user = os.environ.get("AUR_USER") -cmd = os.environ.get("SSH_ORIGINAL_COMMAND") -if not cmd: - die_with_help("Interactive shell is disabled.") -cmdargv = shlex.split(cmd) -action = cmdargv[0] - -if enable_maintenance: - remote_addr = os.environ["SSH_CLIENT"].split(" ")[0] - if remote_addr not in maintenance_exc: - die("The AUR is down due to maintenance. We will be back soon.") - -if action == 'git-upload-pack' or action == 'git-receive-pack': - if len(cmdargv) < 2: - die_with_help("{:s}: missing path".format(action)) - - path = cmdargv[1].rstrip('/') - if not path.startswith('/'): - path = '/' + path - if not path.endswith('.git'): - path = path + '.git' - pkgbase = path[1:-4] - if not re.match(repo_regex, pkgbase): - die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) - - if not pkgbase_exists(pkgbase): - create_pkgbase(pkgbase, user) - - if action == 'git-receive-pack': - if not check_permissions(pkgbase, user): - die('{:s}: permission denied: {:s}'.format(action, user)) - - os.environ["AUR_USER"] = user - os.environ["AUR_PKGBASE"] = pkgbase - os.environ["GIT_NAMESPACE"] = pkgbase - cmd = action + " '" + repo_path + "'" - os.execl(git_shell_cmd, git_shell_cmd, '-c', cmd) -elif action == 'set-keywords': - if len(cmdargv) < 2: - die_with_help("{:s}: missing repository name".format(action)) - pkgbase_set_keywords(cmdargv[1], cmdargv[2:]) -elif action == 'list-repos': - if len(cmdargv) > 1: - die_with_help("{:s}: too many arguments".format(action)) - list_repos(user) -elif action == 'setup-repo': - if len(cmdargv) < 2: - die_with_help("{:s}: missing repository name".format(action)) - if len(cmdargv) > 2: - die_with_help("{:s}: too many arguments".format(action)) - create_pkgbase(cmdargv[1], user) -elif action == 'restore': - if len(cmdargv) < 2: - die_with_help("{:s}: missing repository name".format(action)) - if len(cmdargv) > 2: - die_with_help("{:s}: too many arguments".format(action)) - - pkgbase = cmdargv[1] - if not re.match(repo_regex, pkgbase): - die('{:s}: invalid repository name: {:s}'.format(action, pkgbase)) - - if pkgbase_exists(pkgbase): - die('{:s}: package base exists: {:s}'.format(action, pkgbase)) - create_pkgbase(pkgbase, user) - - os.environ["AUR_USER"] = user - os.environ["AUR_PKGBASE"] = pkgbase - os.execl(git_update_cmd, git_update_cmd, 'restore') -elif action == 'help': - die("Commands:\n" + - " help Show this help message and exit.\n" + - " list-repos List all your repositories.\n" + - " restore <name> Restore a deleted package base.\n" + - " set-keywords <name> [...] Change package base keywords.\n" + - " setup-repo <name> Create an empty repository.\n" + - " git-receive-pack Internal command used with Git.\n" + - " git-upload-pack Internal command used with Git.") -else: - die_with_help("invalid command: {:s}".format(action)) diff --git a/git-interface/git-update.py b/git-interface/git-update.py deleted file mode 100755 index e54e0e68..00000000 --- a/git-interface/git-update.py +++ /dev/null @@ -1,363 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import os -import pygit2 -import re -import subprocess -import sys - -import srcinfo.parse -import srcinfo.utils - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -notify_cmd = config.get('notifications', 'notify-cmd') - -repo_path = config.get('serve', 'repo-path') -repo_regex = config.get('serve', 'repo-regex') - - -def extract_arch_fields(pkginfo, field): - values = [] - - if field in pkginfo: - for val in pkginfo[field]: - values.append({"value": val, "arch": None}) - - for arch in ['i686', 'x86_64']: - if field + '_' + arch in pkginfo: - for val in pkginfo[field + '_' + arch]: - values.append({"value": val, "arch": arch}) - - return values - - -def parse_dep(depstring): - dep, _, desc = depstring.partition(': ') - depname = re.sub(r'(<|=|>).*', '', dep) - depcond = dep[len(depname):] - - if (desc): - return (depname + ': ' + desc, depcond) - else: - return (depname, depcond) - - -def save_metadata(metadata, db, cur, user): - # Obtain package base ID and previous maintainer. - pkgbase = metadata['pkgbase'] - cur.execute("SELECT ID, MaintainerUID FROM PackageBases " - "WHERE Name = %s", [pkgbase]) - (pkgbase_id, maintainer_uid) = cur.fetchone() - was_orphan = not maintainer_uid - - # Obtain the user ID of the new maintainer. - cur.execute("SELECT ID FROM Users WHERE Username = %s", [user]) - user_id = int(cur.fetchone()[0]) - - # Update package base details and delete current packages. - cur.execute("UPDATE PackageBases SET ModifiedTS = UNIX_TIMESTAMP(), " + - "PackagerUID = %s, OutOfDateTS = NULL WHERE ID = %s", - [user_id, pkgbase_id]) - cur.execute("UPDATE PackageBases SET MaintainerUID = %s " + - "WHERE ID = %s AND MaintainerUID IS NULL", - [user_id, pkgbase_id]) - cur.execute("DELETE FROM Packages WHERE PackageBaseID = %s", - [pkgbase_id]) - - for pkgname in srcinfo.utils.get_package_names(metadata): - pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) - - if 'epoch' in pkginfo and int(pkginfo['epoch']) > 0: - ver = '{:d}:{:s}-{:s}'.format(int(pkginfo['epoch']), - pkginfo['pkgver'], - pkginfo['pkgrel']) - else: - ver = '{:s}-{:s}'.format(pkginfo['pkgver'], pkginfo['pkgrel']) - - for field in ('pkgdesc', 'url'): - if field not in pkginfo: - pkginfo[field] = None - - # Create a new package. - cur.execute("INSERT INTO Packages (PackageBaseID, Name, " + - "Version, Description, URL) " + - "VALUES (%s, %s, %s, %s, %s)", - [pkgbase_id, pkginfo['pkgname'], ver, - pkginfo['pkgdesc'], pkginfo['url']]) - db.commit() - pkgid = cur.lastrowid - - # Add package sources. - for source_info in extract_arch_fields(pkginfo, 'source'): - cur.execute("INSERT INTO PackageSources (PackageID, Source, " + - "SourceArch) VALUES (%s, %s, %s)", - [pkgid, source_info['value'], source_info['arch']]) - - # Add package dependencies. - for deptype in ('depends', 'makedepends', - 'checkdepends', 'optdepends'): - cur.execute("SELECT ID FROM DependencyTypes WHERE Name = %s", - [deptype]) - deptypeid = cur.fetchone()[0] - for dep_info in extract_arch_fields(pkginfo, deptype): - depname, depcond = parse_dep(dep_info['value']) - deparch = dep_info['arch'] - cur.execute("INSERT INTO PackageDepends (PackageID, " + - "DepTypeID, DepName, DepCondition, DepArch) " + - "VALUES (%s, %s, %s, %s, %s)", - [pkgid, deptypeid, depname, depcond, deparch]) - - # Add package relations (conflicts, provides, replaces). - for reltype in ('conflicts', 'provides', 'replaces'): - cur.execute("SELECT ID FROM RelationTypes WHERE Name = %s", - [reltype]) - reltypeid = cur.fetchone()[0] - for rel_info in extract_arch_fields(pkginfo, reltype): - relname, relcond = parse_dep(rel_info['value']) - relarch = rel_info['arch'] - cur.execute("INSERT INTO PackageRelations (PackageID, " + - "RelTypeID, RelName, RelCondition, RelArch) " + - "VALUES (%s, %s, %s, %s, %s)", - [pkgid, reltypeid, relname, relcond, relarch]) - - # Add package licenses. - if 'license' in pkginfo: - for license in pkginfo['license']: - cur.execute("SELECT ID FROM Licenses WHERE Name = %s", - [license]) - if cur.rowcount == 1: - licenseid = cur.fetchone()[0] - else: - cur.execute("INSERT INTO Licenses (Name) VALUES (%s)", - [license]) - db.commit() - licenseid = cur.lastrowid - cur.execute("INSERT INTO PackageLicenses (PackageID, " + - "LicenseID) VALUES (%s, %s)", - [pkgid, licenseid]) - - # Add package groups. - if 'groups' in pkginfo: - for group in pkginfo['groups']: - cur.execute("SELECT ID FROM Groups WHERE Name = %s", - [group]) - if cur.rowcount == 1: - groupid = cur.fetchone()[0] - else: - cur.execute("INSERT INTO Groups (Name) VALUES (%s)", - [group]) - db.commit() - groupid = cur.lastrowid - cur.execute("INSERT INTO PackageGroups (PackageID, " - "GroupID) VALUES (%s, %s)", [pkgid, groupid]) - - # Add user to notification list on adoption. - if was_orphan: - cur.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " + - "PackageBaseID = %s AND UserID = %s", - [pkgbase_id, user_id]) - if cur.fetchone()[0] == 0: - cur.execute("INSERT INTO PackageNotifications (PackageBaseID, UserID) " + - "VALUES (%s, %s)", [pkgbase_id, user_id]) - - db.commit() - -def update_notify(db, cur, user, pkgbase_id): - # Obtain the user ID of the new maintainer. - cur.execute("SELECT ID FROM Users WHERE Username = %s", [user]) - user_id = int(cur.fetchone()[0]) - - # Execute the notification script. - subprocess.Popen((notify_cmd, 'update', str(user_id), str(pkgbase_id))) - -def die(msg): - sys.stderr.write("error: {:s}\n".format(msg)) - exit(1) - - -def warn(msg): - sys.stderr.write("warning: {:s}\n".format(msg)) - - -def die_commit(msg, commit): - sys.stderr.write("error: The following error " + - "occurred when parsing commit\n") - sys.stderr.write("error: {:s}:\n".format(commit)) - sys.stderr.write("error: {:s}\n".format(msg)) - exit(1) - - -repo = pygit2.Repository(repo_path) - -user = os.environ.get("AUR_USER") -pkgbase = os.environ.get("AUR_PKGBASE") -privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1') - -if len(sys.argv) == 2 and sys.argv[1] == "restore": - if 'refs/heads/' + pkgbase not in repo.listall_references(): - die('{:s}: repository not found: {:s}'.format(sys.argv[1], pkgbase)) - refname = "refs/heads/master" - sha1_old = sha1_new = repo.lookup_reference('refs/heads/' + pkgbase).target -elif len(sys.argv) == 4: - refname, sha1_old, sha1_new = sys.argv[1:4] -else: - die("invalid arguments") - -if refname != "refs/heads/master": - die("pushing to a branch other than master is restricted") - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) -cur = db.cursor() - -# Detect and deny non-fast-forwards. -if sha1_old != "0000000000000000000000000000000000000000": - walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL) - walker.hide(sha1_new) - if next(walker, None) is not None: - cur.execute("SELECT AccountTypeID FROM Users WHERE UserName = %s ", - [user]) - if cur.fetchone()[0] == 1: - die("denying non-fast-forward (you should pull first)") - -# Prepare the walker that validates new commits. -walker = repo.walk(sha1_new, pygit2.GIT_SORT_TOPOLOGICAL) -if sha1_old != "0000000000000000000000000000000000000000": - walker.hide(sha1_old) - -# Validate all new commits. -for commit in walker: - for fname in ('.SRCINFO', 'PKGBUILD'): - if fname not in commit.tree: - die_commit("missing {:s}".format(fname), str(commit.id)) - - for treeobj in commit.tree: - blob = repo[treeobj.id] - - if isinstance(blob, pygit2.Tree): - die_commit("the repository must not contain subdirectories", - str(commit.id)) - - if not isinstance(blob, pygit2.Blob): - die_commit("not a blob object: {:s}".format(treeobj), - str(commit.id)) - - if blob.size > 250000: - die_commit("maximum blob size (250kB) exceeded", str(commit.id)) - - metadata_raw = repo[commit.tree['.SRCINFO'].id].data.decode() - (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw) - if errors: - sys.stderr.write("error: The following errors occurred " - "when parsing .SRCINFO in commit\n") - sys.stderr.write("error: {:s}:\n".format(str(commit.id))) - for error in errors: - for err in error['error']: - sys.stderr.write("error: line {:d}: {:s}\n".format(error['line'], err)) - exit(1) - - metadata_pkgbase = metadata['pkgbase'] - if not re.match(repo_regex, metadata_pkgbase): - die_commit('invalid pkgbase: {:s}'.format(metadata_pkgbase), - str(commit.id)) - - for pkgname in set(metadata['packages'].keys()): - pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) - - for field in ('pkgver', 'pkgrel', 'pkgname'): - if field not in pkginfo: - die_commit('missing mandatory field: {:s}'.format(field), - str(commit.id)) - - if 'epoch' in pkginfo and not pkginfo['epoch'].isdigit(): - die_commit('invalid epoch: {:s}'.format(pkginfo['epoch']), - str(commit.id)) - - if not re.match(r'[a-z0-9][a-z0-9\.+_-]*$', pkginfo['pkgname']): - die_commit('invalid package name: {:s}'.format(pkginfo['pkgname']), - str(commit.id)) - - for field in ('pkgname', 'pkgdesc', 'url'): - if field in pkginfo and len(pkginfo[field]) > 255: - die_commit('{:s} field too long: {:s}'.format(field, pkginfo[field]), - str(commit.id)) - - for field in ('install', 'changelog'): - if field in pkginfo and not pkginfo[field] in commit.tree: - die_commit('missing {:s} file: {:s}'.format(field, pkginfo[field]), - str(commit.id)) - - for field in extract_arch_fields(pkginfo, 'source'): - fname = field['value'] - if "://" in fname or "lp:" in fname: - continue - if fname not in commit.tree: - die_commit('missing source file: {:s}'.format(fname), - str(commit.id)) - - -# Display a warning if .SRCINFO is unchanged. -if sha1_old not in ("0000000000000000000000000000000000000000", sha1_new): - srcinfo_id_old = repo[sha1_old].tree['.SRCINFO'].id - srcinfo_id_new = repo[sha1_new].tree['.SRCINFO'].id - if srcinfo_id_old == srcinfo_id_new: - warn(".SRCINFO unchanged. The package database will not be updated!") - -# Read .SRCINFO from the HEAD commit. -metadata_raw = repo[repo[sha1_new].tree['.SRCINFO'].id].data.decode() -(metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw) - -# Ensure that the package base name matches the repository name. -metadata_pkgbase = metadata['pkgbase'] -if metadata_pkgbase != pkgbase: - die('invalid pkgbase: {:s}, expected {:s}'.format(metadata_pkgbase, pkgbase)) - -# Ensure that packages are neither blacklisted nor overwritten. -pkgbase = metadata['pkgbase'] -cur.execute("SELECT ID FROM PackageBases WHERE Name = %s", [pkgbase]) -pkgbase_id = cur.fetchone()[0] if cur.rowcount == 1 else 0 - -cur.execute("SELECT Name FROM PackageBlacklist") -blacklist = [row[0] for row in cur.fetchall()] - -for pkgname in srcinfo.utils.get_package_names(metadata): - pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) - pkgname = pkginfo['pkgname'] - - if pkgname in blacklist and not privileged: - die('package is blacklisted: {:s}'.format(pkgname)) - - cur.execute("SELECT COUNT(*) FROM Packages WHERE Name = %s AND " + - "PackageBaseID <> %s", [pkgname, pkgbase_id]) - if cur.fetchone()[0] > 0: - die('cannot overwrite package: {:s}'.format(pkgname)) - -# Store package base details in the database. -save_metadata(metadata, db, cur, user) - -# Create (or update) a branch with the name of the package base for better -# accessibility. -repo.create_reference('refs/heads/' + pkgbase, sha1_new, True) - -# Work around a Git bug: The HEAD ref is not updated when using gitnamespaces. -# This can be removed once the bug fix is included in Git mainline. See -# http://git.661346.n2.nabble.com/PATCH-receive-pack-Create-a-HEAD-ref-for-ref-namespace-td7632149.html -# for details. -repo.create_reference('refs/namespaces/' + pkgbase + '/HEAD', sha1_new, True) - -# Send package update notifications. -update_notify(db, cur, user, pkgbase_id) - -# Close the database. -db.close() @@ -4,13 +4,13 @@ # # Translators: # safa1996alfulaij <safa1996alfulaij@gmail.com>, 2015 -# صÙا الÙليج <safaalfulaij@hotmail.com>, 2015 +# صÙا الÙليج <safaalfulaij@hotmail.com>, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Arabic (http://www.transifex.com/lfleischer/aur/language/" "ar/)\n" @@ -27,6 +27,20 @@ msgstr "لم ÙŠÙعثر على الصّÙØØ©" msgid "Sorry, the page you've requested does not exist." msgstr "آسÙون، الصّÙØØ© التي طلبتها غير موجودة." +msgid "Note" +msgstr "ملاØظة" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "الخدمة غير متوÙّرة" @@ -145,6 +159,7 @@ msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." msgstr "" +"Øزم م‌م‌آ هي Øزم قدّمها المستخدمين. أيّ استخدام للملÙّات يكون على مسؤوليّتك الخاصّة." msgid "Learn more..." msgstr "اطّلع على المزيد..." @@ -228,7 +243,7 @@ msgid "" "development of the AUR web interface, use the %saur-dev%s mailing list." msgstr "" "النّقاشات العاّمة Øول مستودع مستخدمي آرتش (م‌م‌آ) وبنية المستخدمين الموثوقين " -"تكون ÙÙŠ %saur-general%s. للنّقاشات المتعلّقة بتطوير واجهة ÙˆÙب م‌م‌آ، استخدم " +"تكون ÙÙŠ %saur-general%s. للنّقاشات المتعلّقة بتطوير واجهة ÙˆÙبّ م‌م‌آ، استخدم " "قائمة %saur-dev%s البريديّة." msgid "Bug Reporting" @@ -241,6 +256,9 @@ msgid "" "%sonly%s. To report packaging bugs contact the package maintainer or leave a " "comment on the appropriate package page." msgstr "" +"إن وجدت علّة ÙÙŠ واجهة ÙˆÙبّ م‌م‌آ، Ùضلًا املأ تقريرًا بها ÙÙŠ %sمتعقّب العلل%s. استخدم " +"المتعقّب للإبلاغ عن العلل ÙÙŠ واجهة ÙˆÙبّ م‌م‌آ %sÙقط%s. للإبلاغ عن علل الØزم راسل " +"مديرها أو اترك تعليقًا ÙÙŠ صÙØØ© الØزمة المناسبة." msgid "Package Search" msgstr "ابØØ« عن Øزمة" @@ -429,7 +447,7 @@ msgstr "علّم الØزمة كقديمة" msgid "" "Use this form to flag the package base %s%s%s and the following packages out-" "of-date: " -msgstr "" +msgstr "استخدم هذه الاستمارة لتعليم أساس الØزمة %s%s%s والØزم الآتية كقديمة:" #, php-format msgid "" @@ -450,7 +468,7 @@ msgid "Flag" msgstr "علّم" msgid "Only registered users can flag packages out-of-date." -msgstr "" +msgstr "يمكن Ùقط للمستخدمين المسجّلين تعليم الØزم كقديمة." msgid "Package Merging" msgstr "ادمج Øزمة" @@ -606,7 +624,7 @@ msgstr "انقر وصلة الولوج أعلاه لاستخدام Øسابك." #, php-format msgid "No changes were made to the account, %s%s%s." -msgstr "لم تتمّ أيّ تغييرات على الØساب %s%s%s." +msgstr "لم تجري أيّ تغييرات على الØساب %s%s%s." #, php-format msgid "The account, %s%s%s, has been successfully modified." @@ -649,16 +667,16 @@ msgid "View account information for %s" msgstr "اعرض معلومات Øساب %s" msgid "Package base ID or package base name missing." -msgstr "" +msgstr "معرّ٠أساس الØزمة أو اسمه ناقص." msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "ليس مسموØًا لك بتØرير هذا التّعليق." msgid "Comment does not exist." msgstr "التّعليق غير موجود." msgid "Comment cannot be empty." -msgstr "" +msgstr "لا يمكن أن يكون التّعليق Ùارغًا." msgid "Comment has been added." msgstr "Ø£Ùضي٠التّعليق" @@ -670,19 +688,19 @@ msgid "Missing comment ID." msgstr "معرّ٠التّعليق ناقص." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "لا يمكن تثبيت أكثر من 5 تعليقات." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "ليس مسموØًا لك بتثبيت هذا التّعليق." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "ليس مسموØًا لك بÙكّ تثبيت هذا التّعليق." msgid "Comment has been pinned." -msgstr "" +msgstr "ثّبّت التّعليق." msgid "Comment has been unpinned." -msgstr "" +msgstr "ÙÙكّ تثبيت التعليق." msgid "Error retrieving package details." msgstr "خطأ ÙÙŠ استرجاع تÙاصيل الØزمة." @@ -697,7 +715,7 @@ msgid "You did not select any packages to flag." msgstr "لم تØدّد أيّ Øزم لتعليمها." msgid "The selected packages have not been flagged, please enter a comment." -msgstr "" +msgstr "لم تعلّم الØزم المØدّدة، Ùضلًا أدخل تعليقًا." msgid "The selected packages have been flagged out-of-date." msgstr "عÙلّمت الØزم المØدّدة كقديمة." @@ -777,7 +795,7 @@ msgid "Comment has been deleted." msgstr "ØÙذ٠التّعليق." msgid "Comment has been edited." -msgstr "" +msgstr "ØÙرّر التّعليق." msgid "You are not allowed to edit the keywords of this package base." msgstr "ليس مسموØًا لك بتØرير كلمات أساس الØزمة المÙتاØيّة." @@ -856,11 +874,14 @@ msgid "Email Address" msgstr "البريد الإلكترونيّ" msgid "hidden" -msgstr "" +msgstr "مخÙيّ" msgid "Real Name" msgstr "الاسم الØقيقيّ" +msgid "Homepage" +msgstr "الرّئيسيّة" + msgid "IRC Nick" msgstr "اسم آي‌آر‌سي المستعار" @@ -876,6 +897,9 @@ msgstr "غير نشط منذ" msgid "Active" msgstr "نشط" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "آخر ولوج" @@ -892,6 +916,10 @@ msgstr "Øرّر Øساب هذا المستخدم" msgid "Click %shere%s if you want to permanently delete this account." msgstr "انقر %sهنا%s إن أردت Øذ٠هذا الØساب نهائيًّا." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "مطلوب" @@ -910,7 +938,7 @@ msgstr "غير نشط" msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." -msgstr "" +msgstr "Ùضلًا تأكّد من إدخال البريد الإلكترونيّ الصّØÙŠØØŒ وإلّا ÙسيÙÙ‚ÙÙ„ الØساب." msgid "Hide Email Address" msgstr "أخÙ٠عنوان البريد الإلكترونيّ" @@ -930,13 +958,16 @@ msgid "SSH Public Key" msgstr "Ù…ÙØªØ§Ø SSH العموميّ" msgid "Notification settings" -msgstr "" +msgstr "إعدادات الإخطارات" msgid "Notify of new comments" msgstr "أخطرني بالتّعليقات الجديدة" msgid "Notify of package updates" -msgstr "" +msgstr "أخطرني بتØديثات الØزم" + +msgid "Notify of ownership changes" +msgstr "أخطرني بتغيير المÙلّاك" msgid "Update" msgstr "Øدّث" @@ -981,22 +1012,22 @@ msgstr "اØÙظ" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "تعليق التّعليم كقديمة: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" -msgstr "" +msgstr "علّم %s%s%s الØزمة %s%s%s بقديمة ÙÙŠ %s%s%s وذلك للأسباب الآتية:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "لم تÙعلّم الØزمة %s%s%s كقديمة." msgid "Return to Details" -msgstr "" +msgstr "عÙد إلى التّÙاصيل" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "الØقوق Ù…ØÙوظة %s 2004-%d Ùريق تطوير aurweb." msgid "My Packages" msgstr "Øزمي" @@ -1021,7 +1052,7 @@ msgstr "ابØØ« ÙÙŠ الويكي" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "معلّمة كقديمة (%s)" msgid "Flag package out-of-date" msgstr "علّم الØزمة كقديمة" @@ -1038,6 +1069,9 @@ msgstr "صوّت لهذه الØزمة" msgid "Disable notifications" msgstr "عطّل الإخطارات" +msgid "Enable notifications" +msgstr "Ùعّل الإخطارات" + msgid "Manage Co-Maintainers" msgstr "أدر المصينين المشاركين" @@ -1092,7 +1126,7 @@ msgstr "آخر تØديث" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "Øرّر تعليق: %s" msgid "Add Comment" msgstr "أض٠تعليقًا" @@ -1101,7 +1135,7 @@ msgid "View all comments" msgstr "اعرض كلّ التّعليقات" msgid "Pinned Comments" -msgstr "" +msgstr "التّعليقات المثبّتة" msgid "Latest Comments" msgstr "آخر التّعليقات" @@ -1137,10 +1171,10 @@ msgid "Delete comment" msgstr "اØذ٠التّعليق" msgid "Pin comment" -msgstr "" +msgstr "ثبّت التّعليق" msgid "Unpin comment" -msgstr "" +msgstr "Ùكّ تثبيت التّعليق" msgid "All comments" msgstr "كلّ التّعليقات" @@ -1158,7 +1192,7 @@ msgid "Upstream URL" msgstr "عنوان المنبع" msgid "Visit the website for" -msgstr "زÙر موقع ÙˆÙب" +msgstr "زÙر موقع ÙˆÙبّ" msgid "Licenses" msgstr "الرّخص" @@ -1188,9 +1222,6 @@ msgstr "المصادر" msgid "Use this form to close the request for package base %s%s%s." msgstr "استخدم هذه الاستمارة لإغلاق طلب أساس الØزمة %s%s%s." -msgid "Note" -msgstr "ملاØظة" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1225,6 +1256,26 @@ msgstr "يتيمة" msgid "Merge into" msgstr "ادمج مع" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1249,8 +1300,14 @@ msgid "Date" msgstr "التّاريخ" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" #, php-format msgid "~%d hour left" @@ -1305,7 +1362,7 @@ msgid "Voted" msgstr "مصوّت عليها" msgid "Last modified" -msgstr "" +msgstr "آخر تعديل" msgid "Ascending" msgstr "تصاعديًّا" @@ -1356,9 +1413,10 @@ msgstr[5] "عÙثر على %d Øزمة." msgid "Version" msgstr "الإصدارة" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -1419,7 +1477,7 @@ msgid "Recent Updates" msgstr "التّØديثات الأخيرة" msgid "more" -msgstr "" +msgstr "أخرى" msgid "My Statistics" msgstr "Ø¥Øصائيّاتي" @@ -5,13 +5,13 @@ # Translators: # enolp <enolp@softastur.org>, 2014-2015 # Ḷḷumex03 <tornes@opmbx.org>, 2014 -# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2014-2015 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Asturian (http://www.transifex.com/lfleischer/aur/language/" "ast/)\n" @@ -27,6 +27,20 @@ msgstr "Nun s'alcontró la páxina" msgid "Sorry, the page you've requested does not exist." msgstr "Perdón, la páxina que pidisti nun esiste." +msgid "Note" +msgstr "Nota" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Serviciu non disponible" @@ -847,6 +861,9 @@ msgstr "" msgid "Real Name" msgstr "Nome real" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Alcuñu nel IRC" @@ -862,6 +879,9 @@ msgstr "Inactivu dende" msgid "Active" msgstr "Activu" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "" @@ -878,6 +898,10 @@ msgstr "" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Primi %sequÃ%s si quies desaniciar esta cuenta dafechu." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "riquÃu" @@ -925,6 +949,9 @@ msgstr "" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Anovar" @@ -1025,6 +1052,9 @@ msgstr "Votar pol paquete" msgid "Disable notifications" msgstr "" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "Alministra comantenedores" @@ -1171,9 +1201,6 @@ msgstr "Fontes" msgid "Use this form to close the request for package base %s%s%s." msgstr "Usa esti formulariu pa zarrar la solicitú pal paquete base %s%s%s." -msgid "Note" -msgstr "Nota" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1208,6 +1235,26 @@ msgstr "Güérfanu" msgid "Merge into" msgstr "" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1228,8 +1275,10 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "Falten ~%d dÃes" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1327,9 +1376,10 @@ msgstr[1] "Alcontráronse %d paquetes" msgid "Version" msgstr "Versión" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: AUR v4.1.1\n" +"Project-Id-Version: AUR v4.3.0\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" +"POT-Creation-Date: 2016-10-08 14:59+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" @@ -26,6 +26,24 @@ msgstr "" msgid "Sorry, the page you've requested does not exist." msgstr "" +#: html/404.php template/pkgreq_close_form.php +msgid "Note" +msgstr "" + +#: html/404.php +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#: html/404.php +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#: html/404.php +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + #: html/503.php msgid "Service Unavailable" msgstr "" @@ -1077,6 +1095,10 @@ msgid "Real Name" msgstr "" #: template/account_details.php template/account_edit_form.php +msgid "Homepage" +msgstr "" + +#: template/account_details.php template/account_edit_form.php #: template/account_search_results.php template/search_accounts_form.php msgid "IRC Nick" msgstr "" @@ -1100,6 +1122,10 @@ msgid "Active" msgstr "" #: template/account_details.php +msgid "Registration date:" +msgstr "" + +#: template/account_details.php msgid "Last Login" msgstr "" @@ -1121,6 +1147,11 @@ msgid "Click %shere%s if you want to permanently delete this account." msgstr "" #: template/account_edit_form.php +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + +#: template/account_edit_form.php msgid "required" msgstr "" @@ -1172,7 +1203,7 @@ msgstr "" msgid "Notification settings" msgstr "" -#: template/account_edit_form.php template/pkgbase_actions.php +#: template/account_edit_form.php msgid "Notify of new comments" msgstr "" @@ -1180,6 +1211,10 @@ msgstr "" msgid "Notify of package updates" msgstr "" +#: template/account_edit_form.php +msgid "Notify of ownership changes" +msgstr "" + #: template/account_edit_form.php template/pkgbase_details.php #: template/pkg_details.php msgid "Update" @@ -1313,6 +1348,10 @@ msgid "Disable notifications" msgstr "" #: template/pkgbase_actions.php +msgid "Enable notifications" +msgstr "" + +#: template/pkgbase_actions.php msgid "Manage Co-Maintainers" msgstr "" @@ -1510,10 +1549,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" #: template/pkgreq_close_form.php -msgid "Note" -msgstr "" - -#: template/pkgreq_close_form.php msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1556,6 +1591,29 @@ msgstr "" msgid "Merge into" msgstr "" +#: template/pkgreq_form.php +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +#: template/pkgreq_form.php +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +#: template/pkgreq_form.php +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #: template/pkgreq_results.php #, php-format msgid "%d package request found." @@ -1582,8 +1640,10 @@ msgstr "" #: template/pkgreq_results.php #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #: template/pkgreq_results.php #, php-format @@ -1713,9 +1773,10 @@ msgid "Version" msgstr "" #: template/pkg_search_results.php +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" #: template/pkg_search_results.php template/tu_details.php template/tu_list.php @@ -3,15 +3,15 @@ # This file is distributed under the same license as the AUR package. # # Translators: -# Adolfo Jayme Barrientos, 2014 +# Adolfo Jayme-Barrientos, 2014 # Hector Mtz-Seara <hseara@gmail.com>, 2011,2013 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Catalan (http://www.transifex.com/lfleischer/aur/language/" "ca/)\n" @@ -27,6 +27,20 @@ msgstr "No s’ha trobat la pà gina" msgid "Sorry, the page you've requested does not exist." msgstr "Ho sentim, la pà gina que ha sol·licitat no existeix." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "" @@ -852,6 +866,9 @@ msgstr "" msgid "Real Name" msgstr "Nom real" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Nom d'usuari IRC" @@ -867,6 +884,9 @@ msgstr "" msgid "Active" msgstr "Actiu" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "" @@ -883,6 +903,10 @@ msgstr "" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "requerit" @@ -929,6 +953,9 @@ msgstr "Notificar comentaris nous" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Actualitza" @@ -1029,6 +1056,9 @@ msgstr "Vota per aquest paquet" msgid "Disable notifications" msgstr "Deshabilitar notificacions" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1175,9 +1205,6 @@ msgstr "Fonts" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1210,6 +1237,26 @@ msgstr "" msgid "Merge into" msgstr "Combinar amb" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1230,8 +1277,10 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1329,9 +1378,10 @@ msgstr[1] "" msgid "Version" msgstr "Versió" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-10 09:49+0000\n" -"Last-Translator: Jaroslav Lichtblau <dragonlord@seznam.cz>\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" +"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Czech (http://www.transifex.com/lfleischer/aur/language/cs/)\n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -27,6 +27,20 @@ msgstr "Stránka nenalezena" msgid "Sorry, the page you've requested does not exist." msgstr "Omlouváme se, požadovaná stránka neexistuje." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Služba nedostupná" @@ -834,6 +848,9 @@ msgstr "skrytý" msgid "Real Name" msgstr "SkuteÄné jméno" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC pÅ™ezdÃvka" @@ -849,6 +866,9 @@ msgstr "Neaktivnà od" msgid "Active" msgstr "AktivnÃ" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Poslednà pÅ™ihlášenÃ" @@ -865,6 +885,10 @@ msgstr "Upravit tento uživatelský úÄet" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "vyžadováno" @@ -911,6 +935,9 @@ msgstr "Oznamovat nové komentáře" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Aktualizovat" @@ -1011,6 +1038,9 @@ msgstr "Hlasovat pro tento balÃÄek" msgid "Disable notifications" msgstr "Vypnout oznámenÃ" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1158,9 +1188,6 @@ msgstr "Zdroje" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1193,6 +1220,26 @@ msgstr "" msgid "Merge into" msgstr "" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1214,8 +1261,11 @@ msgid "Date" msgstr "Datum" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, php-format msgid "~%d hour left" @@ -1315,9 +1365,10 @@ msgstr[2] "Nalezeno %d balÃÄků." msgid "Version" msgstr "Verze" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Danish (http://www.transifex.com/lfleischer/aur/language/" "da/)\n" @@ -26,6 +26,20 @@ msgstr "Siden blev ikke fundet" msgid "Sorry, the page you've requested does not exist." msgstr "Beklager, den forspurgte side findes ikke." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Service utilgængelig" @@ -828,6 +842,9 @@ msgstr "" msgid "Real Name" msgstr "Rigtigt navn" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC kaldenavn" @@ -843,6 +860,9 @@ msgstr "Inaktiv siden" msgid "Active" msgstr "Aktiv" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Sidste login" @@ -859,6 +879,10 @@ msgstr "" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "pÃ¥krævet" @@ -905,6 +929,9 @@ msgstr "" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Opdater" @@ -1005,6 +1032,9 @@ msgstr "Stem pÃ¥ denne pakke" msgid "Disable notifications" msgstr "Deaktiver notifikationer" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1151,9 +1181,6 @@ msgstr "Kilder" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1186,6 +1213,26 @@ msgstr "Forladt" msgid "Merge into" msgstr "" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1206,8 +1253,10 @@ msgid "Date" msgstr "Dato" #, php-format -msgid "~%d days left" -msgstr "~%d dage tilbage" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1305,9 +1354,10 @@ msgstr[1] "%d pakker fundet." msgid "Version" msgstr "Version" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -9,7 +9,7 @@ # FabianS_ <cadoc@gmx.de>, 2012 # go2sh <c.seitz@tu-bs.de>, 2015 # FabianS_ <cadoc@gmx.de>, 2012 -# Giuliano Schneider <gs93@gmx.net>, 2015 +# Giuliano Schneider <gs93@gmx.net>, 2015-2016 # go2sh <c.seitz@tu-bs.de>, 2015 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # Mark Gerlach, 2015 @@ -24,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: German (http://www.transifex.com/lfleischer/aur/language/" "de/)\n" @@ -41,6 +41,20 @@ msgstr "Seite nicht gefunden" msgid "Sorry, the page you've requested does not exist." msgstr "Die angeforderte Seite existiert leider nicht." +msgid "Note" +msgstr "Anmerkung" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Dienst nicht verfügbr" @@ -830,10 +844,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "Du wurdest von der Benachrichtigungsliste für %s entfernt." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "Du bist nicht berechtigt diesen Kommentar wiederherzustellen." msgid "Comment has been undeleted." -msgstr "" +msgstr "Kommentar wurde wiederhergestellt." msgid "You are not allowed to delete this comment." msgstr "Du darfst diesen Kommentar nicht löschen." @@ -928,6 +942,9 @@ msgstr "versteckt" msgid "Real Name" msgstr "Echter Name" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC-Name" @@ -943,6 +960,9 @@ msgstr "Nicht aktiv seit" msgid "Active" msgstr "Aktiv" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Letzter Login" @@ -960,6 +980,10 @@ msgid "Click %shere%s if you want to permanently delete this account." msgstr "" "Klicke %shier%s, wenn du diesen Account unwiderruflich entfernen möchtest." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "Notwendig" @@ -1010,6 +1034,9 @@ msgstr "Ãœber neue Kommentare benachrichtigen" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Aktualisieren" @@ -1070,7 +1097,7 @@ msgstr "" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "Copyright %s 2004-%d aurweb Development Team." msgid "My Packages" msgstr "Meine Pakete" @@ -1095,7 +1122,7 @@ msgstr "Durchsuche Wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Als \"veraltet\" markiert (%s)" msgid "Flag package out-of-date" msgstr "Paket als \"veraltet\" markieren" @@ -1112,6 +1139,9 @@ msgstr "Für dieses Paket stimmen" msgid "Disable notifications" msgstr "Benachrichtigungen deaktivieren" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "Verwalte Ko-Maintainer" @@ -1190,18 +1220,18 @@ msgstr "gelöscht am %s von %s" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "gelöscht am %s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "geändert am %s von %s" #, php-format msgid "edited on %s" -msgstr "" +msgstr "geändert am %s" msgid "Undelete comment" -msgstr "" +msgstr "Kommentar wiederherstellen" msgid "Delete comment" msgstr "Kommentar löschen" @@ -1260,9 +1290,6 @@ msgstr "" "Benutze dieses Formular, um die Anfrage für die Paketbasis %s%s%s zu " "schließen." -msgid "Note" -msgstr "Anmerkung" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1299,6 +1326,26 @@ msgstr "Verwaist" msgid "Merge into" msgstr "Verschmelzen mit" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1319,8 +1366,10 @@ msgid "Date" msgstr "Datum" #, php-format -msgid "~%d days left" -msgstr "~%d Tage verbleibend" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1418,12 +1467,11 @@ msgstr[1] "%d Pakete gefunden." msgid "Version" msgstr "Version" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"Die Beliebtheit berechnet sich als Summe aller Stimmen, wobei jede Stimme " -"mit einem Faktor von 0,98 pro Tag seit der Erstellung gewichtet wird." msgid "Yes" msgstr "Ja" @@ -1483,7 +1531,7 @@ msgid "Recent Updates" msgstr "Letzte Aktualisierungen" msgid "more" -msgstr "" +msgstr "mehr" msgid "My Statistics" msgstr "Meine Statistiken" @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Greek (http://www.transifex.com/lfleischer/aur/language/el/)\n" "Language: el\n" @@ -30,6 +30,20 @@ msgstr "Η σελίδα δε βÏÎθηκε" msgid "Sorry, the page you've requested does not exist." msgstr "Μας συγχωÏείτε, η σελίδα που ζητήσατε δεν υπάÏχει." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "" @@ -864,6 +878,9 @@ msgstr "" msgid "Real Name" msgstr "Î Ïαγματικό 'Ονομα" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Ψευδώνυμο IRC" @@ -879,6 +896,9 @@ msgstr "ΑδÏανής από" msgid "Active" msgstr "ΕνεÏγός" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Τελευταία σÏνδεση" @@ -895,6 +915,10 @@ msgstr "ΤÏοποποιήστε το λογαÏιασμό Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ï‡Ï msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "απαιτοÏμενο" @@ -941,6 +965,9 @@ msgstr "Ειδοποίησε για νÎα σχόλια" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "EνημÎÏωση" @@ -1041,6 +1068,9 @@ msgstr "Ψηφίστε για αυτό το πακÎτο" msgid "Disable notifications" msgstr "ΑπενεÏγοποιήστε τις ειδοποιήσεις" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1187,9 +1217,6 @@ msgstr "ΠηγÎÏ‚" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1222,6 +1249,26 @@ msgstr "" msgid "Merge into" msgstr "Συγχώνευση σε" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1242,8 +1289,10 @@ msgid "Date" msgstr "" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1341,9 +1390,10 @@ msgstr[1] "" msgid "Version" msgstr "Έκδοση" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -3,20 +3,23 @@ # This file is distributed under the same license as the AUR package. # # Translators: -# Adolfo Jayme Barrientos, 2015 +# Adolfo Jayme-Barrientos, 2015 # Angel Velasquez <angvp@archlinux.org>, 2011 # juantascon <juantascon@gmail.com>, 2011 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # neiko <neikokz+tsfx@gmail.com>, 2011 # Nicolás de la Torre <ndelatorre@gmail.com>, 2012 -# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2012 -# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2013-2015 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2012 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2013-2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Spanish (http://www.transifex.com/lfleischer/aur/language/" "es/)\n" @@ -32,6 +35,20 @@ msgstr "Página no encontrada" msgid "Sorry, the page you've requested does not exist." msgstr "La página solicitada no existe." +msgid "Note" +msgstr "Nota" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Servicio no disponible" @@ -88,7 +105,7 @@ msgid "Submit a proposal to vote on." msgstr "EnvÃa una propuesta a la cual votar." msgid "Applicant/TU" -msgstr "Candidato/Usuario de confianza (TU)" +msgstr "Candidato/Usuario de confianza (UC)" msgid "(empty if not applicable)" msgstr "(vacÃo si no aplica)" @@ -231,7 +248,7 @@ msgstr "" "detalles." msgid "The following SSH fingerprints are used for the AUR:" -msgstr "Las siguientes huellas SSH están en uso para AUR." +msgstr "Las siguientes huellas SSH están en uso para el AUR." msgid "Discussion" msgstr "Debate" @@ -365,7 +382,7 @@ msgid "" "message to the %saur-general%s mailing list." msgstr "" "Si olvidaste la dirección de correo que usaste para registrarte, envÃa un " -"mensaje a la %slista de correo aur-general%s." +"mensaje a la %slista de correo general del AUR%s." msgid "Enter your e-mail address:" msgstr "Introduce tu dirección de correo:" @@ -457,7 +474,7 @@ msgstr "" "de paquetes." msgid "Flag Comment" -msgstr "" +msgstr "Marcar comentario" msgid "Flag Package Out-Of-Date" msgstr "Marcado como desactualizado" @@ -528,7 +545,7 @@ msgstr "" "Solamente usuarios de confianza y desarrolladores pueden unir paquetes." msgid "Submit Request" -msgstr "" +msgstr "Enviar solicitud" msgid "Close Request" msgstr "Cerrar solicitud" @@ -719,19 +736,19 @@ msgid "Missing comment ID." msgstr "Falta el identificador del comentario." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "No pueden fijarse más de 5 comentarios." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "No tienes permitido fijar este comentario." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "No tienes permitido desfijar este comentario." msgid "Comment has been pinned." -msgstr "" +msgstr "El comentario ha sido fijado." msgid "Comment has been unpinned." -msgstr "" +msgstr "El comentario ha sido desfijado." msgid "Error retrieving package details." msgstr "Error al recuperar los detalles del paquete." @@ -816,10 +833,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "Haz sido eliminado de la lista de notificaciones de comentarios de %s." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "No estás autorizado a restablecer este comentario." msgid "Comment has been undeleted." -msgstr "" +msgstr "El comentario se ha restablecido." msgid "You are not allowed to delete this comment." msgstr "No estás autorizado para eliminar este comentario." @@ -917,6 +934,9 @@ msgstr "oculto" msgid "Real Name" msgstr "Nombre real" +msgid "Homepage" +msgstr "Página principal" + msgid "IRC Nick" msgstr "Alias de IRC" @@ -932,6 +952,9 @@ msgstr "Inactivo desde" msgid "Active" msgstr "Activo" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Última autentificación" @@ -948,6 +971,10 @@ msgstr "Editar la cuenta de este usuario" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Haz clic %saquÃ%s si deseas eliminar permanentemente esta cuenta." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "obligatorio" @@ -990,13 +1017,16 @@ msgid "SSH Public Key" msgstr "Clave pública SSH" msgid "Notification settings" -msgstr "" +msgstr "Gestión de notificaciones" msgid "Notify of new comments" msgstr "Notificación de nuevos comentarios" msgid "Notify of package updates" -msgstr "" +msgstr "Notificar de actualizaciones de un paquete" + +msgid "Notify of ownership changes" +msgstr "Notificar de cambios de propietario" msgid "Update" msgstr "Actualizar" @@ -1044,22 +1074,25 @@ msgstr "Guardar" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Marcar comentario como desactualizado: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" msgstr "" +"%s%s%s se ha marcado %s%s%s como desactualizado %s%s%s por la siguiente " +"razón:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s no está marcado como desactualizado." msgid "Return to Details" -msgstr "" +msgstr "Regresar a detalles" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." msgstr "" +"Derechos de autor %s 2004 - %d, equipo desarrollador de la web del AUR." msgid "My Packages" msgstr "Mis paquetes" @@ -1084,7 +1117,7 @@ msgstr "Buscar en la wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Marcado como desactualizado (%s)" msgid "Flag package out-of-date" msgstr "Marcar paquete como desactualizado" @@ -1101,6 +1134,9 @@ msgstr "Votar por este paquete" msgid "Disable notifications" msgstr "Deshabilitar notificaciones" +msgid "Enable notifications" +msgstr "Habilitar notificaciones" + msgid "Manage Co-Maintainers" msgstr "Administrar coencargados" @@ -1160,7 +1196,7 @@ msgid "View all comments" msgstr "Ver todos los comentarios" msgid "Pinned Comments" -msgstr "" +msgstr "Comentarios fijados" msgid "Latest Comments" msgstr "Últimos comentarios" @@ -1179,27 +1215,27 @@ msgstr "borrado el %s por %s" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "borrado el %s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "editado el %s por %s" #, php-format msgid "edited on %s" -msgstr "" +msgstr "editado el %s" msgid "Undelete comment" -msgstr "" +msgstr "Comentario restablecido" msgid "Delete comment" msgstr "Eliminar comentario" msgid "Pin comment" -msgstr "" +msgstr "Comentario fijado" msgid "Unpin comment" -msgstr "" +msgstr "Comentario desfijado" msgid "All comments" msgstr "Todos los comentarios" @@ -1248,9 +1284,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Usa este formulario para cerrar la solicitud para el paquete base %s%s%s." -msgid "Note" -msgstr "Nota" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1287,6 +1320,40 @@ msgstr "Orfandad" msgid "Merge into" msgstr "Unir en" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"Al enviar una solicitud de eliminación, le preguntas a un usuario de " +"confianza que elimine el paquete base. Este tipo de solicitud debe ser " +"utilizado para los duplicados, programas abandonados por el desarrollador " +"principal o encargado, asà como programas ilegales e irreparablemente rotos." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"Al enviar una solicitud de unión, le preguntas a un usuario de confianza que " +"elimine el paquete base y transfiera sus votos y comentarios a otro paquete " +"base. La unión de un paquete no afecta a los correspondientes repositorios " +"Git. Por tanto asegúrate de actualizar el historia Git del paquete de " +"destino tú mismo." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"Al enviar una solicitud de orfandad, le preguntas a un usuario de confianza " +"que remueva la propiedad sobre el paquete base al encargado principal de " +"este. Por favor, haz esto solamente si el paquete necesita una acción de " +"mantenención, el encargado no presenta signos de actividad y ya intentaste " +"ponerte en contacto con él anteriormente." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1307,8 +1374,10 @@ msgid "Date" msgstr "Fecha" #, php-format -msgid "~%d days left" -msgstr "Aprox. %d dÃas restantes" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d dÃa restante" +msgstr[1] "~%d dÃas restantes" #, php-format msgid "~%d hour left" @@ -1406,12 +1475,13 @@ msgstr[1] "%d paquetes fueron encontrados." msgid "Version" msgstr "Versión" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"La popularidad se calcula como la suma de todos los votos con cada voto " -"ponderado con un factor de 0,98 por dÃa desde la creación del paquete." +"La popularidad se calcula como la suma de todos los votos y cada uno " +"ponderado con un factor de %.2f por dÃa desde la creación del paquete." msgid "Yes" msgstr "SÃ" @@ -1471,7 +1541,7 @@ msgid "Recent Updates" msgstr "Actualizaciones recientes" msgid "more" -msgstr "" +msgstr "más" msgid "My Statistics" msgstr "Mis estadÃsticas" diff --git a/po/es_419.po b/po/es_419.po index 962917e7..14adaf94 100644 --- a/po/es_419.po +++ b/po/es_419.po @@ -8,13 +8,16 @@ # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # neiko <neikokz+tsfx@gmail.com>, 2011 # Nicolás de la Torre <ndelatorre@gmail.com>, 2012 -# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2012,2015 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2012,2015-2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 +# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/lfleischer/" "aur/language/es_419/)\n" @@ -30,6 +33,20 @@ msgstr "Página no encontrada" msgid "Sorry, the page you've requested does not exist." msgstr "Disculpe, la página que solicitó no existe." +msgid "Note" +msgstr "Nota" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Servicio no disponible" @@ -86,7 +103,7 @@ msgid "Submit a proposal to vote on." msgstr "EnvÃe una propuesta a la cual votar." msgid "Applicant/TU" -msgstr "Candidato/Usuario de confianza (TU)" +msgstr "Candidato/Usuario de confianza (UC)" msgid "(empty if not applicable)" msgstr "(vacÃo si no aplica)" @@ -95,13 +112,13 @@ msgid "Type" msgstr "Tipo" msgid "Addition of a TU" -msgstr "Agregar a un nuevo usuario de confianza" +msgstr "Agregar a un nuevo Usuario de Confianza" msgid "Removal of a TU" -msgstr "Remover a un usuario de confianza" +msgstr "Remover a un Usuario de Confianza" msgid "Removal of a TU (undeclared inactivity)" -msgstr "Remover a un usuario de confianza (no declarado inactivo)" +msgstr "Remover a un Usuario de Confianza (no declarado inactivo)" msgid "Amendment of Bylaws" msgstr "Enmienda a las Bylaws (Reglas de los TU)" @@ -127,7 +144,7 @@ msgid "" "Guidelines%s for more information." msgstr "" "¡Bienvenido al repositorio de usuarios de Arch! Lea la %sGuÃa del usuario " -"del AUR%s y la %sGuÃa del usuario de confianza del AUR%s para mayor " +"del AUR%s y la %sGuÃa del usuario de Confianza del AUR%s para mayor " "información." #, php-format @@ -152,8 +169,8 @@ msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." msgstr "" -"Los paquetes en AUR son producidos por los usuarios. Cualquier uso de ellos " -"o sus archivos es a su propio riesgo." +"Los paquetes en el AUR son producidos por los usuarios. Cualquier uso de " +"ellos o sus archivos es a su propio riesgo." msgid "Learn more..." msgstr "Aprenda más..." @@ -228,7 +245,7 @@ msgstr "" "información." msgid "The following SSH fingerprints are used for the AUR:" -msgstr "Las siguientes huellas SSH están en uso para AUR." +msgstr "Las siguientes huellas SSH están en uso para el AUR." msgid "Discussion" msgstr "Debate" @@ -453,7 +470,7 @@ msgstr "" "paquetes." msgid "Flag Comment" -msgstr "" +msgstr "Marcar comentario" msgid "Flag Package Out-Of-Date" msgstr "Marcado como desactualizado" @@ -524,7 +541,7 @@ msgid "Only Trusted Users and Developers can merge packages." msgstr "Solo Usuarios de Confianza y Desarrolladores pueden fusionar paquetes." msgid "Submit Request" -msgstr "" +msgstr "Enviar petición" msgid "Close Request" msgstr "Cerrar Petición" @@ -713,19 +730,19 @@ msgid "Missing comment ID." msgstr "Falta el identificador del comentario." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "No pueden ser anclar más de 5 comentarios." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "No tiene permitido anclar este comentario." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "No tiene permitido desanclar este comentario." msgid "Comment has been pinned." -msgstr "" +msgstr "El comentario fue anclado." msgid "Comment has been unpinned." -msgstr "" +msgstr "El comentario fue desanclado." msgid "Error retrieving package details." msgstr "Error al recuperar los detalles del paquete." @@ -810,10 +827,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "Ha sido eliminado de la lista de notificaciones de comentarios de %s." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "No está autorizado a restablecer este comentario." msgid "Comment has been undeleted." -msgstr "" +msgstr "El comentario fue restablecido." msgid "You are not allowed to delete this comment." msgstr "No está autorizado a borrar este comentario." @@ -910,6 +927,9 @@ msgstr "oculto" msgid "Real Name" msgstr "Nombre real" +msgid "Homepage" +msgstr "Página principal" + msgid "IRC Nick" msgstr "Alias de IRC" @@ -925,6 +945,9 @@ msgstr "Inactivo desde" msgid "Active" msgstr "Activo" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Última autentificación" @@ -941,6 +964,10 @@ msgstr "Editar la cuenta de este usuario" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Haga clic %saquÃ%s si desea borrar permanentemente esa cuenta." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "obligatorio" @@ -983,13 +1010,16 @@ msgid "SSH Public Key" msgstr "Clave pública SSH" msgid "Notification settings" -msgstr "" +msgstr "Configuración de notificaciones" msgid "Notify of new comments" msgstr "Notificación de nuevos comentarios" msgid "Notify of package updates" -msgstr "" +msgstr "Notificar sobre actualizaciones de un paquete" + +msgid "Notify of ownership changes" +msgstr "Notificarme de cambios de propietario" msgid "Update" msgstr "Actualizar" @@ -1037,22 +1067,24 @@ msgstr "Guardar" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Marcar comentario como desactualizado: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" msgstr "" +"%s%s%s fue marcado %s%s%s como desactualizado %s%s%s por la siguiente razón:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s no está marcado como desactualizado." msgid "Return to Details" -msgstr "" +msgstr "Regresar a detalles" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." msgstr "" +"Derechos de autor %s 2004 - %d, equipo de desarrollo de la web del AUR." msgid "My Packages" msgstr "Mis paquetes" @@ -1077,7 +1109,7 @@ msgstr "Buscar en la wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Marcado como desactualizado (%s)" msgid "Flag package out-of-date" msgstr "Marcar paquete como desactualizado" @@ -1094,6 +1126,9 @@ msgstr "Votar por este paquete" msgid "Disable notifications" msgstr "Deshabilitar notificaciones" +msgid "Enable notifications" +msgstr "Habilitar notificaciones" + msgid "Manage Co-Maintainers" msgstr "Administrar coencargados" @@ -1153,7 +1188,7 @@ msgid "View all comments" msgstr "Ver todos los comentarios" msgid "Pinned Comments" -msgstr "" +msgstr "Comentarios anclados" msgid "Latest Comments" msgstr "Últimos comentarios" @@ -1172,27 +1207,27 @@ msgstr "borrado el %s por %s" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "borrado el %s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "editado el %s por %s" #, php-format msgid "edited on %s" -msgstr "" +msgstr "editado el %s" msgid "Undelete comment" -msgstr "" +msgstr "Comentario restablecido" msgid "Delete comment" msgstr "Borrar comentario" msgid "Pin comment" -msgstr "" +msgstr "Comentario anclado" msgid "Unpin comment" -msgstr "" +msgstr "Comentario desanclado" msgid "All comments" msgstr "Todos los comentarios" @@ -1241,9 +1276,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Use este formulario para cerrar la petición para el paquete base %s%s%s." -msgid "Note" -msgstr "Nota" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1280,6 +1312,40 @@ msgstr "Orfandad" msgid "Merge into" msgstr "Fusionar en" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"Al enviar una Petición de Borrado, le preguntará a un Usuario de Confianza " +"que elimine dicho paquete base. Este tipo de peticiones debe ser utilizada " +"para duplicados, programas abandonados por el desarrollador principal o " +"encargado, asà como programas ilegales e irreparablemente rotos." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"Al enviar una Petición de Fusión, le preguntará a un Usuario de Confianza " +"que borre el paquete base y transfiera sus votos y comentarios a otro " +"paquete base. La fusión de un paquete no afecta a los correspondientes " +"repositorios Git. Por lo tanto asegúrese de actualizar el historia Git del " +"paquete de destino uste mismo." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"Al enviar una Petición de Orfandad, le preguntarás a un Usuario de Confianza " +"que le quite la propiedad sobre el paquete base al encargado principal de " +"este. Por favor, haga esto solo si el paquete necesita acciones de " +"mantenención para funcionar, el encargado no presenta da de actividad y ya " +"intentó ponerse en contacto con él anteriormente." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1300,8 +1366,10 @@ msgid "Date" msgstr "Fecha" #, php-format -msgid "~%d days left" -msgstr "Aprox. %d dÃas restantes" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d dÃa restante" +msgstr[1] "~%d dÃas restantes" #, php-format msgid "~%d hour left" @@ -1399,12 +1467,13 @@ msgstr[1] "%d paquetes fueron encontrados." msgid "Version" msgstr "Versión" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" "La Popularidad es calculada como la suma de todos los votos ponderados con " -"un factor de 0,98 por dÃa desde la creación del paquete." +"un factor de %.2f por dÃa desde la creación del paquete." msgid "Yes" msgstr "SÃ" @@ -1464,7 +1533,7 @@ msgid "Recent Updates" msgstr "Actualizaciones recientes" msgid "more" -msgstr "" +msgstr "más" msgid "My Statistics" msgstr "Mis estadÃsticas" @@ -1498,7 +1567,7 @@ msgid "Participation" msgstr "Participación" msgid "Last Votes by TU" -msgstr "Último voto del usuario de confianza" +msgstr "Último voto del Usuario de Confianza" msgid "Last vote" msgstr "Último voto" @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Finnish (http://www.transifex.com/lfleischer/aur/language/" "fi/)\n" @@ -26,6 +26,20 @@ msgstr "Sivua ei löydy." msgid "Sorry, the page you've requested does not exist." msgstr "Valitettavasti hakemaasi sivua ei ole olemassa." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Palvelu ei saatavilla." @@ -882,6 +896,9 @@ msgstr "" msgid "Real Name" msgstr "Oikea nimi" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC nikki" @@ -897,6 +914,9 @@ msgstr "" msgid "Active" msgstr "Aktiivinen" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "" @@ -913,6 +933,10 @@ msgstr "" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "vaaditaan" @@ -959,6 +983,9 @@ msgstr "Lähetä ilmoitus uusista kommnteista" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Päivitä" @@ -1059,6 +1086,9 @@ msgstr "Äännestä pakettia" msgid "Disable notifications" msgstr "En halua enää ilmoituksia" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "Hallitse ylläpitäjäkumppaneita" @@ -1205,9 +1235,6 @@ msgstr "Lähdetiedostot" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1240,6 +1267,26 @@ msgstr "" msgid "Merge into" msgstr "Yhdistä pakettiin" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1260,8 +1307,10 @@ msgid "Date" msgstr "" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1359,9 +1408,10 @@ msgstr[1] "" msgid "Version" msgstr "Versio" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -5,7 +5,7 @@ # Translators: # Antoine Lubineau <antoine@lubignon.info>, 2012 # Antoine Lubineau <antoine@lubignon.info>, 2012-2016 -# Cedric Girard <girard.cedric@gmail.com>, 2011,2014 +# Cedric Girard <girard.cedric@gmail.com>, 2011,2014,2016 # lordheavy <lordheavym@gmail.com>, 2011 # lordheavy <lordheavym@gmail.com>, 2013-2014 # lordheavy <lordheavym@gmail.com>, 2011-2012 @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 21:38+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-11 20:06+0000\n" "Last-Translator: Antoine Lubineau <antoine@lubignon.info>\n" "Language-Team: French (http://www.transifex.com/lfleischer/aur/language/" "fr/)\n" @@ -32,6 +32,21 @@ msgstr "Page non trouvée" msgid "Sorry, the page you've requested does not exist." msgstr "Désolé, la page que vous avez demandée n’existe pas." +msgid "Note" +msgstr "Note" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" +"Les URL de clone Git ne sont pas censées être ouvertes depuis un navigateur." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "Pour cloner le dépôt Git de %s, exécutez %s." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Cliquez %sici%s pour retourner à la page des détails de %s." + msgid "Service Unavailable" msgstr "Service indisponible" @@ -536,7 +551,7 @@ msgstr "" "paquets." msgid "Submit Request" -msgstr "Soumettre la demande" +msgstr "Soumettre une demande" msgid "Close Request" msgstr "Fermer la requête" @@ -931,6 +946,9 @@ msgstr "caché" msgid "Real Name" msgstr "Nom réel" +msgid "Homepage" +msgstr "Accueil" + msgid "IRC Nick" msgstr "Pseudo IRC" @@ -946,6 +964,9 @@ msgstr "Inactif depuis" msgid "Active" msgstr "Actif" +msgid "Registration date:" +msgstr "Date d'enregistrement :" + msgid "Last Login" msgstr "Dernière connexion." @@ -962,6 +983,10 @@ msgstr "Éditer le compte de cet utilisateur." msgid "Click %shere%s if you want to permanently delete this account." msgstr "Cliquez %sici%s si vous voulez effacer ce compte de façon définitive." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Cliquer %sici%s pour obtenir les détails de l'utilisateur." + msgid "required" msgstr "requis" @@ -1012,6 +1037,9 @@ msgstr "Avertir des nouveaux commentaires" msgid "Notify of package updates" msgstr "Notifications de mises à jour de paquets" +msgid "Notify of ownership changes" +msgstr "Notifier des changements de propriétaire" + msgid "Update" msgstr "Mise à jour" @@ -1115,6 +1143,9 @@ msgstr "Voter pour ce paquet" msgid "Disable notifications" msgstr "Désactiver les notifications" +msgid "Enable notifications" +msgstr "Activer les notifications" + msgid "Manage Co-Maintainers" msgstr "Gérer les co-mainteneurs" @@ -1262,9 +1293,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Utiliser ce formulaire pour fermer la requête pour le paquet de base %s%s%s." -msgid "Note" -msgstr "Note" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1301,6 +1329,40 @@ msgstr "Rendre orphelin" msgid "Merge into" msgstr "Fusionner dans" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"En soumettant une requète de suppression, vous demandez à un utilisateur de " +"confiance de supprimer le paquet de base. Ce type de requète doit être " +"utilisé pour les doublons, les logiciels abandonnés par l'upstream ainsi que " +"pour les paquets illégaux ou irréparables." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"En soumettant une requète de fusion, vous demandez à un utilisateur de " +"confiance de supprimer le paquet de base et de transférer les votes et les " +"commentaires vers un autre paquet de base. Fusionner un paquet n'impacte pas " +"le dépot Git correspondant. Assurez-vous de mettre à jour l'historique Git " +"du paquet cible vous-même." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"En soumettant une requète pour rendre orphelin, vous demandez à un " +"utilisateur de confiance de retirer le mainteneur du paquet de base. Merci " +"de ne faire ceci que si le paquet nécessite l'action d'un mainteneur, que le " +"mainteneur ne répond pas et que vous avez préalablement essayé de contacter " +"le mainteneur." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1321,8 +1383,10 @@ msgid "Date" msgstr "Date" #, php-format -msgid "~%d days left" -msgstr "~%d jours restants" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d jour restant" +msgstr[1] "~%d jours restants" #, php-format msgid "~%d hour left" @@ -1420,12 +1484,13 @@ msgstr[1] "%d paquets trouvés." msgid "Version" msgstr "Version" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" "La popularité est calculée à partir de la somme de tous les votes, chacun " -"étant pondéré par un facteur de 0.98 par jour depuis sa création." +"étant pondéré par un facteur de %.2f par jour depuis sa création." msgid "Yes" msgstr "Oui" @@ -3,13 +3,15 @@ # This file is distributed under the same license as the AUR package. # # Translators: +# GenghisKhan <genghiskhan@gmx.ca>, 2016 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 +# Yaron Shahrabani <sh.yaron@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Hebrew (http://www.transifex.com/lfleischer/aur/language/" "he/)\n" @@ -20,20 +22,34 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Page Not Found" -msgstr "" +msgstr "העמוד ×œ× × ×ž×¦×" msgid "Sorry, the page you've requested does not exist." +msgstr "העמוד שביקשת ××™× ×• קיי×, עמך הסליחה." + +msgid "Note" +msgstr "הערה" + +msgid "Git clone URLs are not meant to be opened in a browser." msgstr "" -msgid "Service Unavailable" +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." msgstr "" +msgid "Service Unavailable" +msgstr "השירות ××™× ×• זמין" + msgid "" "Don't panic! This site is down due to maintenance. We will be back soon." -msgstr "" +msgstr "×ל בהלה! ×תר ×–×” הושבת לטובת עבודות תחזוקה. × ×©×•×‘ במהרה." msgid "Account" -msgstr "" +msgstr "חשבון" msgid "Accounts" msgstr "×—×©×‘×•× ×•×ª" @@ -51,23 +67,23 @@ msgid "Use this form to search existing accounts." msgstr "× × ×œ×”×©×ª×ž×© בטופס על ×ž× ×ª לחפש ×חר ×—×©×‘×•× ×•×ª קיימי×." msgid "You must log in to view user information." -msgstr "עליך להתחבר על ×ž× ×ª לצפות ×‘× ×ª×•× ×™ משתמש." +msgstr "עליך ×œ×”×™×›× ×¡ על ×ž× ×ª לצפות ×‘× ×ª×•× ×™ משתמש." msgid "Add Proposal" msgstr "הוספת הצעה" msgid "Invalid token for user action." -msgstr "" +msgstr "×סימון שגוי לפעולת משתמש." msgid "Username does not exist." msgstr "×©× ×”×ž×©×ª×ž×© ×œ× ×§×™×™×." #, php-format msgid "%s already has proposal running for them." -msgstr "%s יש כבר הצעה קיימת." +msgstr "ל־%s יש כבר הצעה קיימת." msgid "Invalid type." -msgstr "" +msgstr "סוג שגוי." msgid "Proposal cannot be empty." msgstr "הצעה ×œ× ×™×›×•×œ×” להיות ריקה." @@ -79,7 +95,7 @@ msgid "Submit a proposal to vote on." msgstr "שליחת הצבעה עבור הפעלת הצבעה." msgid "Applicant/TU" -msgstr "" +msgstr "מועמד/משתמש מהימן" msgid "(empty if not applicable)" msgstr "(ריק ×× ××™× ×” מת×ימה)" @@ -88,13 +104,13 @@ msgid "Type" msgstr "סוג" msgid "Addition of a TU" -msgstr "" +msgstr "הוספת משתמש מהימן" msgid "Removal of a TU" -msgstr "" +msgstr "הסרת משתמש מהימן" msgid "Removal of a TU (undeclared inactivity)" -msgstr "" +msgstr "הסרת משתמש מהימן (חוסר פעילות בלתי מוצהרת)" msgid "Amendment of Bylaws" msgstr "" @@ -106,10 +122,10 @@ msgid "Submit" msgstr "שליחה" msgid "Manage Co-maintainers" -msgstr "" +msgstr "× ×™×”×•×œ ×©×•×ª×¤×™× ×œ×ª×—×–×•×§×”" msgid "Edit comment" -msgstr "" +msgstr "עריכת תגובה" msgid "Home" msgstr "בית" @@ -119,52 +135,62 @@ msgid "" "Welcome to the AUR! Please read the %sAUR User Guidelines%s and %sAUR TU " "Guidelines%s for more information." msgstr "" +"ברוך בו×ך ל־AUR, מ×גר תרומות ×”×ž×©×ª×ž×©×™× ×©×œ ×רץ׳! × × ×œ×§×¨×•× ×ת %s×”×›×œ×œ×™× ×œ×ž×©×ª×ž×© ב־" +"AUR%s ו×ת %s×”×›×œ×œ×™× ×œ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×‘Ö¾AUR%s." #, php-format msgid "" "Contributed PKGBUILDs %smust%s conform to the %sArch Packaging Standards%s " "otherwise they will be deleted!" msgstr "" +"הגדרות PKGBUILD ×©× ×ª×¨×ž×• %sחייבות%s לעמוד ב%s×ª×§× ×™ ×”×ריזה של ×רץ׳%s ×חרת הן " +"×ª×ž×—×§× ×”!" msgid "Remember to vote for your favourite packages!" -msgstr "" +msgstr "×œ× ×œ×©×›×•×— להצביע לחבילות המועדפות עליך!" msgid "Some packages may be provided as binaries in [community]." -msgstr "" +msgstr "יתכן שחלק מהחבילות מסופקות בתור ×§×‘×¦×™× ×‘×™× ×¨×™×™× ×ª×—×ª [community] (קהילה)." msgid "DISCLAIMER" -msgstr "" +msgstr "הבהרה" msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." msgstr "" +"חבילות AUR הן תוכן ×©× ×•×¦×¨ על ידי המשתמשי×. כל שימוש ×‘×§×‘×¦×™× ×©×¡×•×¤×§×• ×”×•× ×¢×œ " +"×חריותך בלבד." msgid "Learn more..." -msgstr "" +msgstr "מידע × ×•×¡×£..." msgid "Support" -msgstr "" +msgstr "תמיכה" msgid "Package Requests" -msgstr "" +msgstr "בקשות חבילה" #, php-format msgid "" "There are three types of requests that can be filed in the %sPackage Actions" "%s box on the package details page:" msgstr "" +"×™×©× × ×©×œ×•×©×” ×¡×•×’×™× ×©×œ בקשות ×©× ×™×ª×Ÿ להגיש בתיבה %sפעולות על חבילה%s בעמוד פרטי " +"החבילה:" msgid "Orphan Request" -msgstr "" +msgstr "בקשה יתומה" msgid "" "Request a package to be disowned, e.g. when the maintainer is inactive and " "the package has been flagged out-of-date for a long time." msgstr "" +"הגשת בקשה ×œ× ×™×ª×•×§ בעלות על חבילה, למשל ×›×שר המתחזק ××™× ×• פעיל והחבילה ×¡×•×ž× ×” " +"×›×œ× ×¢×“×›× ×™×ª במשך זמן מה." msgid "Deletion Request" -msgstr "" +msgstr "בקשת מחיקה" msgid "" "Request a package to be removed from the Arch User Repository. Please do not " @@ -173,7 +199,7 @@ msgid "" msgstr "" msgid "Merge Request" -msgstr "" +msgstr "בקשת מיזוג" msgid "" "Request a package to be merged into another one. Can be used when a package " @@ -187,7 +213,7 @@ msgid "" msgstr "" msgid "Submitting Packages" -msgstr "" +msgstr "שליחת חבילות" #, php-format msgid "" @@ -195,9 +221,11 @@ msgid "" "packages%s section of the Arch User Repository ArchWiki page for more " "details." msgstr "" +"Git על גבי SSH ×”×™× ×”×ª×©×ª×™×ª ×”×¢×“×›× ×™×ª להגשת חבילות ל־AUR. × ×™×ª×Ÿ לעיין בסעיף " +"%sהגשת חבילות%s בעמוד Arch User Repository ב־ArchWiki לקבלת ×¤×¨×˜×™× × ×•×¡×¤×™×." msgid "The following SSH fingerprints are used for the AUR:" -msgstr "" +msgstr "טביעות ×”×צבע מסוג SSH הב×ות × ×ž×¦×ות בשימוש עבור AUR:" msgid "Discussion" msgstr "דיון" @@ -210,7 +238,7 @@ msgid "" msgstr "" msgid "Bug Reporting" -msgstr "" +msgstr "דיווח על ב××’×™×" #, php-format msgid "" @@ -221,10 +249,10 @@ msgid "" msgstr "" msgid "Package Search" -msgstr "" +msgstr "חיפוש חבילות" msgid "Adopt" -msgstr "" +msgstr "×ימוץ" msgid "Vote" msgstr "הצבעה" @@ -239,7 +267,7 @@ msgid "UnNotify" msgstr "ביטול התרעה" msgid "UnFlag" -msgstr "" +msgstr "ביטול סימון" msgid "Login" msgstr "×›× ×™×¡×”" @@ -252,10 +280,10 @@ msgid "Logout" msgstr "× ×™×ª×•×§" msgid "Enter login credentials" -msgstr "" +msgstr "× × ×œ×”×–×™×Ÿ פרטי גישה" msgid "User name or email address" -msgstr "" +msgstr "×©× ×ž×©×ª×ž×© ×ו כתובת דו×״ל" msgid "Password" msgstr "ססמה" @@ -264,12 +292,12 @@ msgid "Remember me" msgstr "שמירת הפרטי×" msgid "Forgot Password" -msgstr "" +msgstr "שכחתי ×ת הססמה" #, php-format msgid "" "HTTP login is disabled. Please %sswitch to HTTPs%s if you want to login." -msgstr "" +msgstr "×›× ×™×¡×” ב×מצעות HTTP ×ž× ×•×˜×¨×œ×ª. × × %sלעבור ל־HTTPs%s ×× ×‘×¨×¦×•× ×š ×œ×”×™×›× ×¡." msgid "Search Criteria" msgstr "×§×¨×™×˜×¨×™×•× ×™× ×œ×—×™×¤×•×©" @@ -291,16 +319,16 @@ msgid "Your password must be at least %s characters." msgstr "הססמה חייבת להיות ב×ורך של %s ×ותיות לפחות." msgid "Invalid e-mail." -msgstr "" +msgstr "כתובת דו×״ל שגויה." msgid "Password Reset" msgstr "×יפוס ססמה" msgid "Check your e-mail for the confirmation link." -msgstr "" +msgstr "× × ×œ×‘×“×•×§ בתיבת הדו×״ל שלך ×× ×”×ª×§×‘×œ קישור ל×ישור." msgid "Your password has been reset successfully." -msgstr "" +msgstr "הססמה שלך הת×פסה בהצלחה." msgid "Confirm your e-mail address:" msgstr "×ישור כתובת הדו×״ל שלך" @@ -312,13 +340,15 @@ msgid "Confirm your new password:" msgstr "×ישור הססמה החדשה:" msgid "Continue" -msgstr "" +msgstr "המשך" #, php-format msgid "" "If you have forgotten the e-mail address you used to register, please send a " "message to the %saur-general%s mailing list." msgstr "" +"×× ×©×›×—×ª ×ת כתובת הדו×״ל בה השתמש כדי להירש×, × × ×œ×©×œ×•×— הודעה לקבוצת הדיוור " +"%saur-general%s." msgid "Enter your e-mail address:" msgstr "× × ×œ×”×–×™×Ÿ ×ת כתובת הדו×״ל שלך:" @@ -326,23 +356,23 @@ msgstr "× × ×œ×”×–×™×Ÿ ×ת כתובת הדו×״ל שלך:" msgid "" "The selected packages have not been disowned, check the confirmation " "checkbox." -msgstr "" +msgstr "החבילות הב×ות ×œ× × ×•×ª×§×• מבעליהן, × × ×œ×¡×ž×Ÿ ×ת התיבה ל×ישור." msgid "Cannot find package to merge votes and comments into." -msgstr "" +msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×—×‘×™×œ×” למיזוג הצבעות ותגובות ×ליה." msgid "Cannot merge a package base with itself." -msgstr "" +msgstr "××™ ×פשר למזג בסיס חבילה ×¢× ×¢×¦×ž×•." msgid "" "The selected packages have not been deleted, check the confirmation checkbox." msgstr "החבילות ×©× ×‘×—×¨×• ×œ× × ×ž×—×§×•, × × ×œ×‘×—×•×¨ בתיבת ×”×ישור." msgid "Package Deletion" -msgstr "" +msgstr "מחיקת חבילות" msgid "Delete Package" -msgstr "" +msgstr "מחיקת חבילה" #, php-format msgid "" @@ -351,22 +381,22 @@ msgid "" msgstr "" msgid "Deletion of a package is permanent. " -msgstr "" +msgstr "מחיקת חבילה ×”×™× ×œ×¦×ž×™×ª×•×ª." msgid "Select the checkbox to confirm action." -msgstr "" +msgstr "× × ×œ×‘×—×•×¨ ×ת תיבת הסימון כדי ל×שר ×ת הפעולה." msgid "Confirm package deletion" -msgstr "" +msgstr "×ישור מחיקת חבילה" msgid "Delete" -msgstr "" +msgstr "מחיקה" msgid "Only Trusted Users and Developers can delete packages." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×ž×—×•×§ חבילות." msgid "Disown Package" -msgstr "" +msgstr "× ×™×ª×•×§ בעלות על חבילה" #, php-format msgid "" @@ -379,25 +409,27 @@ msgid "" "By selecting the checkbox, you confirm that you want to disown the package " "and transfer ownership to %s%s%s." msgstr "" +"על ידי סימון תיבת הבחירה, × ×™×ª×Ÿ ×ישורך ×œ× ×™×ª×•×§ הבעלות על חבילה והעברת הבעלות " +"×ל %s%s%s." msgid "" "By selecting the checkbox, you confirm that you want to disown the package." -msgstr "" +msgstr "על ידי סימון תיבת הבחירה, × ×ª×ª ×ת ×ישורך ×œ× ×™×ª×•×§ הבעלות על חבילה." msgid "Confirm to disown the package" -msgstr "" +msgstr "×ישור × ×™×ª×•×§ בעלות החבילה" msgid "Disown" -msgstr "" +msgstr "× ×™×ª×•×§ בעלות" msgid "Only Trusted Users and Developers can disown packages." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ× ×ª×§ בעלות של חבילות." msgid "Flag Comment" -msgstr "" +msgstr "סימון התגובה" msgid "Flag Package Out-Of-Date" -msgstr "" +msgstr "סימון תגובה כבלתי ×¢×“×›× ×™×ª" #, php-format msgid "" @@ -415,70 +447,72 @@ msgid "" "Enter details on why the package is out-of-date below, preferably including " "links to the release announcement or the new release tarball." msgstr "" +"× × ×œ×”×–×™×Ÿ ×ת ×”×¤×¨×˜×™× ×¢×œ מדוע החבילה ××™× ×” בתוקף, מומלץ להוסיף ×§×™×©×•×¨×™× ×œ×”×›×¨×–×•×ª " +"המת×ימות ×ו לקובצי הגרסה ×”×¢×“×›× ×™×ª." msgid "Comments" -msgstr "" +msgstr "תגובות" msgid "Flag" -msgstr "" +msgstr "סימון" msgid "Only registered users can flag packages out-of-date." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×™×›×•×œ×™× ×œ×¡×ž×Ÿ חבילות כפגות תוקף." msgid "Package Merging" -msgstr "" +msgstr "מיזוג חבילות" msgid "Merge Package" -msgstr "" +msgstr "מיזוג חבילה" #, php-format msgid "Use this form to merge the package base %s%s%s into another package. " msgstr "" msgid "The following packages will be deleted: " -msgstr "" +msgstr "החבילות הב×ות ×ª×™×ž×—×§× ×”:" msgid "Once the package has been merged it cannot be reversed. " -msgstr "" +msgstr "ל×חר מיזוג החבילות ×œ× × ×™×ª×Ÿ לחזור ×חורה בתהליך." msgid "Enter the package name you wish to merge the package into. " -msgstr "" +msgstr "× × ×œ×”×–×™×Ÿ ×ת ×©× ×”×—×‘×™×œ×” ש×ליה ×‘×¨×¦×•× ×š למזג ×ת החבילה." msgid "Merge into:" -msgstr "" +msgstr "מיזוג לתוך:" msgid "Confirm package merge" -msgstr "" +msgstr "×ימות מיזוג חבילה" msgid "Merge" -msgstr "" +msgstr "מיזוג" msgid "Only Trusted Users and Developers can merge packages." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×ž×–×’ חבילות." msgid "Submit Request" -msgstr "" +msgstr "שליחת בקשה" msgid "Close Request" -msgstr "" +msgstr "סגירת בקשה" msgid "First" -msgstr "" +msgstr "ר×שון" msgid "Previous" -msgstr "" +msgstr "הקוד×" msgid "Next" msgstr "הב×" msgid "Last" -msgstr "" +msgstr "×חרון" msgid "Requests" -msgstr "" +msgstr "בקשות" msgid "Register" -msgstr "" +msgstr "הרשמה" msgid "Use this form to create an account." msgstr "× ×™×ª×Ÿ להשתמש בטופס ×–×” על ×ž× ×ª ליצור חשבון." @@ -493,7 +527,7 @@ msgid "Voting is closed for this proposal." msgstr "ההצבעה סגורה עבור הצעה זו." msgid "Only Trusted Users are allowed to vote." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×ž×•×¨×©×™× ×œ×”×¦×‘×™×¢." msgid "You cannot vote in an proposal about you." msgstr "×ין ב×פשרותך להצביע עבור הצעה הקשורה בך." @@ -505,13 +539,13 @@ msgid "Vote ID not valid." msgstr "מס׳ הזיהוי של ההצבעה ××™× ×• תקין." msgid "Current Votes" -msgstr "הצבעות × ×•×›×—×™×•×ª" +msgstr "קולות × ×•×›×—×™×™×" msgid "Past Votes" -msgstr "" +msgstr "קולות עבר" msgid "Voters" -msgstr "" +msgstr "מצביעי×" msgid "" "Account registration has been disabled for your IP address, probably due to " @@ -519,7 +553,7 @@ msgid "" msgstr "" msgid "Missing User ID" -msgstr "חסר מס׳ הזיהוי של המשתמש" +msgstr "מס׳ הזיהוי של המשתמש חסר" msgid "The username is invalid." msgstr "×©× ×”×ž×©×ª×ž×© ××™× ×• חוקי." @@ -538,58 +572,60 @@ msgid "The email address is invalid." msgstr "כתובת הדו×״ל ×©×”×•×–× ×” ××™× ×” ×ª×§×™× ×”." msgid "The PGP key fingerprint is invalid." -msgstr "" +msgstr "טביעת ×”×צבע מסוג PGP שגויה." msgid "The SSH public key is invalid." -msgstr "" +msgstr "מפתח ×”Ö¾SSH הציבורי שגוי." msgid "Cannot increase account permissions." -msgstr "" +msgstr "×œ× × ×™×ª×Ÿ להגדיל ×ת הרש×ות החשבון." msgid "Language is not currently supported." msgstr "שפה כרגע ×œ× × ×ª×ž×›×ª." #, php-format msgid "The username, %s%s%s, is already in use." -msgstr "" +msgstr "×©× ×”×ž×©×ª×ž×©, %s%s%s, כבר × ×ž×¦× ×‘×©×™×ž×•×©." #, php-format msgid "The address, %s%s%s, is already in use." -msgstr "" +msgstr "הכתובת, %s%s%s, כבר × ×ž×¦×ת בשימוש." #, php-format msgid "The SSH public key, %s%s%s, is already in use." -msgstr "" +msgstr "מפתח ×”Ö¾SSH הציבורי, %s%s%s, כבר × ×ž×¦× ×‘×©×™×ž×•×©." #, php-format msgid "Error trying to create account, %s%s%s." -msgstr "" +msgstr "×ירעה שגי××” ×‘× ×™×¡×™×•×Ÿ ליצירת חשבון, %s%s%s." #, php-format msgid "The account, %s%s%s, has been successfully created." -msgstr "" +msgstr "החשבון, %s%s%s, × ×•×¦×¨ בהצלחה." msgid "A password reset key has been sent to your e-mail address." -msgstr "" +msgstr "מפתח ×יפוס ססמה × ×©×œ×— לכתובת הדו×״ל שלך." msgid "Click on the Login link above to use your account." -msgstr "" +msgstr "× × ×œ×œ×—×•×¥ על קישור ×”×›× ×™×¡×” להלן כדי להשתמש בחשבון שלך." #, php-format msgid "No changes were made to the account, %s%s%s." -msgstr "" +msgstr "×œ× ×‘×•×¦×¢×• ×©×™× ×•×™×™× ×‘×—×©×‘×•×Ÿ, %s%s%s." #, php-format msgid "The account, %s%s%s, has been successfully modified." -msgstr "" +msgstr "החשבון, %s%s%s, ×”×©×ª× ×” בהצלחה." msgid "" "The login form is currently disabled for your IP address, probably due to " "sustained spam attacks. Sorry for the inconvenience." msgstr "" +"כתובת ×”×›× ×™×¡×” ×ž× ×•×˜×¨×œ×ª לכתובת ×”Ö¾ IP שלך, ×›× ×¨××” עקב מתקפות ספ×× ×ž×ª×ž×©×›×•×ª. ×× ×• " +"×ž×ª× ×¦×œ×™× ×¢×œ ××™ ×”× ×•×—×•×ª." msgid "Account suspended" -msgstr "" +msgstr "חשבון מושעה" #, php-format msgid "" @@ -599,35 +635,35 @@ msgid "" msgstr "" msgid "Bad username or password." -msgstr "" +msgstr "×©× ×”×ž×©×ª×ž×© ×ו הססמה שגויי×." msgid "An error occurred trying to generate a user session." -msgstr "" +msgstr "×ירעה שגי××” בעת ×”× ×™×¡×™×•×Ÿ ליצירת הפעלת משתמש." msgid "Invalid e-mail and reset key combination." -msgstr "" +msgstr "השילוב בין כתובת דו×״ל למפתח ×יפוס שגוי." msgid "None" -msgstr "" +msgstr "לל×" #, php-format msgid "View account information for %s" -msgstr "" +msgstr "הצגת פרטי החשבון %s" msgid "Package base ID or package base name missing." msgstr "" msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "×ין לך הרש××” לערוך ×ת התגובה הזו." msgid "Comment does not exist." -msgstr "" +msgstr "התגובה ××™× ×” קיימת." msgid "Comment cannot be empty." -msgstr "" +msgstr "התגובה ×œ× ×™×›×•×œ×” להיש×ר ריקה." msgid "Comment has been added." -msgstr "" +msgstr "× ×•×¡×¤×” תגובה." msgid "You must be logged in before you can edit package information." msgstr "עליך ×œ×”×™×›× ×¡ ×œ×¤× ×™ שיהיה ב×פשרותך לערוך × ×ª×•× ×™ חבילה." @@ -636,19 +672,19 @@ msgid "Missing comment ID." msgstr "חסר מס׳ זיהוי להערה." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "××™ ×פשר להצמיד למעלה מ־5 תגובות." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "×ין לך הרש××” להצמיד תגובה זו." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "×ין לך הרשה לבטל ×ת ההצמדה של תגובה זו." msgid "Comment has been pinned." -msgstr "" +msgstr "התגובה הוצמדה." msgid "Comment has been unpinned." -msgstr "" +msgstr "הצמדת התגובה בוטלה." msgid "Error retrieving package details." msgstr "שגי××” בקבלת × ×ª×•× ×™ חבילה." @@ -663,7 +699,7 @@ msgid "You did not select any packages to flag." msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª לסימון." msgid "The selected packages have not been flagged, please enter a comment." -msgstr "" +msgstr "החבילות ×”× ×‘×—×¨×•×ª ×œ× ×¡×•×ž× ×•, × × ×œ×›×ª×•×‘ תגובה." msgid "The selected packages have been flagged out-of-date." msgstr "החבילות ×©× ×‘×—×¨×• ×ž×¡×•×ž× ×•×ª ×›×œ× ×¢×“×›× ×™×•×ª." @@ -678,7 +714,7 @@ msgid "The selected packages have been unflagged." msgstr "החבילות ×©× ×‘×—×¨×• בוטלו מהסימון." msgid "You do not have permission to delete packages." -msgstr "" +msgstr "×ין לך הרש××” למחוק חבילות." msgid "You did not select any packages to delete." msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª למחיקה." @@ -690,19 +726,19 @@ msgid "You must be logged in before you can adopt packages." msgstr "עליך ×œ×”×™×›× ×¡ ×œ×¤× ×™ שיהיה ב×פשרותך ל×מץ חבילות." msgid "You must be logged in before you can disown packages." -msgstr "עליך ×œ×”×™×›× ×¡ ×œ×¤× ×™ שיהיה ב×פשרותך לבטל בעלות מחבילות." +msgstr "עליך ×œ×”×™×›× ×¡ ×œ×¤× ×™ שיהיה ב×פשרותך ×œ× ×ª×§ בעלות על חבילות." msgid "You did not select any packages to adopt." msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª ל×ימוץ." msgid "You did not select any packages to disown." -msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª להסרת בעלותך מהן." +msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª ×œ× ×™×ª×•×§ בעלותך מהן." msgid "The selected packages have been adopted." msgstr "החבילות ×©× ×‘×—×¨×• ×ומצו." msgid "The selected packages have been disowned." -msgstr "החבילות ×”×ž×¡×•×ž× ×•×ª × × ×˜×©×•" +msgstr "החבילות ×”×ž×¡×•×ž× ×•×ª × × ×˜×©×• על ידי בעליהן." msgid "You must be logged in before you can vote for packages." msgstr "עליך ×œ×”×™×›× ×¡ ×œ×¤× ×™ שתהיה ב×פשרותך להצביע לחבילות." @@ -731,10 +767,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "הוסרת מרשימה ההתרעות עבור ההערות של %s." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "×ין לך הרש××” לשחזר ×ת התגובה הזו." msgid "Comment has been undeleted." -msgstr "" +msgstr "התגובה שוחזרה." msgid "You are not allowed to delete this comment." msgstr "×ין לך הרש××” למחוק הערה זו." @@ -743,7 +779,7 @@ msgid "Comment has been deleted." msgstr "הערה × ×ž×—×§×”." msgid "Comment has been edited." -msgstr "" +msgstr "התגובה × ×¢×¨×›×”." msgid "You are not allowed to edit the keywords of this package base." msgstr "" @@ -752,56 +788,56 @@ msgid "The package base keywords have been updated." msgstr "" msgid "You are not allowed to manage co-maintainers of this package base." -msgstr "" +msgstr "×ין לך הרש××” ×œ× ×”×œ ×ת מתחזקי ×”×ž×©× ×” לבסיס חבילה ×–×”." #, php-format msgid "Invalid user name: %s" -msgstr "" +msgstr "×©× ×ž×©×ª×ž×© שגוי: %s" msgid "The package base co-maintainers have been updated." -msgstr "" +msgstr "מתחזקי ×”×ž×©× ×” של בסיס החבילה ×¢×•×“×›× ×•." msgid "View packages details for" -msgstr "" +msgstr "הצגת פרטי החבילה עבור" #, php-format msgid "requires %s" msgstr "" msgid "You must be logged in to file package requests." -msgstr "" +msgstr "עליך ×œ×”×™×›× ×¡ כדי להגיש בקשות חבילה." msgid "Invalid name: only lowercase letters are allowed." msgstr "×©× ×œ× ×—×•×§×™: רק ×ותיות ×§×˜× ×•×ª מותרות." msgid "The comment field must not be empty." -msgstr "" +msgstr "שדה התגובה ×œ× ×™×›×•×œ להיש×ר ריק." msgid "Invalid request type." -msgstr "" +msgstr "סוג הבקשה שגוי." msgid "Added request successfully." -msgstr "" +msgstr "התגובה × ×•×¡×¤×” בהצלחה." msgid "Invalid reason." -msgstr "" +msgstr "הסיבה שגויה." msgid "Only TUs and developers can close requests." -msgstr "" +msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×¡×’×•×¨ בקשות." msgid "Request closed successfully." -msgstr "" +msgstr "הבקשה × ×¡×’×¨×” בהצלחה." #, php-format msgid "You can use this form to permanently delete the AUR account %s." -msgstr "" +msgstr "× ×™×ª×Ÿ להשתמש בטופס ×–×” כדי למחוק ×ת חשבון ×”Ö¾AUR ×‘×©× %s לצמיתות." #, php-format msgid "%sWARNING%s: This action cannot be undone." -msgstr "" +msgstr "%s×זהרה%s: ×œ× × ×™×ª×Ÿ לחזור בך מפעולה זו." msgid "Confirm deletion" -msgstr "" +msgstr "×ימות מחיקה" msgid "Username" msgstr "×©× ×ž×©×ª×ž×©" @@ -816,7 +852,7 @@ msgid "Developer" msgstr "מפתח" msgid "Trusted User & Developer" -msgstr "" +msgstr "משתמש מהימן ומפתח" msgid "Email Address" msgstr "כתובת דו×״ל" @@ -827,24 +863,30 @@ msgstr "" msgid "Real Name" msgstr "×©× ×מתי" +msgid "Homepage" +msgstr "עמוד הבית" + msgid "IRC Nick" -msgstr "×›×™× ×•×™ ב־IRC" +msgstr "×›×™× ×•×™ IRC" msgid "PGP Key Fingerprint" -msgstr "" +msgstr "טביעת ×צבע מסוג PGP" msgid "Status" msgstr "מצב" msgid "Inactive since" -msgstr "" +msgstr "×ין פעילות מ××–" msgid "Active" msgstr "פעיל" -msgid "Last Login" +msgid "Registration date:" msgstr "" +msgid "Last Login" +msgstr "×›× ×™×¡×” ××—×¨×•× ×”" + msgid "Never" msgstr "לעול×" @@ -852,10 +894,14 @@ msgid "View this user's packages" msgstr "צפייה בחבילות המשתמש" msgid "Edit this user's account" -msgstr "" +msgstr "עריכת החשבון של משתמש ×–×”" #, php-format msgid "Click %shere%s if you want to permanently delete this account." +msgstr "× × ×œ×œ×—×•×¥ %s×›×ן%s ×× ×¨×¦×•× ×š ×”×•× ×œ×ž×—×•×§ ×ת החשבון ×”×–×” לצמיתות." + +#, php-format +msgid "Click %shere%s for user details." msgstr "" msgid "required" @@ -871,15 +917,15 @@ msgid "Account Suspended" msgstr "חשבון מושעה" msgid "Inactive" -msgstr "" +msgstr "בלתי פעיל" msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." -msgstr "" +msgstr "× × ×œ×•×•×“× ×©×”×–× ×ª ×ת כתובת הדו×״ל שלך כר×וי, ×חרת ×—×©×‘×•× ×š ×™×™× ×¢×œ." msgid "Hide Email Address" -msgstr "" +msgstr "הסתרת כתובת דו×״ל" msgid "Re-type password" msgstr "הקלדת הססמה מחדש" @@ -890,19 +936,22 @@ msgstr "שפה" msgid "" "The following information is only required if you want to submit packages to " "the Arch User Repository." -msgstr "" +msgstr "המידע ×”×‘× × ×—×•×¥ רק ×× ×‘×¨×¦×•× ×š להגיש חבילות למ×גר החבילות של ×רץ׳." msgid "SSH Public Key" -msgstr "" +msgstr "מפתח SSH ציבורי" msgid "Notification settings" -msgstr "" +msgstr "הגדרות התרעה" msgid "Notify of new comments" -msgstr "" +msgstr "להודיע לי על תגובות חדשות" msgid "Notify of package updates" -msgstr "" +msgstr "להודיע לי ל ×¢×“×›×•× ×™× ×‘×—×‘×™×œ×”" + +msgid "Notify of ownership changes" +msgstr "להודיע לי על ×©×™× ×•×™×™× ×‘×‘×¢×œ×•×ª" msgid "Update" msgstr "עדכון" @@ -923,7 +972,7 @@ msgid "Suspended" msgstr "השעייה" msgid "Edit" -msgstr "" +msgstr "עריכה" msgid "Less" msgstr "פחות" @@ -938,12 +987,13 @@ msgstr "×ין יותר תוצ×ות להצגה." msgid "" "Use this form to add co-maintainers for %s%s%s (one user name per line):" msgstr "" +"× ×™×ª×Ÿ להשתמש בטופס ×–×” כדי להוסיף מתחזקי ×ž×©× ×” %s%s%s (×©× ×ž×©×ª×ž×© ×חד בשורה):" msgid "Users" -msgstr "" +msgstr "משתמשי×" msgid "Save" -msgstr "" +msgstr "שמירה" #, php-format msgid "Flagged Out-of-Date Comment: %s" @@ -955,35 +1005,35 @@ msgstr "" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s ××™× ×” ×ž×¡×•×ž× ×ª כפגת תוקף." msgid "Return to Details" -msgstr "" +msgstr "חזרה לפרטי×" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "כל הזכויות שמורות %s 2004-%d לצוות הפיתוח של aurweb." msgid "My Packages" msgstr "החבילות שלי" msgid " My Account" -msgstr "" +msgstr "החשבון שלי" msgid "Package Actions" -msgstr "" +msgstr "פעולות חבילה" msgid "View PKGBUILD" -msgstr "" +msgstr "הצגת ×”Ö¾PKGBUILD" msgid "View Changes" -msgstr "" +msgstr "הצגת ×”×©×™× ×•×™×™×" msgid "Download snapshot" -msgstr "" +msgstr "הורדת לכידה ×¢×“×›× ×™×ª" msgid "Search wiki" -msgstr "" +msgstr "חיפוש בוויקי" #, php-format msgid "Flagged out-of-date (%s)" @@ -993,43 +1043,46 @@ msgid "Flag package out-of-date" msgstr "" msgid "Unflag package" -msgstr "" +msgstr "ביטול סימון חבילה" msgid "Remove vote" -msgstr "" +msgstr "הסרת הצבעה" msgid "Vote for this package" -msgstr "" +msgstr "להצביע לחבילה זו" msgid "Disable notifications" -msgstr "" +msgstr "× ×˜×¨×•×œ התרעות" + +msgid "Enable notifications" +msgstr "הפעלת התרעות" msgid "Manage Co-Maintainers" -msgstr "" +msgstr "× ×™×”×•×œ מתחזקי ×ž×©× ×”" #, php-format msgid "%d pending request" msgid_plural "%d pending requests" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "בקשה %d ×ž×ž×ª×™× ×”" +msgstr[1] "%d בקשות ×ž×ž×ª×™× ×•×ª" msgid "Adopt Package" -msgstr "" +msgstr "×ימוץ חבילה" msgid "unknown" -msgstr "" +msgstr "×œ× ×ž×•×›×¨" msgid "Package Base Details" -msgstr "" +msgstr "פרטי בסיס החבילה" msgid "Git Clone URL" -msgstr "" +msgstr "כתובת השכפול מ־Git" msgid "read-only" -msgstr "" +msgstr "לקרי××” בלבד" msgid "Keywords" -msgstr "" +msgstr "מילות מפתח" msgid "Submitter" msgstr "" @@ -1038,120 +1091,117 @@ msgid "Maintainer" msgstr "מתחזק" msgid "Last Packager" -msgstr "" +msgstr "× ×רז ל××—×¨×•× ×” ×¢×´×™" msgid "Votes" msgstr "הצבעות" msgid "Popularity" -msgstr "" +msgstr "פופולריות" msgid "First Submitted" -msgstr "" +msgstr "× ×©×œ×—×” לר××©×•× ×”" msgid "Last Updated" -msgstr "" +msgstr "×¢×•×“×›× ×” ב××—×¨×•× ×”" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "עריכת תגובה עבור: %s" msgid "Add Comment" -msgstr "" +msgstr "הוספת תגובה" msgid "View all comments" -msgstr "" +msgstr "הצגת כל התגובות" msgid "Pinned Comments" -msgstr "" +msgstr "תגובות × ×¢×•×¦×•×ª" msgid "Latest Comments" -msgstr "" +msgstr "התגובות ×”××—×¨×•× ×•×ª" #, php-format msgid "%s commented on %s" -msgstr "" +msgstr "× ×›×ª×‘×” תגובה ×¢×´×™ %s על %s" #, php-format msgid "Anonymous comment on %s" -msgstr "" +msgstr "תגובה ××œ×ž×•× ×™×ª על %s" #, php-format msgid "deleted on %s by %s" -msgstr "" +msgstr "× ×ž×—×§×” ב־%s ×¢×´×™ %s" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "× ×ž×—×§×” ב־%s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "× ×¢×¨×›×” בת×ריך %s ×¢×´×™ %s" #, php-format msgid "edited on %s" -msgstr "" +msgstr "× ×¢×¨×›×” ב־%s" msgid "Undelete comment" -msgstr "" +msgstr "ביטול מחיקת התגובה" msgid "Delete comment" msgstr "מחיקת הערה" msgid "Pin comment" -msgstr "" +msgstr "הצמדת התגובה" msgid "Unpin comment" -msgstr "" +msgstr "ביטול הצמדת התגובה" msgid "All comments" -msgstr "" +msgstr "כל התגובות" msgid "Package Details" msgstr "× ×ª×•× ×™ חבילה" msgid "Package Base" -msgstr "" +msgstr "בסיס החבילה" msgid "Description" msgstr "תי×ור" msgid "Upstream URL" -msgstr "" +msgstr "כתובת מ×גר המקור" msgid "Visit the website for" -msgstr "" +msgstr "ביקור ב×תר של" msgid "Licenses" -msgstr "" +msgstr "×¨×™×©×™×•× ×•×ª" msgid "Groups" -msgstr "" +msgstr "קבוצות" msgid "Conflicts" -msgstr "" +msgstr "×”×ª× ×’×©×•×™×•×ª" msgid "Provides" -msgstr "" +msgstr "מספקת" msgid "Replaces" -msgstr "" +msgstr "מחליפה" msgid "Dependencies" -msgstr "תלות" +msgstr "תלויות" msgid "Required by" -msgstr "× ×“×¨×© על ידי" +msgstr "× ×“×¨×©×ª על ידי" msgid "Sources" -msgstr "" +msgstr "מקורות" #, php-format msgid "Use this form to close the request for package base %s%s%s." -msgstr "" - -msgid "Note" -msgstr "" +msgstr "× ×™×ª×Ÿ להשתמש בטופס ×–×” כדי לסגור ×ת הבקשה לבסיס החבילה %s%s%s." msgid "" "The comments field can be left empty. However, it is highly recommended to " @@ -1159,13 +1209,13 @@ msgid "" msgstr "" msgid "Reason" -msgstr "" +msgstr "סיבה" msgid "Accepted" -msgstr "" +msgstr "התקבל" msgid "Rejected" -msgstr "" +msgstr "× ×“×—×”" #, php-format msgid "" @@ -1174,81 +1224,103 @@ msgid "" msgstr "" msgid "Request type" -msgstr "" +msgstr "סוג הבקשה" msgid "Deletion" -msgstr "" +msgstr "מחיקה" msgid "Orphan" -msgstr "" +msgstr "יתומה" msgid "Merge into" +msgstr "מיזוג לתוך" + +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." msgstr "" #, php-format msgid "%d package request found." msgid_plural "%d package requests found." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "× ×ž×¦××” בקשה ×חת (%d) לחבילה." +msgstr[1] "× ×ž×¦×ו %d בקשות לחבילות." #, php-format msgid "Page %d of %d." -msgstr "" +msgstr "עמוד %d מתוך %d." msgid "Package" -msgstr "" +msgstr "חבילה" msgid "Filed by" -msgstr "" +msgstr "הוגש ×¢×´×™" msgid "Date" -msgstr "" +msgstr "ת×ריך" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "× ×•×ª×¨ ~%d ×חד" +msgstr[1] "× ×•×ª×¨×• ~%d ימי×" #, php-format msgid "~%d hour left" msgid_plural "~%d hours left" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "× ×•×ª×¨×” שעה ~%d" +msgstr[1] "~%d שעות × ×•×ª×¨×•" msgid "<1 hour left" -msgstr "" +msgstr "× ×•×ª×¨×” פחות משעה" msgid "Accept" -msgstr "" +msgstr "קבלה" msgid "Locked" -msgstr "" +msgstr "× × ×¢×œ" msgid "Close" -msgstr "" +msgstr "סגירה" msgid "Closed" -msgstr "" +msgstr "סגור" msgid "Name, Description" -msgstr "" +msgstr "ש×, תי×ור" msgid "Name Only" -msgstr "" +msgstr "×©× ×‘×œ×‘×“" msgid "Exact Name" -msgstr "" +msgstr "×©× ×ž×“×•×™×§" msgid "Exact Package Base" -msgstr "" +msgstr "בסיס החבילה המדויק" msgid "All" -msgstr "" +msgstr "הכול" msgid "Flagged" -msgstr "" +msgstr "×ž×¡×•×ž× ×ª" msgid "Not Flagged" -msgstr "" +msgstr "×œ× ×ž×¡×•×ž× ×ª" msgid "Name" msgstr "ש×" @@ -1257,22 +1329,22 @@ msgid "Voted" msgstr "הצביעו" msgid "Last modified" -msgstr "" +msgstr "מועד ×©×™× ×•×™ ×חרון" msgid "Ascending" -msgstr "" +msgstr "עולה" msgid "Descending" -msgstr "" +msgstr "יורד" msgid "Enter search criteria" -msgstr "" +msgstr "× × ×œ×”×–×™×Ÿ ×ª× ××™ חיפוש" msgid "Search by" msgstr "חיפוש לפי" msgid "Out of Date" -msgstr "" +msgstr "×œ× ×¢×“×›× ×™" msgid "Sort by" msgstr "סידור לפי" @@ -1298,15 +1370,16 @@ msgstr "×ין חבילות התו×מות ×œ× ×ª×•× ×™ החיפוש שלך." #, php-format msgid "%d package found." msgid_plural "%d packages found." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "× ×ž×¦××” חבילה %d." +msgstr[1] "× ×ž×¦×ו %d חבילות." msgid "Version" -msgstr "" +msgstr "גרסה" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -1325,7 +1398,7 @@ msgid "Adopt Packages" msgstr "×ימוץ חבילות" msgid "Disown Packages" -msgstr "שחרור בעלות על חבילות" +msgstr "× ×™×ª×•×§ בעלות על חבילות" msgid "Delete Packages" msgstr "מחיקת חבילות" @@ -1340,37 +1413,37 @@ msgid "Search" msgstr "חיפוש" msgid "Statistics" -msgstr "" +msgstr "סטטיסטיקות" msgid "Orphan Packages" -msgstr "" +msgstr "חבילות יתומות" msgid "Packages added in the past 7 days" -msgstr "" +msgstr "חבילות ×©× ×•×¡×¤×• בשבוע החולף" msgid "Packages updated in the past 7 days" -msgstr "" +msgstr "חבילות ×©×¢×•×“×›× ×• בשבוע החולף" msgid "Packages updated in the past year" -msgstr "" +msgstr "חבילות ×©×¢×•×“×›× ×• ×‘×©× ×” החולפת" msgid "Packages never updated" -msgstr "" +msgstr "חבילות ×©×œ× ×¢×•×“×›× ×• מעול×" msgid "Registered Users" -msgstr "" +msgstr "×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×" msgid "Trusted Users" -msgstr "" +msgstr "×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™×" msgid "Recent Updates" -msgstr "" +msgstr "×¢×“×›×•× ×™× ××—×¨×•× ×™×" msgid "more" -msgstr "" +msgstr "עוד" msgid "My Statistics" -msgstr "" +msgstr "הסטטיסטיקות שלי" msgid "Proposal Details" msgstr "פרטי הצעה" @@ -1386,7 +1459,7 @@ msgid "End" msgstr "סוף" msgid "Result" -msgstr "" +msgstr "תוצ××”" msgid "No" msgstr "ל×" @@ -1398,13 +1471,13 @@ msgid "Total" msgstr "סך הכול" msgid "Participation" -msgstr "" +msgstr "השתתפות" msgid "Last Votes by TU" -msgstr "" +msgstr "הצבעות ××—×¨×•× ×•×ª של ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™×" msgid "Last vote" -msgstr "" +msgstr "הצבעה ××—×¨×•× ×”" msgid "No results found." msgstr "תוצ×ות ×œ× × ×ž×¦×ו." @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Croatian (http://www.transifex.com/lfleischer/aur/language/" "hr/)\n" @@ -26,6 +26,20 @@ msgstr "" msgid "Sorry, the page you've requested does not exist." msgstr "" +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "" @@ -828,6 +842,9 @@ msgstr "" msgid "Real Name" msgstr "VaÅ¡e stvarno ime" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Nadimak na IRC-u" @@ -843,6 +860,9 @@ msgstr "" msgid "Active" msgstr "Aktivan" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "" @@ -859,6 +879,10 @@ msgstr "" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "obvezno" @@ -905,6 +929,9 @@ msgstr "" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Ažuriraj" @@ -1005,6 +1032,9 @@ msgstr "" msgid "Disable notifications" msgstr "" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1152,9 +1182,6 @@ msgstr "Izvor" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1187,6 +1214,26 @@ msgstr "" msgid "Merge into" msgstr "" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1208,8 +1255,11 @@ msgid "Date" msgstr "" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, php-format msgid "~%d hour left" @@ -1309,9 +1359,10 @@ msgstr[2] "" msgid "Version" msgstr "" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -3,15 +3,16 @@ # This file is distributed under the same license as the AUR package. # # Translators: -# György Balló <ballogy@freestart.hu>, 2013 -# György Balló <ballogy@freestart.hu>, 2011,2013-2015 +# György Balló <ballogyor@gmail.com>, 2013 +# György Balló <ballogyor@gmail.com>, 2011,2013-2016 +# György Balló <ballogyor@gmail.com>, 2016 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Hungarian (http://www.transifex.com/lfleischer/aur/language/" "hu/)\n" @@ -27,6 +28,20 @@ msgstr "Az oldal nem található" msgid "Sorry, the page you've requested does not exist." msgstr "Sajnálom, a megtekinteni kÃvánt oldal nem létezik." +msgid "Note" +msgstr "Megjegyzés" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Szolgáltatás nem elérhetÅ‘" @@ -112,7 +127,7 @@ msgid "Manage Co-maintainers" msgstr "Társkarbantartók kezelése" msgid "Edit comment" -msgstr "" +msgstr "Hozzászólás szerkesztése" msgid "Home" msgstr "Honlap" @@ -146,6 +161,8 @@ msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." msgstr "" +"Az AUR csomagok felhasználók által készÃtett tartalmak. A szolgáltatott " +"fájlok használata csak saját felelÅ‘sségre." msgid "Learn more..." msgstr "Tudj meg többet..." @@ -246,6 +263,11 @@ msgid "" "%sonly%s. To report packaging bugs contact the package maintainer or leave a " "comment on the appropriate package page." msgstr "" +"Ha találsz egy hibát az AUR webes felületén, kérünk, tölts ki egy " +"hibajelentést a %shibakövetÅ‘nkben%s. A hibakövetÅ‘t %scsak%s az AUR webes " +"felületén található hibák jelentésére használd. Csomagolási hibák " +"jelentéséhez lépj kapcsolatba a csomag fenntartójával, vagy hagyj egy " +"hozzászólást a megfelelÅ‘ csomag oldalán." msgid "Package Search" msgstr "Csomag keresése" @@ -282,7 +304,7 @@ msgid "Enter login credentials" msgstr "Bejelentkezési adatok megadása" msgid "User name or email address" -msgstr "" +msgstr "Felhasználónév vagy e-mail cÃm" msgid "Password" msgstr "Jelszó" @@ -363,7 +385,7 @@ msgstr "" msgid "Cannot find package to merge votes and comments into." msgstr "" -"Nem található csomag, amelybe a szavazatok és megjegyzések beolvaszthatók " +"Nem található csomag, amelybe a szavazatok és hozzászólások beolvaszthatók " "lennének." msgid "Cannot merge a package base with itself." @@ -440,36 +462,42 @@ msgstr "" "Csak megbÃzható felhasználók és fejlesztÅ‘k tudnak megtagadni csomagokat." msgid "Flag Comment" -msgstr "" +msgstr "Hozzászólás jelölése" msgid "Flag Package Out-Of-Date" -msgstr "" +msgstr "Csomag elvaultnak jelölése" #, php-format msgid "" "Use this form to flag the package base %s%s%s and the following packages out-" "of-date: " msgstr "" +"Használd ezt az űrlapot annak jelzésére, hogy a(z) %s%s%s alapcsomag és a " +"következÅ‘ csomagok elavultak:" #, php-format msgid "" "Please do %snot%s use this form to report bugs. Use the package comments " "instead." msgstr "" +"Kérünk, %sne%s használd ezt az űrlapot hibák jelentéséhez. Használd a " +"csomaghozzászólásokat helyette." msgid "" "Enter details on why the package is out-of-date below, preferably including " "links to the release announcement or the new release tarball." msgstr "" +"Add meg alább a részleteit, hogy miért avult el a csomag, lehetÅ‘leg " +"hivatkozásokkal a kiadási közleményre vagy az új kiadás tarballjára." msgid "Comments" -msgstr "Megjegyzések" +msgstr "Hozzászólások" msgid "Flag" msgstr "Megjelölés" msgid "Only registered users can flag packages out-of-date." -msgstr "" +msgstr "Csak regisztrált felhasználók jelölhetnek csomagokat elavultnak." msgid "Package Merging" msgstr "Csomag beolvasztása" @@ -507,7 +535,7 @@ msgstr "" "Csak megbÃzható felhasználók és fejlesztÅ‘k tudnak csomagokat beolvasztani." msgid "Submit Request" -msgstr "" +msgstr "Kérelem beküldése" msgid "Close Request" msgstr "Kérelem lezárása" @@ -673,40 +701,40 @@ msgid "View account information for %s" msgstr "Fiók információinak megtekintése – %s" msgid "Package base ID or package base name missing." -msgstr "" +msgstr "Alapcsomag-azonosÃtó vagy alapcsomagnév hiányzik." msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "Nem szerkesztheted ezt a hozzászólást." msgid "Comment does not exist." -msgstr "" +msgstr "A hozzászólás nem létezik." msgid "Comment cannot be empty." -msgstr "" +msgstr "A hozzászólás nem lehet üres." msgid "Comment has been added." -msgstr "A megjegyzés hozzáadva." +msgstr "A hozzászólás hozzáadva." msgid "You must be logged in before you can edit package information." msgstr "A csomag információinak szerkesztéséhez be kell jelentkezned." msgid "Missing comment ID." -msgstr "Hiányzó megjegyzésazonosÃtó." +msgstr "Hiányzó hozzászólásazonosÃtó." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "5-nél több hozzászólás nem rögzÃthetÅ‘." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "Nem rögzÃtheted ezt a hozzászólást." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "Nem oldhatod fel ezt a hozzászólást." msgid "Comment has been pinned." -msgstr "" +msgstr "A hozzászólás rögzÃtésre került." msgid "Comment has been unpinned." -msgstr "" +msgstr "A hozzászólás feloldásra került." msgid "Error retrieving package details." msgstr "Hiba történt a csomag részletes információinak letöltése közben." @@ -721,7 +749,7 @@ msgid "You did not select any packages to flag." msgstr "Nem választottál ki egyetlen csomagot sem megjelölésre." msgid "The selected packages have not been flagged, please enter a comment." -msgstr "" +msgstr "A kiválasztott csomagok nem lettek jelölve, adj meg egy megjegyzést." msgid "The selected packages have been flagged out-of-date." msgstr "A kiválasztott csomagok elavultnak lettek jelölve." @@ -783,26 +811,26 @@ msgstr "Nem sikerült hozzáadni az értesÃtési listához." #, php-format msgid "You have been added to the comment notification list for %s." msgstr "" -"Sikeresen fel lettél véve a(z) %s csomag megjegyzésértesÃtési listájára." +"Sikeresen fel lettél véve a(z) %s csomag hozzászólásértesÃtési listájára." #, php-format msgid "You have been removed from the comment notification list for %s." -msgstr "El lettél távolÃtva a(z) %s csomag megjegyzésértesÃtési listájáról." +msgstr "El lettél távolÃtva a(z) %s csomag hozzászólásértesÃtési listájáról." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "Ennek a hozzászólásnak nem vonhatod vissza a törlését." msgid "Comment has been undeleted." -msgstr "" +msgstr "A hozzászólás törlése visszavonásra került." msgid "You are not allowed to delete this comment." -msgstr "Nem törölheted ezt a megjegyzést." +msgstr "Nem törölheted ezt a hozzászólást." msgid "Comment has been deleted." -msgstr "Megjegyzés törölve." +msgstr "Hozzászólás törölve." msgid "Comment has been edited." -msgstr "" +msgstr "A hozzászólás szerkesztve lett." msgid "You are not allowed to edit the keywords of this package base." msgstr "Nem szerkesztheted ennek az alapcsomagnak a kulcsszavait." @@ -825,7 +853,7 @@ msgstr "Csomag részleteinek megtekintése –" #, php-format msgid "requires %s" -msgstr "" +msgstr "igényli ezt: %s" msgid "You must be logged in to file package requests." msgstr "Csomagkérelmek beküldéséhez be kell jelentkezned." @@ -834,7 +862,7 @@ msgid "Invalid name: only lowercase letters are allowed." msgstr "Érvénytelen név: csak kisbetűk használata engedélyezett." msgid "The comment field must not be empty." -msgstr "A megjegyzés mezÅ‘ nem lehet üres." +msgstr "A hozászólás mezÅ‘ nem lehet üres." msgid "Invalid request type." msgstr "Érvénytelen kérelemtÃpus." @@ -881,11 +909,14 @@ msgid "Email Address" msgstr "E-mail cÃm" msgid "hidden" -msgstr "" +msgstr "rejtett" msgid "Real Name" msgstr "Valós név" +msgid "Homepage" +msgstr "Honlap" + msgid "IRC Nick" msgstr "IRC becenév" @@ -901,6 +932,9 @@ msgstr "Ezóta inaktÃv:" msgid "Active" msgstr "AktÃv" +msgid "Registration date:" +msgstr "Regisztráció dátuma:" + msgid "Last Login" msgstr "Legutóbbi bejelentkezés" @@ -917,6 +951,10 @@ msgstr "Ezen felhasználó fiókjának szerkesztése" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Kattints %side%s, ha véglegesen törölni szeretnéd ezt a fiókot." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Kattints %side%s a felhasználó részleteihez." + msgid "required" msgstr "kötelezÅ‘" @@ -936,9 +974,11 @@ msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." msgstr "" +"Kérünk, gyÅ‘zÅ‘dj meg arról, hogy helyesen adtad meg az e-mail cÃmedet, " +"különben ki leszel zárva." msgid "Hide Email Address" -msgstr "" +msgstr "E-mail cÃm elrejtése" msgid "Re-type password" msgstr "Megismételt jelszó" @@ -957,13 +997,16 @@ msgid "SSH Public Key" msgstr "Nyilvános SSH kulcs" msgid "Notification settings" -msgstr "" +msgstr "ÉrtesÃtési beállÃtások" msgid "Notify of new comments" msgstr "ÉrtesÃtés új hozzászólásról" msgid "Notify of package updates" -msgstr "" +msgstr "ÉrtesÃtés csomagfrissÃtésekrÅ‘l." + +msgid "Notify of ownership changes" +msgstr "ÉrtesÃtés tulajdonváltozásokról" msgid "Update" msgstr "FrissÃtés" @@ -1010,22 +1053,24 @@ msgstr "Mentés" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Elavultnak jelölÅ‘ hozzászólás: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" msgstr "" +"%s%s%s elavultnak jelölte a(z) %s%s%s csomagot ekkor: %s%s%s a következÅ‘ " +"okból:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s nincs elavultnak jelölve." msgid "Return to Details" -msgstr "" +msgstr "Vissza a részletekhez" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "Copyright %s 2004-%d aurweb fejlesztÅ‘i csapat." msgid "My Packages" msgstr "Csomagjaim" @@ -1050,7 +1095,7 @@ msgstr "Keresés wikiben" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Elavultnak jelölve (%s)" msgid "Flag package out-of-date" msgstr "Csomag elavultnak jelölése" @@ -1067,6 +1112,9 @@ msgstr "Szavazás erre a csomagra" msgid "Disable notifications" msgstr "ÉrtesÃtések kikapcsolása" +msgid "Enable notifications" +msgstr "ÉrtesÃtések engedélyezése" + msgid "Manage Co-Maintainers" msgstr "TársszerkesztÅ‘k kezelése" @@ -1117,7 +1165,7 @@ msgstr "Legutóbb frissÃtve" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "Hozzászólás szerkesztése ehhez: %s" msgid "Add Comment" msgstr "Hosszászólás" @@ -1126,46 +1174,46 @@ msgid "View all comments" msgstr "Összes megjegyzés megjelenÃtése" msgid "Pinned Comments" -msgstr "" +msgstr "RögzÃtett hozzászólások" msgid "Latest Comments" msgstr "Legújabb hozzászólások" #, php-format msgid "%s commented on %s" -msgstr "" +msgstr "%s hozzászólt ekkor: %s" #, php-format msgid "Anonymous comment on %s" -msgstr "" +msgstr "Névtelen hozzászólás ekkor: %s" #, php-format msgid "deleted on %s by %s" -msgstr "" +msgstr "törölve ekkor: %s %s által" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "törölve ekkor: %s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "szerkesztve ekkor: %s %s által" #, php-format msgid "edited on %s" -msgstr "" +msgstr "szerkesztve ekkor: %s" msgid "Undelete comment" -msgstr "" +msgstr "Hozzászólás törlésének visszavonása" msgid "Delete comment" msgstr "Hozzászólás törlése" msgid "Pin comment" -msgstr "" +msgstr "Hozzászólás rögzÃtése" msgid "Unpin comment" -msgstr "" +msgstr "Hozzászólás feloldása" msgid "All comments" msgstr "Összes hozzászólás" @@ -1215,9 +1263,6 @@ msgstr "" "Használd ezt az űrlapot a(z) %s%s%s alapcsomaggal kapcsolatos kérelem " "lezárásához." -msgid "Note" -msgstr "Megjegyzés" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1254,6 +1299,39 @@ msgstr "Megtagadás" msgid "Merge into" msgstr "Beolvasztás ebbe:" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"Törlési kérelem beküldésével megkérsz egy megbÃzható felhasználót, hogy " +"törölje az alapcsomagot. Ez a tÃpusú kérelem duplikátumok, főági fejlesztÅ‘k " +"által felhagyott szoftverek, valamint illegális és helyrehozhatatlanul " +"elromlott csomagokhoz használható." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"Beolvasztási kérelem beküldésével megkérsz egy megbÃzható felhasználót, hogy " +"törölje az alapcsomagot, és vigye át a szavazatait és hozzászólásait egy " +"másik alapcsomaghoz. Egy csomag egyesÃtése nem érinti a kapcsolódó Git " +"tárolókat. GyÅ‘zÅ‘dj meg róla, hogy frissÃtetted magadnak a célcsomag Git " +"történetét." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"Megtagadási kérelem beküldésével megkérsz egy megbÃzható felhasználót, hogy " +"tegye árvává az alapcsomagot. Kérünk, hogy ezt csak akkor tedd, ha a csomag " +"igényel fenntartói műveletet, a fenntartó eltűnt, és elÅ‘zÅ‘leg már " +"megpróbáltad felvenni a kapcsolatot a fenntartóval." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1274,8 +1352,10 @@ msgid "Date" msgstr "Dátum" #, php-format -msgid "~%d days left" -msgstr "~%d nap van hátra" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d nap van hátra" +msgstr[1] "~%d nap van hátra" #, php-format msgid "~%d hour left" @@ -1326,7 +1406,7 @@ msgid "Voted" msgstr "Szavazva" msgid "Last modified" -msgstr "" +msgstr "Legutóbb módosÃtva" msgid "Ascending" msgstr "NövekvÅ‘" @@ -1373,12 +1453,13 @@ msgstr[1] "%d csomag található." msgid "Version" msgstr "Verzió" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" "A népszerűség az összes szavazatból kerül számÃtásra. Minden egyes szavazat " -"súlyozásra kerül naponta 0,98-as faktorral a létrehozása óta." +"súlyozásra kerül naponta %.2f-as faktorral a létrehozása óta." msgid "Yes" msgstr "Igen" @@ -1438,7 +1519,7 @@ msgid "Recent Updates" msgstr "Legutóbbi frissÃtések" msgid "more" -msgstr "" +msgstr "több" msgid "My Statistics" msgstr "Statisztikám" @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Italian (http://www.transifex.com/lfleischer/aur/language/" "it/)\n" @@ -27,6 +27,20 @@ msgstr "Impossibile trovare la pagina" msgid "Sorry, the page you've requested does not exist." msgstr "Spiacenti, la pagina richiesta non esiste." +msgid "Note" +msgstr "Nota" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Servizio non disponibile" @@ -915,6 +929,9 @@ msgstr "nascosto" msgid "Real Name" msgstr "Nome reale" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Nick IRC" @@ -930,6 +947,9 @@ msgstr "Inattivo da" msgid "Active" msgstr "Attivo" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Ultimo accesso" @@ -946,6 +966,10 @@ msgstr "Modifica l'account di quest'utente" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Clicca %squi%s se vuoi eliminare definitivamente questo account." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "obbligatorio" @@ -996,6 +1020,9 @@ msgstr "Notifica dei nuovi commenti" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Aggiorna" @@ -1098,6 +1125,9 @@ msgstr "Vota per questo pacchetto" msgid "Disable notifications" msgstr "Disabilita le notifiche" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "Gestisci i co-manutentori" @@ -1244,9 +1274,6 @@ msgstr "Sorgenti" msgid "Use this form to close the request for package base %s%s%s." msgstr "Usa questo modulo per chiudere la richiesta del pacchetto base %s%s%s." -msgid "Note" -msgstr "Nota" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1283,6 +1310,26 @@ msgstr "Abbandona" msgid "Merge into" msgstr "Unisci con" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1303,8 +1350,10 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "~%d giorni rimanenti" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1403,12 +1452,11 @@ msgstr[1] "Sono stati trovati %d pacchetti." msgid "Version" msgstr "Versione" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"La popolarità viene calcolata come la somma di tutti i voti con ogni voto " -"ponderato con un fattore di 0,98 al giorno dalla sua creazione." msgid "Yes" msgstr "Sì" @@ -5,13 +5,13 @@ # Translators: # kusakata, 2013 # kusakata, 2013 -# kusakata, 2013-2015 +# kusakata, 2013-2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Japanese (http://www.transifex.com/lfleischer/aur/language/" "ja/)\n" @@ -27,6 +27,20 @@ msgstr "ページãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" msgid "Sorry, the page you've requested does not exist." msgstr "ã‚ãªãŸãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã—ãŸãƒšãƒ¼ã‚¸ã¯å˜åœ¨ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "Note" +msgstr "ノート" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Service Unavailable" @@ -442,7 +456,7 @@ msgid "Only Trusted Users and Developers can disown packages." msgstr "Trusted User ã¨é–‹ç™ºè€…ã ã‘ãŒãƒ‘ッケージをå¤å…ã«ã§ãã¾ã™ã€‚" msgid "Flag Comment" -msgstr "" +msgstr "コメントã®ãƒ•ãƒ©ã‚°ã‚’ç«‹ã¦ã‚‹" msgid "Flag Package Out-Of-Date" msgstr "パッケージ㮠Out-Of-Date フラグを立ã¦ã‚‹" @@ -798,10 +812,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "%s ãŒã‚³ãƒ¡ãƒ³ãƒˆã®é€šçŸ¥ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚" msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’復元ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。" msgid "Comment has been undeleted." -msgstr "" +msgstr "コメントã¯å¾©å…ƒã•ã‚Œã¾ã—ãŸã€‚" msgid "You are not allowed to delete this comment." msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" @@ -895,6 +909,9 @@ msgstr "éžå…¬é–‹" msgid "Real Name" msgstr "本å" +msgid "Homepage" +msgstr "ホームページ" + msgid "IRC Nick" msgstr "IRC ニックãƒãƒ¼ãƒ " @@ -910,6 +927,9 @@ msgstr "休æ¢é–‹å§‹" msgid "Active" msgstr "活動ä¸" +msgid "Registration date:" +msgstr "登録日:" + msgid "Last Login" msgstr "最後ã®ãƒã‚°ã‚¤ãƒ³" @@ -926,6 +946,10 @@ msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’編集" msgid "Click %shere%s if you want to permanently delete this account." msgstr "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æ’ä¹…çš„ã«å‰Šé™¤ã—ãŸã„å ´åˆã¯%sã“ã¡ã‚‰%sをクリック。" +#, php-format +msgid "Click %shere%s for user details." +msgstr "ユーザーã®è©³ç´°ã¯%sã“ã¡ã‚‰%sをクリック。" + msgid "required" msgstr "å¿…é ˆ" @@ -968,13 +992,16 @@ msgid "SSH Public Key" msgstr "SSH 公開éµ" msgid "Notification settings" -msgstr "" +msgstr "通知è¨å®š" msgid "Notify of new comments" msgstr "æ–°ã—ã„コメントを通知" msgid "Notify of package updates" -msgstr "" +msgstr "パッケージアップデートã®é€šçŸ¥" + +msgid "Notify of ownership changes" +msgstr "所有者ã®å¤‰æ›´ã®é€šçŸ¥" msgid "Update" msgstr "æ›´æ–°" @@ -1021,18 +1048,19 @@ msgstr "ä¿å˜" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Out-of-Date フラグãŒç«‹ã¦ã‚‰ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" msgstr "" +"%s%s%s 㯠%s%s%s ã‚’ %s%s%s ã«ä»¥ä¸‹ã®ç†ç”±ã§ out-of-date フラグを立ã¦ã¾ã—ãŸ:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s 㯠out-of-date フラグãŒç«‹ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“。" msgid "Return to Details" -msgstr "" +msgstr "詳細ã«æˆ»ã‚‹" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." @@ -1061,7 +1089,7 @@ msgstr "wiki を検索" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "out-of-date フラグãŒç«‹ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ (%s)" msgid "Flag package out-of-date" msgstr "パッケージ㮠out-of-date フラグを立ã¦ã‚‹" @@ -1078,6 +1106,9 @@ msgstr "ã“ã®ãƒ‘ッケージã«æŠ•ç¥¨ã™ã‚‹" msgid "Disable notifications" msgstr "通知をæ¢ã‚ã‚‹" +msgid "Enable notifications" +msgstr "通知を有効ã«ã™ã‚‹" + msgid "Manage Co-Maintainers" msgstr "å…±åŒãƒ¡ãƒ³ãƒ†ãƒŠã®ç®¡ç†" @@ -1155,18 +1186,18 @@ msgstr "%s ã«ã‚ˆã£ã¦ %s ã«å‰Šé™¤" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "%s ã«å‰Šé™¤" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "%s ã« %s ã«ã‚ˆã£ã¦ç·¨é›†" #, php-format msgid "edited on %s" -msgstr "" +msgstr "%s ã«ç·¨é›†" msgid "Undelete comment" -msgstr "" +msgstr "コメントを復元" msgid "Delete comment" msgstr "コメントを削除" @@ -1225,9 +1256,6 @@ msgstr "" "ã“ã®ãƒ•ã‚©ãƒ¼ãƒ を使ã£ã¦ãƒ‘ッケージベース %s%s%s ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’クãƒãƒ¼ã‚ºã™ã‚‹ã“ã¨ãŒ" "ã§ãã¾ã™ã€‚" -msgid "Note" -msgstr "ノート" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1264,6 +1292,38 @@ msgstr "å¤å…" msgid "Merge into" msgstr "マージ" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"削除リクエストをé€ä¿¡ã™ã‚‹ã“ã¨ã§ã€Trusted User ã«ãƒ‘ッケージベースã®å‰Šé™¤ã‚’è¦æ±‚ã§" +"ãã¾ã™ã€‚削除リクエストを使用ã™ã‚‹ã‚±ãƒ¼ã‚¹: パッケージã®é‡è¤‡ã‚„ã€ä¸Šæµã«ã‚ˆã£ã¦ã‚½ãƒ•" +"トウェアã®é–‹ç™ºãŒæ”¾æ£„ã•ã‚ŒãŸå ´åˆã€é•æ³•ãªãƒ‘ッケージã€ã‚ã‚‹ã„ã¯ãƒ‘ッケージãŒã©ã†ã—" +"よã†ã‚‚ãªã壊れã¦ã—ã¾ã£ã¦ã„ã‚‹å ´åˆãªã©ã€‚" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"マージリクエストをé€ä¿¡ã™ã‚‹ã“ã¨ã§ã€ãƒ‘ッケージベースを削除ã—ã¦\n" +"投票数ã¨ã‚³ãƒ¡ãƒ³ãƒˆã‚’ä»–ã®ãƒ‘ッケージベースã«ç§»å‹•ã™ã‚‹ã“ã¨ã‚’ Trusted User ã«è¦æ±‚ã§" +"ãã¾ã™ã€‚パッケージã®ãƒžãƒ¼ã‚¸ã¯ Git リãƒã‚¸ãƒˆãƒªã«å½±éŸ¿ã‚’与ãˆã¾ã›ã‚“。マージ先ã®ãƒ‘ッ" +"ケージ㮠Git å±¥æ´ã¯è‡ªåˆ†ã§æ›´æ–°ã—ã¦ãã ã•ã„。" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"å¤å…リクエストをé€ä¿¡ã™ã‚‹ã“ã¨ã§ã€ãƒ‘ッケージベースã®æ‰€æœ‰æ¨©ãŒæ”¾æ£„ã•ã‚Œã‚‹ã‚ˆã†ã« " +"Trusted User ã«è¦æ±‚ã§ãã¾ã™ã€‚パッケージã«ãƒ¡ãƒ³ãƒ†ãƒŠãŒä½•ã‚‰ã‹ã®æ‰‹ã‚’åŠ ãˆã‚‹å¿…è¦ãŒã‚" +"ã‚Šã€ç¾åœ¨ã®ãƒ¡ãƒ³ãƒ†ãƒŠãŒè¡Œæ–¹ä¸æ˜Žã§ã€ãƒ¡ãƒ³ãƒ†ãƒŠã«é€£çµ¡ã‚’å–ã‚ã†ã¨ã—ã¦ã‚‚è¿”ç”ãŒãªã„å ´åˆ" +"ã«ã®ã¿ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ãã ã•ã„。" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1283,8 +1343,9 @@ msgid "Date" msgstr "日付" #, php-format -msgid "~%d days left" -msgstr "残り ~%d æ—¥" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "残り ~%d æ—¥" #, php-format msgid "~%d hour left" @@ -1380,11 +1441,13 @@ msgstr[0] "パッケージ㌠%d 個見ã¤ã‹ã‚Šã¾ã—ãŸã€‚" msgid "Version" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"人気度ã¯å„投票ã«ä½œæˆæ—¥ã‹ã‚‰ã®æ—¥æ•°ã‚’0.98å€ã—ãŸå…¨æŠ•ç¥¨ã®åˆè¨ˆã§è¨ˆç®—ã•ã‚Œã¾ã™ã€‚" +"人気度ã¯å„投票ã«ãƒ‘ッケージ作æˆæ—¥ã‹ã‚‰ã®æ—¥æ•°ã‚’ %.2f å€ã—ãŸå…¨æŠ•ç¥¨ã®åˆè¨ˆã§è¨ˆç®—ã•" +"ã‚Œã¾ã™ã€‚" msgid "Yes" msgstr "ã¯ã„" @@ -1444,7 +1507,7 @@ msgid "Recent Updates" msgstr "最近ã®ã‚¢ãƒƒãƒ—デート" msgid "more" -msgstr "" +msgstr "詳細" msgid "My Statistics" msgstr "自分ã®çµ±è¨ˆ" @@ -6,15 +6,15 @@ # Alexander F Rødseth <rodseth@gmail.com>, 2015 # Alexander F Rødseth <rodseth@gmail.com>, 2011,2013-2014 # Harald H. <haarektrans@gmail.com>, 2015 -# AdmiringWorm <kim.nordmo@gmail.com>, 2016 +# Kim Nordmo <kim.nordmo@gmail.com>, 2016 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # Thor K. H. <nitrolinken@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Norwegian BokmÃ¥l (http://www.transifex.com/lfleischer/aur/" "language/nb/)\n" @@ -30,6 +30,20 @@ msgstr "Finner ikke siden" msgid "Sorry, the page you've requested does not exist." msgstr "Den ønskede siden finnes ikke." +msgid "Note" +msgstr "OBS" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Tjenesten er utilgjengelig" @@ -866,6 +880,9 @@ msgstr "" msgid "Real Name" msgstr "Ekte navn" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC-kallenavn" @@ -881,6 +898,9 @@ msgstr "Inaktiv siden" msgid "Active" msgstr "Aktiv" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Sist logget inn" @@ -897,6 +917,10 @@ msgstr "Endre brukerkonto" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Klikk %sher%s hvis du vil slette denne kontoen, for alltid." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "trengs" @@ -945,6 +969,9 @@ msgstr "Gi beskjed om nye kommentarer" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Oppdater" @@ -1045,6 +1072,9 @@ msgstr "Stem pÃ¥ denne pakken" msgid "Disable notifications" msgstr "SlÃ¥ av beskjeder" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1191,9 +1221,6 @@ msgstr "Kilder" msgid "Use this form to close the request for package base %s%s%s." msgstr "Bruk dette skjemaet for Ã¥ lukke forespørselen for grunnpakken %s%s%s." -msgid "Note" -msgstr "OBS" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1230,6 +1257,26 @@ msgstr "Foreldreløs" msgid "Merge into" msgstr "Flett med" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1250,8 +1297,10 @@ msgid "Date" msgstr "Dato" #, php-format -msgid "~%d days left" -msgstr "~%d dager igjen" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1349,9 +1398,10 @@ msgstr[1] "Fant %d pakker." msgid "Version" msgstr "Versjon" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Dutch (http://www.transifex.com/lfleischer/aur/language/nl/)\n" "Language: nl\n" @@ -28,6 +28,20 @@ msgstr "De pagina kon niet worden gevonden" msgid "Sorry, the page you've requested does not exist." msgstr "Sorry, de pagina die u heeft aangevraagd bestaat niet." +msgid "Note" +msgstr "Notitie" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "De dienst is niet beschikbaar" @@ -892,6 +906,9 @@ msgstr "" msgid "Real Name" msgstr "Echte naam" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC Nick" @@ -907,6 +924,9 @@ msgstr "Geen activiteit sinds" msgid "Active" msgstr "Actief" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Laatste Login" @@ -923,6 +943,10 @@ msgstr "Bewerk account van deze gebruiker" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Klik %shier%s als u dit account permanent wilt verwijderen." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "verplicht" @@ -971,6 +995,9 @@ msgstr "Notificatie bij nieuwe comment" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Update" @@ -1073,6 +1100,9 @@ msgstr "Stem voor dit pakket" msgid "Disable notifications" msgstr "Schakel notificaties uit" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "Beheer mede-onderhouders" @@ -1220,9 +1250,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Gebruik dit formulier om het verzoek voor basispakket %s%s%s te sluiten." -msgid "Note" -msgstr "Notitie" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1259,6 +1286,26 @@ msgstr "Wees" msgid "Merge into" msgstr "Voeg samen met" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1279,8 +1326,10 @@ msgid "Date" msgstr "Datum" #, php-format -msgid "~%d days left" -msgstr "~%d dagen resterend" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1378,9 +1427,10 @@ msgstr[1] "%d pakketten gevonden" msgid "Version" msgstr "Versie" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -9,15 +9,16 @@ # Chris Warrick <kwpolska@gmail.com>, 2012 # Kwpolska <kwpolska@kwpolska.tk>, 2011 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 +# Michal T <zorza2@gmail.com>, 2016 # Nuc1eoN <nucrap@hotmail.com>, 2014 # Piotr StrÄ™bski <strebski@o2.pl>, 2013-2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-13 13:13+0000\n" -"Last-Translator: Piotr StrÄ™bski <strebski@o2.pl>\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-12 09:11+0000\n" +"Last-Translator: Michal T <zorza2@gmail.com>\n" "Language-Team: Polish (http://www.transifex.com/lfleischer/aur/language/" "pl/)\n" "Language: pl\n" @@ -33,6 +34,20 @@ msgstr "Nie znaleziono strony" msgid "Sorry, the page you've requested does not exist." msgstr "Przepraszamy, strona o którÄ… prosiÅ‚eÅ› nie istnieje." +msgid "Note" +msgstr "Uwaga" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "Adresy URL GIT clone nie sÄ… przeznaczone do otwierania w przeglÄ…darce." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "Aby sklonować repozytorium GIT-a %s, uruchom %s." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Kliknij %stutaj%s by powrócić do strony szczegółów %s." + msgid "Service Unavailable" msgstr "UsÅ‚uga niedostÄ™pna" @@ -61,13 +76,13 @@ msgid "Use this form to search existing accounts." msgstr "Przy użyciu tego formularza możesz przeszukać istniejÄ…ce konta." msgid "You must log in to view user information." -msgstr "Musisz być zalogowany aby móc oglÄ…dać informacje o użytkownikach." +msgstr "Musisz być zalogowany, aby móc przeglÄ…dać informacje o użytkownikach." msgid "Add Proposal" -msgstr "Dodaj PropozycjÄ™" +msgstr "Dodaj propozycjÄ™" msgid "Invalid token for user action." -msgstr "NieprawidÅ‚owy token dla akcji użytkownika." +msgstr "NieprawidÅ‚owy token dla czynnoÅ›ci użytkownika." msgid "Username does not exist." msgstr "Nazwa użytkownika nie istnieje." @@ -89,10 +104,10 @@ msgid "Submit a proposal to vote on." msgstr "WyÅ›lij propozycjÄ™ do gÅ‚osowania." msgid "Applicant/TU" -msgstr "Wnioskodawca/TU" +msgstr "Wnioskodawca/ZU" msgid "(empty if not applicable)" -msgstr "(puste jeÅ›li nie dotyczy)" +msgstr "(puste, jeÅ›li nie dotyczy)" msgid "Type" msgstr "Rodzaj" @@ -153,6 +168,7 @@ msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." msgstr "" +"Pakiety w AUR sÄ… tworzone przez użytkowników. Używasz ich na wÅ‚asne ryzyko." msgid "Learn more..." msgstr "Dowiedz siÄ™ wiÄ™cej..." @@ -161,7 +177,7 @@ msgid "Support" msgstr "Wsparcie" msgid "Package Requests" -msgstr "Propozycje pakietu" +msgstr "ProÅ›by o pakiet" #, php-format msgid "" @@ -176,9 +192,11 @@ msgid "" "Request a package to be disowned, e.g. when the maintainer is inactive and " "the package has been flagged out-of-date for a long time." msgstr "" +"Wnioskuj o wyrzeczenie wÅ‚asnoÅ›ci pakietu - np. gdy zarzÄ…dzajÄ…cy jest " +"nieaktywny i pakiet zostaÅ‚ oznaczony jako przestarzaÅ‚y dawno temu." msgid "Deletion Request" -msgstr "Propozycja usuniÄ™cia" +msgstr "ProÅ›ba o usuniÄ™cie" msgid "" "Request a package to be removed from the Arch User Repository. Please do not " @@ -187,7 +205,7 @@ msgid "" msgstr "" msgid "Merge Request" -msgstr "Propozycja poÅ‚Ä…czenia" +msgstr "ProÅ›ba o poÅ‚Ä…czenie" msgid "" "Request a package to be merged into another one. Can be used when a package " @@ -211,7 +229,7 @@ msgid "" msgstr "" msgid "The following SSH fingerprints are used for the AUR:" -msgstr "" +msgstr "NastÄ™pujÄ…ce odciski SSH sÄ… używane przez AUR:" msgid "Discussion" msgstr "Dyskusja" @@ -222,6 +240,10 @@ msgid "" "structure takes place on %saur-general%s. For discussion relating to the " "development of the AUR web interface, use the %saur-dev%s mailing list." msgstr "" +"Ogólna dyskusja dotyczÄ…ca Repozytorium Użytkowników Arch (AUR) i struktury " +"Zaufanych Użytkowników odbywa siÄ™ na %saur-general%s. Dyskusja dotyczÄ…ca " +"rozwoju interfejsu webowego AUR odbywa siÄ™ zaÅ› na liÅ›cie dyskusyjnej %saur-" +"dev%s." msgid "Bug Reporting" msgstr "ZgÅ‚aszanie bÅ‚Ä™dów" @@ -233,6 +255,10 @@ msgid "" "%sonly%s. To report packaging bugs contact the package maintainer or leave a " "comment on the appropriate package page." msgstr "" +"JeÅ›li znalazÅ‚eś bÅ‚Ä…d w interfejsie webowym AUR, zgÅ‚oś go w naszym %ssystemie " +"Å›ledzenia bÅ‚Ä™dów%s. Używaj go %swyÅ‚Ä…cznie%s do zgÅ‚aszania bÅ‚Ä™dów zwiÄ…zanych " +"z interfejsem webowym AUR. BÅ‚Ä™dy powiÄ…zane z pakietami zgÅ‚aszaj ich " +"opiekunom lub zostaw komentarz pod odpowiednim pakietem." msgid "Package Search" msgstr "Wyszukiwanie pakietów" @@ -346,12 +372,13 @@ msgid "" "The selected packages have not been disowned, check the confirmation " "checkbox." msgstr "" +"Wybrane pakiety nie zostaÅ‚y porzucone, sprawdź pole wyboru potwierdzenia." msgid "Cannot find package to merge votes and comments into." msgstr "Nie można znaleźć pakietu do scalenia gÅ‚osów i komentarzy." msgid "Cannot merge a package base with itself." -msgstr "Nie można poÅ‚Ä…czyć bazowego pakietu z nim samym." +msgstr "Nie można poÅ‚Ä…czyć bazy pakietu z niÄ… samÄ…." msgid "" "The selected packages have not been deleted, check the confirmation checkbox." @@ -395,25 +422,29 @@ msgid "" "Use this form to disown the package base %s%s%s which includes the following " "packages: " msgstr "" +"Użyj tego formularza, aby zÅ‚ożyć proÅ›bÄ™ wyrzeczenie wÅ‚asnoÅ›ci bazie pakietu " +"%s%s%s, która zawiera nastÄ™pujÄ…ce pakiety:" #, php-format msgid "" "By selecting the checkbox, you confirm that you want to disown the package " "and transfer ownership to %s%s%s." msgstr "" +"ZaznaczajÄ…c pole wyboru potwierdzasz, że chcesz porzucić pakiet i przenieść " +"wÅ‚asność na %s%s%s." msgid "" "By selecting the checkbox, you confirm that you want to disown the package." -msgstr "" +msgstr "ZaznaczajÄ…c pole wyboru potwierdzasz, że chcesz porzucić pakiet." msgid "Confirm to disown the package" -msgstr "" +msgstr "Potwierdź porzucenie pakietu" msgid "Disown" msgstr "Porzuć" msgid "Only Trusted Users and Developers can disown packages." -msgstr "" +msgstr "Tylko Zaufani Użytkownicy i ProgramiÅ›ci mogÄ… porzucać pakiety." msgid "Flag Comment" msgstr "Oznacz komentarz" @@ -426,17 +457,24 @@ msgid "" "Use this form to flag the package base %s%s%s and the following packages out-" "of-date: " msgstr "" +"Użyj tego formularza, aby oznaczyć bazÄ™ pakietu %s%s%s i nastÄ™pujÄ…ce pakiety " +"jako nieaktualne:" #, php-format msgid "" "Please do %snot%s use this form to report bugs. Use the package comments " "instead." msgstr "" +"Prosimy %snie%s używać tego formularza do zgÅ‚aszania bÅ‚Ä™dów. Użyj do tego " +"systemu komentowania pakietu." msgid "" "Enter details on why the package is out-of-date below, preferably including " "links to the release announcement or the new release tarball." msgstr "" +"Wprowadź poniżej szczegóły, dlaczego pakiet zostaÅ‚ oznaczony jako " +"nieaktualny, najlepiej Å‚Ä…cznie z odnoÅ›nikiem do ogÅ‚oszenia o nowym wydaniu " +"lub do archiwum tarball nowego wydania." msgid "Comments" msgstr "Kommentarze" @@ -446,6 +484,7 @@ msgstr "Oznacz" msgid "Only registered users can flag packages out-of-date." msgstr "" +"Tylko zarejestrowani użytkownicy mogÄ… oznaczać pakiety jako nieaktualne." msgid "Package Merging" msgstr "Scalanie pakietów" @@ -481,10 +520,10 @@ msgid "Only Trusted Users and Developers can merge packages." msgstr "Tylko Zaufani Użytkownicy i Deweloperzy mogÄ… scalać pakiety." msgid "Submit Request" -msgstr "PrzeÅ›lij propozycjÄ™" +msgstr "PrzeÅ›lij proÅ›bÄ™" msgid "Close Request" -msgstr "Zamknij propozycjÄ™" +msgstr "Zamknij proÅ›bÄ™" msgid "First" msgstr "Pierwsza" @@ -499,7 +538,7 @@ msgid "Last" msgstr "Ostatnia" msgid "Requests" -msgstr "Propozycje" +msgstr "ProÅ›by" msgid "Register" msgstr "Zarejestruj siÄ™" @@ -526,13 +565,13 @@ msgid "You've already voted for this proposal." msgstr "Już zagÅ‚osowaÅ‚eÅ› na tÄ… propozycjÄ™" msgid "Vote ID not valid." -msgstr "ID gÅ‚osowania nieprawidÅ‚owe." +msgstr "NieprawidÅ‚owy identyfikator gÅ‚osowania." msgid "Current Votes" -msgstr "Obecne GÅ‚osy" +msgstr "Obecne gÅ‚osy" msgid "Past Votes" -msgstr "Poprzednie GÅ‚osy" +msgstr "Poprzednie gÅ‚osy" msgid "Voters" msgstr "GÅ‚osujÄ…cych" @@ -586,7 +625,7 @@ msgstr "Adres, %s%s%s, jest już używany." #, php-format msgid "The SSH public key, %s%s%s, is already in use." -msgstr "" +msgstr "Publiczny klucz SSH, %s%s%s, jest już używany." #, php-format msgid "Error trying to create account, %s%s%s." @@ -649,16 +688,16 @@ msgid "View account information for %s" msgstr "WyÅ›wietl informacje o koncie %s" msgid "Package base ID or package base name missing." -msgstr "" +msgstr "Brakuje identyfikatora lub nazwy bazy pakietów." msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "Nie masz uprawnieÅ„ do edycji tego komentarza." msgid "Comment does not exist." -msgstr "" +msgstr "Komentarz nie istnieje." msgid "Comment cannot be empty." -msgstr "" +msgstr "Komentarz nie może być pusty." msgid "Comment has been added." msgstr "Komentarz zostaÅ‚ dodany." @@ -670,19 +709,19 @@ msgid "Missing comment ID." msgstr "Brakuje identyfikatora komentarza." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "Można przypiąć nie wiÄ™cej niż 5 komentarzy." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "Nie masz uprawnieÅ„ do przypiÄ™cia tego komentarza." msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "Nie masz uprawnieÅ„ do odpiÄ™cia tego komentarza." msgid "Comment has been pinned." -msgstr "" +msgstr "Komentarz zostaÅ‚ przypiÄ™ty." msgid "Comment has been unpinned." -msgstr "" +msgstr "Komentarz zostaÅ‚ odpiÄ™ty." msgid "Error retrieving package details." msgstr "BÅ‚Ä…d podczas pobierania informacji o pakiecie." @@ -698,6 +737,7 @@ msgstr "Nie wybraÅ‚eÅ› żadnych pakietów do oznaczenia." msgid "The selected packages have not been flagged, please enter a comment." msgstr "" +"Zaznaczone pakiety nie zostaÅ‚y oznaczone, prosimy o wpisanie komentarza." msgid "The selected packages have been flagged out-of-date." msgstr "Wybrane pakiety zostaÅ‚y oznaczone jako nieaktualne." @@ -724,7 +764,7 @@ msgid "You must be logged in before you can adopt packages." msgstr "Musisz być zalogowany aby móc przejmować pakiety." msgid "You must be logged in before you can disown packages." -msgstr "Musisz być zalogowany aby móc porzucać pakiety." +msgstr "Musisz być zalogowany, aby móc porzucać pakiety." msgid "You did not select any packages to adopt." msgstr "Nie wybraÅ‚eÅ› żadnych pakietów do przejÄ™cia." @@ -765,10 +805,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "ZostaÅ‚eÅ› usuniÄ™ty z listy powiadamiania o komentarzach dla %s." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "Nie masz uprawnieÅ„ do cofniÄ™cia usuniÄ™cia tego komentarza." msgid "Comment has been undeleted." -msgstr "" +msgstr "ZostaÅ‚o cofniÄ™te usuniÄ™cie komentarza." msgid "You are not allowed to delete this comment." msgstr "Nie masz uprawnieÅ„ do usuniÄ™cia tego komentarza." @@ -777,33 +817,33 @@ msgid "Comment has been deleted." msgstr "Komentarz zostaÅ‚ usuniÄ™ty." msgid "Comment has been edited." -msgstr "" +msgstr "Komentarz zostaÅ‚ zmodyfikowany." msgid "You are not allowed to edit the keywords of this package base." -msgstr "" +msgstr "Nie masz uprawnieÅ„, by modyfikować sÅ‚owa kluczowe tej bazy pakietów." msgid "The package base keywords have been updated." -msgstr "" +msgstr "SÅ‚owa kluczowe bazy pakietu zostaÅ‚y zaktualizowane." msgid "You are not allowed to manage co-maintainers of this package base." -msgstr "" +msgstr "Nie masz uprawnieÅ„, by zarzÄ…dzać współutrzymujÄ…cymi tej bazy pakietu." #, php-format msgid "Invalid user name: %s" msgstr "Niepoprawna nazwa użytkownika: %s" msgid "The package base co-maintainers have been updated." -msgstr "" +msgstr "WspółutrzymujÄ…cy bazy pakietu zostali zaktualizowani." msgid "View packages details for" msgstr "WyÅ›wietl informacje o pakiecie" #, php-format msgid "requires %s" -msgstr "" +msgstr "wymaga %s" msgid "You must be logged in to file package requests." -msgstr "Musisz być zalogowanym, aby zÅ‚ożyć propozycje pakietu." +msgstr "Musisz być zalogowanym, aby zÅ‚ożyć proÅ›bÄ™ o pakiet." msgid "Invalid name: only lowercase letters are allowed." msgstr "NieprawidÅ‚owa nazwa: tylko maÅ‚e litery sÄ… dozwolone." @@ -812,19 +852,19 @@ msgid "The comment field must not be empty." msgstr "Pole komentarzy nie może pozostać pustÄ™." msgid "Invalid request type." -msgstr "NieprawidÅ‚owy rodzaj propozycji." +msgstr "NieprawidÅ‚owy rodzaj proÅ›by." msgid "Added request successfully." -msgstr "PomyÅ›lnie dodano propozycjÄ™." +msgstr "PomyÅ›lnie dodano proÅ›bÄ™." msgid "Invalid reason." msgstr "NieprawidÅ‚owy powód." msgid "Only TUs and developers can close requests." -msgstr "Tylko Zaufani Użytkownicy i Deweloperzy mogÄ… zamykać propozycje." +msgstr "Tylko Zaufani Użytkownicy i programiÅ›ci mogÄ… zamykać proÅ›by." msgid "Request closed successfully." -msgstr "PomyÅ›lnie zamkniÄ™to propozycjÄ™." +msgstr "PomyÅ›lnie zamkniÄ™to proÅ›bÄ™." #, php-format msgid "You can use this form to permanently delete the AUR account %s." @@ -856,11 +896,14 @@ msgid "Email Address" msgstr "Adres e-mail" msgid "hidden" -msgstr "" +msgstr "ukryte" msgid "Real Name" msgstr "ImiÄ™ i nazwisko" +msgid "Homepage" +msgstr "Strona główna" + msgid "IRC Nick" msgstr "Nick na IRC-u" @@ -876,6 +919,9 @@ msgstr "Nieaktywny od" msgid "Active" msgstr "Aktywne" +msgid "Registration date:" +msgstr "Data rejestracji:" + msgid "Last Login" msgstr "Ostatnie logowanie" @@ -890,7 +936,11 @@ msgstr "Edycja tego konta użytkownika" #, php-format msgid "Click %shere%s if you want to permanently delete this account." -msgstr "Kliknij %stutaj%s jeÅ›li chcesz nieodwracalnie usunąć to konto." +msgstr "Kliknij %stutaj%s, jeÅ›li chcesz nieodwracalnie usunąć to konto." + +#, php-format +msgid "Click %shere%s for user details." +msgstr "Kliknij %stutaj%s by wyÅ›wietlić szczegóły użytkownika." msgid "required" msgstr "wymagane" @@ -911,9 +961,11 @@ msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." msgstr "" +"Upewnij siÄ™, czy poprawnie wpisano adres e-mail, w przeciwnym razie " +"zostaniesz zablokowany." msgid "Hide Email Address" -msgstr "" +msgstr "Ukryj adres e-mail" msgid "Re-type password" msgstr "HasÅ‚o (ponownie)" @@ -925,18 +977,23 @@ msgid "" "The following information is only required if you want to submit packages to " "the Arch User Repository." msgstr "" +"NastÄ™pujÄ…ca informacja jest wymagana jedynie w sytuacji, gdy chcesz przesÅ‚ać " +"pakiety do Repozytorium Użytkowników Arch." msgid "SSH Public Key" msgstr "Klucz publiczny SSH" msgid "Notification settings" -msgstr "" +msgstr "Ustawienia powiadomieÅ„" msgid "Notify of new comments" msgstr "Powiadom o nowych komentarzach" msgid "Notify of package updates" -msgstr "" +msgstr "Powiadom o aktualizacjach pakietu" + +msgid "Notify of ownership changes" +msgstr "Powiadom o zmianie wÅ‚aÅ›ciciela" msgid "Update" msgstr "Aktualizuj" @@ -972,6 +1029,8 @@ msgstr "Brak wyników do wyÅ›wietlenia." msgid "" "Use this form to add co-maintainers for %s%s%s (one user name per line):" msgstr "" +"Użyj tego formularza, aby dodać współutrzymujÄ…cych %s%s%s (jedna nazwa " +"użytkownika na wiersz):" msgid "Users" msgstr "Użytkownicy" @@ -981,22 +1040,23 @@ msgstr "Zapisz" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Komentarz do oznaczenia jako nieaktualny: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" msgstr "" +"%s%s%s oznaczyÅ‚ %s%s%s jako nieaktualny dnia %s%s%s z nastÄ™pujÄ…cego powodu:" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s nie jest oznaczone jako nieaktualne." msgid "Return to Details" -msgstr "" +msgstr "Powrót do szczegółów" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "Prawa autorskie %s 2004-%d Zespół Programistów aurweb." msgid "My Packages" msgstr "Moje pakiety" @@ -1014,14 +1074,14 @@ msgid "View Changes" msgstr "Zobacz zmiany" msgid "Download snapshot" -msgstr "" +msgstr "Pobierz migawkÄ™" msgid "Search wiki" msgstr "Przeszukaj wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Oznaczono jako nieaktualny (%s)" msgid "Flag package out-of-date" msgstr "Oznacz pakiet jako nieaktualny" @@ -1038,15 +1098,18 @@ msgstr "ZagÅ‚osuj na ten pakiet" msgid "Disable notifications" msgstr "WyÅ‚Ä…cz powiadomienia" +msgid "Enable notifications" +msgstr "WÅ‚Ä…cz powiadomienia" + msgid "Manage Co-Maintainers" -msgstr "" +msgstr "ZarzÄ…dzanie współutrzymujÄ…cymi" #, php-format msgid "%d pending request" msgid_plural "%d pending requests" -msgstr[0] "%d propozycja w toku" -msgstr[1] "%d propozycje w toku" -msgstr[2] "%d propozycji w toku" +msgstr[0] "%d proÅ›ba w toku" +msgstr[1] "%d proÅ›by w toku" +msgstr[2] "%d próśb w toku" msgid "Adopt Package" msgstr "Przejmij pakiet" @@ -1058,10 +1121,10 @@ msgid "Package Base Details" msgstr "Szczegóły bazy pakietu" msgid "Git Clone URL" -msgstr "" +msgstr "URL klonu Git" msgid "read-only" -msgstr "" +msgstr "tylko do odczytu" msgid "Keywords" msgstr "SÅ‚owa kluczowe" @@ -1082,14 +1145,14 @@ msgid "Popularity" msgstr "Popularność" msgid "First Submitted" -msgstr "WysÅ‚any" +msgstr "Umieszczony" msgid "Last Updated" msgstr "Ostatnia aktualizacja" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "Edycja komentarza do: %s" msgid "Add Comment" msgstr "Dodaj komentarz" @@ -1098,46 +1161,46 @@ msgid "View all comments" msgstr "Pokaż wszystkie komentarze" msgid "Pinned Comments" -msgstr "" +msgstr "PrzypiÄ™te komentarze" msgid "Latest Comments" msgstr "Ostatnie komentarze" #, php-format msgid "%s commented on %s" -msgstr "" +msgstr "%s skomentowaÅ‚ dnia %s" #, php-format msgid "Anonymous comment on %s" -msgstr "" +msgstr "Anonimowy komentarz do %s" #, php-format msgid "deleted on %s by %s" -msgstr "" +msgstr "usuniÄ™te %s przez %s" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "usuniÄ™te %s" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "edytowane %s przez %s" #, php-format msgid "edited on %s" -msgstr "" +msgstr "edytowane %s" msgid "Undelete comment" -msgstr "" +msgstr "Cofnij usuniÄ™cie komentarza" msgid "Delete comment" msgstr "UsuÅ„ komentarz" msgid "Pin comment" -msgstr "" +msgstr "Przypnij komentarz" msgid "Unpin comment" -msgstr "" +msgstr "Odepnij komentarz" msgid "All comments" msgstr "Wszystkie komentarze" @@ -1152,7 +1215,7 @@ msgid "Description" msgstr "Opis" msgid "Upstream URL" -msgstr "URL upstreamu" +msgstr "URL źródÅ‚a" msgid "Visit the website for" msgstr "Odwiedź stronÄ™ pakietu" @@ -1183,15 +1246,14 @@ msgstr "ŹródÅ‚a" #, php-format msgid "Use this form to close the request for package base %s%s%s." -msgstr "" - -msgid "Note" -msgstr "Uwaga" +msgstr "Użyj tego formularza, aby zamknąć proÅ›bÄ™ o bazÄ™ pakietów %s%s%s." msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." msgstr "" +"Pole komentarza może zostać pozostawione pustym. Jednakże w przypadku " +"odrzucenia proÅ›by dodanie komentarza jest wysoce polecane." msgid "Reason" msgstr "Powód" @@ -1207,11 +1269,11 @@ msgid "" "Use this form to file a request against package base %s%s%s which includes " "the following packages:" msgstr "" -"Użyj tego formularza, aby zÅ‚ożyć propozycjÄ™ na bazÄ™ pakietu %s%s%s i " -"nastÄ™pujÄ…ce pakiety:" +"Użyj tego formularza, aby zÅ‚ożyć proÅ›bÄ™ przeciwko bazie pakietu %s%s%s, " +"która zawiera nastÄ™pujÄ…ce pakiety:" msgid "Request type" -msgstr "Rodzaj propozycji" +msgstr "Rodzaj proÅ›by" msgid "Deletion" msgstr "UsuniÄ™cie" @@ -1222,12 +1284,32 @@ msgstr "Bez opiekuna" msgid "Merge into" msgstr "Scal z" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." -msgstr[0] "%d propozycje znaleziono" -msgstr[1] "%d propozycje znaleziono." -msgstr[2] "%d propozycji znaleziono." +msgstr[0] "%d proÅ›ba odnaleziona." +msgstr[1] "%d proÅ›by odnalezione." +msgstr[2] "%d próśb odnaleziono." #, php-format msgid "Page %d of %d." @@ -1243,8 +1325,11 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "pozostaÅ‚o ~%d dni" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "pozostaÅ‚o ~%d dzieÅ„" +msgstr[1] "pozostaÅ‚o ~%d dni" +msgstr[2] "pozostaÅ‚o ~%d dni" #, php-format msgid "~%d hour left" @@ -1293,10 +1378,10 @@ msgid "Name" msgstr "Nazwa" msgid "Voted" -msgstr "GÅ‚os" +msgstr "ZagÅ‚osowany" msgid "Last modified" -msgstr "" +msgstr "Ostatnio zmienione" msgid "Ascending" msgstr "RosnÄ…co" @@ -1344,9 +1429,10 @@ msgstr[2] "%d pakietów znaleziono" msgid "Version" msgstr "Wersja" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -1407,7 +1493,7 @@ msgid "Recent Updates" msgstr "Ostatnie aktualizacje" msgid "more" -msgstr "" +msgstr "wiÄ™cej" msgid "My Statistics" msgstr "Moje statystyki" diff --git a/po/pt_BR.po b/po/pt_BR.po index b5fec0d8..f653b435 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -4,8 +4,9 @@ # # Translators: # Albino Biasutti Neto Bino <biasuttin@gmail.com>, 2011 +# Fábio Nogueira <deb.user.ba@gmail.com>, 2016 # Rafael Fontenelle <rffontenelle@gmail.com>, 2012-2015 -# Rafael Fontenelle <rffontenelle@gmail.com>, 2011,2015 +# Rafael Fontenelle <rffontenelle@gmail.com>, 2011,2015-2016 # Rafael Fontenelle <rffontenelle@gmail.com>, 2011 # Sandro <sandrossv@hotmail.com>, 2011 # Sandro <sandrossv@hotmail.com>, 2011 @@ -13,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 21:44+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 14:05+0000\n" "Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/lfleischer/aur/" "language/pt_BR/)\n" @@ -30,8 +31,22 @@ msgstr "Página não encontrada" msgid "Sorry, the page you've requested does not exist." msgstr "Desculpe, a página que você solicitou não existe." +msgid "Note" +msgstr "Nota" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "URLs de git-clone não servem para ser abertas em um navegador." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "Para clonar o repositório Git de %s, execute %s." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Clique %saqui%s para retornar para a página de detalhes de %s." + msgid "Service Unavailable" -msgstr "Serviço IndisponÃvel" +msgstr "Serviço indisponÃvel" msgid "" "Don't panic! This site is down due to maintenance. We will be back soon." @@ -86,7 +101,7 @@ msgid "Submit a proposal to vote on." msgstr "Enviar uma proposta para ser votada." msgid "Applicant/TU" -msgstr "Requerente/TU" +msgstr "Requerente/UC" msgid "(empty if not applicable)" msgstr "(vazio se não aplicável)" @@ -95,13 +110,13 @@ msgid "Type" msgstr "Tipo" msgid "Addition of a TU" -msgstr "Adição de um TU" +msgstr "Adição de um UC" msgid "Removal of a TU" -msgstr "Remoção de um TU" +msgstr "Remoção de um UC" msgid "Removal of a TU (undeclared inactivity)" -msgstr "Remoção de um TU (inatividade não declarada)" +msgstr "Remoção de um UC (inatividade não declarada)" msgid "Amendment of Bylaws" msgstr "Emenda ao Estatuto" @@ -127,7 +142,7 @@ msgid "" "Guidelines%s for more information." msgstr "" "Bem-vindo ao AUR! Por favor, leia as %sDiretrizes de Usuário do AUR%s e " -"%sDiretrizes de TU do AUR%s para mais informações." +"%sDiretrizes de UC do AUR%s para mais informações." #, php-format msgid "" @@ -227,7 +242,7 @@ msgstr "" "detalhes." msgid "The following SSH fingerprints are used for the AUR:" -msgstr "As seguintes fingeprints SSH são usadas para o AUR:" +msgstr "As seguintes impressões digitais SSH são usadas para o AUR:" msgid "Discussion" msgstr "Discussão" @@ -239,8 +254,9 @@ msgid "" "development of the AUR web interface, use the %saur-dev%s mailing list." msgstr "" "Discussões gerais no que se refere à estrutura do Arch User Repository (AUR) " -"e do Trusted User acontecem no %saur-general%s. Para discussão relacionada " -"ao desenvolvimento do AUR web, use a lista de discussão do %saur-dev%s" +"e do Usuário Confiável acontecem no %saur-general%s. Para discussão " +"relacionada ao desenvolvimento do AUR web, use a lista de discussão do %saur-" +"dev%s" msgid "Bug Reporting" msgstr "Relatório de erros" @@ -410,7 +426,7 @@ msgid "Delete" msgstr "Excluir" msgid "Only Trusted Users and Developers can delete packages." -msgstr "Somente Trusted Users e Desenvolvedores podem excluir pacotes." +msgstr "Somente Usuários Confiáveis e Desenvolvedores podem excluir pacotes." msgid "Disown Package" msgstr "Abandonar pacote" @@ -443,7 +459,7 @@ msgid "Disown" msgstr "Abandonar" msgid "Only Trusted Users and Developers can disown packages." -msgstr "Apenas Trusted Users e Desenvolvedores podem abandonar pacotes." +msgstr "Apenas Usuários Confiáveis e Desenvolvedores podem abandonar pacotes." msgid "Flag Comment" msgstr "Comentário da marcação" @@ -515,7 +531,7 @@ msgid "Merge" msgstr "Mesclar" msgid "Only Trusted Users and Developers can merge packages." -msgstr "Somente Trusted Users e Desenvolvedores podem mesclar pacotes." +msgstr "Somente Usuários Confiáveis e Desenvolvedores podem mesclar pacotes." msgid "Submit Request" msgstr "Enviar requisição" @@ -545,7 +561,7 @@ msgid "Use this form to create an account." msgstr "Utilize este formulário para criar uma conta." msgid "Trusted User" -msgstr "Trusted User" +msgstr "Usuário confiável" msgid "Could not retrieve proposal details." msgstr "Não foi possÃvel adquirir detalhes da proposta." @@ -554,7 +570,7 @@ msgid "Voting is closed for this proposal." msgstr "A votação está encerrada para esta proposta." msgid "Only Trusted Users are allowed to vote." -msgstr "Apenas Trusted Users têm permissão para votar." +msgstr "Apenas Usuários Confiáveis têm permissão para votar." msgid "You cannot vote in an proposal about you." msgstr "Você não pode votar em uma proposta sobre você." @@ -630,7 +646,7 @@ msgstr "Erro ao tentar criar uma conta, %s%s%s." #, php-format msgid "The account, %s%s%s, has been successfully created." -msgstr "A conta, %s%s%s, foi criada com sucesso." +msgstr "A conta %s%s%s foi criada com sucesso." msgid "A password reset key has been sent to your e-mail address." msgstr "" @@ -645,7 +661,7 @@ msgstr "Nenhuma alteração foi feita na conta, %s%s%s." #, php-format msgid "The account, %s%s%s, has been successfully modified." -msgstr "A conta, %s%s%s, foi modificada com sucesso." +msgstr "A conta %s%s%s foi modificada com sucesso." msgid "" "The login form is currently disabled for your IP address, probably due to " @@ -861,7 +877,7 @@ msgid "Invalid reason." msgstr "Motivo inválido" msgid "Only TUs and developers can close requests." -msgstr "Apenas TUs e desenvolvedores podem fechar requisições" +msgstr "Apenas UCs e desenvolvedores podem fechar requisições." msgid "Request closed successfully." msgstr "Requisição fechada com sucesso" @@ -892,7 +908,7 @@ msgid "Developer" msgstr "Desenvolvedor" msgid "Trusted User & Developer" -msgstr "Trusted User & Desenvolvedor" +msgstr "Usuário Confiável & Desenvolvedor" msgid "Email Address" msgstr "Endereço de e-mail" @@ -903,6 +919,9 @@ msgstr "oculto" msgid "Real Name" msgstr "Nome real" +msgid "Homepage" +msgstr "Página inicial" + msgid "IRC Nick" msgstr "Apelido no IRC" @@ -918,6 +937,9 @@ msgstr "Inativo desde" msgid "Active" msgstr "Ativa" +msgid "Registration date:" +msgstr "Data de registro:" + msgid "Last Login" msgstr "Último login" @@ -934,6 +956,10 @@ msgstr "Edite a conta desse usuário" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Clique %saqui%s se você deseja excluir permanentemente esta conta." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Clique %saqui%s para os detalhes do usuário." + msgid "required" msgstr "obrigatório" @@ -984,6 +1010,9 @@ msgstr "Notificar sobre novos comentários" msgid "Notify of package updates" msgstr "Notificar sobre atualizações de pacotes" +msgid "Notify of ownership changes" +msgstr "Notificar sobre mudanças de mantenedor" + msgid "Update" msgstr "Atualizar" @@ -1087,6 +1116,9 @@ msgstr "Votar neste pacote" msgid "Disable notifications" msgstr "Desabilitar notificações" +msgid "Enable notifications" +msgstr "Habilitar notificações" + msgid "Manage Co-Maintainers" msgstr "Gerenciar comantenedores" @@ -1234,9 +1266,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Use esse formulário para fechar a requisição para o pacote base %s%s%s." -msgid "Note" -msgstr "Nota" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1273,6 +1302,39 @@ msgstr "Tornar órfão" msgid "Merge into" msgstr "Mesclar em" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"Ao enviar uma requisição de exclusão, você solicita que um Trusted User " +"exclua o pacote base. Esse tipo de requisição deveria ser usada em caso de " +"duplicidade, softwares abandonados pelo upstream, assim como pacotes ilegais " +"ou irreparavelmente quebrados." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"Ao enviar uma requisição de mesclagem, você solicita que um Trusted User " +"exclua o pacote base e transfira seus votos e comentários para um outro " +"pacote base. Mesclar um pacote não afeta os repositórios Git " +"correspondentes. Certifique-se de você mesmo atualizar o histórico Git do " +"pacote alvo." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"Ao enviar uma requisição de tornar órfão, você pede que um Trusted User " +"abandona o pacote base. Por favor, apenas faça isto se o pacote precise de " +"ação do mantenedor, estando este ausente por muito tempo, e você já tentou - " +"e não conseguiu - contatá-lo anteriormente." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1293,8 +1355,10 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "~%d dias restantes" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d dia restante" +msgstr[1] "~%d dias restantes" #, php-format msgid "~%d hour left" @@ -1392,12 +1456,13 @@ msgstr[1] "%d pacotes encontrados." msgid "Version" msgstr "Versão" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" "Popularidade é calculada como a soma de todos os votos, sendo cada voto " -"pesado com um fator de 0.98 por dia desde sua criação." +"pesado com um fator de %.2f por dia desde sua criação." msgid "Yes" msgstr "Sim" @@ -1451,7 +1516,7 @@ msgid "Registered Users" msgstr "Usuários registrados" msgid "Trusted Users" -msgstr "Trusted Users" +msgstr "Usuários Confiáveis" msgid "Recent Updates" msgstr "Atualizações recentes" @@ -1491,7 +1556,7 @@ msgid "Participation" msgstr "Participação" msgid "Last Votes by TU" -msgstr "Últimos votos por TU" +msgstr "Últimos votos por UC" msgid "Last vote" msgstr "Último voto" diff --git a/po/pt_PT.po b/po/pt_PT.po index fa61d356..59ecb4f6 100644 --- a/po/pt_PT.po +++ b/po/pt_PT.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/lfleischer/" "aur/language/pt_PT/)\n" @@ -29,6 +29,20 @@ msgstr "Página Não Encontrada" msgid "Sorry, the page you've requested does not exist." msgstr "As nossas desculpas, a página que pediu não existe." +msgid "Note" +msgstr "" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Serviço não disponÃvel" @@ -876,6 +890,9 @@ msgstr "" msgid "Real Name" msgstr "Nome real" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Nick IRC" @@ -891,6 +908,9 @@ msgstr "Inativo desde" msgid "Active" msgstr "Activo" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Última sessão" @@ -907,6 +927,10 @@ msgstr "Editar a conta deste utilizador" msgid "Click %shere%s if you want to permanently delete this account." msgstr "" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "necessário" @@ -953,6 +977,9 @@ msgstr "Notificar-me sobre novos comentários" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Actualizar" @@ -1053,6 +1080,9 @@ msgstr "Votar neste pacote" msgid "Disable notifications" msgstr "Desativar notificações" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1199,9 +1229,6 @@ msgstr "Fontes" msgid "Use this form to close the request for package base %s%s%s." msgstr "" -msgid "Note" -msgstr "" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1236,6 +1263,26 @@ msgstr "Orfão" msgid "Merge into" msgstr "Juntar em" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1256,8 +1303,10 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" #, php-format msgid "~%d hour left" @@ -1355,9 +1404,10 @@ msgstr[1] "%d pacotes encontrados." msgid "Version" msgstr "Versão" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Romanian (http://www.transifex.com/lfleischer/aur/language/" "ro/)\n" @@ -28,6 +28,20 @@ msgstr "Pagina nu a fost găsită" msgid "Sorry, the page you've requested does not exist." msgstr "Din păcate, pagina solicitată nu există." +msgid "Note" +msgstr "Notă" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "" @@ -858,6 +872,9 @@ msgstr "" msgid "Real Name" msgstr "Nume real" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "Pseudonim IRC" @@ -873,6 +890,9 @@ msgstr "Inactiv din" msgid "Active" msgstr "Activ" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Ultima autentificare" @@ -889,6 +909,10 @@ msgstr "Modifică contul acestui utilizator" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Clic %saici%s dacă doreÈ™ti să È™tergi definitiv acest cont." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "cerut" @@ -935,6 +959,9 @@ msgstr "Notifică pentru comentarii noi" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Actualizare" @@ -1035,6 +1062,9 @@ msgstr "Votează acest pachet" msgid "Disable notifications" msgstr "Dezactivează notificări" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "" @@ -1184,9 +1214,6 @@ msgstr "" "FoloseÈ™te acest formular pentru a închide cererea pentru pachetul de bază %s" "%s%s." -msgid "Note" -msgstr "Notă" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1223,6 +1250,26 @@ msgstr "Orfan" msgid "Merge into" msgstr "Fuzionează" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1244,8 +1291,11 @@ msgid "Date" msgstr "Data" #, php-format -msgid "~%d days left" -msgstr "~%d zile rămase" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, php-format msgid "~%d hour left" @@ -1345,9 +1395,10 @@ msgstr[2] "%d de pachete găsite" msgid "Version" msgstr "Versiune" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -9,14 +9,15 @@ # Kyrylo Silin <curacaothe@gmail.com>, 2011 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # Rustam Tsurik <rustam.tsurik@gmail.com>, 2013 -# Sergey Shepelev <temotor@gmail.com>, 2014 +# Sergey Shepelev <temotor@gmail.com>, 2014,2016 +# ÐÑкольд <HaskuldNihil@protonmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-11 08:38+0000\n" -"Last-Translator: Evgeniy Alekseev <darkarcanis@mail.ru>\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" +"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Russian (http://www.transifex.com/lfleischer/aur/language/" "ru/)\n" "Language: ru\n" @@ -33,6 +34,20 @@ msgstr "Страница не найдена" msgid "Sorry, the page you've requested does not exist." msgstr "Извините, Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ñтраница не ÑущеÑтвует." +msgid "Note" +msgstr "Примечание" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен" @@ -342,7 +357,7 @@ msgid "Check your e-mail for the confirmation link." msgstr "Проверьте Ñвою Ñлектронную почту на наличие ÑÑылки подтверждениÑ." msgid "Your password has been reset successfully." -msgstr "Ваш пароль был уÑпешно переуÑтановлен." +msgstr "Ваш пароль уÑпешно Ñброшен." msgid "Confirm your e-mail address:" msgstr "Подтвердите Ð°Ð´Ñ€ÐµÑ Ñвоей Ñлектронной почты:" @@ -373,7 +388,7 @@ msgid "" msgstr "Выбранные пакеты будут брошены." msgid "Cannot find package to merge votes and comments into." -msgstr "Ðе могу найти пакет Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð½Ð¸Ð¼ голоÑов и комментариев." +msgstr "Ðе могу найти пакет Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñов и комментариев." msgid "Cannot merge a package base with itself." msgstr "Ðевозможно объединить группу пакетов Ñ Ñамой Ñобой." @@ -591,7 +606,7 @@ msgid "Start and end with a letter or number" msgstr "ÐачинаютÑÑ Ð¸ заканчиваютÑÑ Ñ†Ð¸Ñ„Ñ€Ð¾Ð¹ или буквой" msgid "Can contain only one period, underscore or hyphen." -msgstr "Может Ñодержать только одну запÑтую, подчёркивание или тире." +msgstr "Может Ñодержать только одну точку, подчёркивание или тире." msgid "The email address is invalid." msgstr "Ðеправильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты." @@ -610,7 +625,7 @@ msgstr "Язык пока не поддерживаетÑÑ." #, php-format msgid "The username, %s%s%s, is already in use." -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, %s%s%s, уже иÑпользуетÑÑ." +msgstr "Ð˜Ð¼Ñ %s%s%s уже занÑто." #, php-format msgid "The address, %s%s%s, is already in use." @@ -632,7 +647,7 @@ msgid "A password reset key has been sent to your e-mail address." msgstr "Ключ Ð´Ð»Ñ Ñмены Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð±Ñ‹Ð» отправлен на ваш Ñлектронный адреÑ." msgid "Click on the Login link above to use your account." -msgstr "Ðажмите на ÑÑылку Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° вверху чтобы зайти." +msgstr "Ðажмите на ÑÑылку Войти выше." #, php-format msgid "No changes were made to the account, %s%s%s." @@ -722,7 +737,7 @@ msgid "Package details could not be found." msgstr "Ðе найдена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пакете." msgid "You must be logged in before you can flag packages." -msgstr "Ð’Ñ‹ должны войти прежде чем раÑÑтавлÑÑ‚ÑŒ флажки на пакеты." +msgstr "Ð’Ñ‹ должны войти чтобы Ñтавить флажки на пакеты." msgid "You did not select any packages to flag." msgstr "Ð’Ñ‹ не выбрали ни одного пакета Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‚ÐºÐ¸." @@ -734,7 +749,7 @@ msgid "The selected packages have been flagged out-of-date." msgstr "Выбранные пакеты помечены как уÑтаревшие." msgid "You must be logged in before you can unflag packages." -msgstr "Ð’Ñ‹ должны войти прежде чем Ñнимать флажки." +msgstr "Ð’Ñ‹ должны войти чтобы Ñнимать флажки." msgid "You did not select any packages to unflag." msgstr "Ð’Ñ‹ не выбрали ни одного пакета Ð´Ð»Ñ ÑнÑÑ‚Ð¸Ñ Ð¿Ð¾Ð¼ÐµÑ‚ÐºÐ¸." @@ -752,10 +767,10 @@ msgid "The selected packages have been deleted." msgstr "Выбранные пакеты удалены." msgid "You must be logged in before you can adopt packages." -msgstr "Ð’Ñ‹ должны войти прежде чем уÑыновлÑÑ‚ÑŒ пакеты." +msgstr "Ð’Ñ‹ должны войти чтобы уÑыновлÑÑ‚ÑŒ пакеты." msgid "You must be logged in before you can disown packages." -msgstr "Ð’Ñ‹ должны войти прежде чем броÑать пакеты." +msgstr "Ð’Ñ‹ должны войти чтобы броÑать пакеты." msgid "You did not select any packages to adopt." msgstr "Ð’Ñ‹ не выбрали ни одного пакета Ð´Ð»Ñ ÑƒÑыновлениÑ." @@ -770,10 +785,10 @@ msgid "The selected packages have been disowned." msgstr "Выбранные пакеты брошены." msgid "You must be logged in before you can vote for packages." -msgstr "Ð’Ñ‹ должны войти прежде чем голоÑовать." +msgstr "Ð’Ñ‹ должны войти чтобы голоÑовать." msgid "You must be logged in before you can un-vote for packages." -msgstr "Ð’Ñ‹ должны войти прежде чем Ñнимать Ð³Ð¾Ð»Ð¾Ñ Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." +msgstr "Ð’Ñ‹ должны войти чтобы Ñнимать Ð³Ð¾Ð»Ð¾Ñ Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." msgid "You did not select any packages to vote for." msgstr "Ð’Ñ‹ не выбрали ни одного пакета Ð´Ð»Ñ Ð³Ð¾Ð»Ð¾ÑованиÑ." @@ -837,7 +852,7 @@ msgid "You must be logged in to file package requests." msgstr "Ð’Ñ‹ должны войти, чтобы отправить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾ пакету." msgid "Invalid name: only lowercase letters are allowed." -msgstr "Ðеверное имÑ: только нижний региÑÑ‚Ñ€ допуÑтим." +msgstr "Ðеверное имÑ: допуÑтим только нижний региÑÑ‚Ñ€." msgid "The comment field must not be empty." msgstr "Поле комментариев должно быть заполнено." @@ -894,6 +909,9 @@ msgstr "Ñкрыто" msgid "Real Name" msgstr "ÐаÑтоÑщее имÑ" +msgid "Homepage" +msgstr "ДомашнÑÑ Ñтраница" + msgid "IRC Nick" msgstr "IRC Ðик" @@ -909,6 +927,9 @@ msgstr "Ðеактивен Ñ" msgid "Active" msgstr "Ðктивный" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "ПоÑледний вход" @@ -925,6 +946,10 @@ msgstr "Отредактировать Ñтот аккаунт" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Ðажмите %sздеÑÑŒ%s, еÑли Ð’Ñ‹ хотите удалить данный аккаунт наÑовÑем." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "необходимо" @@ -959,7 +984,9 @@ msgstr "Язык" msgid "" "The following information is only required if you want to submit packages to " "the Arch User Repository." -msgstr "Только ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°, еÑли вы хотите загрузить пакеты в AUR." +msgstr "" +"Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°, только еÑли вы хотите загружать пакеты в " +"AUR." msgid "SSH Public Key" msgstr "Публичный SSH ключ" @@ -973,6 +1000,9 @@ msgstr "УведомлÑÑ‚ÑŒ о новых комментариÑÑ…" msgid "Notify of package updates" msgstr "УведомлÑÑ‚ÑŒ об обновлении пакета" +msgid "Notify of ownership changes" +msgstr "УведомлÑÑ‚ÑŒ об измененÑÑ… ÑобÑтвенноÑти" + msgid "Update" msgstr "Обновить" @@ -1007,8 +1037,8 @@ msgstr "Больше нет результатов." msgid "" "Use this form to add co-maintainers for %s%s%s (one user name per line):" msgstr "" -"ИÑпользуйте данную форму, чтобы добавить Ñопровождающих Ð´Ð»Ñ %s%s%s " -"(иÑпользуйте одно Ð¸Ð¼Ñ Ð½Ð° Ñтроку):" +"ИÑпользуйте данную форму, чтобы добавить Ñопровождающих Ð´Ð»Ñ %s%s%s (одно Ð¸Ð¼Ñ " +"на Ñтроку):" msgid "Users" msgstr "Пользователи" @@ -1058,7 +1088,7 @@ msgstr "ИÑкать в Wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "Отмечет уÑтаревшим (%s)" +msgstr "Отмечен уÑтаревшим (%s)" msgid "Flag package out-of-date" msgstr "Пометить пакет как уÑтаревший" @@ -1075,6 +1105,9 @@ msgstr "ПроголоÑовать за пакет" msgid "Disable notifications" msgstr "Выключить уведомлениÑ" +msgid "Enable notifications" +msgstr "Включить уведомлениÑ" + msgid "Manage Co-Maintainers" msgstr "Управление Ñопровождающими" @@ -1223,9 +1256,6 @@ msgstr "ИÑходники" msgid "Use this form to close the request for package base %s%s%s." msgstr "ИÑпользуйте Ñту форму, чтобы закрыть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ группе пакетов %s%s%s." -msgid "Note" -msgstr "Примечание" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1262,6 +1292,37 @@ msgstr "Сделать Ñиротой" msgid "Merge into" msgstr "Объединить Ñ" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"ОтправлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ, Ð’Ñ‹ проÑите Доверенного ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ " +"оÑновной пакет. Ðтот тип запроÑа должен иÑпользоватьÑÑ Ð´Ð»Ñ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð¾Ð², " +"заброшенных, а также незаконных и безнадёжно Ñломанных пакетов." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"ОтправлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние, Ð’Ñ‹ проÑите Доверенного ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ " +"оÑновной пакет, перемеÑтить голоÑа и комментарии к другому оÑновному пакету. " +"СлиÑние пакета не влиÑет на ÑоответÑтвующие Git репозитории. Обновите Git " +"иÑторию целевого пакета ÑамоÑтоÑтельно." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"ОтправлÑÑ ÑиротÑкий запроÑ, Ð’Ñ‹ проÑите Доверенного ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ€Ð¾Ñить " +"оÑновной пакет. ПожалуйÑта, делайте Ñто, только еÑли пакет нуждаетÑÑ Ð² " +"дейÑтвиÑÑ… обÑлуживающего, который недоÑтупен и вы уже пыталиÑÑŒ ÑвÑзатьÑÑ Ñ " +"ним ранее." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1284,8 +1345,12 @@ msgid "Date" msgstr "Дата" #, php-format -msgid "~%d days left" -msgstr "оÑталоÑÑŒ ~%d дней" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, php-format msgid "~%d hour left" @@ -1387,19 +1452,17 @@ msgstr[3] "Ðайдено %d пакетов." msgid "Version" msgstr "ВерÑиÑ" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"ПопулÑрноÑÑ‚ÑŒ ÑчитаетÑÑ, как Ñумма вÑех голоÑов, где каждый Ð³Ð¾Ð»Ð¾Ñ Ð²Ð·Ð²ÐµÑˆÐµÐ½ Ñ " -"коÑффициентом 0.98 за каждый день разницы между днем голоÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ днем " -"загрузки пакета." msgid "Yes" msgstr "Да" msgid "orphan" -msgstr "Ñирота" +msgstr "брошеный" msgid "Actions" msgstr "ДейÑтвиÑ" @@ -1429,7 +1492,7 @@ msgid "Statistics" msgstr "СтатиÑтика" msgid "Orphan Packages" -msgstr "Пакеты-Ñироты" +msgstr "Брошеные пакеты" msgid "Packages added in the past 7 days" msgstr "Пакеты, добавленные за прошедшие 7 дней" @@ -1459,7 +1522,7 @@ msgid "My Statistics" msgstr "ÐœÐ¾Ñ ÑтатиÑтика" msgid "Proposal Details" -msgstr "Подробнее о предложении" +msgstr "ПодробноÑти предложениÑ" msgid "This vote is still running." msgstr "ГолоÑование продолжаетÑÑ." @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Slovak (http://www.transifex.com/lfleischer/aur/language/" "sk/)\n" @@ -26,6 +26,20 @@ msgstr "Stránka nebola nájdená" msgid "Sorry, the page you've requested does not exist." msgstr "Mrzà nás to, ale stránka, ktorú ste zadali, neexistuje." +msgid "Note" +msgstr "Poznámka" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + msgid "Service Unavailable" msgstr "Služba nie je dostupná" @@ -887,6 +901,9 @@ msgstr "skrytý" msgid "Real Name" msgstr "SkutoÄné meno" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC prezývka" @@ -902,6 +919,9 @@ msgstr "NeaktÃvny od" msgid "Active" msgstr "AktÃvny" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "Posledné prihlásenie" @@ -918,6 +938,10 @@ msgstr "EditovaÅ¥ úÄet tohto užÃvateľa" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Kliknite %ssem%s ak chcete natrvalo vymazaÅ¥ tento úÄet." +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "povinný" @@ -967,6 +991,9 @@ msgstr "Upozorni na nové komentáre" msgid "Notify of package updates" msgstr "" +msgid "Notify of ownership changes" +msgstr "" + msgid "Update" msgstr "Aktualizácia" @@ -1069,6 +1096,9 @@ msgstr "Hlasuj za tento balÃÄek" msgid "Disable notifications" msgstr "Vypni upozornenia" +msgid "Enable notifications" +msgstr "" + msgid "Manage Co-Maintainers" msgstr "ManažovaÅ¥ spolupracovnÃkov" @@ -1217,9 +1247,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Použite tento formulár pre zatvorenie požiadavky na základňu balÃÄka %s%s%s." -msgid "Note" -msgstr "Poznámka" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1256,6 +1283,26 @@ msgstr "VyvlastniÅ¥" msgid "Merge into" msgstr "ZlúÄiÅ¥ do" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1277,8 +1324,11 @@ msgid "Date" msgstr "Dátum" #, php-format -msgid "~%d days left" -msgstr "~%d dnà ostáva" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, php-format msgid "~%d hour left" @@ -1378,12 +1428,11 @@ msgstr[2] "%d nájdených balÃÄkov." msgid "Version" msgstr "Verzia" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"Popularita sa poÄÃta ako suma vÅ¡etkých hlasov, priÄom každý hlas je násobený " -"váhovým faktorom 0.98 za deň od dátumu vzniku." msgid "Yes" msgstr "Ãno" @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-11 01:46+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-11 14:07+0000\n" "Last-Translator: Slobodan Terzić <githzerai06@gmail.com>\n" "Language-Team: Serbian (http://www.transifex.com/lfleischer/aur/language/" "sr/)\n" @@ -28,6 +28,20 @@ msgstr "Stranica nije naÄ‘ena" msgid "Sorry, the page you've requested does not exist." msgstr "Stranica koju ste zahtevali ne postoji." +msgid "Note" +msgstr "BeleÅ¡ka" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "URL-ovi za Git kloniranje nisu namenjeni za otvaranje u pregledaÄu." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "Da bi klonirali git riznicu %s, pokrenite %s." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Kliknite %sovde%s da bi se vratili na stranicu o %s." + msgid "Service Unavailable" msgstr "Servis nije dostupan" @@ -880,6 +894,9 @@ msgstr "skrivena" msgid "Real Name" msgstr "Pravo ime" +msgid "Homepage" +msgstr "Domaća stranica" + msgid "IRC Nick" msgstr "IRC nadimak" @@ -895,6 +912,9 @@ msgstr "Neaktivan od" msgid "Active" msgstr "Aktivan" +msgid "Registration date:" +msgstr "Datum registracije:" + msgid "Last Login" msgstr "Poslednje prijavljivanje" @@ -911,6 +931,10 @@ msgstr "UreÄ‘ivanje naloga ovog korisnika" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Kliknite %sovde%s ako želite trajno brisanje ovog naloga." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Kliknite %sovde%s za podatke o korisniku." + msgid "required" msgstr "neophodno" @@ -961,6 +985,9 @@ msgstr "Obavesti o novim komentarima" msgid "Notify of package updates" msgstr "Obavesti o nadogradnjama paketa" +msgid "Notify of ownership changes" +msgstr "Obavesti o promenama vlasniÅ¡tva" + msgid "Update" msgstr "Ažuriraj" @@ -1063,6 +1090,9 @@ msgstr "Glasajte za paket" msgid "Disable notifications" msgstr "Ugasi obaveÅ¡tenja" +msgid "Enable notifications" +msgstr "UkljuÄi obaveÅ¡tenja" + msgid "Manage Co-Maintainers" msgstr "Upravljanje koodržavaocima" @@ -1130,7 +1160,7 @@ msgstr "Poslednji komentari" #, php-format msgid "%s commented on %s" -msgstr "%s postavi komentar za %s" +msgstr "%s postavi komentar %s u" #, php-format msgid "Anonymous comment on %s" @@ -1210,9 +1240,6 @@ msgstr "Izvori" msgid "Use this form to close the request for package base %s%s%s." msgstr "Ovim formularom zatvarate zahteve za osnovu paketa %s%s%s." -msgid "Note" -msgstr "BeleÅ¡ka" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1249,6 +1276,37 @@ msgstr "SiroÄić" msgid "Merge into" msgstr "Stopi sa" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"PodnoÅ¡enjem zahteva za brisanje tražili ste of poverljivog korisnika da " +"obriÅ¡e bazu paketa. Ovaj tip zahteva treba koristiti za duplikate, uzvodno " +"napiÅ¡ten softver, kao i nelegalne ili nepopravljivo pokvarene pakete." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"PodnoÅ¡enjem zahteva za spajanje tražili ste of poverljivog korisnika da " +"obriÅ¡e bazu paketa i spoji njene glasove sa drugom bazom paketa. Spajanje " +"paketa ne utiÄe na pripadajuće Git riznice. Postarajte se sami da ažurirate " +"Git istorijat ciljanog paketa." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"PodnoÅ¡enjem zahteva za odricanje tražili ste od poverljivog korisnika da " +"izvrži odricanje od baze paketa. Molimo da ovo tražite samo ukoliko paket " +"zahteva održavanje, a održavalac je nedosupan i već ste pokuÅ¡ali da ga " +"kontaktirate." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1270,8 +1328,11 @@ msgid "Date" msgstr "Datum" #, php-format -msgid "~%d days left" -msgstr "Preostalo dana: ~%d" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "Preostaje joÅ¡ ~%d dan" +msgstr[1] "Preostaje joÅ¡ ~%d dana" +msgstr[2] "Preostaje joÅ¡ ~%d dana" #, php-format msgid "~%d hour left" @@ -1371,12 +1432,13 @@ msgstr[2] "NaÄ‘eno %d paketa." msgid "Version" msgstr "Verzija" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"Popularnost se izraÄunava kao suma svih glasova, gde glas ima faktor težine " -"0,98 za svaki dan od njegovog nastanka." +"Popularnost se izraÄunava kao suma svih glasova, gde svaki glas ima teži " +"%.2f po danu od kada je dat." msgid "Yes" msgstr "Da" @@ -9,14 +9,15 @@ # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # Samed Beyribey <ras0ir@eventualis.org>, 2012 # Samed Beyribey <samed@ozguryazilim.com.tr>, 2012 +# Serpil Acar <acarserpil89@gmail.com>, 2016 # Atilla ÖntaÅŸ <tarakbumba@gmail.com>, 2012 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" -"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-09 05:38+0000\n" +"Last-Translator: Serpil Acar <acarserpil89@gmail.com>\n" "Language-Team: Turkish (http://www.transifex.com/lfleischer/aur/language/" "tr/)\n" "Language: tr\n" @@ -31,6 +32,20 @@ msgstr "Sayfa Bulunamadı" msgid "Sorry, the page you've requested does not exist." msgstr "Ãœzgünüz, talep ettiÄŸiniz sayfa bulunamadı." +msgid "Note" +msgstr "Not" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "Git clone linkleri bir tarayıcıda açılamazlar." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "%s'in Git deposunu kopyalamak için, %s komutunu çalıştırın." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Detaylar sayfasına %s geri dönmek için %sburaya%s tıklayınız." + msgid "Service Unavailable" msgstr "Hizmete EriÅŸilemiyor" @@ -290,7 +305,7 @@ msgid "Enter login credentials" msgstr "GiriÅŸ bilgilerinizi doldurun" msgid "User name or email address" -msgstr "" +msgstr "Kullanıcı adı veya e-posta adresi" msgid "Password" msgstr "Parola" @@ -443,10 +458,10 @@ msgstr "" "bırakabilir." msgid "Flag Comment" -msgstr "" +msgstr "Yorumu Ä°ÅŸaretle" msgid "Flag Package Out-Of-Date" -msgstr "" +msgstr "Paketi güncel deÄŸil olarak iÅŸaretle" #, php-format msgid "" @@ -464,6 +479,8 @@ msgid "" "Enter details on why the package is out-of-date below, preferably including " "links to the release announcement or the new release tarball." msgstr "" +"Paketin neden güncel olmadığıyla ilgili detayları aÅŸağıya girin, tercihen " +"sürüm bildirilerinin veya yeni tarball sürümünün linklerini dahil ederek." msgid "Comments" msgstr "Yorumlar" @@ -473,6 +490,7 @@ msgstr "Ä°ÅŸaretle" msgid "Only registered users can flag packages out-of-date." msgstr "" +"Sadece kayıtlı kullanıcılar paketleri güncel deÄŸil olarak iÅŸaretleyebilir." msgid "Package Merging" msgstr "Paket birleÅŸtirme" @@ -673,16 +691,16 @@ msgid "View account information for %s" msgstr "%s için hesap bilgilerini görüntüle" msgid "Package base ID or package base name missing." -msgstr "" +msgstr "Paket ID'si veya paket ismi eksik." msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "Bu yorumu düzenlemek için yetkiniz yok." msgid "Comment does not exist." -msgstr "" +msgstr "Yorum bulunamadı." msgid "Comment cannot be empty." -msgstr "" +msgstr "Yorum boÅŸ olamaz." msgid "Comment has been added." msgstr "Yorum eklendi." @@ -694,16 +712,16 @@ msgid "Missing comment ID." msgstr "Yorum kimliÄŸi bulunamadı." msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "5 taneden fazla yorum iÄŸnelenemez." msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "Bu yorumu iÄŸnelemek için yetkiniz yok." msgid "You are not allowed to unpin this comment." msgstr "" msgid "Comment has been pinned." -msgstr "" +msgstr "Yorum iÄŸnelendi." msgid "Comment has been unpinned." msgstr "" @@ -721,7 +739,7 @@ msgid "You did not select any packages to flag." msgstr "Ä°ÅŸaretlenecek paketleri seçmediniz." msgid "The selected packages have not been flagged, please enter a comment." -msgstr "" +msgstr "Seçilen paketler iÅŸaretlenmedi, lütfen bir yorum giriniz." msgid "The selected packages have been flagged out-of-date." msgstr "Seçilen paketler güncelliÄŸini yitirmiÅŸ olarak iÅŸaretlendi." @@ -789,10 +807,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "%s bildirim listesinden baÅŸarıyla çıktınız." msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "Bu silinmiÅŸ yorumu geri almak için yetkili deÄŸilsiniz." msgid "Comment has been undeleted." -msgstr "" +msgstr "Yorum silindi." msgid "You are not allowed to delete this comment." msgstr "Bu yorumu silme yetkiniz yok." @@ -801,7 +819,7 @@ msgid "Comment has been deleted." msgstr "Yorum silindi." msgid "Comment has been edited." -msgstr "" +msgstr "Yorum düzenlendi." msgid "You are not allowed to edit the keywords of this package base." msgstr "" @@ -826,7 +844,7 @@ msgstr "Paket detaylarını görüntüle" #, php-format msgid "requires %s" -msgstr "" +msgstr "%s'ye ihtiyaç duyuyor." msgid "You must be logged in to file package requests." msgstr "Paket gereksinimlerinin kaydını tutmalısın." @@ -882,11 +900,14 @@ msgid "Email Address" msgstr "E-posta adresi" msgid "hidden" -msgstr "" +msgstr "gizli" msgid "Real Name" msgstr "Gerçek Ä°sim" +msgid "Homepage" +msgstr "Anasayfa" + msgid "IRC Nick" msgstr "IRC Rumuzu" @@ -902,6 +923,9 @@ msgstr "Åžu tarihten beri etkin deÄŸil:" msgid "Active" msgstr "Etkin" +msgid "Registration date:" +msgstr "Kayıt tarihi:" + msgid "Last Login" msgstr "Son giriÅŸ" @@ -918,6 +942,10 @@ msgstr "Bu kullanıcının hesabını düzenleyin" msgid "Click %shere%s if you want to permanently delete this account." msgstr "Bu hesabı temelli olarak silmek istiyorsanız %sburaya%s tıklayın." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Kullanıcı detayları için %sburaya%s tıklayın." + msgid "required" msgstr "gerekli" @@ -937,9 +965,11 @@ msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." msgstr "" +"Lütfen e-posta adresinizi doÄŸru girdiÄŸinizden emin olun, aksi halde " +"hesabınız kilitlenecektir." msgid "Hide Email Address" -msgstr "" +msgstr "E-posta Adresini Gizle" msgid "Re-type password" msgstr "Parolayı tekrar girin" @@ -958,13 +988,16 @@ msgid "SSH Public Key" msgstr "SSH Kamu Anahtarı" msgid "Notification settings" -msgstr "" +msgstr "Bildirim ayarları" msgid "Notify of new comments" msgstr "Yeni yorumları bildir" msgid "Notify of package updates" -msgstr "" +msgstr "Paket güncellemelerini bildir" + +msgid "Notify of ownership changes" +msgstr "Sahiplik deÄŸiÅŸikliklerini bildir." msgid "Update" msgstr "Güncelle" @@ -1011,7 +1044,7 @@ msgstr "Kaydet" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Güncel olmayan olarak iÅŸaretli yorum: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" @@ -1019,10 +1052,10 @@ msgstr "" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s güncel deÄŸil olarak iÅŸaretlenmedi." msgid "Return to Details" -msgstr "" +msgstr "Detaylara Geri Dön." #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." @@ -1051,7 +1084,7 @@ msgstr "Wikide ara" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "Güncel deÄŸil olarak iÅŸaretlendi (%s)" msgid "Flag package out-of-date" msgstr "GüncelliÄŸini yitirmiÅŸ olarak iÅŸaretle" @@ -1068,6 +1101,9 @@ msgstr "Pakete oy ver" msgid "Disable notifications" msgstr "Bildirimleri kapat" +msgid "Enable notifications" +msgstr "Bildirimleri etkinleÅŸtir" + msgid "Manage Co-Maintainers" msgstr "Yardımcı Bakımcıları Yönet" @@ -1118,7 +1154,7 @@ msgstr "Son Güncelleme" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "Yorumu düzenle: %s" msgid "Add Comment" msgstr "Yorum Ekle" @@ -1127,43 +1163,43 @@ msgid "View all comments" msgstr "Tüm yorumları görünüle" msgid "Pinned Comments" -msgstr "" +msgstr "Ä°ÄŸnelenmiÅŸ Yorumlar" msgid "Latest Comments" msgstr "Son Yorumlar" #, php-format msgid "%s commented on %s" -msgstr "" +msgstr "%s, %s'e yorum yaptı." #, php-format msgid "Anonymous comment on %s" -msgstr "" +msgstr "%s'e isimsiz yorum" #, php-format msgid "deleted on %s by %s" -msgstr "" +msgstr "%s'te, %s tarafından silindi." #, php-format msgid "deleted on %s" -msgstr "" +msgstr "%s'te silindi." #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "%s'te, %s tarafından düzenlendi" #, php-format msgid "edited on %s" -msgstr "" +msgstr "%s'te düzenlendi." msgid "Undelete comment" -msgstr "" +msgstr "Yorumu silmeyi geri al." msgid "Delete comment" msgstr "Yorumu sil" msgid "Pin comment" -msgstr "" +msgstr "Yorumu iÄŸnele" msgid "Unpin comment" msgstr "" @@ -1215,9 +1251,6 @@ msgid "Use this form to close the request for package base %s%s%s." msgstr "" "Bu formu %s%s%s paket temeli için yapılan talebi kapatmak için kullanın." -msgid "Note" -msgstr "Not" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1254,6 +1287,34 @@ msgstr "Öksüz" msgid "Merge into" msgstr "Åžununla iliÅŸkilendir:" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"Silme talebi göndererek, Güvenilir Kullanıcıdan paketi silmesini " +"istiyorsunuz. Bu tür bir istek birden fazla olan paketlerde, geliÅŸtirilmesi " +"durdurulmuÅŸ yazılımlarda, ve aynı zamanda yasadışı ve onarılamaz bozuklukta " +"olan paketler için kullanılmalıdır." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"BirleÅŸtirme talebi göndererek, Güvenilir Kullanıcıdan paketi silmesini ve bu " +"paketin oylarını ve yorumlarını diÄŸer pakete transfer etmesini istiyorsunuz. " +"Bir paketi birleÅŸtirmek ilgili Git deposunu etkilemeyecektir. Hedef paketin " +"Git geçmiÅŸini bizzat güncellediÄŸinizden emin olun. " + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1274,8 +1335,10 @@ msgid "Date" msgstr "Tarih" #, php-format -msgid "~%d days left" -msgstr "~%d gün kaldı" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d gün kaldı" +msgstr[1] "~%d gün kaldı" #, php-format msgid "~%d hour left" @@ -1326,7 +1389,7 @@ msgid "Voted" msgstr "Oylanmış" msgid "Last modified" -msgstr "" +msgstr "Son düzenleme" msgid "Ascending" msgstr "Eskiden yeniye" @@ -1373,12 +1436,13 @@ msgstr[1] "%d adet paket bulundu." msgid "Version" msgstr "Sürüm" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" -"BeÄŸenilirlik, oluÅŸturulmasından itibaren günlük 0.98 oranı ile çarpılarak " -"bulunan her oyun toplamı ile ölçülür." +"Popülarite, oluÅŸturulmasından itibaren günlük %.2f oranı ile " +"ağırlaÅŸtırılarak bulunan her oyun toplamı ile ölçülür." msgid "Yes" msgstr "Evet" @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 23:36+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 15:11+0000\n" "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" "Language-Team: Ukrainian (http://www.transifex.com/lfleischer/aur/language/" "uk/)\n" @@ -30,6 +30,21 @@ msgstr "Сторінку не знайдено" msgid "Sorry, the page you've requested does not exist." msgstr "Ðа жаль, запитаної Ñторінки не Ñ–Ñнує." +msgid "Note" +msgstr "Примітка" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "" +"ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñховища Git не вдаÑÑ‚ÑŒÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ в переглÑдарці." + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "Щоб клонувати Ñховище Git з %s, виконайте %s." + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "Клацніть %sтут%s Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½Ð° Ñторінку деталей %s." + msgid "Service Unavailable" msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð½ÐµÐ´Ð¾Ñтупний" @@ -895,6 +910,9 @@ msgstr "приховано" msgid "Real Name" msgstr "Справжнє ім'Ñ" +msgid "Homepage" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка" + msgid "IRC Nick" msgstr "ПÑевдонім IRC" @@ -910,6 +928,9 @@ msgstr "Ðеактивний з" msgid "Active" msgstr "Ðктивний" +msgid "Registration date:" +msgstr "Дата реєÑтрації:" + msgid "Last Login" msgstr "ОÑтанній вхід" @@ -926,6 +947,10 @@ msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ цього кориÑтувача" msgid "Click %shere%s if you want to permanently delete this account." msgstr "ÐатиÑніть %sтут%s, Ñкщо Ви бажаєте безповоротно вилучити цей рахунок." +#, php-format +msgid "Click %shere%s for user details." +msgstr "Клацніть %sтут%s Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ про кориÑтувача." + msgid "required" msgstr "обов'Ñзково" @@ -976,6 +1001,9 @@ msgstr "Сповіщати про нові коментарі" msgid "Notify of package updates" msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÑ–Ð²" +msgid "Notify of ownership changes" +msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ зміну влаÑника" + msgid "Update" msgstr "Оновити" @@ -1021,7 +1049,7 @@ msgstr "Зберегти" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "Позначено Ñк заÑтарілий коментар: %s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" @@ -1078,6 +1106,9 @@ msgstr "ГолоÑувати за цей пакунок" msgid "Disable notifications" msgstr "Відключити ÑповіщеннÑ" +msgid "Enable notifications" +msgstr "Включити ÑповіщеннÑ" + msgid "Manage Co-Maintainers" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¡ÑƒÐ¿Ñ€Ð¾Ð²Ñ–Ð´Ð½Ð¸ÐºÐ°Ð¼Ð¸" @@ -1225,9 +1256,6 @@ msgstr "Сирці" msgid "Use this form to close the request for package base %s%s%s." msgstr "ВикориÑтайте цю форму Ð´Ð»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ щодо бази пакетів %s%s%s." -msgid "Note" -msgstr "Примітка" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1264,6 +1292,36 @@ msgstr "Позначити заÑтарілим" msgid "Merge into" msgstr "Об'єднати в" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"ÐадÑилаючи запит на вилученнÑ, Ви проÑите Довіреного КориÑтувача вилучити " +"пакунок з бази. Цей тип запиту повинен викориÑтовуватиÑÑ Ð´Ð»Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð², " +"неоновлюваних програм, а також нелегальних Ñ– невиправно пошкоджених пакунків." + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"ÐадÑилаючи запит на об'єднаннÑ, Ви проÑите Довіреного КориÑтувача вилучити " +"пакунок Ñ– перенеÑти вÑÑ– його голоÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ– коментарі до іншого пакунку. " +"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÑƒ не впливає на відповідні Ñховища Git. ВпевнітьÑÑ, що Ви " +"оновили Ñамі Ñ–Ñторію Git доцільового пакунку." + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"ÐадÑилаючи запит на зреченнÑ, Ви проÑите Довіреного КориÑтувача позбавити " +"пакунок влаÑника. Робіть це, Ñкщо пакунок потребує ÑкоїÑÑŒ дії, Ñупровідник " +"не робить жодних дій Ñ– Ви вже попередньо намагалиÑÑ Ð·Ð²'ÑзатиÑÑ Ð· ним." + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1285,8 +1343,11 @@ msgid "Date" msgstr "Дата" #, php-format -msgid "~%d days left" -msgstr "~%d днів залишилоÑÑ" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "~%d день залишивÑÑ" +msgstr[1] "~%d днів залишилоÑÑ" +msgstr[2] "~%d днів залишилоÑÑ" #, php-format msgid "~%d hour left" @@ -1386,12 +1447,13 @@ msgstr[2] "Знайдено %d пакунків." msgid "Version" msgstr "ВерÑÑ–Ñ" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" "ПопулÑрніÑÑ‚ÑŒ розраховуєтьÑÑ Ñк Ñума вÑÑ–Ñ… голоÑувань, де кожен Ð³Ð¾Ð»Ð¾Ñ Ð±ÐµÑ€ÐµÑ‚ÑŒÑÑ " -"з ваговим коефіцієнтом 0.98 за кожен день з чаÑу ÑтвореннÑ." +"з ваговим коефіцієнтом %.2f за кожен день з чаÑу ÑтвореннÑ." msgid "Yes" msgstr "Так" diff --git a/po/zh_CN.po b/po/zh_CN.po index 928d9fac..453e7683 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -3,18 +3,19 @@ # This file is distributed under the same license as the AUR package. # # Translators: -# leonfeng <chaofeng111@gmail.com>, 2015 +# leonfeng <chaofeng111@gmail.com>, 2015-2016 # dongfengweixiao <dongfengweixiao@gmail.com>, 2015 # Felix Yan <felixonmars@gmail.com>, 2014 # Lukas Fleischer <transifex@cryptocrack.de>, 2011 # leonfeng <chaofeng111@gmail.com>, 2012 # Weiwen Zhao <panda.hust@gmail.com>, 2013 +# Xiaodong Qi <xiaodong.que+github@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-09 20:59+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-08 12:59+0000\n" "Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n" "Language-Team: Chinese (China) (http://www.transifex.com/lfleischer/aur/" "language/zh_CN/)\n" @@ -30,12 +31,26 @@ msgstr "页é¢æœªæ‰¾åˆ°" msgid "Sorry, the page you've requested does not exist." msgstr "请求的页é¢ä¸å˜åœ¨ã€‚" -msgid "Service Unavailable" +msgid "Note" +msgstr "æ示" + +msgid "Git clone URLs are not meant to be opened in a browser." msgstr "" +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "" + +msgid "Service Unavailable" +msgstr "æœåŠ¡ä¸å¯ç”¨" + msgid "" "Don't panic! This site is down due to maintenance. We will be back soon." -msgstr "" +msgstr "别怕ï¼æœ¬ç«™æ£åœ¨ç»´æŠ¤ä¸ï¼Œæˆ‘们会回æ¥çš„。" msgid "Account" msgstr "å¸æˆ·" @@ -111,10 +126,10 @@ msgid "Submit" msgstr "æ交" msgid "Manage Co-maintainers" -msgstr "" +msgstr "管ç†å…±åŒç»´æŠ¤è€…" msgid "Edit comment" -msgstr "" +msgstr "编辑评论" msgid "Home" msgstr "首页" @@ -145,56 +160,64 @@ msgstr "å…责声明" msgid "" "AUR packages are user produced content. Any use of the provided files is at " "your own risk." -msgstr "" +msgstr "AUR åŒ…ä¸ºç”¨æˆ·äº§ç”Ÿçš„å†…å®¹ã€‚ä½¿ç”¨å®ƒä»¬é€ æˆçš„åŽæžœè‡ªè´Ÿã€‚" msgid "Learn more..." -msgstr "" +msgstr "了解更多..." msgid "Support" -msgstr "" +msgstr "支æŒ" msgid "Package Requests" -msgstr "" +msgstr "软件包请求" #, php-format msgid "" "There are three types of requests that can be filed in the %sPackage Actions" "%s box on the package details page:" -msgstr "" +msgstr "在软件包详情页é¢ä¸Šæœ‰ä¸‰ç§å¯ä»¥åœ¨ %s软件包æ“作%s 框ä¸æ交的请求:" msgid "Orphan Request" -msgstr "" +msgstr "弃置请求" msgid "" "Request a package to be disowned, e.g. when the maintainer is inactive and " "the package has been flagged out-of-date for a long time." msgstr "" +"è¯·æ±‚æ ‡è®°è¿™ä¸ªè½¯ä»¶åŒ…ä¸ºæ— ä¸»çš„ï¼Œæ¯”å¦‚ç»´æŠ¤è€…ä¸æ´»è·ƒè€Œä¸”这个软件包已ç»è¢«æ ‡è®°ä¸ºè¿‡æ—¶å¾ˆ" +"久了。" msgid "Deletion Request" -msgstr "" +msgstr "åˆ é™¤è¯·æ±‚" msgid "" "Request a package to be removed from the Arch User Repository. Please do not " "use this if a package is broken and can be fixed easily. Instead, contact " "the package maintainer and file orphan request if necessary." msgstr "" +"请求软件包从 AUR ä¸ç§»é™¤ã€‚如果这个包虽然æŸå了但是å¯ä»¥è¢«è½»æ˜“地修好,请ä¸è¦è¿›è¡Œ" +"æ¤æ“作,您应该è”系包的维护者或者有必è¦çš„情况下å‘é€ orphan request。" msgid "Merge Request" -msgstr "" +msgstr "åˆå¹¶è¯·æ±‚" msgid "" "Request a package to be merged into another one. Can be used when a package " "needs to be renamed or replaced by a split package." msgstr "" +"请求一个软件包被åˆå¹¶åˆ°å¦ä¸€ä¸ªä¸ã€‚在一个包需è¦è¢«é‡å‘½å或者被分离æˆå¤šä¸ªåŒ…的情况" +"下使用。" #, php-format msgid "" "If you want to discuss a request, you can use the %saur-requests%s mailing " "list. However, please do not use that list to file requests." msgstr "" +"å¦‚æžœä½ æƒ³è®¨è®ºä¸€ä¸ªè¯·æ±‚ï¼Œä½ å¯ä»¥åœ¨ %saur-requests%s 邮件列表上å‘é€æ¶ˆæ¯ã€‚然而,ä¸" +"è¦åœ¨é‚£é‡Œå‘é€è¯·æ±‚。" msgid "Submitting Packages" -msgstr "" +msgstr "æ交软件包" #, php-format msgid "" @@ -202,9 +225,11 @@ msgid "" "packages%s section of the Arch User Repository ArchWiki page for more " "details." msgstr "" +"现在请使用 Git over SSH æ¥å‘ AUR æ交软件包。如果想知é“更多,请查看 Arch " +"Wiki 上的 Arch User Repository (简体ä¸æ–‡) 页é¢ä¸ %sæ交软件包%s ç« èŠ‚ã€‚" msgid "The following SSH fingerprints are used for the AUR:" -msgstr "" +msgstr "AUR 使用以下 SSH 指纹:" msgid "Discussion" msgstr "邮件列表" @@ -215,6 +240,8 @@ msgid "" "structure takes place on %saur-general%s. For discussion relating to the " "development of the AUR web interface, use the %saur-dev%s mailing list." msgstr "" +"与 Arch 用户仓库(AUR)或者å—信用户结构相关的一般讨论在 %saur-general%s 邮件" +"列表。若是与 AUR web 页é¢å¼€å‘相关的讨论,请使用 %saur-dev%s 邮件列表。" msgid "Bug Reporting" msgstr "Bug 报告" @@ -226,6 +253,9 @@ msgid "" "%sonly%s. To report packaging bugs contact the package maintainer or leave a " "comment on the appropriate package page." msgstr "" +"å¦‚æžœä½ åœ¨ AUR web 页é¢ä¸å‘现了一个 Bug,请æ交到我们的 %sBug 追踪系统%s。请%s" +"ä»…ä»…%s使用追踪系统报告 AUR 自身的 Bug。如果想è¦æŠ¥å‘Šæ‰“包方é¢çš„ Bug,请è”系相应" +"的包维护者,或者在相应的软件包页é¢ä¸ç•™ä¸‹ä¸€æ¡è¯„论。" msgid "Package Search" msgstr "软件包æœç´¢" @@ -262,7 +292,7 @@ msgid "Enter login credentials" msgstr "输入账户信æ¯" msgid "User name or email address" -msgstr "" +msgstr "用户å或 E-mail" msgid "Password" msgstr "密ç " @@ -334,7 +364,7 @@ msgstr "输入您的邮箱地å€:" msgid "" "The selected packages have not been disowned, check the confirmation " "checkbox." -msgstr "" +msgstr "选ä¸çš„软件包未被弃置,请检查确认å¤é€‰æ¡†ã€‚" msgid "Cannot find package to merge votes and comments into." msgstr "找ä¸åˆ°åˆå¹¶æŠ•ç¥¨ä¸Žè¯„è®ºçš„ç›®æ ‡åŒ…ã€‚" @@ -380,49 +410,51 @@ msgstr "弃置软件包" msgid "" "Use this form to disown the package base %s%s%s which includes the following " "packages: " -msgstr "" +msgstr "ä½¿ç”¨è¿™ä¸ªè¡¨æ ¼æ¥å¼ƒç½®åŒ…基础 %s%s%s,其ä¸åŒ…括下列软件包:" #, php-format msgid "" "By selecting the checkbox, you confirm that you want to disown the package " "and transfer ownership to %s%s%s." -msgstr "" +msgstr "通过选ä¸å¤é€‰æ¡†ï¼Œæ‚¨å°†ç¡®è®¤æ‚¨å°†å¼ƒç½®è¿™ä¸ªåŒ…并将其所有æƒè½¬ç§»ç»™ %s%s%s。" msgid "" "By selecting the checkbox, you confirm that you want to disown the package." -msgstr "" +msgstr "通过选ä¸å¤é€‰æ¡†ï¼Œæ‚¨å°†ç¡®è®¤æ‚¨å°†å¼ƒç½®è¿™ä¸ªåŒ…。" msgid "Confirm to disown the package" -msgstr "" +msgstr "继ç»ä»¥å¼ƒç½®åŒ…" msgid "Disown" msgstr "弃置" msgid "Only Trusted Users and Developers can disown packages." -msgstr "" +msgstr "åªæœ‰å—信用户和开å‘人员能弃置软件包。" msgid "Flag Comment" -msgstr "" +msgstr "æ ‡è®°è¯„è®º" msgid "Flag Package Out-Of-Date" -msgstr "" +msgstr "å°†è½¯ä»¶åŒ…æ ‡è®°ä¸ºè¿‡æœŸ" #, php-format msgid "" "Use this form to flag the package base %s%s%s and the following packages out-" "of-date: " -msgstr "" +msgstr "使用这个表å•å°†åŒ…基础 %s%s%s å’Œä»¥ä¸‹åŒ…æ ‡è®°ä¸ºå·²è¿‡æœŸ :" #, php-format msgid "" "Please do %snot%s use this form to report bugs. Use the package comments " "instead." -msgstr "" +msgstr "请 %sä¸%s è¦ç”¨è¿™ä¸ªè¡¨å•æ交问题。请您使用包评论功能。" msgid "" "Enter details on why the package is out-of-date below, preferably including " "links to the release announcement or the new release tarball." msgstr "" +"在下é¢è¾“入为什么这个软件包过期了,最好写一下更新日志的链接或者新版软件压缩包" +"的地å€ã€‚" msgid "Comments" msgstr "评论" @@ -431,7 +463,7 @@ msgid "Flag" msgstr "æ ‡è®°" msgid "Only registered users can flag packages out-of-date." -msgstr "" +msgstr "åªæœ‰å·²æ³¨å†Œçš„用户æ‰èƒ½æŠŠè½¯ä»¶æ ‡è®°ä¸ºå·²è¿‡æœŸã€‚" msgid "Package Merging" msgstr "软件包åˆå¹¶" @@ -465,7 +497,7 @@ msgid "Only Trusted Users and Developers can merge packages." msgstr "åªæœ‰å—信用户和开å‘人员æ‰èƒ½åˆ 除软件包。" msgid "Submit Request" -msgstr "" +msgstr "æ交请求" msgid "Close Request" msgstr "å…³é—请求" @@ -551,7 +583,7 @@ msgid "The PGP key fingerprint is invalid." msgstr "PGP å¯†é’¥æŒ‡çº¹æ— æ•ˆã€‚" msgid "The SSH public key is invalid." -msgstr "" +msgstr "æ¤ SSH å…¬é’¥æ— æ•ˆã€‚" msgid "Cannot increase account permissions." msgstr "ä¸èƒ½æ高账户æƒé™ã€‚" @@ -569,7 +601,7 @@ msgstr "è¯¥åœ°å€ %s%s%s 已被使用。" #, php-format msgid "The SSH public key, %s%s%s, is already in use." -msgstr "" +msgstr "SSH 公钥 %s%s%s 已被使用。" #, php-format msgid "Error trying to create account, %s%s%s." @@ -629,16 +661,16 @@ msgid "View account information for %s" msgstr "查看 %s 的账户信æ¯" msgid "Package base ID or package base name missing." -msgstr "" +msgstr "缺少软件包基础 ID 或软件包å。" msgid "You are not allowed to edit this comment." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™ç¼–辑评论。" msgid "Comment does not exist." -msgstr "" +msgstr "评论ä¸å˜åœ¨ã€‚" msgid "Comment cannot be empty." -msgstr "" +msgstr "评论ä¸èƒ½ä¸ºç©ºã€‚" msgid "Comment has been added." msgstr "å·²ç»æ·»åŠ 评论。" @@ -650,19 +682,19 @@ msgid "Missing comment ID." msgstr "è¯„è®ºæ ‡è¯†ä¸¢å¤±ã€‚" msgid "No more than 5 comments can be pinned." -msgstr "" +msgstr "ä¸èƒ½åŒæ—¶é”定 5 æ¡ä»¥ä¸Šçš„评论。" msgid "You are not allowed to pin this comment." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™é”定这æ¡è¯„论。" msgid "You are not allowed to unpin this comment." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™è§£é”è¿™æ¡è¯„论。" msgid "Comment has been pinned." -msgstr "" +msgstr "评论已é”定。" msgid "Comment has been unpinned." -msgstr "" +msgstr "评论已解é”。" msgid "Error retrieving package details." msgstr "获å–软件包详情时å‘生错误。" @@ -677,7 +709,7 @@ msgid "You did not select any packages to flag." msgstr "您没有选择è¦æ ‡è®°çš„软件包。" msgid "The selected packages have not been flagged, please enter a comment." -msgstr "" +msgstr "选ä¸çš„è½¯ä»¶åŒ…å·²è¢«æ ‡è®°ï¼Œè¯·è¾“å…¥è¯„è®ºã€‚" msgid "The selected packages have been flagged out-of-date." msgstr "é€‰æ‹©çš„è½¯ä»¶åŒ…å·²è¢«æ ‡è®°ä¸ºè¿‡æœŸã€‚" @@ -745,10 +777,10 @@ msgid "You have been removed from the comment notification list for %s." msgstr "您将ä¸å†æ”¶åˆ° %s 的评论通知。" msgid "You are not allowed to undelete this comment." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™æ¢å¤è¿™æ¡è¯„论。" msgid "Comment has been undeleted." -msgstr "" +msgstr "评论已æ¢å¤ã€‚" msgid "You are not allowed to delete this comment." msgstr "您没有æƒé™åˆ 除æ¤è¯„论。" @@ -757,30 +789,30 @@ msgid "Comment has been deleted." msgstr "è¯„è®ºå·²è¢«åˆ é™¤ã€‚" msgid "Comment has been edited." -msgstr "" +msgstr "评论已编辑。" msgid "You are not allowed to edit the keywords of this package base." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™ç¼–辑这个软件包基础的关键è¯ã€‚" msgid "The package base keywords have been updated." -msgstr "" +msgstr "软件包基础的关键è¯å·²è¢«æ›´æ–°ã€‚" msgid "You are not allowed to manage co-maintainers of this package base." -msgstr "" +msgstr "ä½ æ²¡æœ‰æƒé™ç®¡ç†è¿™ä¸ªè½¯ä»¶åŒ…基础的共åŒç®¡ç†è€…。" #, php-format msgid "Invalid user name: %s" -msgstr "" +msgstr "éžæ³•ç”¨æˆ·å:%s" msgid "The package base co-maintainers have been updated." -msgstr "" +msgstr "软件包基础的共åŒç»´æŠ¤è€…已更新。" msgid "View packages details for" msgstr "查看软件包详细信æ¯" #, php-format msgid "requires %s" -msgstr "" +msgstr "éœ€è¦ %s" msgid "You must be logged in to file package requests." msgstr "登录之åŽæ‰èƒ½æ交软件包需求。" @@ -836,11 +868,14 @@ msgid "Email Address" msgstr "Email" msgid "hidden" -msgstr "" +msgstr "å·²éšè—" msgid "Real Name" msgstr "真实åå—" +msgid "Homepage" +msgstr "" + msgid "IRC Nick" msgstr "IRC昵称" @@ -856,6 +891,9 @@ msgstr "ä¸æ´»è·ƒè‡ª" msgid "Active" msgstr "激活" +msgid "Registration date:" +msgstr "" + msgid "Last Login" msgstr "最åŽç™»é™†" @@ -872,6 +910,10 @@ msgstr "编辑æ¤ç”¨æˆ·çš„å¸å·" msgid "Click %shere%s if you want to permanently delete this account." msgstr "å¦‚æžœä½ æƒ³è¦å½»åº•åˆ 除这个å¸å·ï¼Œè¯·ç‚¹å‡»%s这里%s。" +#, php-format +msgid "Click %shere%s for user details." +msgstr "" + msgid "required" msgstr "å¿…å¡«" @@ -890,10 +932,10 @@ msgstr "ä¸æ´»è·ƒ" msgid "" "Please ensure you correctly entered your email address, otherwise you will " "be locked out." -msgstr "" +msgstr "è¯·ç¡®è®¤ä½ æ£ç¡®åœ°è¾“å…¥äº†ä½ çš„ E-mailï¼Œæˆ–è€…ä½ å°†ä¼šè¢«é”定。" msgid "Hide Email Address" -msgstr "" +msgstr "éšè— E-mail" msgid "Re-type password" msgstr "确认密ç " @@ -904,18 +946,21 @@ msgstr "è¯è¨€" msgid "" "The following information is only required if you want to submit packages to " "the Arch User Repository." -msgstr "" +msgstr "ä»…ä»…å½“ä½ æƒ³è¦å‘ AUR æ交软件包时æ‰éœ€è¦å¡«å†™ä»¥ä¸‹ä¿¡æ¯ã€‚" msgid "SSH Public Key" -msgstr "" +msgstr "SSH 公钥" msgid "Notification settings" -msgstr "" +msgstr "æ醒设置" msgid "Notify of new comments" msgstr "当有新评论的时候æ醒我" msgid "Notify of package updates" +msgstr "软件包更新æ醒" + +msgid "Notify of ownership changes" msgstr "" msgid "Update" @@ -951,32 +996,32 @@ msgstr "没有更多的结果供显示。" #, php-format msgid "" "Use this form to add co-maintainers for %s%s%s (one user name per line):" -msgstr "" +msgstr "使用这个表å•æ¥æ·»åŠ %s%s%s çš„å…±åŒç»´æŠ¤è€…(一个用户å一行):" msgid "Users" -msgstr "" +msgstr "用户" msgid "Save" -msgstr "" +msgstr "ä¿å˜" #, php-format msgid "Flagged Out-of-Date Comment: %s" -msgstr "" +msgstr "å·²æ ‡è®°ä¸ºè¿‡æœŸçš„è¯„è®ºï¼š%s" #, php-format msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:" -msgstr "" +msgstr "%s%s%s æ ‡è®°äº† %s%s%s 为过期,在 %s%s%sï¼Œå› ä¸ºä»¥ä¸‹åŽŸå› ï¼š" #, php-format msgid "%s%s%s is not flagged out-of-date." -msgstr "" +msgstr "%s%s%s æœªè¢«æ ‡è®°ä¸ºè¿‡æœŸã€‚" msgid "Return to Details" -msgstr "" +msgstr "返回详情" #, php-format msgid "Copyright %s 2004-%d aurweb Development Team." -msgstr "" +msgstr "版æƒæ‰€æœ‰ %s 2004-%d aurweb å¼€å‘组" msgid "My Packages" msgstr "我的软件包" @@ -991,17 +1036,17 @@ msgid "View PKGBUILD" msgstr "查看 PKGBUILD" msgid "View Changes" -msgstr "" +msgstr "查看更改" msgid "Download snapshot" -msgstr "" +msgstr "下载快照" msgid "Search wiki" msgstr "æœç´¢ Wiki" #, php-format msgid "Flagged out-of-date (%s)" -msgstr "" +msgstr "å·²æ ‡è®°ä¸ºè¿‡æœŸ (%s)" msgid "Flag package out-of-date" msgstr "å°†è½¯ä»¶åŒ…æ ‡è®°ä¸ºè¿‡æœŸ" @@ -1018,9 +1063,12 @@ msgstr "为这个软件包投票" msgid "Disable notifications" msgstr "ç¦ç”¨é€šçŸ¥" -msgid "Manage Co-Maintainers" +msgid "Enable notifications" msgstr "" +msgid "Manage Co-Maintainers" +msgstr "管ç†å…±åŒç»´æŠ¤è€…" + #, php-format msgid "%d pending request" msgid_plural "%d pending requests" @@ -1036,10 +1084,10 @@ msgid "Package Base Details" msgstr "包基础详情" msgid "Git Clone URL" -msgstr "" +msgstr "Git 克隆地å€" msgid "read-only" -msgstr "" +msgstr "åªè¯»" msgid "Keywords" msgstr "关键å—" @@ -1057,7 +1105,7 @@ msgid "Votes" msgstr "得票" msgid "Popularity" -msgstr "" +msgstr "å—欢迎度" msgid "First Submitted" msgstr "首次æ交" @@ -1067,7 +1115,7 @@ msgstr "最åŽæ›´æ–°" #, php-format msgid "Edit comment for: %s" -msgstr "" +msgstr "编辑 %s 的评论" msgid "Add Comment" msgstr "æ·»åŠ è¯„è®º" @@ -1076,46 +1124,46 @@ msgid "View all comments" msgstr "查看所有评论" msgid "Pinned Comments" -msgstr "" +msgstr "å·²é”定评论" msgid "Latest Comments" msgstr "最新的评论" #, php-format msgid "%s commented on %s" -msgstr "" +msgstr "%s 在 %s å‘表了评论" #, php-format msgid "Anonymous comment on %s" -msgstr "" +msgstr "在 %s å‘表的匿å评论" #, php-format msgid "deleted on %s by %s" -msgstr "" +msgstr "在 %s 被 %s åˆ é™¤" #, php-format msgid "deleted on %s" -msgstr "" +msgstr "在 %s è¢«åˆ é™¤" #, php-format msgid "edited on %s by %s" -msgstr "" +msgstr "在 %s 被 %s 编辑" #, php-format msgid "edited on %s" -msgstr "" +msgstr "在 %s 被编辑" msgid "Undelete comment" -msgstr "" +msgstr "æ¢å¤è¯„论" msgid "Delete comment" msgstr "åˆ é™¤è¯„è®º" msgid "Pin comment" -msgstr "" +msgstr "é”定评论" msgid "Unpin comment" -msgstr "" +msgstr "解é”评论" msgid "All comments" msgstr "全部评论" @@ -1163,9 +1211,6 @@ msgstr "æºä»£ç :" msgid "Use this form to close the request for package base %s%s%s." msgstr "使用这个表å•æ¥å…³é—对包基础 %s%s%s 的请求。" -msgid "Note" -msgstr "æ示" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1198,6 +1243,26 @@ msgstr "弃置" msgid "Merge into" msgstr "åˆå¹¶åˆ°" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1217,8 +1282,9 @@ msgid "Date" msgstr "日期" #, php-format -msgid "~%d days left" -msgstr "剩余~%d天" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "" #, php-format msgid "~%d hour left" @@ -1268,7 +1334,7 @@ msgid "Voted" msgstr "已投票" msgid "Last modified" -msgstr "" +msgstr "上次修改" msgid "Ascending" msgstr "从å°åˆ°å¤§" @@ -1314,9 +1380,10 @@ msgstr[0] "找到了 %d 个软件包。" msgid "Version" msgstr "版本" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." +"weighted with a factor of %.2f per day since its creation." msgstr "" msgid "Yes" @@ -1377,7 +1444,7 @@ msgid "Recent Updates" msgstr "最新更新" msgid "more" -msgstr "" +msgstr "更多" msgid "My Statistics" msgstr "我的统计" diff --git a/po/zh_TW.po b/po/zh_TW.po index bb26fd59..5d1a4247 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Arch User Repository (AUR)\n" "Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n" -"POT-Creation-Date: 2016-02-09 21:58+0100\n" -"PO-Revision-Date: 2016-02-11 13:26+0000\n" +"POT-Creation-Date: 2016-10-08 14:59+0200\n" +"PO-Revision-Date: 2016-10-09 09:21+0000\n" "Last-Translator: Jeff Huang <s8321414@gmail.com>\n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/lfleischer/aur/" "language/zh_TW/)\n" @@ -25,6 +25,20 @@ msgstr "é é¢æ‰¾ä¸åˆ°" msgid "Sorry, the page you've requested does not exist." msgstr "抱æ‰ï¼Œæ‚¨æ‰€è«‹æ±‚çš„é é¢ä¸å˜åœ¨ã€‚" +msgid "Note" +msgstr "注æ„" + +msgid "Git clone URLs are not meant to be opened in a browser." +msgstr "Git clone 的網å€ä¸¦ä¸ä»£è¡¨å¯ä»¥åœ¨ç€è¦½å™¨ä¸é–‹å•Ÿã€‚" + +#, php-format +msgid "To clone the Git repository of %s, run %s." +msgstr "è¦ clone %s çš„ Git 倉庫,執行 %s。" + +#, php-format +msgid "Click %shere%s to return to the %s details page." +msgstr "é»žé¸ %sæ¤è™•%s 以回到 %s 的詳細資訊é é¢ã€‚" + msgid "Service Unavailable" msgstr "æœå‹™ä¸å¯ç”¨" @@ -857,6 +871,9 @@ msgstr "已隱è—" msgid "Real Name" msgstr "真實å稱" +msgid "Homepage" +msgstr "首é " + msgid "IRC Nick" msgstr "IRC 暱稱" @@ -872,6 +889,9 @@ msgstr "ä¸æ´»èºè‡ª" msgid "Active" msgstr "æ´»èº" +msgid "Registration date:" +msgstr "註冊日期:" + msgid "Last Login" msgstr "最後登入" @@ -888,6 +908,10 @@ msgstr "編輯æ¤ä½¿ç”¨è€…的帳號" msgid "Click %shere%s if you want to permanently delete this account." msgstr "如果您想è¦æ°¸ä¹…刪除æ¤å¸³è™Ÿï¼Œè«‹é»žæ“Š %s這裡%s 。" +#, php-format +msgid "Click %shere%s for user details." +msgstr "é»žé¸ %sæ¤è™•%s 來å–得使用者的詳細資訊。" + msgid "required" msgstr "å¿…å¡«" @@ -934,6 +958,9 @@ msgstr "接收新評論通知" msgid "Notify of package updates" msgstr "通知套件更新" +msgid "Notify of ownership changes" +msgstr "æ“有者變更通知" + msgid "Update" msgstr "æ›´æ–°" @@ -1034,6 +1061,9 @@ msgstr "為æ¤å¥—件投票" msgid "Disable notifications" msgstr "åœç”¨é€šçŸ¥" +msgid "Enable notifications" +msgstr "啟用通知" + msgid "Manage Co-Maintainers" msgstr "管ç†å…±åŒç¶è·è€…" @@ -1179,9 +1209,6 @@ msgstr "來æº" msgid "Use this form to close the request for package base %s%s%s." msgstr "使用這個表單以關閉請求套件基礎 %s%s%s 。" -msgid "Note" -msgstr "注æ„" - msgid "" "The comments field can be left empty. However, it is highly recommended to " "add a comment when rejecting a request." @@ -1214,6 +1241,33 @@ msgstr "棄置" msgid "Merge into" msgstr "åˆä½µåˆ°" +msgid "" +"By submitting a deletion request, you ask a Trusted User to delete the " +"package base. This type of request should be used for duplicates, software " +"abandoned by upstream, as well as illegal and irreparably broken packages." +msgstr "" +"é€éŽéžäº¤åˆªé™¤è«‹æ±‚,您會請求å—信使用者刪除套件基礎。這個類型的請求應該用於é‡" +"複ã€è¢«ä¸Šæ¸¸æ”¾æ£„的軟體,以åŠé•æ³•èˆ‡ç„¡æ³•ä¿®å¾©çš„æ壞套件。" + +msgid "" +"By submitting a merge request, you ask a Trusted User to delete the package " +"base and transfer its votes and comments to another package base. Merging a " +"package does not affect the corresponding Git repositories. Make sure you " +"update the Git history of the target package yourself." +msgstr "" +"é€éŽéžäº¤åˆä½µè«‹æ±‚,您會請求å—信使用者刪除套件基礎並轉移其投票數到其他的套件基" +"礎。åˆä½µä¸€å€‹å¥—件ä¸æœƒå½±éŸ¿ç›¸å°æ‡‰çš„ Git 倉庫。確ä¿æ‚¨å¯ä»¥è‡ªå·±æ›´æ–°ç›®æ¨™å¥—件的 Git " +"æ·å²ã€‚" + +msgid "" +"By submitting an orphan request, you ask a Trusted User to disown the " +"package base. Please only do this if the package needs maintainer action, " +"the maintainer is MIA and you already tried to contact the maintainer " +"previously." +msgstr "" +"é€éŽéžäº¤æ£„置請求,您會請求å—信使用者棄置套件基礎。請僅在該套件需è¦æœ‰ç¶è·è€…å‹•" +"作ã€ç¶è·è€…çªç„¶æ¶ˆå¤±ä¸”您先å‰å·²ç¶“連絡éŽç¶è·è€…時åšæ¤å‹•ä½œã€‚" + #, php-format msgid "%d package request found." msgid_plural "%d package requests found." @@ -1233,8 +1287,9 @@ msgid "Date" msgstr "日期" #, php-format -msgid "~%d days left" -msgstr "剩餘 ~%d 天" +msgid "~%d day left" +msgid_plural "~%d days left" +msgstr[0] "剩餘 ~%d 天" #, php-format msgid "~%d hour left" @@ -1330,10 +1385,11 @@ msgstr[0] "找到 %d 個套件。" msgid "Version" msgstr "版本" +#, php-format msgid "" "Popularity is calculated as the sum of all votes with each vote being " -"weighted with a factor of 0.98 per day since its creation." -msgstr "人氣的計算方å¼ç‚ºï¼Œå°‡æ‰€æœ‰ç¥¨æ•¸åŠ 總,且æ¯ä¸€ç¥¨è‡ªå»ºç«‹ä»¥ä¾†æ¯å¤©ä¹˜ä¸Š 0.98。" +"weighted with a factor of %.2f per day since its creation." +msgstr "人氣的計算方å¼ç‚ºï¼Œå°‡æ‰€æœ‰ç¥¨æ•¸åŠ 總,且æ¯ä¸€ç¥¨è‡ªå»ºç«‹ä»¥ä¾†æ¯å¤©ä¹˜ä¸Š %.2f。" msgid "Yes" msgstr "是" diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql index aa5ed9da..30209bd8 100644 --- a/schema/aur-schema.sql +++ b/schema/aur-schema.sql @@ -31,28 +31,23 @@ CREATE TABLE Users ( Salt CHAR(32) NOT NULL DEFAULT '', ResetKey CHAR(32) NOT NULL DEFAULT '', RealName VARCHAR(64) NOT NULL DEFAULT '', - LangPreference VARCHAR(5) NOT NULL DEFAULT 'en', + LangPreference VARCHAR(6) NOT NULL DEFAULT 'en', + Homepage TEXT NULL DEFAULT NULL, IRCNick VARCHAR(32) NOT NULL DEFAULT '', PGPKey VARCHAR(40) NULL DEFAULT NULL, LastLogin BIGINT UNSIGNED NOT NULL DEFAULT 0, - LastLoginIPAddress VARCHAR(40) NULL DEFAULT NULL, + LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL, InactivityTS BIGINT UNSIGNED NOT NULL DEFAULT 0, RegistrationTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CommentNotify TINYINT(1) NOT NULL DEFAULT 1, UpdateNotify TINYINT(1) NOT NULL DEFAULT 0, + OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1, PRIMARY KEY (ID), UNIQUE (Username), UNIQUE (Email), - INDEX (AccountTypeID), FOREIGN KEY (AccountTypeID) REFERENCES AccountTypes(ID) ON DELETE NO ACTION ) ENGINE = InnoDB; --- A default developer account for testing purposes -INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES ( - 1, 3, 'dev', 'dev@localhost', MD5('dev')); -INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES ( - 2, 2, 'tu', 'tu@localhost', MD5('tu')); -INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES ( - 3, 1, 'user', 'user@localhost', MD5('user')); +CREATE INDEX UsersAccountTypeID ON Users (AccountTypeID); -- SSH public keys used for the aurweb SSH/Git interface. @@ -94,16 +89,16 @@ CREATE TABLE PackageBases ( PackagerUID INTEGER UNSIGNED NULL DEFAULT NULL, -- Last packager PRIMARY KEY (ID), UNIQUE (Name), - INDEX (NumVotes), - INDEX (SubmitterUID), - INDEX (MaintainerUID), - INDEX (PackagerUID), FOREIGN KEY (FlaggerUID) REFERENCES Users(ID) ON DELETE SET NULL, -- deleting a user will cause packages to be orphaned, not deleted FOREIGN KEY (SubmitterUID) REFERENCES Users(ID) ON DELETE SET NULL, FOREIGN KEY (MaintainerUID) REFERENCES Users(ID) ON DELETE SET NULL, FOREIGN KEY (PackagerUID) REFERENCES Users(ID) ON DELETE SET NULL ) ENGINE = InnoDB; +CREATE INDEX BasesNumVotes ON PackageBases (NumVotes); +CREATE INDEX BasesSubmitterUID ON PackageBases (SubmitterUID); +CREATE INDEX BasesMaintainerUID ON PackageBases (MaintainerUID); +CREATE INDEX BasesPackagerUID ON PackageBases (PackagerUID); -- Keywords of package bases @@ -124,7 +119,7 @@ CREATE TABLE Packages ( Name VARCHAR(255) NOT NULL, Version VARCHAR(255) NOT NULL DEFAULT '', Description VARCHAR(255) NULL DEFAULT NULL, - URL VARCHAR(255) NULL DEFAULT NULL, + URL VARCHAR(8000) NULL DEFAULT NULL, PRIMARY KEY (ID), UNIQUE (Name), FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE @@ -194,11 +189,11 @@ CREATE TABLE PackageDepends ( DepName VARCHAR(255) NOT NULL, DepCondition VARCHAR(255), DepArch VARCHAR(255) NULL DEFAULT NULL, - INDEX (PackageID), - INDEX (DepName), FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE, FOREIGN KEY (DepTypeID) REFERENCES DependencyTypes(ID) ON DELETE NO ACTION ) ENGINE = InnoDB; +CREATE INDEX DependsPackageID ON PackageDepends (PackageID); +CREATE INDEX DependsDepName ON PackageDepends (DepName); -- Define the package relation types @@ -221,22 +216,22 @@ CREATE TABLE PackageRelations ( RelName VARCHAR(255) NOT NULL, RelCondition VARCHAR(255), RelArch VARCHAR(255) NULL DEFAULT NULL, - INDEX (PackageID), - INDEX (RelName), FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE, FOREIGN KEY (RelTypeID) REFERENCES RelationTypes(ID) ON DELETE NO ACTION ) ENGINE = InnoDB; +CREATE INDEX RelationsPackageID ON PackageRelations (PackageID); +CREATE INDEX RelationsRelName ON PackageRelations (RelName); -- Track which sources a package has -- CREATE TABLE PackageSources ( PackageID INTEGER UNSIGNED NOT NULL, - Source VARCHAR(255) NOT NULL DEFAULT "/dev/null", + Source VARCHAR(8000) NOT NULL DEFAULT "/dev/null", SourceArch VARCHAR(255) NULL DEFAULT NULL, - INDEX (PackageID), FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE ) ENGINE = InnoDB; +CREATE INDEX SourcesPackageID ON PackageSources (PackageID); -- Track votes for packages @@ -245,12 +240,12 @@ CREATE TABLE PackageVotes ( UsersID INTEGER UNSIGNED NOT NULL, PackageBaseID INTEGER UNSIGNED NOT NULL, VoteTS BIGINT UNSIGNED NULL DEFAULT NULL, - INDEX (UsersID), - INDEX (PackageBaseID), FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE CASCADE, FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE ) ENGINE = InnoDB; CREATE UNIQUE INDEX VoteUsersIDPackageID ON PackageVotes (UsersID, PackageBaseID); +CREATE INDEX VotesUsersID ON PackageVotes (UsersID); +CREATE INDEX VotesPackageBaseID ON PackageVotes (PackageBaseID); -- Record comments for packages -- @@ -266,13 +261,13 @@ CREATE TABLE PackageComments ( DelUsersID INTEGER UNSIGNED NULL DEFAULT NULL, PinnedTS BIGINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (ID), - INDEX (UsersID), - INDEX (PackageBaseID), FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL, FOREIGN KEY (EditedUsersID) REFERENCES Users(ID) ON DELETE SET NULL, FOREIGN KEY (DelUsersID) REFERENCES Users(ID) ON DELETE CASCADE, FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE ) ENGINE = InnoDB; +CREATE INDEX CommentsUsersID ON PackageComments (UsersID); +CREATE INDEX CommentsPackageBaseID ON PackageComments (PackageBaseID); -- Package base co-maintainers -- @@ -280,11 +275,11 @@ CREATE TABLE PackageComaintainers ( UsersID INTEGER UNSIGNED NOT NULL, PackageBaseID INTEGER UNSIGNED NOT NULL, Priority INTEGER UNSIGNED NOT NULL, - INDEX (UsersID), - INDEX (PackageBaseID), FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE CASCADE, FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE ) ENGINE = InnoDB; +CREATE INDEX ComaintainersUsersID ON PackageComaintainers (UsersID); +CREATE INDEX ComaintainersPackageBaseID ON PackageComaintainers (PackageBaseID); -- Package base notifications -- @@ -310,6 +305,7 @@ CREATE TABLE PackageBlacklist ( CREATE TABLE OfficialProviders ( ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name VARCHAR(64) NOT NULL, + Repo VARCHAR(64) NOT NULL, Provides VARCHAR(64) NOT NULL, PRIMARY KEY (ID) ) ENGINE = InnoDB; @@ -340,27 +336,27 @@ CREATE TABLE PackageRequests ( RequestTS BIGINT UNSIGNED NOT NULL DEFAULT 0, Status TINYINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (ID), - INDEX (UsersID), - INDEX (PackageBaseID), FOREIGN KEY (ReqTypeID) REFERENCES RequestTypes(ID) ON DELETE NO ACTION, FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL, FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE SET NULL ) ENGINE = InnoDB; +CREATE INDEX RequestsUsersID ON PackageRequests (UsersID); +CREATE INDEX RequestsPackageBaseID ON PackageRequests (PackageBaseID); -- Vote information -- CREATE TABLE IF NOT EXISTS TU_VoteInfo ( - ID int(10) unsigned NOT NULL auto_increment, - Agenda text NOT NULL, + ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + Agenda TEXT NOT NULL, User VARCHAR(32) NOT NULL, - Submitted bigint(20) unsigned NOT NULL, - End bigint(20) unsigned NOT NULL, - Quorum decimal(2, 2) unsigned NOT NULL, - SubmitterID int(10) unsigned NOT NULL, - Yes tinyint(3) unsigned NOT NULL default '0', - No tinyint(3) unsigned NOT NULL default '0', - Abstain tinyint(3) unsigned NOT NULL default '0', - ActiveTUs tinyint(3) unsigned NOT NULL default '0', + Submitted BIGINT UNSIGNED NOT NULL, + End BIGINT UNSIGNED NOT NULL, + Quorum DECIMAL(2, 2) UNSIGNED NOT NULL, + SubmitterID INTEGER UNSIGNED NOT NULL, + Yes TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + No TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + Abstain TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + ActiveTUs TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (ID), FOREIGN KEY (SubmitterID) REFERENCES Users(ID) ON DELETE CASCADE ) ENGINE = InnoDB; @@ -368,8 +364,8 @@ CREATE TABLE IF NOT EXISTS TU_VoteInfo ( -- Individual vote records -- CREATE TABLE IF NOT EXISTS TU_Votes ( - VoteID int(10) unsigned NOT NULL, - UserID int(10) unsigned NOT NULL, + VoteID INTEGER UNSIGNED NOT NULL, + UserID INTEGER UNSIGNED NOT NULL, FOREIGN KEY (VoteID) REFERENCES TU_VoteInfo(ID) ON DELETE CASCADE, FOREIGN KEY (UserID) REFERENCES Users(ID) ON DELETE CASCADE ) ENGINE = InnoDB; diff --git a/scripts/aurblup.py b/scripts/aurblup.py deleted file mode 100755 index 325ef3dd..00000000 --- a/scripts/aurblup.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import os -import pyalpm -import re - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') -db_path = config.get('aurblup', 'db-path') -sync_dbs = config.get('aurblup', 'sync-dbs').split(' ') -servers = config.get('aurblup', 'servers').split(' ') - -blacklist = set() -providers = set() - -h = pyalpm.Handle("/", db_path) -for sync_db in sync_dbs: - repo = h.register_syncdb(sync_db, pyalpm.SIG_DATABASE_OPTIONAL) - repo.servers = [server.replace("%s", sync_db) for server in servers] - t = h.init_transaction() - repo.update(False) - t.release() - - for pkg in repo.pkgcache: - blacklist.add(pkg.name) - [blacklist.add(x) for x in pkg.replaces] - providers.add((pkg.name, pkg.name)) - for provision in pkg.provides: - provisionname = re.sub(r'(<|=|>).*', '', provision) - providers.add((pkg.name, provisionname)) - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) -cur = db.cursor() - -cur.execute("SELECT Name FROM PackageBlacklist") -oldblacklist = set([row[0] for row in cur.fetchall()]) - -for pkg in blacklist.difference(oldblacklist): - cur.execute("INSERT INTO PackageBlacklist (Name) VALUES (%s)", [pkg]) -for pkg in oldblacklist.difference(blacklist): - cur.execute("DELETE FROM PackageBlacklist WHERE Name = %s", [pkg]) - -cur.execute("SELECT Name, Provides FROM OfficialProviders") -oldproviders = set(cur.fetchall()) - -for pkg, provides in providers.difference(oldproviders): - cur.execute("INSERT INTO OfficialProviders (Name, Provides) " - "VALUES (%s, %s)", [pkg, provides]) -for pkg, provides in oldproviders.difference(providers): - cur.execute("DELETE FROM OfficialProviders " - "WHERE Name = %s AND Provides = %s", [pkg, provides]) - -db.commit() -db.close() diff --git a/scripts/mkpkglists.py b/scripts/mkpkglists.py deleted file mode 100755 index a6f8a197..00000000 --- a/scripts/mkpkglists.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import datetime -import gzip -import mysql.connector -import os - -docroot = os.path.dirname(os.path.realpath(__file__)) + "/../web/html/" - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) -cur = db.cursor() - -datestr = datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT") -pkglist_header = "# AUR package list, generated on " + datestr -pkgbaselist_header = "# AUR package base list, generated on " + datestr - -with gzip.open(docroot + "packages.gz", "w") as f: - f.write(bytes(pkglist_header + "\n", "UTF-8")) - cur.execute("SELECT Packages.Name FROM Packages INNER JOIN PackageBases " + - "ON PackageBases.ID = Packages.PackageBaseID " + - "WHERE PackageBases.PackagerUID IS NOT NULL") - f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()]) - -with gzip.open(docroot + "pkgbase.gz", "w") as f: - f.write(bytes(pkgbaselist_header + "\n", "UTF-8")) - cur.execute("SELECT Name FROM PackageBases WHERE PackagerUID IS NOT NULL") - f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()]) - -db.close() diff --git a/scripts/notify.py b/scripts/notify.py deleted file mode 100755 index 25102a26..00000000 --- a/scripts/notify.py +++ /dev/null @@ -1,382 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import email.mime.text -import mysql.connector -import os -import subprocess -import sys -import textwrap - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + '/../conf/config') - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -aur_location = config.get('options', 'aur_location') -aur_request_ml = config.get('options', 'aur_request_ml') - -sendmail = config.get('notifications', 'sendmail') -sender = config.get('notifications', 'sender') -reply_to = config.get('notifications', 'reply-to') - - -def headers_cc(cclist): - return {'Cc': str.join(', ', cclist)} - - -def headers_msgid(thread_id): - return {'Message-ID': thread_id} - - -def headers_reply(thread_id): - return {'In-Reply-To': thread_id, 'References': thread_id} - - -def send_notification(to, subject, body, refs, headers={}): - wrapped = '' - for line in body.splitlines(): - wrapped += textwrap.fill(line, break_long_words=False) + '\n' - body = wrapped + '\n' + refs - - for recipient in to: - msg = email.mime.text.MIMEText(body, 'plain', 'utf-8') - msg['Subject'] = subject - msg['From'] = sender - msg['Reply-to'] = reply_to - msg['To'] = recipient - - for key, value in headers.items(): - msg[key] = value - - p = subprocess.Popen([sendmail, '-t', '-oi'], stdin=subprocess.PIPE) - p.communicate(msg.as_bytes()) - - -def username_from_id(cur, uid): - cur.execute('SELECT UserName FROM Users WHERE ID = %s', [uid]) - return cur.fetchone()[0] - - -def pkgbase_from_id(cur, pkgbase_id): - cur.execute('SELECT Name FROM PackageBases WHERE ID = %s', [pkgbase_id]) - return cur.fetchone()[0] - - -def pkgbase_from_pkgreq(cur, reqid): - cur.execute('SELECT PackageBaseID FROM PackageRequests WHERE ID = %s', - [reqid]) - return cur.fetchone()[0] - - -def get_user_email(cur, uid): - cur.execute('SELECT Email FROM Users WHERE ID = %s', [uid]) - return cur.fetchone()[0] - - -def get_maintainer_email(cur, pkgbase_id): - cur.execute('SELECT Users.Email FROM Users ' + - 'INNER JOIN PackageBases ' + - 'ON PackageBases.MaintainerUID = Users.ID WHERE ' + - 'PackageBases.ID = %s', [pkgbase_id]) - return cur.fetchone()[0] - - -def get_recipients(cur, pkgbase_id, uid): - cur.execute('SELECT DISTINCT Users.Email FROM Users ' + - 'INNER JOIN PackageNotifications ' + - 'ON PackageNotifications.UserID = Users.ID WHERE ' + - 'PackageNotifications.UserID != %s AND ' + - 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id]) - return [row[0] for row in cur.fetchall()] - - -def get_comment_recipients(cur, pkgbase_id, uid): - cur.execute('SELECT DISTINCT Users.Email FROM Users ' + - 'INNER JOIN PackageNotifications ' + - 'ON PackageNotifications.UserID = Users.ID WHERE ' + - 'Users.CommentNotify = 1 AND ' + - 'PackageNotifications.UserID != %s AND ' + - 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id]) - return [row[0] for row in cur.fetchall()] - - -def get_update_recipients(cur, pkgbase_id, uid): - cur.execute('SELECT DISTINCT Users.Email FROM Users ' + - 'INNER JOIN PackageNotifications ' + - 'ON PackageNotifications.UserID = Users.ID WHERE ' + - 'Users.UpdateNotify = 1 AND ' + - 'PackageNotifications.UserID != %s AND ' + - 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id]) - return [row[0] for row in cur.fetchall()] - - -def get_request_recipients(cur, reqid): - cur.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' + - 'INNER JOIN PackageBases ' + - 'ON PackageBases.ID = PackageRequests.PackageBaseID ' + - 'INNER JOIN Users ' + - 'ON Users.ID = PackageRequests.UsersID ' + - 'OR Users.ID = PackageBases.MaintainerUID ' + - 'WHERE PackageRequests.ID = %s', [reqid]) - return [row[0] for row in cur.fetchall()] - - -def get_comment(cur, comment_id): - cur.execute('SELECT Comments FROM PackageComments WHERE ID = %s', - [comment_id]) - return cur.fetchone()[0] - - -def get_flagger_comment(cur, pkgbase_id): - cur.execute('SELECT FlaggerComment FROM PackageBases WHERE ID = %s', - [pkgbase_id]) - return cur.fetchone()[0] - - -def get_request_comment(cur, reqid): - cur.execute('SELECT Comments FROM PackageRequests WHERE ID = %s', [reqid]) - return cur.fetchone()[0] - - -def get_request_closure_comment(cur, reqid): - cur.execute('SELECT ClosureComment FROM PackageRequests WHERE ID = %s', - [reqid]) - return cur.fetchone()[0] - - -def send_resetkey(cur, uid): - cur.execute('SELECT UserName, Email, ResetKey FROM Users WHERE ID = %s', - [uid]) - username, to, resetkey = cur.fetchone() - - subject = 'AUR Password Reset' - body = 'A password reset request was submitted for the account %s ' \ - 'associated with your email address. If you wish to reset your ' \ - 'password follow the link [1] below, otherwise ignore this ' \ - 'message and nothing will happen.' % (username) - refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey - - send_notification([to], subject, body, refs) - - -def welcome(cur, uid): - cur.execute('SELECT UserName, Email, ResetKey FROM Users WHERE ID = %s', - [uid]) - username, to, resetkey = cur.fetchone() - - subject = 'Welcome to the Arch User Repository' - body = 'Welcome to the Arch User Repository! In order to set an initial ' \ - 'password for your new account, please click the link [1] below. ' \ - 'If the link does not work, try copying and pasting it into your ' \ - 'browser.' - refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey - - send_notification([to], subject, body, refs) - - -def comment(cur, uid, pkgbase_id, comment_id): - user = username_from_id(cur, uid) - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = get_comment_recipients(cur, pkgbase_id, uid) - text = get_comment(cur, comment_id) - - user_uri = aur_location + '/account/' + user + '/' - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = 'AUR Comment for %s' % (pkgbase) - body = '%s [1] added the following comment to %s [2]:' % (user, pkgbase) - body += '\n\n' + text + '\n\n' - body += 'If you no longer wish to receive notifications about this ' \ - 'package, please go to the package page [2] and select "%s".' % \ - ('Disable notifications') - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri - thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>' - headers = headers_reply(thread_id) - - send_notification(to, subject, body, refs, headers) - - -def update(cur, uid, pkgbase_id): - user = username_from_id(cur, uid) - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = get_update_recipients(cur, pkgbase_id, uid) - - user_uri = aur_location + '/account/' + user + '/' - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = 'AUR Package Update: %s' % (pkgbase) - body = '%s [1] pushed a new commit to %s [2].' % (user, pkgbase) - body += '\n\n' - body += 'If you no longer wish to receive notifications about this ' \ - 'package, please go to the package page [2] and select "%s".' % \ - ('Disable notifications') - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri - thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>' - headers = headers_reply(thread_id) - - send_notification(to, subject, body, refs, headers) - - -def flag(cur, uid, pkgbase_id): - user = username_from_id(cur, uid) - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = [get_maintainer_email(cur, pkgbase_id)] - text = get_flagger_comment(cur, pkgbase_id) - - user_uri = aur_location + '/account/' + user + '/' - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = 'AUR Out-of-date Notification for %s' % (pkgbase) - body = 'Your package %s [1] has been flagged out-of-date by %s [2]:' % \ - (pkgbase, user) - body += '\n\n' + text - refs = '[1] ' + pkgbase_uri + '\n' - refs += '[2] ' + user_uri - - send_notification(to, subject, body, refs) - - -def comaintainer_add(cur, pkgbase_id, uid): - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = [get_user_email(cur, uid)] - - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase) - body = 'You were added to the co-maintainer list of %s [1].' % (pkgbase) - refs = '[1] ' + pkgbase_uri + '\n' - - send_notification(to, subject, body, refs) - - -def comaintainer_remove(cur, pkgbase_id, uid): - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = [get_user_email(cur, uid)] - - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase) - body = ('You were removed from the co-maintainer list of %s [1].' % - (pkgbase)) - refs = '[1] ' + pkgbase_uri + '\n' - - send_notification(to, subject, body, refs) - - -def delete(cur, uid, old_pkgbase_id, new_pkgbase_id=None): - user = username_from_id(cur, uid) - old_pkgbase = pkgbase_from_id(cur, old_pkgbase_id) - if new_pkgbase_id: - new_pkgbase = pkgbase_from_id(cur, new_pkgbase_id) - to = get_recipients(cur, old_pkgbase_id, uid) - - user_uri = aur_location + '/account/' + user + '/' - pkgbase_uri = aur_location + '/pkgbase/' + old_pkgbase + '/' - - subject = 'AUR Package deleted: %s' % (old_pkgbase) - if new_pkgbase_id: - new_pkgbase_uri = aur_location + '/pkgbase/' + new_pkgbase + '/' - body = '%s [1] merged %s [2] into %s [3].\n\n' \ - 'If you no longer wish receive notifications about the new ' \ - 'package, please go to [3] and click "%s".' %\ - (user, old_pkgbase, new_pkgbase, 'Disable notifications') - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri + '\n' - refs += '[3] ' + new_pkgbase_uri - else: - body = '%s [1] deleted %s [2].\n\n' \ - 'You will no longer receive notifications about this ' \ - 'package.' % (user, old_pkgbase) - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri - - send_notification(to, subject, body, refs) - - -def request_open(cur, uid, reqid, reqtype, pkgbase_id, merge_into=None): - user = username_from_id(cur, uid) - pkgbase = pkgbase_from_id(cur, pkgbase_id) - to = [aur_request_ml] - cc = get_request_recipients(cur, reqid) - text = get_request_comment(cur, reqid) - - user_uri = aur_location + '/account/' + user + '/' - pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' - - subject = '[PRQ#%d] %s Request for %s' % \ - (int(reqid), reqtype.title(), pkgbase) - if merge_into: - merge_into_uri = aur_location + '/pkgbase/' + merge_into + '/' - body = '%s [1] filed a request to merge %s [2] into %s [3]:' % \ - (user, pkgbase, merge_into) - body += '\n\n' + text - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri + '\n' - refs += '[3] ' + merge_into_uri - else: - body = '%s [1] filed a %s request for %s [2]:' % \ - (user, reqtype, pkgbase) - body += '\n\n' + text - refs = '[1] ' + user_uri + '\n' - refs += '[2] ' + pkgbase_uri + '\n' - thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>' - # Use a deterministic Message-ID for the first email referencing a request. - headers = headers_msgid(thread_id) - headers.update(headers_cc(cc)) - - send_notification(to, subject, body, refs, headers) - - -def request_close(cur, uid, reqid, reason): - user = username_from_id(cur, uid) - to = [aur_request_ml] - cc = get_request_recipients(cur, reqid) - text = get_request_closure_comment(cur, reqid) - - user_uri = aur_location + '/account/' + user + '/' - - subject = '[PRQ#%d] Request %s' % (int(reqid), reason.title()) - body = 'Request #%d has been %s by %s [1]' % (int(reqid), reason, user) - if text.strip() == '': - body += '.' - else: - body += ':\n\n' + text - refs = '[1] ' + user_uri - thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>' - headers = headers_reply(thread_id) - headers.update(headers_cc(cc)) - - send_notification(to, subject, body, refs, headers) - - -if __name__ == '__main__': - action = sys.argv[1] - action_map = { - 'send-resetkey': send_resetkey, - 'welcome': welcome, - 'comment': comment, - 'update': update, - 'flag': flag, - 'comaintainer-add': comaintainer_add, - 'comaintainer-remove': comaintainer_remove, - 'delete': delete, - 'request-open': request_open, - 'request-close': request_close, - } - - db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) - cur = db.cursor() - - action_map[action](cur, *sys.argv[2:]) - - db.commit() - db.close() diff --git a/scripts/pkgmaint.py b/scripts/pkgmaint.py deleted file mode 100755 index 0eb94221..00000000 --- a/scripts/pkgmaint.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import os - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) -cur = db.cursor() - -cur.execute("DELETE FROM PackageBases WHERE " + - "UNIX_TIMESTAMP() - SubmittedTS > 86400 AND PackagerUID IS NULL") - -db.commit() -db.close() diff --git a/scripts/popupdate.py b/scripts/popupdate.py deleted file mode 100755 index f3ba5131..00000000 --- a/scripts/popupdate.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/python3 - -import configparser -import mysql.connector -import os - -config = configparser.RawConfigParser() -config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config") - -aur_db_host = config.get('database', 'host') -aur_db_name = config.get('database', 'name') -aur_db_user = config.get('database', 'user') -aur_db_pass = config.get('database', 'password') -aur_db_socket = config.get('database', 'socket') - -db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, - passwd=aur_db_pass, db=aur_db_name, - unix_socket=aur_db_socket, buffered=True) -cur = db.cursor() - -cur.execute("UPDATE PackageBases SET NumVotes = (SELECT COUNT(*) FROM " + - "PackageVotes WHERE PackageVotes.PackageBaseID = PackageBases.ID)") - -cur.execute("UPDATE PackageBases SET Popularity = (" + - "SELECT COALESCE(SUM(POWER(0.98, (UNIX_TIMESTAMP() - VoteTS) / 86400)), 0.0) " + - "FROM PackageVotes WHERE PackageVotes.PackageBaseID = " + - "PackageBases.ID AND NOT VoteTS IS NULL)") - -db.commit() -db.close() diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..99dbfedf --- /dev/null +++ b/setup.py @@ -0,0 +1,33 @@ +import re +from setuptools import setup, find_packages +import sys + +version = None +with open('web/lib/version.inc.php', 'r') as f: + for line in f.readlines(): + match = re.match(r'^define\("AURWEB_VERSION", "v([0-9.]+)"\);$', line) + if match: + version = match.group(1) + +if not version: + sys.stderr.write('error: Failed to parse version file!') + sys.exit(1) + +setup( + name="aurweb", + version=version, + packages=find_packages(), + entry_points={ + 'console_scripts': [ + 'aurweb-git-auth = aurweb.git.auth:main', + 'aurweb-git-serve = aurweb.git.serve:main', + 'aurweb-git-update = aurweb.git.update:main', + 'aurweb-aurblup = aurweb.scripts.aurblup:main', + 'aurweb-mkpkglists = aurweb.scripts.mkpkglists:main', + 'aurweb-notify = aurweb.scripts.notify:main', + 'aurweb-pkgmaint = aurweb.scripts.pkgmaint:main', + 'aurweb-popupdate = aurweb.scripts.popupdate:main', + 'aurweb-tuvotereminder = aurweb.scripts.tuvotereminder:main', + ], + }, +) diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 00000000..d6f0f740 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,11 @@ +T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)) + +check: $(T) + +clean: + $(RM) -r test-results/ + +$(T): + @echo "*** $@ ***"; $(SHELL) $@ + +.PHONY: check clean $(T) diff --git a/test/setup.sh b/test/setup.sh new file mode 100644 index 00000000..d02d2981 --- /dev/null +++ b/test/setup.sh @@ -0,0 +1,218 @@ +TEST_DIRECTORY="$(pwd)" +TOPLEVEL="$(cd .. && pwd)" + +. ./sharness.sh + +# Configure python search path. +PYTHONPATH="$TOPLEVEL" +export PYTHONPATH + +# Configure paths to the Git interface scripts. +GIT_AUTH="$TOPLEVEL/aurweb/git/auth.py" +GIT_SERVE="$TOPLEVEL/aurweb/git/serve.py" +GIT_UPDATE="$TOPLEVEL/aurweb/git/update.py" +MKPKGLISTS="$TOPLEVEL/scripts/mkpkglists.py" +TUVOTEREMINDER="$TOPLEVEL/scripts/tuvotereminder.py" +PKGMAINT="$TOPLEVEL/scripts/pkgmaint.py" +AURBLUP="$TOPLEVEL/scripts/aurblup.py" +NOTIFY="$TOPLEVEL/scripts/notify.py" + +# Create the configuration file and a dummy notification script. +cat >config <<-EOF +[database] +backend = sqlite +name = aur.db + +[options] +aur_location = https://aur.archlinux.org +aur_request_ml = aur-requests@archlinux.org +enable-maintenance = 0 +maintenance-exceptions = 127.0.0.1 + +[notifications] +notify-cmd = $NOTIFY +sendmail = ./sendmail.sh +sender = notify@aur.archlinux.org +reply-to = noreply@aur.archlinux.org + +[auth] +valid-keytypes = ssh-rsa ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519 +username-regex = [a-zA-Z0-9]+[.\-_]?[a-zA-Z0-9]+$ +git-serve-cmd = $GIT_SERVE +ssh-options = restrict + +[serve] +repo-path = ./aur.git/ +repo-regex = [a-z0-9][a-z0-9.+_-]*$ +git-shell-cmd = ./git-shell.sh +git-update-cmd = ./update.sh +ssh-cmdline = ssh aur@aur.archlinux.org + +[update] +max-blob-size = 256000 + +[aurblup] +db-path = $(pwd)/sync/ +sync-dbs = test +server = file://$(pwd)/remote/ + +[mkpkglists] +packagesfile = packages.gz +pkgbasefile = pkgbase.gz +EOF + +cat >sendmail.sh <<-\EOF +#!/bin/sh +cat >>sendmail.out +EOF +chmod +x sendmail.sh + +cat >git-shell.sh <<-\EOF +#!/bin/sh +echo $AUR_USER +echo $AUR_PKGBASE +echo $GIT_NAMESPACE +EOF +chmod +x git-shell.sh + +cat >update.sh <<-\EOF +#!/bin/sh +echo $AUR_USER +echo $AUR_PKGBASE +EOF +chmod +x update.sh + +AUR_CONFIG=config +export AUR_CONFIG + +# Create SSH public keys which will be used by the test users later. +AUTH_KEYTYPE_USER=ssh-rsa +AUTH_KEYTEXT_USER=AAAAB3NzaC1yc2EAAAADAQABAAABAQCeUafDK4jqUiRHNQfwHcYjBKLZ4Rc1sNUofHApBP6j91nIvDHZe2VUqeBmFUhBz7kXK4VbXD9nlHMun2HeshL8hXnMzymZ8Wk7+IKefj61pajJkIdttw9Tnayfg7uhg5RbFy9zpEjmGjnIVjSzOXKCwppNT+CNujpKM5FD8gso/Z+l3fD+IwrPwS1SzF1Z99nqI9n2FM/JWZqluvTqnW9WdAvBDfutXxp0R5ZiLI5TAKL2Ssp5rpL70pkLXhv+9sK545zKKlXUFmw6Pi2iVBdqdRsk9ocl49dLiNIh8CYDCO3CRQn+8EnpBhTor2TKQxGJI3mzoBwWJJxoKhD/XlYJ +AUTH_FINGERPRINT_USER=SHA256:F/OFtYAy0JCytAGUi4RUZnOsThhQtFMK7fH1YvFBCpo + +AUTH_KEYTYPE_TU=ssh-rsa +AUTH_KEYTEXT_TU=AAAAB3NzaC1yc2EAAAADAQABAAABAQC4Q2Beg6jf2r1LZ4vwT5y10dK8+/c5RaNyTwv77wF2OSLXh32xW0ovhE2lW2gqoakdGsxgM2fTtqMTl29WOsAxlGF7x9XbWhFXFUT88Daq1fAeuihkiRjfBbInSW/WcrFZ+biLBch67addtfkkd4PmAafDeeCtszAXqza+ltBG1oxAGiTXgI3LOhA1/GtLLxsi5sPUO3ZlhvwDn4Sy0aXYx8l9hop/PU4Cjn82hyRa9r+SRxQ3KtjKxcVMnZ8IyXOrBwXTukgSBR/6nSdEmO0JPkYUFuNwh3UGFKuNkrPguL5T+4YDym6czYmZJzQ7NNl2pLKYmYgBwBe5rORlWfN5 +AUTH_FINGERPRINT_TU=SHA256:xQGC6j/U1Q3NDXLl04pm+Shr1mjYUXbGMUzlm9vby4k + +AUTH_KEYTYPE_MISSING=sha-rsa +AUTH_KEYTEXT_MISSING=AAAAB3NzaC1yc2EAAAADAQABAAABAQC9UTpssBunuTBCT3KFtv+yb+cN0VmI2C9O9U7wHlkEZWxNBK8is6tnDHXBxRuvRk0LHILkTidLLFX22ZF0+TFgSz7uuEvGZVNpa2Fn2+vKJJYMvZEvb/f8VHF5/Jddt21VOyu23royTN/duiT7WIZdCtEmq5C9Y43NPfsB8FbUc+FVSYT2Lq7g1/bzvFF+CZxwCrGjC3qC7p3pshICfFR8bbWgRN33ClxIQ7MvkcDtfNu38dLotJqdfEa7NdQgba5/S586f1A4OWKc/mQJFyTaGhRBxw/cBSjqonvO0442VYLHFxlrTHoUunKyOJ8+BJfKgjWmfENC9ESY3mL/IEn5 +AUTH_FINGERPRINT_MISSING=SHA256:uB0B+30r2WA1TDMUmFcaEBjosjnFGzn33XFhiyvTL9w + +# Initialize the test database. +rm -f aur.db +sed \ + -e '/^DROP DATABASE /d' \ + -e '/^CREATE DATABASE /d' \ + -e '/^USE /d' \ + -e 's/ ENGINE = InnoDB//' \ + -e 's/ [A-Z]* UNSIGNED NOT NULL AUTO_INCREMENT/ INTEGER NOT NULL/' \ + -e 's/([0-9, ]*) UNSIGNED / UNSIGNED /' \ + "$TOPLEVEL/schema/aur-schema.sql" | sqlite3 aur.db + +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (1, 'user', '!', 'user@localhost', 1);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (2, 'tu', '!', 'tu@localhost', 2);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (3, 'dev', '!', 'dev@localhost', 3);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (4, 'user2', '!', 'user2@localhost', 1);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (5, 'user3', '!', 'user3@localhost', 1);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (6, 'user4', '!', 'user4@localhost', 1);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (7, 'tu2', '!', 'tu2@localhost', 2);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (8, 'tu3', '!', 'tu3@localhost', 2);" | sqlite3 aur.db +echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (9, 'tu4', '!', 'tu4@localhost', 2);" | sqlite3 aur.db + +echo "INSERT INTO SSHPubKeys (UserID, Fingerprint, PubKey) VALUES (1, '$AUTH_FINGERPRINT_USER', '$AUTH_KEYTYPE_USER $AUTH_KEYTEXT_USER');" | sqlite3 aur.db +echo "INSERT INTO SSHPubKeys (UserID, Fingerprint, PubKey) VALUES (2, '$AUTH_FINGERPRINT_TU', '$AUTH_KEYTYPE_TU $AUTH_KEYTEXT_TU');" | sqlite3 aur.db + +echo "INSERT INTO PackageBlacklist (Name) VALUES ('forbidden');" | sqlite3 aur.db +echo "INSERT INTO OfficialProviders (Name, Repo, Provides) VALUES ('official', 'core', 'official');" | sqlite3 aur.db + +# Initialize a Git repository and test packages. +GIT_AUTHOR_EMAIL=author@example.com +GIT_AUTHOR_NAME='A U Thor' +GIT_COMMITTER_EMAIL=committer@example.com +GIT_COMMITTER_NAME='C O Mitter' +export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME +export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME + +( + mkdir aur.git + cd aur.git + git init -q + + git checkout -q --orphan refs/namespaces/foobar/refs/heads/master + + cat >PKGBUILD <<-EOF + pkgname=foobar + pkgver=1 + pkgrel=1 + pkgdesc='aurweb test package.' + url='https://aur.archlinux.org/' + license=('GPL') + arch=('any') + depends=('python-pygit2') + source=() + md5sums=() + + package() { + echo 'Hello world!' + } + EOF + + cat >.SRCINFO <<-EOF + pkgbase = foobar + pkgdesc = aurweb test package. + pkgver = 1 + pkgrel = 1 + url = https://aur.archlinux.org/ + arch = any + license = GPL + depends = python-pygit2 + + pkgname = foobar + EOF + + git add PKGBUILD .SRCINFO + git commit -q -m 'Initial import' + + sed 's/\(pkgrel.*\)1/\12/' PKGBUILD >PKGBUILD.new + sed 's/\(pkgrel.*\)1/\12/' .SRCINFO >.SRCINFO.new + mv PKGBUILD.new PKGBUILD + mv .SRCINFO.new .SRCINFO + git commit -q -am 'Bump pkgrel' + + git checkout -q --orphan refs/namespaces/foobar2/refs/heads/master + + cat >PKGBUILD <<-EOF + pkgname=foobar2 + pkgver=1 + pkgrel=1 + pkgdesc='aurweb test package.' + url='https://aur.archlinux.org/' + license=('MIT') + arch=('any') + depends=('python-pygit2') + source=() + md5sums=() + + package() { + echo 'Hello world!' + } + EOF + + cat >.SRCINFO <<-EOF + pkgbase = foobar2 + pkgdesc = aurweb test package. + pkgver = 1 + pkgrel = 1 + url = https://aur.archlinux.org/ + arch = any + license = MIT + depends = python-pygit2 + + pkgname = foobar2 + EOF + + git add PKGBUILD .SRCINFO + git commit -q -m 'Initial import' + + git checkout -q refs/namespaces/foobar/refs/heads/master +) diff --git a/test/sharness.sh b/test/sharness.sh new file mode 100644 index 00000000..1d57ce9a --- /dev/null +++ b/test/sharness.sh @@ -0,0 +1,851 @@ +#!/bin/sh +# +# Copyright (c) 2011-2012 Mathias Lafeldt +# Copyright (c) 2005-2012 Git project +# Copyright (c) 2005-2012 Junio C Hamano +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/ . + +# Public: Current version of Sharness. +SHARNESS_VERSION="1.0.0" +export SHARNESS_VERSION + +# Public: The file extension for tests. By default, it is set to "t". +: ${SHARNESS_TEST_EXTENSION:=t} +export SHARNESS_TEST_EXTENSION + +# Reset TERM to original terminal if found, otherwise save orignal TERM +[ "x" = "x$SHARNESS_ORIG_TERM" ] && + SHARNESS_ORIG_TERM="$TERM" || + TERM="$SHARNESS_ORIG_TERM" +# Public: The unsanitized TERM under which sharness is originally run +export SHARNESS_ORIG_TERM + +# Export SHELL_PATH +: ${SHELL_PATH:=$SHELL} +export SHELL_PATH + +# For repeatability, reset the environment to a known state. +# TERM is sanitized below, after saving color control sequences. +LANG=C +LC_ALL=C +PAGER=cat +TZ=UTC +EDITOR=: +export LANG LC_ALL PAGER TZ EDITOR +unset VISUAL CDPATH GREP_OPTIONS + +# Line feed +LF=' +' + +[ "x$TERM" != "xdumb" ] && ( + [ -t 1 ] && + tput bold >/dev/null 2>&1 && + tput setaf 1 >/dev/null 2>&1 && + tput sgr0 >/dev/null 2>&1 + ) && + color=t + +while test "$#" -ne 0; do + case "$1" in + -d|--d|--de|--deb|--debu|--debug) + debug=t; shift ;; + -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) + immediate=t; shift ;; + -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) + TEST_LONG=t; export TEST_LONG; shift ;; + --in|--int|--inte|--inter|--intera|--interac|--interact|--interacti|--interactiv|--interactive|--interactive-|--interactive-t|--interactive-te|--interactive-tes|--interactive-test|--interactive-tests): + TEST_INTERACTIVE=t; export TEST_INTERACTIVE; verbose=t; shift ;; + -h|--h|--he|--hel|--help) + help=t; shift ;; + -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) + verbose=t; shift ;; + -q|--q|--qu|--qui|--quie|--quiet) + # Ignore --quiet under a TAP::Harness. Saying how many tests + # passed without the ok/not ok details is always an error. + test -z "$HARNESS_ACTIVE" && quiet=t; shift ;; + --chain-lint) + chain_lint=t; shift ;; + --no-chain-lint) + chain_lint=; shift ;; + --no-color) + color=; shift ;; + --root=*) + root=$(expr "z$1" : 'z[^=]*=\(.*\)') + shift ;; + *) + echo "error: unknown test option '$1'" >&2; exit 1 ;; + esac +done + +if test -n "$color"; then + # Save the color control sequences now rather than run tput + # each time say_color() is called. This is done for two + # reasons: + # * TERM will be changed to dumb + # * HOME will be changed to a temporary directory and tput + # might need to read ~/.terminfo from the original HOME + # directory to get the control sequences + # Note: This approach assumes the control sequences don't end + # in a newline for any terminal of interest (command + # substitutions strip trailing newlines). Given that most + # (all?) terminals in common use are related to ECMA-48, this + # shouldn't be a problem. + say_color_error=$(tput bold; tput setaf 1) # bold red + say_color_skip=$(tput setaf 4) # blue + say_color_warn=$(tput setaf 3) # brown/yellow + say_color_pass=$(tput setaf 2) # green + say_color_info=$(tput setaf 6) # cyan + say_color_reset=$(tput sgr0) + say_color_="" # no formatting for normal text + say_color() { + test -z "$1" && test -n "$quiet" && return + eval "say_color_color=\$say_color_$1" + shift + printf "%s\\n" "$say_color_color$*$say_color_reset" + } +else + say_color() { + test -z "$1" && test -n "$quiet" && return + shift + printf "%s\n" "$*" + } +fi + +TERM=dumb +export TERM + +error() { + say_color error "error: $*" + EXIT_OK=t + exit 1 +} + +say() { + say_color info "$*" +} + +test -n "$test_description" || error "Test script did not set test_description." + +if test "$help" = "t"; then + echo "$test_description" + exit 0 +fi + +exec 5>&1 +exec 6<&0 +if test "$verbose" = "t"; then + exec 4>&2 3>&1 +else + exec 4>/dev/null 3>/dev/null +fi + +test_failure=0 +test_count=0 +test_fixed=0 +test_broken=0 +test_success=0 + +die() { + code=$? + if test -n "$EXIT_OK"; then + exit $code + else + echo >&5 "FATAL: Unexpected exit with code $code" + exit 1 + fi +} + +EXIT_OK= +trap 'die' EXIT + +# Public: Define that a test prerequisite is available. +# +# The prerequisite can later be checked explicitly using test_have_prereq or +# implicitly by specifying the prerequisite name in calls to test_expect_success +# or test_expect_failure. +# +# $1 - Name of prerequiste (a simple word, in all capital letters by convention) +# +# Examples +# +# # Set PYTHON prerequisite if interpreter is available. +# command -v python >/dev/null && test_set_prereq PYTHON +# +# # Set prerequisite depending on some variable. +# test -z "$NO_GETTEXT" && test_set_prereq GETTEXT +# +# Returns nothing. +test_set_prereq() { + satisfied_prereq="$satisfied_prereq$1 " +} +satisfied_prereq=" " + +# Public: Check if one or more test prerequisites are defined. +# +# The prerequisites must have previously been set with test_set_prereq. +# The most common use of this is to skip all the tests if some essential +# prerequisite is missing. +# +# $1 - Comma-separated list of test prerequisites. +# +# Examples +# +# # Skip all remaining tests if prerequisite is not set. +# if ! test_have_prereq PERL; then +# skip_all='skipping perl interface tests, perl not available' +# test_done +# fi +# +# Returns 0 if all prerequisites are defined or 1 otherwise. +test_have_prereq() { + # prerequisites can be concatenated with ',' + save_IFS=$IFS + IFS=, + set -- $* + IFS=$save_IFS + + total_prereq=0 + ok_prereq=0 + missing_prereq= + + for prerequisite; do + case "$prerequisite" in + !*) + negative_prereq=t + prerequisite=${prerequisite#!} + ;; + *) + negative_prereq= + esac + + total_prereq=$(($total_prereq + 1)) + case "$satisfied_prereq" in + *" $prerequisite "*) + satisfied_this_prereq=t + ;; + *) + satisfied_this_prereq= + esac + + case "$satisfied_this_prereq,$negative_prereq" in + t,|,t) + ok_prereq=$(($ok_prereq + 1)) + ;; + *) + # Keep a list of missing prerequisites; restore + # the negative marker if necessary. + prerequisite=${negative_prereq:+!}$prerequisite + if test -z "$missing_prereq"; then + missing_prereq=$prerequisite + else + missing_prereq="$prerequisite,$missing_prereq" + fi + esac + done + + test $total_prereq = $ok_prereq +} + +# You are not expected to call test_ok_ and test_failure_ directly, use +# the text_expect_* functions instead. + +test_ok_() { + test_success=$(($test_success + 1)) + say_color "" "ok $test_count - $@" +} + +test_failure_() { + test_failure=$(($test_failure + 1)) + say_color error "not ok $test_count - $1" + shift + echo "$@" | sed -e 's/^/# /' + test "$immediate" = "" || { EXIT_OK=t; exit 1; } +} + +test_known_broken_ok_() { + test_fixed=$(($test_fixed + 1)) + say_color error "ok $test_count - $@ # TODO known breakage vanished" +} + +test_known_broken_failure_() { + test_broken=$(($test_broken + 1)) + say_color warn "not ok $test_count - $@ # TODO known breakage" +} + +# Public: Execute commands in debug mode. +# +# Takes a single argument and evaluates it only when the test script is started +# with --debug. This is primarily meant for use during the development of test +# scripts. +# +# $1 - Commands to be executed. +# +# Examples +# +# test_debug "cat some_log_file" +# +# Returns the exit code of the last command executed in debug mode or 0 +# otherwise. +test_debug() { + test "$debug" = "" || eval "$1" +} + +# Public: Stop execution and start a shell. +# +# This is useful for debugging tests and only makes sense together with "-v". +# Be sure to remove all invocations of this command before submitting. +test_pause() { + if test "$verbose" = t; then + "$SHELL_PATH" <&6 >&3 2>&4 + else + error >&5 "test_pause requires --verbose" + fi +} + +test_eval_() { + # This is a separate function because some tests use + # "return" to end a test_expect_success block early. + case ",$test_prereq," in + *,INTERACTIVE,*) + eval "$*" + ;; + *) + eval </dev/null >&3 2>&4 "$*" + ;; + esac +} + +test_run_() { + test_cleanup=: + expecting_failure=$2 + test_eval_ "$1" + eval_ret=$? + + if test "$chain_lint" = "t"; then + test_eval_ "(exit 117) && $1" + if test "$?" != 117; then + error "bug in the test script: broken &&-chain: $1" + fi + fi + + if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"; then + test_eval_ "$test_cleanup" + fi + if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then + echo "" + fi + return "$eval_ret" +} + +test_skip_() { + test_count=$(($test_count + 1)) + to_skip= + for skp in $SKIP_TESTS; do + case $this_test.$test_count in + $skp) + to_skip=t + break + esac + done + if test -z "$to_skip" && test -n "$test_prereq" && ! test_have_prereq "$test_prereq"; then + to_skip=t + fi + case "$to_skip" in + t) + of_prereq= + if test "$missing_prereq" != "$test_prereq"; then + of_prereq=" of $test_prereq" + fi + + say_color skip >&3 "skipping test: $@" + say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})" + : true + ;; + *) + false + ;; + esac +} + +# Public: Run test commands and expect them to succeed. +# +# When the test passed, an "ok" message is printed and the number of successful +# tests is incremented. When it failed, a "not ok" message is printed and the +# number of failed tests is incremented. +# +# With --immediate, exit test immediately upon the first failed test. +# +# Usually takes two arguments: +# $1 - Test description +# $2 - Commands to be executed. +# +# With three arguments, the first will be taken to be a prerequisite: +# $1 - Comma-separated list of test prerequisites. The test will be skipped if +# not all of the given prerequisites are set. To negate a prerequisite, +# put a "!" in front of it. +# $2 - Test description +# $3 - Commands to be executed. +# +# Examples +# +# test_expect_success \ +# 'git-write-tree should be able to write an empty tree.' \ +# 'tree=$(git-write-tree)' +# +# # Test depending on one prerequisite. +# test_expect_success TTY 'git --paginate rev-list uses a pager' \ +# ' ... ' +# +# # Multiple prerequisites are separated by a comma. +# test_expect_success PERL,PYTHON 'yo dawg' \ +# ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" ' +# +# Returns nothing. +test_expect_success() { + test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq= + test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_success" + export test_prereq + if ! test_skip_ "$@"; then + say >&3 "expecting success: $2" + if test_run_ "$2"; then + test_ok_ "$1" + else + test_failure_ "$@" + fi + fi + echo >&3 "" +} + +# Public: Run test commands and expect them to fail. Used to demonstrate a known +# breakage. +# +# This is NOT the opposite of test_expect_success, but rather used to mark a +# test that demonstrates a known breakage. +# +# When the test passed, an "ok" message is printed and the number of fixed tests +# is incremented. When it failed, a "not ok" message is printed and the number +# of tests still broken is incremented. +# +# Failures from these tests won't cause --immediate to stop. +# +# Usually takes two arguments: +# $1 - Test description +# $2 - Commands to be executed. +# +# With three arguments, the first will be taken to be a prerequisite: +# $1 - Comma-separated list of test prerequisites. The test will be skipped if +# not all of the given prerequisites are set. To negate a prerequisite, +# put a "!" in front of it. +# $2 - Test description +# $3 - Commands to be executed. +# +# Returns nothing. +test_expect_failure() { + test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq= + test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_failure" + export test_prereq + if ! test_skip_ "$@"; then + say >&3 "checking known breakage: $2" + if test_run_ "$2" expecting_failure; then + test_known_broken_ok_ "$1" + else + test_known_broken_failure_ "$1" + fi + fi + echo >&3 "" +} + +# Public: Run command and ensure that it fails in a controlled way. +# +# Use it instead of "! <command>". For example, when <command> dies due to a +# segfault, test_must_fail diagnoses it as an error, while "! <command>" would +# mistakenly be treated as just another expected failure. +# +# This is one of the prefix functions to be used inside test_expect_success or +# test_expect_failure. +# +# $1.. - Command to be executed. +# +# Examples +# +# test_expect_success 'complain and die' ' +# do something && +# do something else && +# test_must_fail git checkout ../outerspace +# ' +# +# Returns 1 if the command succeeded (exit code 0). +# Returns 1 if the command died by signal (exit codes 130-192) +# Returns 1 if the command could not be found (exit code 127). +# Returns 0 otherwise. +test_must_fail() { + "$@" + exit_code=$? + if test $exit_code = 0; then + echo >&2 "test_must_fail: command succeeded: $*" + return 1 + elif test $exit_code -gt 129 -a $exit_code -le 192; then + echo >&2 "test_must_fail: died by signal: $*" + return 1 + elif test $exit_code = 127; then + echo >&2 "test_must_fail: command not found: $*" + return 1 + fi + return 0 +} + +# Public: Run command and ensure that it succeeds or fails in a controlled way. +# +# Similar to test_must_fail, but tolerates success too. Use it instead of +# "<command> || :" to catch failures caused by a segfault, for instance. +# +# This is one of the prefix functions to be used inside test_expect_success or +# test_expect_failure. +# +# $1.. - Command to be executed. +# +# Examples +# +# test_expect_success 'some command works without configuration' ' +# test_might_fail git config --unset all.configuration && +# do something +# ' +# +# Returns 1 if the command died by signal (exit codes 130-192) +# Returns 1 if the command could not be found (exit code 127). +# Returns 0 otherwise. +test_might_fail() { + "$@" + exit_code=$? + if test $exit_code -gt 129 -a $exit_code -le 192; then + echo >&2 "test_might_fail: died by signal: $*" + return 1 + elif test $exit_code = 127; then + echo >&2 "test_might_fail: command not found: $*" + return 1 + fi + return 0 +} + +# Public: Run command and ensure it exits with a given exit code. +# +# This is one of the prefix functions to be used inside test_expect_success or +# test_expect_failure. +# +# $1 - Expected exit code. +# $2.. - Command to be executed. +# +# Examples +# +# test_expect_success 'Merge with d/f conflicts' ' +# test_expect_code 1 git merge "merge msg" B master +# ' +# +# Returns 0 if the expected exit code is returned or 1 otherwise. +test_expect_code() { + want_code=$1 + shift + "$@" + exit_code=$? + if test $exit_code = $want_code; then + return 0 + fi + + echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*" + return 1 +} + +# Public: Compare two files to see if expected output matches actual output. +# +# The TEST_CMP variable defines the command used for the comparision; it +# defaults to "diff -u". Only when the test script was started with --verbose, +# will the command's output, the diff, be printed to the standard output. +# +# This is one of the prefix functions to be used inside test_expect_success or +# test_expect_failure. +# +# $1 - Path to file with expected output. +# $2 - Path to file with actual output. +# +# Examples +# +# test_expect_success 'foo works' ' +# echo expected >expected && +# foo >actual && +# test_cmp expected actual +# ' +# +# Returns the exit code of the command set by TEST_CMP. +test_cmp() { + ${TEST_CMP:-diff -u} "$@" +} + +# Public: portably print a sequence of numbers. +# +# seq is not in POSIX and GNU seq might not be available everywhere, +# so it is nice to have a seq implementation, even a very simple one. +# +# $1 - Starting number. +# $2 - Ending number. +# +# Examples +# +# test_expect_success 'foo works 10 times' ' +# for i in $(test_seq 1 10) +# do +# foo || return +# done +# ' +# +# Returns 0 if all the specified numbers can be displayed. +test_seq() { + i="$1" + j="$2" + while test "$i" -le "$j" + do + echo "$i" || return + i=$(expr "$i" + 1) + done +} + +# Public: Check if the file expected to be empty is indeed empty, and barfs +# otherwise. +# +# $1 - File to check for emptyness. +# +# Returns 0 if file is empty, 1 otherwise. +test_must_be_empty() { + if test -s "$1" + then + echo "'$1' is not empty, it contains:" + cat "$1" + return 1 + fi +} + +# Public: Schedule cleanup commands to be run unconditionally at the end of a +# test. +# +# If some cleanup command fails, the test will not pass. With --immediate, no +# cleanup is done to help diagnose what went wrong. +# +# This is one of the prefix functions to be used inside test_expect_success or +# test_expect_failure. +# +# $1.. - Commands to prepend to the list of cleanup commands. +# +# Examples +# +# test_expect_success 'test core.capslock' ' +# git config core.capslock true && +# test_when_finished "git config --unset core.capslock" && +# do_something +# ' +# +# Returns the exit code of the last cleanup command executed. +test_when_finished() { + test_cleanup="{ $* + } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup" +} + +# Public: Schedule cleanup commands to be run unconditionally when all tests +# have run. +# +# This can be used to clean up things like test databases. It is not needed to +# clean up temporary files, as test_done already does that. +# +# Examples: +# +# cleanup mysql -e "DROP DATABASE mytest" +# +# Returns the exit code of the last cleanup command executed. +final_cleanup= +cleanup() { + final_cleanup="{ $* + } && (exit \"\$eval_ret\"); eval_ret=\$?; $final_cleanup" +} + +# Public: Summarize test results and exit with an appropriate error code. +# +# Must be called at the end of each test script. +# +# Can also be used to stop tests early and skip all remaining tests. For this, +# set skip_all to a string explaining why the tests were skipped before calling +# test_done. +# +# Examples +# +# # Each test script must call test_done at the end. +# test_done +# +# # Skip all remaining tests if prerequisite is not set. +# if ! test_have_prereq PERL; then +# skip_all='skipping perl interface tests, perl not available' +# test_done +# fi +# +# Returns 0 if all tests passed or 1 if there was a failure. +test_done() { + EXIT_OK=t + + if test -z "$HARNESS_ACTIVE"; then + test_results_dir="$SHARNESS_TEST_DIRECTORY/test-results" + mkdir -p "$test_results_dir" + test_results_path="$test_results_dir/$this_test.$$.counts" + + cat >>"$test_results_path" <<-EOF + total $test_count + success $test_success + fixed $test_fixed + broken $test_broken + failed $test_failure + + EOF + fi + + if test "$test_fixed" != 0; then + say_color error "# $test_fixed known breakage(s) vanished; please update test(s)" + fi + if test "$test_broken" != 0; then + say_color warn "# still have $test_broken known breakage(s)" + fi + if test "$test_broken" != 0 || test "$test_fixed" != 0; then + test_remaining=$(( $test_count - $test_broken - $test_fixed )) + msg="remaining $test_remaining test(s)" + else + test_remaining=$test_count + msg="$test_count test(s)" + fi + + case "$test_failure" in + 0) + # Maybe print SKIP message + if test -n "$skip_all" && test $test_count -gt 0; then + error "Can't use skip_all after running some tests" + fi + [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all" + + if test $test_remaining -gt 0; then + say_color pass "# passed all $msg" + fi + say "1..$test_count$skip_all" + + test_eval_ "$final_cleanup" + + test -d "$remove_trash" && + cd "$(dirname "$remove_trash")" && + rm -rf "$(basename "$remove_trash")" + + exit 0 ;; + + *) + say_color error "# failed $test_failure among $msg" + say "1..$test_count" + + exit 1 ;; + + esac +} + +# Public: Root directory containing tests. Tests can override this variable, +# e.g. for testing Sharness itself. +: ${SHARNESS_TEST_DIRECTORY:=$(pwd)} +export SHARNESS_TEST_DIRECTORY + +# Public: Source directory of test code and sharness library. +# This directory may be different from the directory in which tests are +# being run. +: ${SHARNESS_TEST_SRCDIR:=$(cd $(dirname $0) && pwd)} +export SHARNESS_TEST_SRCDIR + +# Public: Build directory that will be added to PATH. By default, it is set to +# the parent directory of SHARNESS_TEST_DIRECTORY. +: ${SHARNESS_BUILD_DIRECTORY:="$SHARNESS_TEST_DIRECTORY/.."} +PATH="$SHARNESS_BUILD_DIRECTORY:$PATH" +export PATH SHARNESS_BUILD_DIRECTORY + +# Public: Path to test script currently executed. +SHARNESS_TEST_FILE="$0" +export SHARNESS_TEST_FILE + +# Prepare test area. +SHARNESS_TRASH_DIRECTORY="trash directory.$(basename "$SHARNESS_TEST_FILE" ".$SHARNESS_TEST_EXTENSION")" +test -n "$root" && SHARNESS_TRASH_DIRECTORY="$root/$SHARNESS_TRASH_DIRECTORY" +case "$SHARNESS_TRASH_DIRECTORY" in +/*) ;; # absolute path is good + *) SHARNESS_TRASH_DIRECTORY="$SHARNESS_TEST_DIRECTORY/$SHARNESS_TRASH_DIRECTORY" ;; +esac +test "$debug" = "t" || remove_trash="$SHARNESS_TRASH_DIRECTORY" +rm -rf "$SHARNESS_TRASH_DIRECTORY" || { + EXIT_OK=t + echo >&5 "FATAL: Cannot prepare test area" + exit 1 +} + + +# +# Load any extensions in $srcdir/sharness.d/*.sh +# +if test -d "${SHARNESS_TEST_SRCDIR}/sharness.d" +then + for file in "${SHARNESS_TEST_SRCDIR}"/sharness.d/*.sh + do + # Ensure glob was not an empty match: + test -e "${file}" || break + + if test -n "$debug" + then + echo >&5 "sharness: loading extensions from ${file}" + fi + . "${file}" + if test $? != 0 + then + echo >&5 "sharness: Error loading ${file}. Aborting." + exit 1 + fi + done +fi + +# Public: Empty trash directory, the test area, provided for each test. The HOME +# variable is set to that directory too. +export SHARNESS_TRASH_DIRECTORY + +HOME="$SHARNESS_TRASH_DIRECTORY" +export HOME + +mkdir -p "$SHARNESS_TRASH_DIRECTORY" || exit 1 +# Use -P to resolve symlinks in our working directory so that the cwd +# in subprocesses like git equals our $PWD (for pathname comparisons). +cd -P "$SHARNESS_TRASH_DIRECTORY" || exit 1 + +this_test=${SHARNESS_TEST_FILE##*/} +this_test=${this_test%.$SHARNESS_TEST_EXTENSION} +for skp in $SKIP_TESTS; do + case "$this_test" in + $skp) + say_color info >&3 "skipping test $this_test altogether" + skip_all="skip all tests in $this_test" + test_done + esac +done + +test -n "$TEST_LONG" && test_set_prereq EXPENSIVE +test -n "$TEST_INTERACTIVE" && test_set_prereq INTERACTIVE + +# Make sure this script ends with code 0 +: + +# vi: set ts=4 sw=4 noet : diff --git a/test/t1100-git-auth.sh b/test/t1100-git-auth.sh new file mode 100755 index 00000000..71d526f2 --- /dev/null +++ b/test/t1100-git-auth.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +test_description='git-auth tests' + +. ./setup.sh + +test_expect_success 'Test basic authentication.' ' + "$GIT_AUTH" "$AUTH_KEYTYPE_USER" "$AUTH_KEYTEXT_USER" >out && + grep -q AUR_USER=user out && + grep -q AUR_PRIVILEGED=0 out +' + +test_expect_success 'Test Trusted User authentication.' ' + "$GIT_AUTH" "$AUTH_KEYTYPE_TU" "$AUTH_KEYTEXT_TU" >out && + grep -q AUR_USER=tu out && + grep -q AUR_PRIVILEGED=1 out +' + +test_expect_success 'Test authentication with an unsupported key type.' ' + test_must_fail "$GIT_AUTH" ssh-xxx "$AUTH_KEYTEXT_USER" +' + +test_expect_success 'Test authentication with a wrong key.' ' + "$GIT_AUTH" "$AUTH_KEYTYPE_MISSING" "$AUTH_KEYTEXT_MISSING" >out + test_must_be_empty out +' + +test_done diff --git a/test/t1200-git-serve.sh b/test/t1200-git-serve.sh new file mode 100755 index 00000000..5054ce36 --- /dev/null +++ b/test/t1200-git-serve.sh @@ -0,0 +1,343 @@ +#!/bin/sh + +test_description='git-serve tests' + +. ./setup.sh + +test_expect_success 'Test interactive shell.' ' + "$GIT_SERVE" 2>&1 | grep -q "Interactive shell is disabled." +' + +test_expect_success 'Test help.' ' + SSH_ORIGINAL_COMMAND=help "$GIT_SERVE" 2>actual && + save_IFS=$IFS + IFS= + while read -r line; do + echo $line | grep -q "^Commands:$" && continue + echo $line | grep -q "^ [a-z]" || return 1 + [ ${#line} -le 80 ] || return 1 + done <actual + IFS=$save_IFS +' + +test_expect_success 'Test setup-repo and list-repos.' ' + SSH_ORIGINAL_COMMAND="setup-repo foobar" AUR_USER=user \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="setup-repo foobar2" AUR_USER=tu \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + *foobar + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success 'Test git-receive-pack.' ' + cat >expected <<-EOF && + user + foobar + foobar + EOF + SSH_ORIGINAL_COMMAND="git-receive-pack /foobar.git/" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success 'Test git-receive-pack with an invalid repository name.' ' + SSH_ORIGINAL_COMMAND="git-receive-pack /!.git/" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 >actual +' + +test_expect_success "Test git-upload-pack." ' + cat >expected <<-EOF && + user + foobar + foobar + EOF + SSH_ORIGINAL_COMMAND="git-upload-pack /foobar.git/" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Try to pull from someone else's repository." ' + cat >expected <<-EOF && + user + foobar2 + foobar2 + EOF + SSH_ORIGINAL_COMMAND="git-upload-pack /foobar2.git/" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Try to push to someone else's repository." ' + SSH_ORIGINAL_COMMAND="git-receive-pack /foobar2.git/" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 +' + +test_expect_success "Try to push to someone else's repository as Trusted User." ' + cat >expected <<-EOF && + tu + foobar + foobar + EOF + SSH_ORIGINAL_COMMAND="git-receive-pack /foobar.git/" \ + AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Test restore." ' + echo "DELETE FROM PackageBases WHERE Name = \"foobar\";" | \ + sqlite3 aur.db && + cat >expected <<-EOF && + user + foobar + EOF + SSH_ORIGINAL_COMMAND="restore foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual + test_cmp expected actual +' + +test_expect_success "Try to restore an existing package base." ' + SSH_ORIGINAL_COMMAND="restore foobar2" AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 +' + +test_expect_success "Disown all package bases." ' + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Adopt a package base as a regular user." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + *foobar + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Adopt an already adopted package base." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 +' + +test_expect_success "Adopt a package base as a Trusted User." ' + SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + *foobar2 + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Disown one's own package base as a regular user." ' + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Disown one's own package base as a Trusted User." ' + SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual +' + +test_expect_success "Try to steal another user's package as a regular user." ' + SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + cat >expected <<-EOF && + *foobar2 + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 +' + +test_expect_success "Try to steal another user's package as a Trusted User." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + cat >expected <<-EOF && + *foobar + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 +' + +test_expect_success "Try to disown another user's package as a regular user." ' + SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + *foobar2 + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 +' + +test_expect_success "Try to disown another user's package as a Trusted User." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 +' + +test_expect_success "Adopt a package base and add co-maintainers." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + SSH_ORIGINAL_COMMAND="set-comaintainers foobar user3 user4" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + 5|3|1 + 6|3|2 + EOF + echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \ + sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success "Update package base co-maintainers." ' + SSH_ORIGINAL_COMMAND="set-comaintainers foobar user2 user3 user4" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + 4|3|1 + 5|3|2 + 6|3|3 + EOF + echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \ + sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success "Try to add co-maintainers to an orphan package base." ' + SSH_ORIGINAL_COMMAND="set-comaintainers foobar2 user2 user3 user4" \ + AUR_USER=user AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + 4|3|1 + 5|3|2 + 6|3|3 + EOF + echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \ + sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success "Disown a package base and check (co-)maintainer list." ' + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + *foobar + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user2 AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + cat >expected <<-EOF && + 5|3|1 + 6|3|2 + EOF + echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \ + sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success "Force-disown a package base and check (co-)maintainer list." ' + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \ + "$GIT_SERVE" 2>&1 && + cat >expected <<-EOF && + EOF + SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user3 AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 >actual && + test_cmp expected actual && + cat >expected <<-EOF && + EOF + echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \ + sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success "Check whether package requests are closed when disowning." ' + SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat <<-EOD | sqlite3 aur.db && + INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (1, 2, 3, "foobar", 4); + INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (2, 3, 3, "foobar", 5); + INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (3, 2, 2, "foobar2", 6); + EOD + >sendmail.out && + SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \ + "$GIT_SERVE" 2>&1 && + cat <<-EOD >expected && + Subject: [PRQ#1] Request Accepted + EOD + grep "^Subject.*PRQ" sendmail.out >sendmail.parts && + test_cmp sendmail.parts expected && + cat <<-EOD >expected && + 1|2|3|foobar||4||The user user disowned the package.|0|2 + EOD + echo "SELECT * FROM PackageRequests WHERE Status = 2;" | sqlite3 aur.db >actual && + test_cmp actual expected +' + +test_done diff --git a/test/t1300-git-update.sh b/test/t1300-git-update.sh new file mode 100755 index 00000000..a65ca3a1 --- /dev/null +++ b/test/t1300-git-update.sh @@ -0,0 +1,464 @@ +#!/bin/sh + +test_description='git-update tests' + +. ./setup.sh + +test_expect_success 'Test update hook on a fresh repository.' ' + old=0000000000000000000000000000000000000000 && + new=$(git -C aur.git rev-parse HEAD^) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 && + cat >expected <<-EOF && + 1|1|foobar|1-1|aurweb test package.|https://aur.archlinux.org/ + 1|GPL + 1|1 + 1|1|python-pygit2|| + 1|1 + EOF + >actual && + for t in Packages Licenses PackageLicenses Groups PackageGroups \ + PackageDepends PackageRelations PackageSources \ + PackageNotifications; do + echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual + done && + test_cmp expected actual +' + +test_expect_success 'Test update hook on another fresh repository.' ' + old=0000000000000000000000000000000000000000 && + test_when_finished "git -C aur.git checkout refs/namespaces/foobar/refs/heads/master" && + git -C aur.git checkout -q refs/namespaces/foobar2/refs/heads/master && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar2 AUR_PRIVILEGED=0 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 && + cat >expected <<-EOF && + 1|1|foobar|1-1|aurweb test package.|https://aur.archlinux.org/ + 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/ + 1|GPL + 2|MIT + 1|1 + 2|2 + 1|1|python-pygit2|| + 2|1|python-pygit2|| + 1|1 + 2|1 + EOF + >actual && + for t in Packages Licenses PackageLicenses Groups PackageGroups \ + PackageDepends PackageRelations PackageSources \ + PackageNotifications; do + echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual + done && + test_cmp expected actual +' + +test_expect_success 'Test update hook on an updated repository.' ' + old=$(git -C aur.git rev-parse HEAD^) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 && + cat >expected <<-EOF && + 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/ + 3|1|foobar|1-2|aurweb test package.|https://aur.archlinux.org/ + 1|GPL + 2|MIT + 2|2 + 3|1 + 2|1|python-pygit2|| + 3|1|python-pygit2|| + 1|1 + 2|1 + EOF + >actual && + for t in Packages Licenses PackageLicenses Groups PackageGroups \ + PackageDepends PackageRelations PackageSources \ + PackageNotifications; do + echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual + done && + test_cmp expected actual +' + +test_expect_success 'Test restore mode.' ' + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + "$GIT_UPDATE" restore 2>&1 && + cat >expected <<-EOF && + 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/ + 3|1|foobar|1-2|aurweb test package.|https://aur.archlinux.org/ + 1|GPL + 2|MIT + 2|2 + 3|1 + 2|1|python-pygit2|| + 3|1|python-pygit2|| + 1|1 + 2|1 + EOF + >actual && + for t in Packages Licenses PackageLicenses Groups PackageGroups \ + PackageDepends PackageRelations PackageSources \ + PackageNotifications; do + echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual + done && + test_cmp expected actual +' + +test_expect_success 'Test restore mode on a non-existent repository.' ' + cat >expected <<-EOD && + error: restore: repository not found: foobar3 + EOD + AUR_USER=user AUR_PKGBASE=foobar3 AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" restore >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Pushing to a branch other than master.' ' + old=0000000000000000000000000000000000000000 && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + error: pushing to a branch other than master is restricted + EOD + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/pu "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Performing a non-fast-forward ref update.' ' + old=$(git -C aur.git rev-parse HEAD) && + new=$(git -C aur.git rev-parse HEAD^) && + cat >expected <<-EOD && + error: denying non-fast-forward (you should pull first) + EOD + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Performing a non-fast-forward ref update as Trusted User.' ' + old=$(git -C aur.git rev-parse HEAD) && + new=$(git -C aur.git rev-parse HEAD^) && + AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 +' + +test_expect_success 'Removing .SRCINFO.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + git -C aur.git rm -q .SRCINFO && + git -C aur.git commit -q -m "Remove .SRCINFO" && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing .SRCINFO$" actual +' + +test_expect_success 'Removing .SRCINFO with a follow-up fix.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + git -C aur.git rm -q .SRCINFO && + git -C aur.git commit -q -m "Remove .SRCINFO" && + git -C aur.git revert --no-edit HEAD && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing .SRCINFO$" actual +' + +test_expect_success 'Removing PKGBUILD.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + git -C aur.git rm -q PKGBUILD && + git -C aur.git commit -q -m "Remove PKGBUILD" && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing PKGBUILD$" actual +' + +test_expect_success 'Pushing a tree with a subdirectory.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + mkdir aur.git/subdir && + touch aur.git/subdir/file && + git -C aur.git add subdir/file && + git -C aur.git commit -q -m "Add subdirectory" && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: the repository must not contain subdirectories$" actual +' + +test_expect_success 'Pushing a tree with a large blob.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + printf "%256001s" x >aur.git/file && + git -C aur.git add file && + git -C aur.git commit -q -m "Add large blob" && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: maximum blob size (250.00KiB) exceeded$" actual +' + +test_expect_success 'Pushing .SRCINFO with a non-matching package base.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/\(pkgbase.*\)foobar/\1foobar2/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Change package base" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: invalid pkgbase: foobar2, expected foobar$" actual +' + +test_expect_success 'Pushing .SRCINFO with invalid syntax.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/=//" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Break .SRCINFO" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 +' + +test_expect_success 'Pushing .SRCINFO without pkgver.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "/pkgver/d" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Remove pkgver" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing mandatory field: pkgver$" actual +' + +test_expect_success 'Pushing .SRCINFO without pkgrel.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "/pkgrel/d" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Remove pkgrel" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing mandatory field: pkgrel$" actual +' + +test_expect_success 'Pushing .SRCINFO with epoch.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/.*pkgrel.*/\\0\\nepoch = 1/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Add epoch" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 && + cat >expected <<-EOF && + 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/ + 3|1|foobar|1:1-2|aurweb test package.|https://aur.archlinux.org/ + EOF + echo "SELECT * FROM Packages;" | sqlite3 aur.db >actual && + test_cmp expected actual +' + +test_expect_success 'Pushing .SRCINFO with invalid pkgname.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/\(pkgname.*\)foobar/\1!/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Change pkgname" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: invalid package name: !$" actual +' + +test_expect_success 'Pushing .SRCINFO with invalid epoch.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/.*pkgrel.*/\\0\\nepoch = !/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Change epoch" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: invalid epoch: !$" actual +' + +test_expect_success 'Pushing .SRCINFO with too long URL.' ' + old=$(git -C aur.git rev-parse HEAD) && + url="http://$(printf "%7993s" x | sed "s/ /x/g")/" && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s#.*url.*#\\0\\nurl = $url#" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Change URL" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: url field too long: $url\$" actual +' + +test_expect_success 'Missing install file.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/.*depends.*/\\0\\ninstall = install/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Add install field" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing install file: install$" actual +' + +test_expect_success 'Missing changelog file.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/.*depends.*/\\0\\nchangelog = changelog/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Add changelog field" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing changelog file: changelog$" actual +' + +test_expect_success 'Missing source file.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s/.*depends.*/\\0\\nsource = file/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Add file to the source array" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: missing source file: file$" actual +' + +test_expect_success 'Pushing .SRCINFO with too long source URL.' ' + old=$(git -C aur.git rev-parse HEAD) && + url="http://$(printf "%7993s" x | sed "s/ /x/g")/" && + test_when_finished "git -C aur.git reset --hard $old" && + ( + cd aur.git && + sed "s#.*depends.*#\\0\\nsource = $url#" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Add huge source URL" + ) && + new=$(git -C aur.git rev-parse HEAD) && + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + grep -q "^error: source entry too long: $url\$" actual +' + +test_expect_success 'Pushing a blacklisted package.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + echo "pkgname = forbidden" >>aur.git/.SRCINFO && + git -C aur.git commit -q -am "Add blacklisted package" && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + error: package is blacklisted: forbidden + EOD + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Pushing a blacklisted package as Trusted User.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + echo "pkgname = forbidden" >>aur.git/.SRCINFO && + git -C aur.git commit -q -am "Add blacklisted package" && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + warning: package is blacklisted: forbidden + EOD + AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Pushing a package already in the official repositories.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + echo "pkgname = official" >>aur.git/.SRCINFO && + git -C aur.git commit -q -am "Add official package" && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + error: package already provided by [core]: official + EOD + AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Pushing a package already in the official repositories as Trusted User.' ' + old=$(git -C aur.git rev-parse HEAD) && + test_when_finished "git -C aur.git reset --hard $old" && + echo "pkgname = official" >>aur.git/.SRCINFO && + git -C aur.git commit -q -am "Add official package" && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + warning: package already provided by [core]: official + EOD + AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \ + "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_expect_success 'Trying to hijack a package.' ' + old=0000000000000000000000000000000000000000 && + test_when_finished "git -C aur.git checkout refs/namespaces/foobar/refs/heads/master" && + ( + cd aur.git && + git checkout -q refs/namespaces/foobar2/refs/heads/master && + sed "s/\\(.*pkgname.*\\)2/\\1/" .SRCINFO >.SRCINFO.new + mv .SRCINFO.new .SRCINFO + git commit -q -am "Change package name" + ) && + new=$(git -C aur.git rev-parse HEAD) && + cat >expected <<-EOD && + error: cannot overwrite package: foobar + EOD + AUR_USER=user AUR_PKGBASE=foobar2 AUR_PRIVILEGED=0 \ + test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 && + test_cmp expected actual +' + +test_done diff --git a/test/t2100-mkpkglists.sh b/test/t2100-mkpkglists.sh new file mode 100755 index 00000000..a84a1b65 --- /dev/null +++ b/test/t2100-mkpkglists.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +test_description='mkpkglists tests' + +. ./setup.sh + +test_expect_success 'Test package list generation with no packages.' ' + echo "DELETE FROM Packages;" | sqlite3 aur.db && + echo "DELETE FROM PackageBases;" | sqlite3 aur.db && + "$MKPKGLISTS" && + test $(zcat packages.gz | wc -l) -eq 1 && + test $(zcat pkgbase.gz | wc -l) -eq 1 +' + +test_expect_success 'Test package list generation.' ' + cat <<-EOD | sqlite3 aur.db && + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (1, "foobar", 1, 0, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (2, "foobar2", 2, 0, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (3, "foobar3", NULL, 0, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (4, "foobar4", 1, 0, 0); + INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (1, 1, "pkg1"); + INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (2, 1, "pkg2"); + INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (3, 1, "pkg3"); + INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (4, 2, "pkg4"); + INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (5, 3, "pkg5"); + EOD + "$MKPKGLISTS" && + cat <<-EOD >expected && + foobar + foobar2 + foobar4 + EOD + gunzip pkgbase.gz && + sed "/^#/d" pkgbase >actual && + test_cmp actual expected && + cat <<-EOD >expected && + pkg1 + pkg2 + pkg3 + pkg4 + EOD + gunzip packages.gz && + sed "/^#/d" packages >actual && + test_cmp actual expected +' + +test_done diff --git a/test/t2200-tuvotereminder.sh b/test/t2200-tuvotereminder.sh new file mode 100755 index 00000000..c82ce874 --- /dev/null +++ b/test/t2200-tuvotereminder.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +test_description='tuvotereminder tests' + +. ./setup.sh + +test_expect_success 'Test Trusted User vote reminders.' ' + now=$(date -d now +%s) && + tomorrow=$(date -d tomorrow +%s) && + threedays=$(date -d "3 days" +%s) && + cat <<-EOD | sqlite3 aur.db && + INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (1, "Lorem ipsum.", "user", 0, $now, 0.00, 2); + INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (2, "Lorem ipsum.", "user", 0, $tomorrow, 0.00, 2); + INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (3, "Lorem ipsum.", "user", 0, $tomorrow, 0.00, 2); + INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (4, "Lorem ipsum.", "user", 0, $threedays, 0.00, 2); + EOD + >sendmail.out && + "$TUVOTEREMINDER" && + grep -q "Proposal 2" sendmail.out && + grep -q "Proposal 3" sendmail.out && + test_must_fail grep -q "Proposal 1" sendmail.out && + test_must_fail grep -q "Proposal 4" sendmail.out +' + +test_expect_success 'Check that only TUs who did not vote receive reminders.' ' + cat <<-EOD | sqlite3 aur.db && + INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 2); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (2, 2); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (3, 2); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (4, 2); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 7); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (3, 7); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (2, 8); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (4, 8); + INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 9); + EOD + >sendmail.out && + "$TUVOTEREMINDER" && + cat <<-EOD >expected && + Subject: TU Vote Reminder: Proposal 2 + To: tu2@localhost + Subject: TU Vote Reminder: Proposal 2 + To: tu4@localhost + Subject: TU Vote Reminder: Proposal 3 + To: tu3@localhost + Subject: TU Vote Reminder: Proposal 3 + To: tu4@localhost + EOD + grep "^\(Subject\|To\)" sendmail.out >sendmail.parts && + test_cmp sendmail.parts expected +' + +test_done diff --git a/test/t2300-pkgmaint.sh b/test/t2300-pkgmaint.sh new file mode 100755 index 00000000..5c55aaf1 --- /dev/null +++ b/test/t2300-pkgmaint.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +test_description='pkgmaint tests' + +. ./setup.sh + +test_expect_success 'Test package base cleanup script.' ' + now=$(date -d now +%s) && + threedaysago=$(date -d "3 days ago" +%s) && + cat <<-EOD | sqlite3 aur.db && + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (1, "foobar", 1, $now, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (2, "foobar2", 2, $threedaysago, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (3, "foobar3", NULL, $now, 0); + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (4, "foobar4", NULL, $threedaysago, 0); + EOD + "$PKGMAINT" && + cat <<-EOD >expected && + foobar + foobar2 + foobar3 + EOD + echo "SELECT Name FROM PackageBases;" | sqlite3 aur.db >actual && + test_cmp actual expected +' + +test_done diff --git a/test/t2400-aurblup.sh b/test/t2400-aurblup.sh new file mode 100755 index 00000000..708281c6 --- /dev/null +++ b/test/t2400-aurblup.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +test_description='aurblup tests' + +. ./setup.sh + +test_expect_success 'Test official provider update script.' ' + mkdir -p remote/test/foobar-1.0-1 && + cat <<-EOD >remote/test/foobar-1.0-1/desc && + %FILENAME% + foobar-1.0-any.pkg.tar.xz + + %NAME% + foobar + + %VERSION% + 1.0-1 + + %ARCH% + any + EOD + mkdir -p remote/test/foobar2-1.0-1 && + cat <<-EOD >remote/test/foobar2-1.0-1/desc && + %FILENAME% + foobar2-1.0-any.pkg.tar.xz + + %NAME% + foobar2 + + %VERSION% + 1.0-1 + + %ARCH% + any + + %PROVIDES% + foobar3 + foobar4 + EOD + ( cd remote/test && bsdtar -czf ../test.db * ) && + mkdir sync && + "$AURBLUP" && + cat <<-EOD >expected && + foobar|test|foobar + foobar2|test|foobar2 + foobar2|test|foobar3 + foobar2|test|foobar4 + EOD + echo "SELECT Name, Repo, Provides FROM OfficialProviders ORDER BY Provides;" | sqlite3 aur.db >actual && + test_cmp actual expected +' + +test_done diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt new file mode 100644 index 00000000..78f94551 --- /dev/null +++ b/upgrading/4.3.0.txt @@ -0,0 +1,29 @@ +1. Add a column to store ownership notification settings: + +---- +ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1; +---- + +2. Resize the LastLoginIPAddress column: + +---- +ALTER TABLE Users MODIFY LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL; +---- + +3. Add a new column to store repository information of official providers: + +---- +ALTER TABLE OfficialProviders ADD COLUMN Repo VARCHAR(64) NOT NULL; +---- + +4. Add a column to store users' homepages: + +---- +ALTER TABLE Users ADD COLUMN Homepage TEXT NULL DEFAULT NULL; +---- + +5. Resize LangPreference to fit Latin American Spanish language code: + +-- +ALTER TABLE Users MODIFY LangPreference VARCHAR(6); +-- diff --git a/upgrading/4.4.0.txt b/upgrading/4.4.0.txt new file mode 100644 index 00000000..afe01bea --- /dev/null +++ b/upgrading/4.4.0.txt @@ -0,0 +1,17 @@ +1. Resize the URL column of the Packages table: + +---- +ALTER TABLE Packages MODIFY URL VARCHAR(8000) NULL DEFAULT NULL; +---- + +2. Resize the Source column of the PackageSources table: + +---- +ALTER TABLE PackageSources + MODIFY Source VARCHAR(8000) NOT NULL DEFAULT "/dev/null"; +---- + +3. The location of the Git interface scripts was changed. Make sure you update + your aurweb configuration, as well as the SSH daemon and AUR Git repository + configurations to point to the new wrapper scripts which are located in + /usr/local/bin/ by default. diff --git a/upgrading/4.4.1.txt b/upgrading/4.4.1.txt new file mode 100644 index 00000000..726f9e2b --- /dev/null +++ b/upgrading/4.4.1.txt @@ -0,0 +1,6 @@ +1. The default configuration file search path now points to /etc/aurweb/config. + Make sure you copy your aurweb configuration to the new location before + upgrading. + +2. The maintenance scripts have been prefixed by "aurweb-" and can now be + installed using `python3 setup.py install`. diff --git a/web/html/404.php b/web/html/404.php index a47ae1e4..757c4855 100644 --- a/web/html/404.php +++ b/web/html/404.php @@ -2,12 +2,45 @@ set_include_path(get_include_path() . PATH_SEPARATOR . '../lib'); +$path = $_SERVER['PATH_INFO']; +$tokens = explode('/', $path); + +if (preg_match('/^([a-z0-9][a-z0-9.+_-]*?)(\.git)?$/', $tokens[1], $matches)) { + $gitpkg = $matches[1]; + if (pkg_from_name($gitpkg)) { + $gitcmd = 'git clone ' . sprintf(config_get('options', 'git_clone_uri_anon'), htmlspecialchars($gitpkg)); + $gitlink = get_pkgbase_uri($gitpkg); + } else { + unset($gitpkg); + } +} else { + unset($gitpkg); +} + html_header( __("Page Not Found") ); ?> <div id="error-page" class="box 404"> <h2>404 - <?= __("Page Not Found") ?></h2> <p><?= __("Sorry, the page you've requested does not exist.") ?></p> + <?php if (isset($gitpkg)): ?> + <ul> + <li> + <strong><?= __("Note") ?>:</strong> + <?= __("Git clone URLs are not meant to be opened in a browser.") ?> + </li> + <li> + <?= __("To clone the Git repository of %s, run %s.", + '<strong>' . htmlspecialchars($gitpkg) . '</strong>', + '<code>' . htmlspecialchars($gitcmd) . '</code>') ?> + </li> + <li> + <?= __("Click %shere%s to return to the %s details page.", + '<a href="' . htmlspecialchars($gitlink, ENT_QUOTES) . '">', '</a>', + '<strong>' . htmlspecialchars($gitpkg) . '</strong>') ?> + </li> + </ul> + <?php endif; ?> </div> <?php diff --git a/web/html/account.php b/web/html/account.php index 9007ace5..2892f046 100644 --- a/web/html/account.php +++ b/web/html/account.php @@ -34,9 +34,10 @@ if ($action == "UpdateAccount") { in_request("U"), in_request("T"), in_request("S"), in_request("E"), in_request("H"), in_request("P"), in_request("C"), in_request("R"), in_request("L"), - in_request("I"), in_request("K"), in_request("PK"), - in_request("J"), in_request("CN"), in_request("UN"), - in_request("ID"), $row["Username"]); + in_request("HP"), in_request("I"), in_request("K"), + in_request("PK"), in_request("J"), in_request("CN"), + in_request("UN"), in_request("ON"), in_request("ID"), + $row["Username"]); } } @@ -78,12 +79,26 @@ if (isset($_COOKIE["AURSID"])) { } else { /* Verify user has permission to edit the account */ if (can_edit_account($row)) { - display_account_form("UpdateAccount", $row["Username"], - $row["AccountTypeID"], $row["Suspended"], $row["Email"], - $row["HideEmail"], "", "", $row["RealName"], - $row["LangPreference"], $row["IRCNick"], $row["PGPKey"], $PK, - $row["InactivityTS"] ? 1 : 0, $row["CommentNotify"], - $row["UpdateNotify"], $row["ID"], $row["Username"]); + display_account_form("UpdateAccount", + $row["Username"], + $row["AccountTypeID"], + $row["Suspended"], + $row["Email"], + $row["HideEmail"], + "", + "", + $row["RealName"], + $row["LangPreference"], + $row["Homepage"], + $row["IRCNick"], + $row["PGPKey"], + $PK, + $row["InactivityTS"] ? 1 : 0, + $row["CommentNotify"], + $row["UpdateNotify"], + $row["OwnershipNotify"], + $row["ID"], + $row["Username"]); } else { print __("You do not have permission to edit this account."); } @@ -116,15 +131,26 @@ if (isset($_COOKIE["AURSID"])) { print $update_account_message; if (!$success) { - display_account_form("UpdateAccount", in_request("U"), - in_request("T"), in_request("S"), - in_request("E"), in_request("H"), - in_request("P"), in_request("C"), - in_request("R"), in_request("L"), - in_request("I"), in_request("K"), - in_request("PK"), in_request("J"), - in_request("CN"), in_request("UN"), - in_request("ID"), $row["Username"]); + display_account_form("UpdateAccount", + in_request("U"), + in_request("T"), + in_request("S"), + in_request("E"), + in_request("H"), + in_request("P"), + in_request("C"), + in_request("R"), + in_request("L"), + in_request("HP"), + in_request("I"), + in_request("K"), + in_request("PK"), + in_request("J"), + in_request("CN"), + in_request("UN"), + in_request("ON"), + in_request("ID"), + $row["Username"]); } } else { diff --git a/web/html/css/aurweb.css b/web/html/css/aurweb.css index f5e10371..f777ab83 100644 --- a/web/html/css/aurweb.css +++ b/web/html/css/aurweb.css @@ -148,3 +148,8 @@ label.confirmation, color: red; font-weight: bold; } + +#news div p { + max-height: 15em; + overflow: auto; +} diff --git a/web/html/index.php b/web/html/index.php index 3787d4e4..78ab6ad7 100644 --- a/web/html/index.php +++ b/web/html/index.php @@ -167,10 +167,6 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) { header("Content-Type: image/gif"); readfile("./$path"); break; - case "/css/archnavbar/archlogo.gif": - header("Content-Type: image/png"); - readfile("./$path"); - break; case "/css/archnavbar/archlogo.png": case "/css/archnavbar/aurlogo.png": case "/images/favicon.ico": diff --git a/web/html/register.php b/web/html/register.php index 3155449c..6c6d52e6 100644 --- a/web/html/register.php +++ b/web/html/register.php @@ -20,18 +20,47 @@ echo '<h2>' . __('Register') . '</h2>'; if (in_request("Action") == "NewAccount") { list($success, $message) = process_account_form( - "new", "NewAccount", in_request("U"), 1, 0, - in_request("E"), in_request("H"), '', '', in_request("R"), - in_request("L"), in_request("I"), in_request("K"), - in_request("PK"), 0, in_request("CN"), in_request("UN")); + "new", + "NewAccount", + in_request("U"), + 1, + 0, + in_request("E"), + in_request("H"), + '', + '', + in_request("R"), + in_request("L"), + in_request("HP"), + in_request("I"), + in_request("K"), + in_request("PK"), + 0, + in_request("CN"), + in_request("UN"), + in_request("ON")); print $message; if (!$success) { - display_account_form("NewAccount", in_request("U"), 1, 0, - in_request("E"), in_request("H"), '', '', in_request("R"), - in_request("L"), in_request("I"), in_request("K"), - in_request("PK"), 0, in_request("CN"), in_request("UN")); + display_account_form("NewAccount", + in_request("U"), + 1, + 0, + in_request("E"), + in_request("H"), + '', + '', + in_request("R"), + in_request("L"), + in_request("HP"), + in_request("I"), + in_request("K"), + in_request("PK"), + 0, + in_request("CN"), + in_request("UN"), + in_request("ON")); } } else { print '<p>' . __("Use this form to create an account.") . '</p>'; diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php index 2d70f65f..172b9621 100644 --- a/web/lib/acctfuncs.inc.php +++ b/web/lib/acctfuncs.inc.php @@ -52,19 +52,21 @@ function html_format_pgp_fingerprint($fingerprint) { * @param string $C The confirmed password value of the displayed user * @param string $R The real name of the displayed user * @param string $L The language preference of the displayed user + * @param string $HP The homepage of the displayed user * @param string $I The IRC nickname of the displayed user * @param string $K The PGP key fingerprint of the displayed user * @param string $PK The list of SSH public keys * @param string $J The inactivity status of the displayed user * @param string $CN Whether to notify of new comments * @param string $UN Whether to notify of package updates + * @param string $ON Whether to notify of ownership changes * @param string $UID The user ID of the displayed user * @param string $N The username as present in the database * * @return void */ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="", - $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") { + $L="",$HP="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") { global $SUPPORTED_LANGS; include("account_edit_form.php"); @@ -86,19 +88,21 @@ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="" * @param string $C The confirmed password for the user * @param string $R The real name of the user * @param string $L The language preference of the user + * @param string $HP The homepage of the displayed user * @param string $I The IRC nickname of the user * @param string $K The PGP fingerprint of the user * @param string $PK The list of public SSH keys * @param string $J The inactivity status of the user * @param string $CN Whether to notify of new comments * @param string $UN Whether to notify of package updates + * @param string $ON Whether to notify of ownership changes * @param string $UID The user ID of the modified account * @param string $N The username as present in the database * * @return array Boolean indicating success and message to be printed */ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="", - $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") { + $R="",$L="",$HP="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") { global $SUPPORTED_LANGS; $error = ''; @@ -274,13 +278,14 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="" $salt = $dbh->quote($salt); $R = $dbh->quote($R); $L = $dbh->quote($L); + $HP = $dbh->quote($HP); $I = $dbh->quote($I); $K = $dbh->quote(str_replace(" ", "", $K)); $q = "INSERT INTO Users (AccountTypeID, Suspended, "; $q.= "InactivityTS, Username, Email, Passwd, Salt, "; - $q.= "RealName, LangPreference, IRCNick, PGPKey) "; + $q.= "RealName, LangPreference, Homepage, IRCNick, PGPKey) "; $q.= "VALUES (1, 0, 0, $U, $E, $P, $salt, $R, $L, "; - $q.= "$I, $K)"; + $q.= "$HP, $I, $K)"; $result = $dbh->exec($q); if (!$result) { $message = __("Error trying to create account, %s%s%s.", @@ -342,11 +347,13 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="" } $q.= ", RealName = " . $dbh->quote($R); $q.= ", LangPreference = " . $dbh->quote($L); + $q.= ", Homepage = " . $dbh->quote($HP); $q.= ", IRCNick = " . $dbh->quote($I); $q.= ", PGPKey = " . $dbh->quote(str_replace(" ", "", $K)); $q.= ", InactivityTS = " . $inactivity_ts; $q.= ", CommentNotify = " . ($CN ? "1" : "0"); $q.= ", UpdateNotify = " . ($UN ? "1" : "0"); + $q.= ", OwnershipNotify = " . ($ON ? "1" : "0"); $q.= " WHERE ID = ".intval($UID); $result = $dbh->exec($q); diff --git a/web/lib/confparser.inc.php b/web/lib/confparser.inc.php index 6368b869..789300e1 100644 --- a/web/lib/confparser.inc.php +++ b/web/lib/confparser.inc.php @@ -4,7 +4,7 @@ function config_load() { global $AUR_CONFIG; if (!isset($AUR_CONFIG)) { - $AUR_CONFIG = parse_ini_file("../../conf/config", true, INI_SCANNER_RAW); + $AUR_CONFIG = parse_ini_file("/etc/aurweb/config", true, INI_SCANNER_RAW); } } diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php index 1691bff7..b0827844 100644 --- a/web/lib/pkgbasefuncs.inc.php +++ b/web/lib/pkgbasefuncs.inc.php @@ -661,6 +661,9 @@ function pkgbase_adopt ($base_ids, $action=true, $via) { $q.= "SET MaintainerUID = $uid "; $q.= "WHERE ID IN (" . implode(",", $base_ids) . ") "; $dbh->exec($q); + + /* Add the new maintainer to the notification list. */ + pkgbase_notify($base_ids); } else { /* Update the co-maintainer list when disowning a package. */ if (has_credential(CRED_PKGBASE_DISOWN)) { @@ -692,8 +695,11 @@ function pkgbase_adopt ($base_ids, $action=true, $via) { } } + foreach ($base_ids as $base_id) { + notify(array($action ? 'adopt' : 'disown', $base_id, $uid)); + } + if ($action) { - pkgbase_notify($base_ids); return array(true, __("The selected packages have been adopted.")); } else { return array(true, __("The selected packages have been disowned.")); @@ -1056,7 +1062,6 @@ function pkgbase_set_keywords($base_id, $keywords) { $i = 0; foreach ($keywords as $keyword) { $q = sprintf("INSERT INTO PackageKeywords (PackageBaseID, Keyword) VALUES (%d, %s)", $base_id, $dbh->quote($keyword)); - var_dump($q); $dbh->exec($q); $i++; diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php index f34dbba6..4b0fdbac 100644 --- a/web/lib/pkgfuncs.inc.php +++ b/web/lib/pkgfuncs.inc.php @@ -230,7 +230,7 @@ function pkg_providers($name) { * Get package dependencies for a specific package * * @param int $pkgid The package to get dependencies for - * @param int $limit An upper bound on the number of packages to retrieve + * @param int $limit An upper bound for the number of packages to retrieve * * @return array All package dependencies for the package */ @@ -506,7 +506,7 @@ function pkg_source_link($url, $arch) { * * @param string $name The package name for the dependency search * @param array $provides A list of virtual provisions of the package - * @param int $limit An upper bound on the number of packages to retrieve + * @param int $limit An upper bound for the number of packages to retrieve * * @return array All packages that depend on the specified package name */ diff --git a/web/lib/pkgreqfuncs.inc.php b/web/lib/pkgreqfuncs.inc.php index cf56663b..8ceac8df 100644 --- a/web/lib/pkgreqfuncs.inc.php +++ b/web/lib/pkgreqfuncs.inc.php @@ -221,7 +221,7 @@ function pkgreq_close($id, $reason, $comments, $auto_close=false) { $dbh = DB::connect(); $id = intval($id); - $uid = uid_from_sid($_COOKIE["AURSID"]); + $uid = $auto_close ? 0 : uid_from_sid($_COOKIE["AURSID"]); if (!$auto_close && !has_credential(CRED_PKGREQ_CLOSE)) { return array(false, __("Only TUs and developers can close requests.")); diff --git a/web/lib/version.inc.php b/web/lib/version.inc.php index 9c0a5e60..dcf5666e 100644 --- a/web/lib/version.inc.php +++ b/web/lib/version.inc.php @@ -1,3 +1,3 @@ <?php -define("AURWEB_VERSION", "v4.2.1"); +define("AURWEB_VERSION", "v4.4.1"); diff --git a/web/template/account_details.php b/web/template/account_details.php index 59a6a63b..024bd9c3 100644 --- a/web/template/account_details.php +++ b/web/template/account_details.php @@ -42,6 +42,10 @@ <td><?= htmlspecialchars($row["RealName"], ENT_QUOTES) ?></td> </tr> <tr> + <th><?= __("Homepage") . ":" ?></th> + <td><a href="<?= htmlspecialchars($row["Homepage"], ENT_QUOTES) ?>" rel="nofollow"><?= htmlspecialchars($row["Homepage"], ENT_QUOTES) ?></a></td> + </tr> + <tr> <th><?= __("IRC Nick") . ":" ?></th> <td><?= htmlspecialchars($row["IRCNick"], ENT_QUOTES) ?></td> </tr> @@ -55,6 +59,14 @@ <?= $row["InactivityTS"] ? __("Inactive since") . ' ' . date("Y-m-d H:i", $row["InactivityTS"]) : __("Active"); ?> </td> </tr> + <tr> + <th><?= __("Registration date:") ?></th> + <?php if ($row["RegistrationTS"]): ?> + <td><?= (new DateTime($row["RegistrationTS"]))->format('Y-m-d') ?></td> + <?php else: ?> + <td><?= __("unknown") ?></td> + <?php endif; ?> + </tr> <?php if (has_credential(CRED_ACCOUNT_LAST_LOGIN)): ?> <tr> <th><?= __("Last Login") . ":" ?></th> diff --git a/web/template/account_edit_form.php b/web/template/account_edit_form.php index b9affd64..19821a0b 100644 --- a/web/template/account_edit_form.php +++ b/web/template/account_edit_form.php @@ -1,6 +1,7 @@ <?php if ($A == "UpdateAccount"): ?> <p> <?= __('Click %shere%s if you want to permanently delete this account.', '<a href="' . get_user_uri($N) . 'delete/' . '">', '</a>') ?> + <?= __('Click %shere%s for user details.', '<a href="' . get_user_uri($N) . '">', '</a>') ?> </p> <form id="edit-profile-form" action="<?= get_user_uri($N) . 'update/'; ?>" method="post"> @@ -99,6 +100,11 @@ </p> <p> + <label for="id_homepage"><?= __("Homepage") ?>:</label> + <input type="text" size="30" name="HP" id="id_homepage" value="<?= htmlspecialchars($HP,ENT_QUOTES) ?>" /> + </p> + + <p> <label for="id_irc"><?= __("IRC Nick") ?>:</label> <input type="text" size="30" maxlength="32" name="I" id="id_irc" value="<?= htmlspecialchars($I,ENT_QUOTES) ?>" /> </p> @@ -143,6 +149,10 @@ <label for="id_updatenotify"><?= __("Notify of package updates") ?>:</label> <input type="checkbox" name="UN" id="id_updatenotify" <?= $UN ? 'checked="checked"' : '' ?> /> </p> + <p> + <label for="id_ownershipnotify"><?= __("Notify of ownership changes") ?>:</label> + <input type="checkbox" name="ON" id="id_ownershipnotify" <?= $ON ? 'checked="checked"' : '' ?> /> + </p> </fieldset> <fieldset> diff --git a/web/template/footer.php b/web/template/footer.php index f5dc2d06..572dbb26 100644 --- a/web/template/footer.php +++ b/web/template/footer.php @@ -3,7 +3,7 @@ <div id="footer"> <?php if ($ver): ?> - <p>aurweb <a href="https://projects.archlinux.org/aurweb.git/log/?h=<?= htmlspecialchars($ver, ENT_QUOTES) ?>"><?= htmlspecialchars($ver) ?></a></p> + <p>aurweb <a href="https://git.archlinux.org/aurweb.git/log/?h=<?= htmlspecialchars($ver, ENT_QUOTES) ?>"><?= htmlspecialchars($ver) ?></a></p> <?php endif; ?> <p><?= __('Copyright %s 2004-%d aurweb Development Team.', '©', date('Y')) ?></p> <p><?= __('AUR packages are user produced content. Any use of the provided files is at your own risk.') ?></p> diff --git a/web/template/pkg_search_results.php b/web/template/pkg_search_results.php index 3046c253..37a90328 100644 --- a/web/template/pkg_search_results.php +++ b/web/template/pkg_search_results.php @@ -35,7 +35,7 @@ if (!$result): ?> <th><a href="?<?= mkurl('SB=n&SO=' . $SO_next) ?>"><?= __("Name") ?></a></th> <th><?= __("Version") ?></th> <th><a href="?<?= mkurl('SB=v&SO=' . $SO_next) ?>"><?= __("Votes") ?></a></th> - <th><a href="?<?= mkurl('SB=p&SO=' . $SO_next) ?>"><?= __("Popularity") ?></a><span title="<?= __('Popularity is calculated as the sum of all votes with each vote being weighted with a factor of 0.98 per day since its creation.') ?>" class="hover-help"><sup>?</sup></span></th> + <th><a href="?<?= mkurl('SB=p&SO=' . $SO_next) ?>"><?= __("Popularity") ?></a><span title="<?= __('Popularity is calculated as the sum of all votes with each vote being weighted with a factor of %.2f per day since its creation.', 0.98) ?>" class="hover-help"><sup>?</sup></span></th> <?php if ($SID): ?> <th><a href="?<?= mkurl('SB=w&SO=' . $SO_next) ?>"><?= __("Voted") ?></a></th> <th><a href="?<?= mkurl('SB=o&SO=' . $SO_next) ?>"><?= __("Notify") ?></a></th> diff --git a/web/template/pkgbase_actions.php b/web/template/pkgbase_actions.php index 237e712f..d3f05921 100644 --- a/web/template/pkgbase_actions.php +++ b/web/template/pkgbase_actions.php @@ -24,7 +24,7 @@ <?php if (pkgbase_user_notify($uid, $base_id)): ?> <li><?= html_action_form($base_uri . 'unnotify/', "do_UnNotify", __('Disable notifications')) ?></li> <?php else: ?> - <li><?= html_action_form($base_uri . 'notify/', "do_Notify", __('Notify of new comments')) ?></li> + <li><?= html_action_form($base_uri . 'notify/', "do_Notify", __('Enable notifications')) ?></li> <?php endif; ?> <?php if (has_credential(CRED_PKGBASE_EDIT_COMAINTAINERS, array($row["MaintainerUID"]))): ?> diff --git a/web/template/pkgreq_form.php b/web/template/pkgreq_form.php index 4fd7851d..35dbef57 100644 --- a/web/template/pkgreq_form.php +++ b/web/template/pkgreq_form.php @@ -16,7 +16,7 @@ <input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" /> <p> <label for="id_type"><?= __("Request type") ?>:</label> - <select name="type" id="id_type" onchange="showHideMergeSection()"> + <select name="type" id="id_type" onchange="showHideMergeSection(); showHideRequestHints()"> <option value="deletion"><?= __('Deletion') ?></option> <option value="merge"><?= __('Merge') ?></option> <?php if (pkgbase_maintainer_uid($base_id)): ?> @@ -35,8 +35,16 @@ } } + function showHideRequestHints() { + $('#deletion_hint').hide(); + $('#merge_hint').hide(); + $('#orphan_hint').hide(); + $('#' + $('#id_type').val() + '_hint').show(); + } + $(document).ready(function() { showHideMergeSection(); + showHideRequestHints(); $('#id_merge_into').typeahead({ source: function(query, callback) { @@ -59,6 +67,15 @@ <label for="id_comments"><?= __("Comments") ?>:</label> <textarea name="comments" id="id_comments" rows="5" cols="50"></textarea> </p> + <p id="deletion_hint"> + <?= __('By submitting a deletion request, you ask a Trusted User to delete the package base. This type of request should be used for duplicates, software abandoned by upstream, as well as illegal and irreparably broken packages.') ?> + </p> + <p id="merge_hint"> + <?= __('By submitting a merge request, you ask a Trusted User to delete the package base and transfer its votes and comments to another package base. Merging a package does not affect the corresponding Git repositories. Make sure you update the Git history of the target package yourself.') ?> + </p> + <p id="orphan_hint"> + <?= __('By submitting an orphan request, you ask a Trusted User to disown the package base. Please only do this if the package needs maintainer action, the maintainer is MIA and you already tried to contact the maintainer previously.') ?> + </p> <p> <input type="submit" class="button" name="do_FileRequest" value="<?= __("Submit Request") ?>" /> </p> diff --git a/web/template/pkgreq_results.php b/web/template/pkgreq_results.php index 24ee877a..b27963be 100644 --- a/web/template/pkgreq_results.php +++ b/web/template/pkgreq_results.php @@ -39,7 +39,7 @@ if (!$due) { $time_left = $idle_time - (time() - intval($row['RequestTS'])); if ($time_left > 48 * 3600) { - $time_left_fmt = __("~%d days left", round($time_left / (24 * 3600))); + $time_left_fmt = _n("~%d day left", "~%d days left", round($time_left / (24 * 3600))); } elseif ($time_left > 3600) { $time_left_fmt = _n("~%d hour left", "~%d hours left", round($time_left / 3600)); } else { |