Merge branch 'master' into maint

This commit is contained in:
Lukas Fleischer 2016-10-17 15:34:21 +02:00
commit fdd932ff8d
94 changed files with 6819 additions and 2306 deletions

7
.gitignore vendored
View file

@ -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/

35
INSTALL
View file

@ -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,46 +30,43 @@ 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
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))$" {

51
README
View file

@ -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.
community. The scripts contained in the repository can be built using `makepkg`
and installed using the Arch Linux package manager `pacman`.
Functionality
-------------
The aurweb project includes
* 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.
* 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.
scripts::
aurblup package blacklist tool. Scripts for AUR maintenance.
schema::
Schema for the SQL database. Script for dummy data generation.
support::
Schema for SQL database. Script for dummy data generation.
scripts::
Scripts for AUR maintenance.
test::
Test suite and test cases.
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

0
aurweb/__init__.py Normal file
View file

30
aurweb/config.py Normal file
View file

@ -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)

51
aurweb/db.py Normal file
View file

@ -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()

0
aurweb/git/__init__.py Normal file
View file

62
aurweb/git/auth.py Executable file
View file

@ -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()

451
aurweb/git/serve.py Executable file
View file

@ -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()

423
aurweb/git/update.py Executable file
View file

@ -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()

View file

55
aurweb/scripts/aurblup.py Executable file
View file

@ -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()

38
aurweb/scripts/mkpkglists.py Executable file
View file

@ -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()

455
aurweb/scripts/notify.py Executable file
View file

@ -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()

20
aurweb/scripts/pkgmaint.py Executable file
View file

@ -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()

26
aurweb/scripts/popupdate.py Executable file
View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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.
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, 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.
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.

View file

@ -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:

View file

@ -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

View file

@ -1 +0,0 @@
PREFIX = /usr/local

View file

@ -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))

View file

@ -1,3 +0,0 @@
#!/bin/sh
%GIT_INTERFACE_DIR%/git-auth.py "$1" "$2"

View file

@ -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))

View file

@ -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()

138
po/ar.po
View file

@ -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 "إحصائيّاتي"

View file

@ -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"

View file

@ -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 ""
@ -1076,6 +1094,10 @@ msgstr ""
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"
@ -1099,6 +1121,10 @@ msgstr ""
msgid "Active"
msgstr ""
#: template/account_details.php
msgid "Registration date:"
msgstr ""
#: template/account_details.php
msgid "Last Login"
msgstr ""
@ -1120,6 +1146,11 @@ msgstr ""
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"
@ -1312,6 +1347,10 @@ msgstr ""
msgid "Disable notifications"
msgstr ""
#: template/pkgbase_actions.php
msgid "Enable notifications"
msgstr ""
#: template/pkgbase_actions.php
msgid "Manage Co-Maintainers"
msgstr ""
@ -1509,10 +1548,6 @@ msgstr ""
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 "
@ -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

View file

@ -3,15 +3,15 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
# Adolfo JaymeBarrientos, 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 sha 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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

148
po/es.po
View file

@ -3,20 +3,23 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
# Adolfo JaymeBarrientos, 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"

View file

@ -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"

View file

@ -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"

View file

@ -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 nexiste 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"

583
po/he.po

File diff suppressed because it is too large Load diff

View file

@ -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"

205
po/hu.po
View file

@ -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"

View file

@ -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ì"

111
po/ja.po
View file

@ -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 "自分の統計"

View file

@ -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"

View file

@ -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"

270
po/pl.po
View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

127
po/ru.po
View file

@ -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 "Голосование продолжается."

View file

@ -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"

View file

@ -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"

154
po/tr.po
View file

@ -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 "
"ırlaştırılarak bulunan her oyun toplamı ile ölçülür."
msgid "Yes"
msgstr "Evet"

View file

@ -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 "Так"

View file

@ -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 "我的统计"

View file

@ -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 "是"

View file

@ -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;

View file

@ -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()

View file

@ -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()

View file

@ -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()

View file

@ -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()

View file

@ -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()

33
setup.py Normal file
View file

@ -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',
],
},
)

11
test/Makefile Normal file
View file

@ -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)

218
test/setup.sh Normal file
View file

@ -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
)

851
test/sharness.sh Normal file
View file

@ -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 :

28
test/t1100-git-auth.sh Executable file
View file

@ -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

343
test/t1200-git-serve.sh Executable file
View file

@ -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

464
test/t1300-git-update.sh Executable file
View file

@ -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

47
test/t2100-mkpkglists.sh Executable file
View file

@ -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

53
test/t2200-tuvotereminder.sh Executable file
View file

@ -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

26
test/t2300-pkgmaint.sh Executable file
View file

@ -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

53
test/t2400-aurblup.sh Executable file
View file

@ -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

29
upgrading/4.3.0.txt Normal file
View file

@ -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);
--

17
upgrading/4.4.0.txt Normal file
View file

@ -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.

6
upgrading/4.4.1.txt Normal file
View file

@ -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`.

View file

@ -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

View file

@ -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 {

View file

@ -148,3 +148,8 @@ label.confirmation,
color: red;
font-weight: bold;
}
#news div p {
max-height: 15em;
overflow: auto;
}

View file

@ -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":

View file

@ -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>';

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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++;

View file

@ -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
*/

View file

@ -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."));

View file

@ -1,3 +1,3 @@
<?php
define("AURWEB_VERSION", "v4.2.1");
define("AURWEB_VERSION", "v4.4.1");

View file

@ -41,6 +41,10 @@
<th><?= __("Real Name") . ":" ?></th>
<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>
@ -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>

View file

@ -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">
@ -98,6 +99,11 @@
<input type="text" size="30" maxlength="32" name="R" id="id_realname" value="<?= htmlspecialchars($R,ENT_QUOTES) ?>" />
</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) ?>" />
@ -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>

View file

@ -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.', '&copy;', date('Y')) ?></p>
<p><?= __('AUR packages are user produced content. Any use of the provided files is at your own risk.') ?></p>

View file

@ -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>

View file

@ -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"]))): ?>

View file

@ -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>

View file

@ -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 {