summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@archlinux.org>2016-10-17 15:34:21 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2016-10-17 15:34:21 +0200
commitfdd932ff8d5e5899cfeae9a8b29011fa2cf9d439 (patch)
tree07afb8664e18e4d4fb479525b16db6edf026b72b
parentb091fb77580d56dbdca6424f9065581945b8e815 (diff)
parentc3f464f50fb35ffb7825b90437bd912051a994ee (diff)
Merge branch 'master' into maintaurweb/maint
-rw-r--r--.gitignore7
-rw-r--r--INSTALL37
-rw-r--r--README53
-rw-r--r--aurweb/__init__.py0
-rw-r--r--aurweb/config.py30
-rw-r--r--aurweb/db.py51
-rw-r--r--aurweb/git/__init__.py0
-rwxr-xr-xaurweb/git/auth.py62
-rwxr-xr-xaurweb/git/serve.py451
-rwxr-xr-xaurweb/git/update.py423
-rw-r--r--aurweb/scripts/__init__.py0
-rwxr-xr-xaurweb/scripts/aurblup.py55
-rwxr-xr-xaurweb/scripts/mkpkglists.py38
-rwxr-xr-xaurweb/scripts/notify.py455
-rwxr-xr-xaurweb/scripts/pkgmaint.py20
-rwxr-xr-xaurweb/scripts/popupdate.py26
-rwxr-xr-xaurweb/scripts/tuvotereminder.py28
-rw-r--r--conf/config.proto17
-rw-r--r--doc/git-interface.txt39
-rw-r--r--doc/i18n.txt2
-rw-r--r--git-interface/Makefile18
-rw-r--r--git-interface/config.mk1
-rwxr-xr-xgit-interface/git-auth.py69
-rw-r--r--git-interface/git-auth.sh.in3
-rwxr-xr-xgit-interface/git-serve.py217
-rwxr-xr-xgit-interface/git-update.py363
-rw-r--r--po/ar.po138
-rw-r--r--po/ast.po68
-rw-r--r--po/aur.pot81
-rw-r--r--po/ca.po68
-rw-r--r--po/cs.po69
-rw-r--r--po/da.po66
-rw-r--r--po/de.po88
-rw-r--r--po/el.po66
-rw-r--r--po/es.po148
-rw-r--r--po/es_419.po153
-rw-r--r--po/fi.po66
-rw-r--r--po/fr.po87
-rw-r--r--po/he.po583
-rw-r--r--po/hr.po67
-rw-r--r--po/hu.po205
-rw-r--r--po/it.po68
-rw-r--r--po/ja.po111
-rw-r--r--po/nb.po68
-rw-r--r--po/nl.po66
-rw-r--r--po/pl.po270
-rw-r--r--po/pt_BR.po125
-rw-r--r--po/pt_PT.po66
-rw-r--r--po/ro.po67
-rw-r--r--po/ru.po127
-rw-r--r--po/sk.po69
-rw-r--r--po/sr.po84
-rw-r--r--po/tr.po154
-rw-r--r--po/uk.po82
-rw-r--r--po/zh_CN.po249
-rw-r--r--po/zh_TW.po74
-rw-r--r--schema/aur-schema.sql78
-rwxr-xr-xscripts/aurblup.py64
-rwxr-xr-xscripts/mkpkglists.py41
-rwxr-xr-xscripts/notify.py382
-rwxr-xr-xscripts/pkgmaint.py25
-rwxr-xr-xscripts/popupdate.py30
-rw-r--r--setup.py33
-rw-r--r--test/Makefile11
-rw-r--r--test/setup.sh218
-rw-r--r--test/sharness.sh851
-rwxr-xr-xtest/t1100-git-auth.sh28
-rwxr-xr-xtest/t1200-git-serve.sh343
-rwxr-xr-xtest/t1300-git-update.sh464
-rwxr-xr-xtest/t2100-mkpkglists.sh47
-rwxr-xr-xtest/t2200-tuvotereminder.sh53
-rwxr-xr-xtest/t2300-pkgmaint.sh26
-rwxr-xr-xtest/t2400-aurblup.sh53
-rw-r--r--upgrading/4.3.0.txt29
-rw-r--r--upgrading/4.4.0.txt17
-rw-r--r--upgrading/4.4.1.txt6
-rw-r--r--web/html/404.php33
-rw-r--r--web/html/account.php62
-rw-r--r--web/html/css/aurweb.css5
-rw-r--r--web/html/index.php4
-rw-r--r--web/html/register.php45
-rw-r--r--web/lib/acctfuncs.inc.php15
-rw-r--r--web/lib/confparser.inc.php2
-rw-r--r--web/lib/pkgbasefuncs.inc.php9
-rw-r--r--web/lib/pkgfuncs.inc.php4
-rw-r--r--web/lib/pkgreqfuncs.inc.php2
-rw-r--r--web/lib/version.inc.php2
-rw-r--r--web/template/account_details.php12
-rw-r--r--web/template/account_edit_form.php10
-rw-r--r--web/template/footer.php2
-rw-r--r--web/template/pkg_search_results.php2
-rw-r--r--web/template/pkgbase_actions.php2
-rw-r--r--web/template/pkgreq_form.php19
-rw-r--r--web/template/pkgreq_results.php2
94 files changed, 6821 insertions, 2308 deletions
diff --git a/.gitignore b/.gitignore
index c41bf3e..f0e462d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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/
diff --git a/INSTALL b/INSTALL
index be39052..95cac4c 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Setup on Arch Linux
1) Clone the AUR project:
$ cd /srv/http/
- $ git clone git://projects.archlinux.org/aurweb.git
+ $ git clone git://git.archlinux.org/aurweb.git
2) Setup a web server with PHP and MySQL. Configure the web server to redirect
all URLs to /index.php/foo/bar/. The following block can be used with nginx:
@@ -30,47 +30,44 @@ Setup on Arch Linux
}
}
-3) Copy conf/config.proto to conf/config and adjust the configuration (pay
- attention to disable_http_login, enable_maintenance and aur_location).
+3) Copy conf/config.proto to /etc/aurweb/config and adjust the configuration
+ (pay attention to disable_http_login, enable_maintenance and aur_location).
4) Create a new MySQL database and a user and import the AUR SQL schema:
$ mysql -uaur -p AUR </srv/http/aurweb/schema/aur-schema.sql
-5) Create a new user:
+5) Install Python modules and dependencies:
+
+ # pacman -S python-mysql-connector python-pygit2 python-srcinfo
+ # python3 setup.py install
+
+6) Create a new user:
# useradd -U -d /srv/http/aurweb -c 'AUR user' aur
-6) Initialize the Git repository:
+7) Initialize the Git repository:
# mkdir /srv/http/aurweb/aur.git/
# cd /srv/http/aurweb/aur.git/
# git init --bare
# git config --local transfer.hideRefs '^refs/'
- # git config --local transfer.hideRefs '!refs/'
- # ln -s ../../git-interface/git-update.py hooks/update
+ # git config --local --add transfer.hideRefs '!refs/'
+ # git config --local --add transfer.hideRefs '!HEAD'
+ # ln -s /usr/local/bin/aurweb-git-update hooks/update
# chown -R aur .
-7) Install needed Python modules:
-
- # pacman -S python-mysql-connector python-pygit2 python-srcinfo
-
-8) Install the git-auth wrapper script:
-
- # cd /srv/http/aurweb/git-interface/
- # make && make install
-
-9) Configure sshd(8) for the AUR. Add the following lines at the end of your
+8) Configure sshd(8) for the AUR. Add the following lines at the end of your
sshd_config(5) and restart the sshd. Note that OpenSSH 6.9 or newer is
needed!
Match User aur
PasswordAuthentication no
- AuthorizedKeysCommand /usr/local/bin/aur-git-auth "%t" "%k"
+ AuthorizedKeysCommand /usr/local/bin/aurweb-git-auth "%t" "%k"
AuthorizedKeysCommandUser aur
-10) If you want to enable smart HTTP support with nginx and fcgiwrap, you can
- use the following directives:
+9) If you want to enable smart HTTP support with nginx and fcgiwrap, you can
+ use the following directives:
location ~ "^/([a-z0-9][a-z0-9.+_-]*?)(\.git)?/(git-(receive|upload)-pack|HEAD|info/refs|objects/(info/(http-)?alternates|packs)|[0-9a-f]{2}/[0-9a-f]{38}|pack/pack-[0-9a-f]{40}\.(pack|idx))$" {
fastcgi_pass unix:/run/fcgiwrap.sock;
diff --git a/README b/README
index 71e8481..e633ec3 100644
--- a/README
+++ b/README
@@ -1,40 +1,45 @@
aurweb
======
-aurweb is a framework for hosting the Arch User Repository (AUR), a collection
+aurweb is a hosting platform for the Arch User Repository (AUR), a collection
of packaging scripts that are created and submitted by the Arch Linux
-community. The scripts contained in the repository (PKGBUILDs) can be built
-using makepkg and installed via the Arch Linux package manager pacman. The
-aurweb project aims to provide the necessary web interface, database schema,
-and scripts for a multi-lingual community-driven repository.
-
-Functionality
--------------
-
-* Users may submit source packages that contain a PKGBUILD.
-* User accounts with varying permission levels (User, Trusted User, Developer).
-* Ability to search for specific submitted packages.
-* Display package information by parsing meta-data provided with the packages.
-* Users can make comments on package information page.
-* Mark packages as out-of-date.
-* Vote for well-done and popular user submitted packages.
-* Trusted User and Developer can search for and modify accounts.
+community. The scripts contained in the repository can be built using `makepkg`
+and installed using the Arch Linux package manager `pacman`.
+
+The aurweb project includes
+
+* A web interface to search for packaging scripts and display package details.
+* A SSH/Git interface to submit and update packages and package meta data.
+* Community features such as comments, votes, package flagging and requests.
+* Editing/deletion of packages and accounts by Trusted Users and Developers.
* Area for Trusted Users to post AUR-related proposals and vote on them.
Directory Layout
----------------
+aurweb::
+ aurweb Python modules.
+
+conf::
+ Configuration and configuration templates.
+
doc::
- aurweb documentation.
+ Project documentation.
po::
Translation files for strings in the aurweb interface.
+schema::
+ Schema for the SQL database. Script for dummy data generation.
+
scripts::
- aurblup package blacklist tool. Scripts for AUR maintenance.
+ Scripts for AUR maintenance.
+
+test::
+ Test suite and test cases.
-support::
- Schema for SQL database. Script for dummy data generation.
+upgrading::
+ Instructions for upgrading setups from one release to another.
web::
Web interface for the AUR.
@@ -42,10 +47,10 @@ web::
Links
-----
-* The repository is hosted at git://projects.archlinux.org/aurweb.git -- see
- doc/CodingGuidelines for information on submitting patches.
+* The repository is hosted at git://git.archlinux.org/aurweb.git -- see
+ doc/CodingGuidelines for information on the patch submission process.
-* Discovered bugs can be submitted to the aurweb bug tracker:
+* Bugs can (and should) be submitted to the aurweb bug tracker:
https://bugs.archlinux.org/index.php?project=2
* Questions, comments, and patches related to aurweb can be sent to the AUR
diff --git a/aurweb/__init__.py b/aurweb/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/aurweb/__init__.py
diff --git a/aurweb/config.py b/aurweb/config.py
new file mode 100644
index 0000000..a52d942
--- /dev/null
+++ b/aurweb/config.py
@@ -0,0 +1,30 @@
+import configparser
+import os
+
+_parser = None
+
+
+def _get_parser():
+ global _parser
+
+ if not _parser:
+ _parser = configparser.RawConfigParser()
+ if 'AUR_CONFIG' in os.environ:
+ path = os.environ.get('AUR_CONFIG')
+ else:
+ path = "/etc/aurweb/config"
+ _parser.read(path)
+
+ return _parser
+
+
+def get(section, option):
+ return _get_parser().get(section, option)
+
+
+def getboolean(section, option):
+ return _get_parser().getboolean(section, option)
+
+
+def getint(section, option):
+ return _get_parser().getint(section, option)
diff --git a/aurweb/db.py b/aurweb/db.py
new file mode 100644
index 0000000..0b58197
--- /dev/null
+++ b/aurweb/db.py
@@ -0,0 +1,51 @@
+import mysql.connector
+import sqlite3
+
+import aurweb.config
+
+
+class Connection:
+ _conn = None
+ _paramstyle = None
+
+ def __init__(self):
+ aur_db_backend = aurweb.config.get('database', 'backend')
+
+ if aur_db_backend == 'mysql':
+ aur_db_host = aurweb.config.get('database', 'host')
+ aur_db_name = aurweb.config.get('database', 'name')
+ aur_db_user = aurweb.config.get('database', 'user')
+ aur_db_pass = aurweb.config.get('database', 'password')
+ aur_db_socket = aurweb.config.get('database', 'socket')
+ self._conn = mysql.connector.connect(host=aur_db_host,
+ user=aur_db_user,
+ passwd=aur_db_pass,
+ db=aur_db_name,
+ unix_socket=aur_db_socket,
+ buffered=True)
+ self._paramstyle = mysql.connector.paramstyle
+ elif aur_db_backend == 'sqlite':
+ aur_db_name = aurweb.config.get('database', 'name')
+ self._conn = sqlite3.connect(aur_db_name)
+ self._paramstyle = sqlite3.paramstyle
+ else:
+ raise ValueError('unsupported database backend')
+
+ def execute(self, query, params=()):
+ if self._paramstyle in ('format', 'pyformat'):
+ query = query.replace('%', '%%').replace('?', '%s')
+ elif self._paramstyle == 'qmark':
+ pass
+ else:
+ raise ValueError('unsupported paramstyle')
+
+ cur = self._conn.cursor()
+ cur.execute(query, params)
+
+ return cur
+
+ def commit(self):
+ self._conn.commit()
+
+ def close(self):
+ self._conn.close()
diff --git a/aurweb/git/__init__.py b/aurweb/git/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/aurweb/git/__init__.py
diff --git a/aurweb/git/auth.py b/aurweb/git/auth.py
new file mode 100755
index 0000000..022b0ff
--- /dev/null
+++ b/aurweb/git/auth.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python3
+
+import shlex
+import re
+import sys
+
+import aurweb.config
+import aurweb.db
+
+
+def format_command(env_vars, command, ssh_opts, ssh_key):
+ environment = ''
+ for key, var in env_vars.items():
+ environment += '{}={} '.format(key, shlex.quote(var))
+
+ command = shlex.quote(command)
+ command = '{}{}'.format(environment, command)
+
+ # The command is being substituted into an authorized_keys line below,
+ # so we need to escape the double quotes.
+ command = command.replace('"', '\\"')
+ msg = 'command="{}",{} {}'.format(command, ssh_opts, ssh_key)
+ return msg
+
+
+def main():
+ valid_keytypes = aurweb.config.get('auth', 'valid-keytypes').split()
+ username_regex = aurweb.config.get('auth', 'username-regex')
+ git_serve_cmd = aurweb.config.get('auth', 'git-serve-cmd')
+ ssh_opts = aurweb.config.get('auth', 'ssh-options')
+
+ keytype = sys.argv[1]
+ keytext = sys.argv[2]
+ if keytype not in valid_keytypes:
+ exit(1)
+
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT Users.Username, Users.AccountTypeID FROM Users "
+ "INNER JOIN SSHPubKeys ON SSHPubKeys.UserID = Users.ID "
+ "WHERE SSHPubKeys.PubKey = ? AND Users.Suspended = 0",
+ (keytype + " " + keytext,))
+
+ row = cur.fetchone()
+ if not row or cur.fetchone():
+ exit(1)
+
+ user, account_type = row
+ if not re.match(username_regex, user):
+ exit(1)
+
+ env_vars = {
+ 'AUR_USER': user,
+ 'AUR_PRIVILEGED': '1' if account_type > 1 else '0',
+ }
+ key = keytype + ' ' + keytext
+
+ print(format_command(env_vars, git_serve_cmd, ssh_opts, key))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/git/serve.py b/aurweb/git/serve.py
new file mode 100755
index 0000000..476aea8
--- /dev/null
+++ b/aurweb/git/serve.py
@@ -0,0 +1,451 @@
+#!/usr/bin/python3
+
+import os
+import re
+import shlex
+import subprocess
+import sys
+import time
+
+import aurweb.config
+import aurweb.db
+
+notify_cmd = aurweb.config.get('notifications', 'notify-cmd')
+
+repo_path = aurweb.config.get('serve', 'repo-path')
+repo_regex = aurweb.config.get('serve', 'repo-regex')
+git_shell_cmd = aurweb.config.get('serve', 'git-shell-cmd')
+git_update_cmd = aurweb.config.get('serve', 'git-update-cmd')
+ssh_cmdline = aurweb.config.get('serve', 'ssh-cmdline')
+
+enable_maintenance = aurweb.config.getboolean('options', 'enable-maintenance')
+maintenance_exc = aurweb.config.get('options', 'maintenance-exceptions').split()
+
+
+def pkgbase_from_name(pkgbase):
+ conn = aurweb.db.Connection()
+ cur = conn.execute("SELECT ID FROM PackageBases WHERE Name = ?", [pkgbase])
+
+ row = cur.fetchone()
+ return row[0] if row else None
+
+
+def pkgbase_exists(pkgbase):
+ return pkgbase_from_name(pkgbase) is not None
+
+
+def list_repos(user):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ cur = conn.execute("SELECT Name, PackagerUID FROM PackageBases " +
+ "WHERE MaintainerUID = ?", [userid])
+ for row in cur:
+ print((' ' if row[1] else '*') + row[0])
+ conn.close()
+
+
+def create_pkgbase(pkgbase, user):
+ if not re.match(repo_regex, pkgbase):
+ die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
+ if pkgbase_exists(pkgbase):
+ die('{:s}: package base already exists: {:s}'.format(action, pkgbase))
+
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ now = int(time.time())
+ cur = conn.execute("INSERT INTO PackageBases (Name, SubmittedTS, " +
+ "ModifiedTS, SubmitterUID, MaintainerUID) VALUES " +
+ "(?, ?, ?, ?, ?)", [pkgbase, now, now, userid, userid])
+ pkgbase_id = cur.lastrowid
+
+ cur = conn.execute("INSERT INTO PackageNotifications " +
+ "(PackageBaseID, UserID) VALUES (?, ?)",
+ [pkgbase_id, userid])
+
+ conn.commit()
+ conn.close()
+
+
+def pkgbase_adopt(pkgbase, user, privileged):
+ pkgbase_id = pkgbase_from_name(pkgbase)
+ if not pkgbase_id:
+ die('{:s}: package base not found: {:s}'.format(action, pkgbase))
+
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT ID FROM PackageBases WHERE ID = ? AND " +
+ "MaintainerUID IS NULL", [pkgbase_id])
+ if not privileged and not cur.fetchone():
+ die('{:s}: permission denied: {:s}'.format(action, user))
+
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ cur = conn.execute("UPDATE PackageBases SET MaintainerUID = ? " +
+ "WHERE ID = ?", [userid, pkgbase_id])
+
+ cur = conn.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " +
+ "PackageBaseID = ? AND UserID = ?",
+ [pkgbase_id, userid])
+ if cur.fetchone()[0] == 0:
+ cur = conn.execute("INSERT INTO PackageNotifications " +
+ "(PackageBaseID, UserID) VALUES (?, ?)",
+ [pkgbase_id, userid])
+ conn.commit()
+
+ subprocess.Popen((notify_cmd, 'adopt', str(pkgbase_id), str(userid)))
+
+ conn.close()
+
+
+def pkgbase_get_comaintainers(pkgbase):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT UserName FROM PackageComaintainers " +
+ "INNER JOIN Users " +
+ "ON Users.ID = PackageComaintainers.UsersID " +
+ "INNER JOIN PackageBases " +
+ "ON PackageBases.ID = PackageComaintainers.PackageBaseID " +
+ "WHERE PackageBases.Name = ? " +
+ "ORDER BY Priority ASC", [pkgbase])
+
+ return [row[0] for row in cur.fetchall()]
+
+
+def pkgbase_set_comaintainers(pkgbase, userlist, user, privileged):
+ pkgbase_id = pkgbase_from_name(pkgbase)
+ if not pkgbase_id:
+ die('{:s}: package base not found: {:s}'.format(action, pkgbase))
+
+ if not privileged and not pkgbase_has_full_access(pkgbase, user):
+ die('{:s}: permission denied: {:s}'.format(action, user))
+
+ conn = aurweb.db.Connection()
+
+ userlist_old = set(pkgbase_get_comaintainers(pkgbase))
+
+ uids_old = set()
+ for olduser in userlist_old:
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?",
+ [olduser])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+ uids_old.add(userid)
+
+ uids_new = set()
+ for newuser in userlist:
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?",
+ [newuser])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+ uids_new.add(userid)
+
+ uids_add = uids_new - uids_old
+ uids_rem = uids_old - uids_new
+
+ i = 1
+ for userid in uids_new:
+ if userid in uids_add:
+ cur = conn.execute("INSERT INTO PackageComaintainers " +
+ "(PackageBaseID, UsersID, Priority) " +
+ "VALUES (?, ?, ?)", [pkgbase_id, userid, i])
+ subprocess.Popen((notify_cmd, 'comaintainer-add', str(pkgbase_id),
+ str(userid)))
+ else:
+ cur = conn.execute("UPDATE PackageComaintainers " +
+ "SET Priority = ? " +
+ "WHERE PackageBaseID = ? AND UsersID = ?",
+ [i, pkgbase_id, userid])
+ i += 1
+
+ for userid in uids_rem:
+ cur = conn.execute("DELETE FROM PackageComaintainers " +
+ "WHERE PackageBaseID = ? AND UsersID = ?",
+ [pkgbase_id, userid])
+ subprocess.Popen((notify_cmd, 'comaintainer-remove',
+ str(pkgbase_id), str(userid)))
+
+ conn.commit()
+ conn.close()
+
+
+def pkgreq_by_pkgbase(pkgbase_id, reqtype):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT PackageRequests.ID FROM PackageRequests " +
+ "INNER JOIN RequestTypes ON " +
+ "RequestTypes.ID = PackageRequests.ReqTypeID " +
+ "WHERE PackageRequests.Status = 0 " +
+ "AND PackageRequests.PackageBaseID = ?" +
+ "AND RequestTypes.Name = ?", [pkgbase_id, reqtype])
+
+ return [row[0] for row in cur.fetchall()]
+
+
+def pkgreq_close(reqid, reason, comments, autoclose=False):
+ statusmap = {'accepted': 2, 'rejected': 3}
+ if reason not in statusmap:
+ die('{:s}: invalid reason: {:s}'.format(action, reason))
+ status = statusmap[reason]
+
+ conn = aurweb.db.Connection()
+
+ if autoclose:
+ userid = 0
+ else:
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ conn.execute("UPDATE PackageRequests SET Status = ?, ClosureComment = ? " +
+ "WHERE ID = ?", [status, comments, reqid])
+ conn.commit()
+ conn.close()
+
+ subprocess.Popen((notify_cmd, 'request-close', str(userid), str(reqid),
+ reason)).wait()
+
+
+def pkgbase_disown(pkgbase, user, privileged):
+ pkgbase_id = pkgbase_from_name(pkgbase)
+ if not pkgbase_id:
+ die('{:s}: package base not found: {:s}'.format(action, pkgbase))
+
+ initialized_by_owner = pkgbase_has_full_access(pkgbase, user)
+ if not privileged and not initialized_by_owner:
+ die('{:s}: permission denied: {:s}'.format(action, user))
+
+ # TODO: Support disowning package bases via package request.
+
+ # Scan through pending orphan requests and close them.
+ comment = 'The user {:s} disowned the package.'.format(user)
+ for reqid in pkgreq_by_pkgbase(pkgbase_id, 'orphan'):
+ pkgreq_close(reqid, 'accepted', comment, True)
+
+ comaintainers = []
+ new_maintainer_userid = None
+
+ conn = aurweb.db.Connection()
+
+ # Make the first co-maintainer the new maintainer, unless the action was
+ # enforced by a Trusted User.
+ if initialized_by_owner:
+ comaintainers = pkgbase_get_comaintainers(pkgbase)
+ if len(comaintainers) > 0:
+ new_maintainer = comaintainers[0]
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?",
+ [new_maintainer])
+ new_maintainer_userid = cur.fetchone()[0]
+ comaintainers.remove(new_maintainer)
+
+ pkgbase_set_comaintainers(pkgbase, comaintainers, user, privileged)
+ cur = conn.execute("UPDATE PackageBases SET MaintainerUID = ? " +
+ "WHERE ID = ?", [new_maintainer_userid, pkgbase_id])
+
+ conn.commit()
+
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ subprocess.Popen((notify_cmd, 'disown', str(pkgbase_id), str(userid)))
+
+ conn.close()
+
+
+def pkgbase_set_keywords(pkgbase, keywords):
+ pkgbase_id = pkgbase_from_name(pkgbase)
+ if not pkgbase_id:
+ die('{:s}: package base not found: {:s}'.format(action, pkgbase))
+
+ conn = aurweb.db.Connection()
+
+ conn.execute("DELETE FROM PackageKeywords WHERE PackageBaseID = ?",
+ [pkgbase_id])
+ for keyword in keywords:
+ conn.execute("INSERT INTO PackageKeywords (PackageBaseID, Keyword) " +
+ "VALUES (?, ?)", [pkgbase_id, keyword])
+
+ conn.commit()
+ conn.close()
+
+
+def pkgbase_has_write_access(pkgbase, user):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT COUNT(*) FROM PackageBases " +
+ "LEFT JOIN PackageComaintainers " +
+ "ON PackageComaintainers.PackageBaseID = PackageBases.ID " +
+ "INNER JOIN Users " +
+ "ON Users.ID = PackageBases.MaintainerUID " +
+ "OR PackageBases.MaintainerUID IS NULL " +
+ "OR Users.ID = PackageComaintainers.UsersID " +
+ "WHERE Name = ? AND Username = ?", [pkgbase, user])
+ return cur.fetchone()[0] > 0
+
+
+def pkgbase_has_full_access(pkgbase, user):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT COUNT(*) FROM PackageBases " +
+ "INNER JOIN Users " +
+ "ON Users.ID = PackageBases.MaintainerUID " +
+ "WHERE Name = ? AND Username = ?", [pkgbase, user])
+ return cur.fetchone()[0] > 0
+
+
+def die(msg):
+ sys.stderr.write("{:s}\n".format(msg))
+ exit(1)
+
+
+def die_with_help(msg):
+ die(msg + "\nTry `{:s} help` for a list of commands.".format(ssh_cmdline))
+
+
+def warn(msg):
+ sys.stderr.write("warning: {:s}\n".format(msg))
+
+
+def usage(cmds):
+ sys.stderr.write("Commands:\n")
+ colwidth = max([len(cmd) for cmd in cmds.keys()]) + 4
+ for key in sorted(cmds):
+ sys.stderr.write(" " + key.ljust(colwidth) + cmds[key] + "\n")
+ exit(0)
+
+
+def main():
+ user = os.environ.get('AUR_USER')
+ privileged = (os.environ.get('AUR_PRIVILEGED', '0') == '1')
+ ssh_cmd = os.environ.get('SSH_ORIGINAL_COMMAND')
+ ssh_client = os.environ.get('SSH_CLIENT')
+
+ if not ssh_cmd:
+ die_with_help("Interactive shell is disabled.")
+ cmdargv = shlex.split(ssh_cmd)
+ action = cmdargv[0]
+ remote_addr = ssh_client.split(' ')[0] if ssh_client else None
+
+ if enable_maintenance:
+ if remote_addr not in maintenance_exc:
+ die("The AUR is down due to maintenance. We will be back soon.")
+
+ if action == 'git' and cmdargv[1] in ('upload-pack', 'receive-pack'):
+ action = action + '-' + cmdargv[1]
+ del cmdargv[1]
+
+ if action == 'git-upload-pack' or action == 'git-receive-pack':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing path".format(action))
+
+ path = cmdargv[1].rstrip('/')
+ if not path.startswith('/'):
+ path = '/' + path
+ if not path.endswith('.git'):
+ path = path + '.git'
+ pkgbase = path[1:-4]
+ if not re.match(repo_regex, pkgbase):
+ die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
+
+ if action == 'git-receive-pack' and pkgbase_exists(pkgbase):
+ if not privileged and not pkgbase_has_write_access(pkgbase, user):
+ die('{:s}: permission denied: {:s}'.format(action, user))
+
+ os.environ["AUR_USER"] = user
+ os.environ["AUR_PKGBASE"] = pkgbase
+ os.environ["GIT_NAMESPACE"] = pkgbase
+ cmd = action + " '" + repo_path + "'"
+ os.execl(git_shell_cmd, git_shell_cmd, '-c', cmd)
+ elif action == 'set-keywords':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+ pkgbase_set_keywords(cmdargv[1], cmdargv[2:])
+ elif action == 'list-repos':
+ if len(cmdargv) > 1:
+ die_with_help("{:s}: too many arguments".format(action))
+ list_repos(user)
+ elif action == 'setup-repo':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+ if len(cmdargv) > 2:
+ die_with_help("{:s}: too many arguments".format(action))
+ warn('{:s} is deprecated. '
+ 'Use `git push` to create new repositories.'.format(action))
+ create_pkgbase(cmdargv[1], user)
+ elif action == 'restore':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+ if len(cmdargv) > 2:
+ die_with_help("{:s}: too many arguments".format(action))
+
+ pkgbase = cmdargv[1]
+ if not re.match(repo_regex, pkgbase):
+ die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
+
+ if pkgbase_exists(pkgbase):
+ die('{:s}: package base exists: {:s}'.format(action, pkgbase))
+ create_pkgbase(pkgbase, user)
+
+ os.environ["AUR_USER"] = user
+ os.environ["AUR_PKGBASE"] = pkgbase
+ os.execl(git_update_cmd, git_update_cmd, 'restore')
+ elif action == 'adopt':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+ if len(cmdargv) > 2:
+ die_with_help("{:s}: too many arguments".format(action))
+
+ pkgbase = cmdargv[1]
+ pkgbase_adopt(pkgbase, user, privileged)
+ elif action == 'disown':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+ if len(cmdargv) > 2:
+ die_with_help("{:s}: too many arguments".format(action))
+
+ pkgbase = cmdargv[1]
+ pkgbase_disown(pkgbase, user, privileged)
+ elif action == 'set-comaintainers':
+ if len(cmdargv) < 2:
+ die_with_help("{:s}: missing repository name".format(action))
+
+ pkgbase = cmdargv[1]
+ userlist = cmdargv[2:]
+ pkgbase_set_comaintainers(pkgbase, userlist, user, privileged)
+ elif action == 'help':
+ cmds = {
+ "adopt <name>": "Adopt a package base.",
+ "disown <name>": "Disown a package base.",
+ "help": "Show this help message and exit.",
+ "list-repos": "List all your repositories.",
+ "restore <name>": "Restore a deleted package base.",
+ "set-comaintainers <name> [...]": "Set package base co-maintainers.",
+ "set-keywords <name> [...]": "Change package base keywords.",
+ "setup-repo <name>": "Create a repository (deprecated).",
+ "git-receive-pack": "Internal command used with Git.",
+ "git-upload-pack": "Internal command used with Git.",
+ }
+ usage(cmds)
+ else:
+ die_with_help("invalid command: {:s}".format(action))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/git/update.py b/aurweb/git/update.py
new file mode 100755
index 0000000..3b84eb5
--- /dev/null
+++ b/aurweb/git/update.py
@@ -0,0 +1,423 @@
+#!/usr/bin/python3
+
+import os
+import pygit2
+import re
+import subprocess
+import sys
+import time
+
+import srcinfo.parse
+import srcinfo.utils
+
+import aurweb.config
+import aurweb.db
+
+notify_cmd = aurweb.config.get('notifications', 'notify-cmd')
+
+repo_path = aurweb.config.get('serve', 'repo-path')
+repo_regex = aurweb.config.get('serve', 'repo-regex')
+
+max_blob_size = aurweb.config.getint('update', 'max-blob-size')
+
+
+def size_humanize(num):
+ for unit in ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB']:
+ if abs(num) < 2048.0:
+ if isinstance(num, int):
+ return "{}{}".format(num, unit)
+ else:
+ return "{:.2f}{}".format(num, unit)
+ num /= 1024.0
+ return "{:.2f}{}".format(num, 'YiB')
+
+
+def extract_arch_fields(pkginfo, field):
+ values = []
+
+ if field in pkginfo:
+ for val in pkginfo[field]:
+ values.append({"value": val, "arch": None})
+
+ for arch in ['i686', 'x86_64']:
+ if field + '_' + arch in pkginfo:
+ for val in pkginfo[field + '_' + arch]:
+ values.append({"value": val, "arch": arch})
+
+ return values
+
+
+def parse_dep(depstring):
+ dep, _, desc = depstring.partition(': ')
+ depname = re.sub(r'(<|=|>).*', '', dep)
+ depcond = dep[len(depname):]
+
+ if (desc):
+ return (depname + ': ' + desc, depcond)
+ else:
+ return (depname, depcond)
+
+
+def create_pkgbase(conn, pkgbase, user):
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+
+ now = int(time.time())
+ cur = conn.execute("INSERT INTO PackageBases (Name, SubmittedTS, " +
+ "ModifiedTS, SubmitterUID, MaintainerUID) VALUES " +
+ "(?, ?, ?, ?, ?)", [pkgbase, now, now, userid, userid])
+ pkgbase_id = cur.lastrowid
+
+ cur = conn.execute("INSERT INTO PackageNotifications " +
+ "(PackageBaseID, UserID) VALUES (?, ?)",
+ [pkgbase_id, userid])
+
+ conn.commit()
+
+ return pkgbase_id
+
+
+def save_metadata(metadata, conn, user):
+ # Obtain package base ID and previous maintainer.
+ pkgbase = metadata['pkgbase']
+ cur = conn.execute("SELECT ID, MaintainerUID FROM PackageBases "
+ "WHERE Name = ?", [pkgbase])
+ (pkgbase_id, maintainer_uid) = cur.fetchone()
+ was_orphan = not maintainer_uid
+
+ # Obtain the user ID of the new maintainer.
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ user_id = int(cur.fetchone()[0])
+
+ # Update package base details and delete current packages.
+ now = int(time.time())
+ conn.execute("UPDATE PackageBases SET ModifiedTS = ?, " +
+ "PackagerUID = ?, OutOfDateTS = NULL WHERE ID = ?",
+ [now, user_id, pkgbase_id])
+ conn.execute("UPDATE PackageBases SET MaintainerUID = ? " +
+ "WHERE ID = ? AND MaintainerUID IS NULL",
+ [user_id, pkgbase_id])
+ for table in ('Sources', 'Depends', 'Relations', 'Licenses', 'Groups'):
+ conn.execute("DELETE FROM Package" + table + " WHERE EXISTS (" +
+ "SELECT * FROM Packages " +
+ "WHERE Packages.PackageBaseID = ? AND " +
+ "Package" + table + ".PackageID = Packages.ID)",
+ [pkgbase_id])
+ conn.execute("DELETE FROM Packages WHERE PackageBaseID = ?", [pkgbase_id])
+
+ for pkgname in srcinfo.utils.get_package_names(metadata):
+ pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
+
+ if 'epoch' in pkginfo and int(pkginfo['epoch']) > 0:
+ ver = '{:d}:{:s}-{:s}'.format(int(pkginfo['epoch']),
+ pkginfo['pkgver'],
+ pkginfo['pkgrel'])
+ else:
+ ver = '{:s}-{:s}'.format(pkginfo['pkgver'], pkginfo['pkgrel'])
+
+ for field in ('pkgdesc', 'url'):
+ if field not in pkginfo:
+ pkginfo[field] = None
+
+ # Create a new package.
+ cur = conn.execute("INSERT INTO Packages (PackageBaseID, Name, " +
+ "Version, Description, URL) " +
+ "VALUES (?, ?, ?, ?, ?)",
+ [pkgbase_id, pkginfo['pkgname'], ver,
+ pkginfo['pkgdesc'], pkginfo['url']])
+ conn.commit()
+ pkgid = cur.lastrowid
+
+ # Add package sources.
+ for source_info in extract_arch_fields(pkginfo, 'source'):
+ conn.execute("INSERT INTO PackageSources (PackageID, Source, " +
+ "SourceArch) VALUES (?, ?, ?)",
+ [pkgid, source_info['value'], source_info['arch']])
+
+ # Add package dependencies.
+ for deptype in ('depends', 'makedepends',
+ 'checkdepends', 'optdepends'):
+ cur = conn.execute("SELECT ID FROM DependencyTypes WHERE Name = ?",
+ [deptype])
+ deptypeid = cur.fetchone()[0]
+ for dep_info in extract_arch_fields(pkginfo, deptype):
+ depname, depcond = parse_dep(dep_info['value'])
+ deparch = dep_info['arch']
+ conn.execute("INSERT INTO PackageDepends (PackageID, " +
+ "DepTypeID, DepName, DepCondition, DepArch) " +
+ "VALUES (?, ?, ?, ?, ?)",
+ [pkgid, deptypeid, depname, depcond, deparch])
+
+ # Add package relations (conflicts, provides, replaces).
+ for reltype in ('conflicts', 'provides', 'replaces'):
+ cur = conn.execute("SELECT ID FROM RelationTypes WHERE Name = ?",
+ [reltype])
+ reltypeid = cur.fetchone()[0]
+ for rel_info in extract_arch_fields(pkginfo, reltype):
+ relname, relcond = parse_dep(rel_info['value'])
+ relarch = rel_info['arch']
+ conn.execute("INSERT INTO PackageRelations (PackageID, " +
+ "RelTypeID, RelName, RelCondition, RelArch) " +
+ "VALUES (?, ?, ?, ?, ?)",
+ [pkgid, reltypeid, relname, relcond, relarch])
+
+ # Add package licenses.
+ if 'license' in pkginfo:
+ for license in pkginfo['license']:
+ cur = conn.execute("SELECT ID FROM Licenses WHERE Name = ?",
+ [license])
+ row = cur.fetchone()
+ if row:
+ licenseid = row[0]
+ else:
+ cur = conn.execute("INSERT INTO Licenses (Name) " +
+ "VALUES (?)", [license])
+ conn.commit()
+ licenseid = cur.lastrowid
+ conn.execute("INSERT INTO PackageLicenses (PackageID, " +
+ "LicenseID) VALUES (?, ?)",
+ [pkgid, licenseid])
+
+ # Add package groups.
+ if 'groups' in pkginfo:
+ for group in pkginfo['groups']:
+ cur = conn.execute("SELECT ID FROM Groups WHERE Name = ?",
+ [group])
+ row = cur.fetchone()
+ if row:
+ groupid = row[0]
+ else:
+ cur = conn.execute("INSERT INTO Groups (Name) VALUES (?)",
+ [group])
+ conn.commit()
+ groupid = cur.lastrowid
+ conn.execute("INSERT INTO PackageGroups (PackageID, "
+ "GroupID) VALUES (?, ?)", [pkgid, groupid])
+
+ # Add user to notification list on adoption.
+ if was_orphan:
+ cur = conn.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " +
+ "PackageBaseID = ? AND UserID = ?",
+ [pkgbase_id, user_id])
+ if cur.fetchone()[0] == 0:
+ conn.execute("INSERT INTO PackageNotifications " +
+ "(PackageBaseID, UserID) VALUES (?, ?)",
+ [pkgbase_id, user_id])
+
+ conn.commit()
+
+
+def update_notify(conn, user, pkgbase_id):
+ # Obtain the user ID of the new maintainer.
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ user_id = int(cur.fetchone()[0])
+
+ # Execute the notification script.
+ subprocess.Popen((notify_cmd, 'update', str(user_id), str(pkgbase_id)))
+
+
+def die(msg):
+ sys.stderr.write("error: {:s}\n".format(msg))
+ exit(1)
+
+
+def warn(msg):
+ sys.stderr.write("warning: {:s}\n".format(msg))
+
+
+def die_commit(msg, commit):
+ sys.stderr.write("error: The following error " +
+ "occurred when parsing commit\n")
+ sys.stderr.write("error: {:s}:\n".format(commit))
+ sys.stderr.write("error: {:s}\n".format(msg))
+ exit(1)
+
+
+def main():
+ repo = pygit2.Repository(repo_path)
+
+ user = os.environ.get("AUR_USER")
+ pkgbase = os.environ.get("AUR_PKGBASE")
+ privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1')
+ warn_or_die = warn if privileged else die
+
+ if len(sys.argv) == 2 and sys.argv[1] == "restore":
+ if 'refs/heads/' + pkgbase not in repo.listall_references():
+ die('{:s}: repository not found: {:s}'.format(sys.argv[1],
+ pkgbase))
+ refname = "refs/heads/master"
+ branchref = 'refs/heads/' + pkgbase
+ sha1_old = sha1_new = repo.lookup_reference(branchref).target
+ elif len(sys.argv) == 4:
+ refname, sha1_old, sha1_new = sys.argv[1:4]
+ else:
+ die("invalid arguments")
+
+ if refname != "refs/heads/master":
+ die("pushing to a branch other than master is restricted")
+
+ conn = aurweb.db.Connection()
+
+ # Detect and deny non-fast-forwards.
+ if sha1_old != "0" * 40 and not privileged:
+ walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL)
+ walker.hide(sha1_new)
+ if next(walker, None) is not None:
+ die("denying non-fast-forward (you should pull first)")
+
+ # Prepare the walker that validates new commits.
+ walker = repo.walk(sha1_new, pygit2.GIT_SORT_TOPOLOGICAL)
+ if sha1_old != "0" * 40:
+ walker.hide(sha1_old)
+
+ # Validate all new commits.
+ for commit in walker:
+ for fname in ('.SRCINFO', 'PKGBUILD'):
+ if fname not in commit.tree:
+ die_commit("missing {:s}".format(fname), str(commit.id))
+
+ for treeobj in commit.tree:
+ blob = repo[treeobj.id]
+
+ if isinstance(blob, pygit2.Tree):
+ die_commit("the repository must not contain subdirectories",
+ str(commit.id))
+
+ if not isinstance(blob, pygit2.Blob):
+ die_commit("not a blob object: {:s}".format(treeobj),
+ str(commit.id))
+
+ if blob.size > max_blob_size:
+ die_commit("maximum blob size ({:s}) exceeded".format(
+ size_humanize(max_blob_size)), str(commit.id))
+
+ metadata_raw = repo[commit.tree['.SRCINFO'].id].data.decode()
+ (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw)
+ if errors:
+ sys.stderr.write("error: The following errors occurred "
+ "when parsing .SRCINFO in commit\n")
+ sys.stderr.write("error: {:s}:\n".format(str(commit.id)))
+ for error in errors:
+ for err in error['error']:
+ sys.stderr.write("error: line {:d}: {:s}\n".format(
+ error['line'], err))
+ exit(1)
+
+ metadata_pkgbase = metadata['pkgbase']
+ if not re.match(repo_regex, metadata_pkgbase):
+ die_commit('invalid pkgbase: {:s}'.format(metadata_pkgbase),
+ str(commit.id))
+
+ for pkgname in set(metadata['packages'].keys()):
+ pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
+
+ for field in ('pkgver', 'pkgrel', 'pkgname'):
+ if field not in pkginfo:
+ die_commit('missing mandatory field: {:s}'.format(field),
+ str(commit.id))
+
+ if 'epoch' in pkginfo and not pkginfo['epoch'].isdigit():
+ die_commit('invalid epoch: {:s}'.format(pkginfo['epoch']),
+ str(commit.id))
+
+ if not re.match(r'[a-z0-9][a-z0-9\.+_-]*$', pkginfo['pkgname']):
+ die_commit('invalid package name: {:s}'.format(
+ pkginfo['pkgname']), str(commit.id))
+
+ max_len = {'pkgname': 255, 'pkgdesc': 255, 'url': 8000}
+ for field in max_len.keys():
+ if field in pkginfo and len(pkginfo[field]) > max_len[field]:
+ die_commit('{:s} field too long: {:s}'.format(field,
+ pkginfo[field]), str(commit.id))
+
+ for field in ('install', 'changelog'):
+ if field in pkginfo and not pkginfo[field] in commit.tree:
+ die_commit('missing {:s} file: {:s}'.format(field,
+ pkginfo[field]), str(commit.id))
+
+ for field in extract_arch_fields(pkginfo, 'source'):
+ fname = field['value']
+ if len(fname) > 8000:
+ die_commit('source entry too long: {:s}'.format(fname),
+ str(commit.id))
+ if "://" in fname or "lp:" in fname:
+ continue
+ if fname not in commit.tree:
+ die_commit('missing source file: {:s}'.format(fname),
+ str(commit.id))
+
+ # Display a warning if .SRCINFO is unchanged.
+ if sha1_old not in ("0000000000000000000000000000000000000000", sha1_new):
+ srcinfo_id_old = repo[sha1_old].tree['.SRCINFO'].id
+ srcinfo_id_new = repo[sha1_new].tree['.SRCINFO'].id
+ if srcinfo_id_old == srcinfo_id_new:
+ warn(".SRCINFO unchanged. "
+ "The package database will not be updated!")
+
+ # Read .SRCINFO from the HEAD commit.
+ metadata_raw = repo[repo[sha1_new].tree['.SRCINFO'].id].data.decode()
+ (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw)
+
+ # Ensure that the package base name matches the repository name.
+ metadata_pkgbase = metadata['pkgbase']
+ if metadata_pkgbase != pkgbase:
+ die('invalid pkgbase: {:s}, expected {:s}'.format(metadata_pkgbase,
+ pkgbase))
+
+ # Ensure that packages are neither blacklisted nor overwritten.
+ pkgbase = metadata['pkgbase']
+ cur = conn.execute("SELECT ID FROM PackageBases WHERE Name = ?", [pkgbase])
+ row = cur.fetchone()
+ pkgbase_id = row[0] if row else 0
+
+ cur = conn.execute("SELECT Name FROM PackageBlacklist")
+ blacklist = [row[0] for row in cur.fetchall()]
+
+ cur = conn.execute("SELECT Name, Repo FROM OfficialProviders")
+ providers = dict(cur.fetchall())
+
+ for pkgname in srcinfo.utils.get_package_names(metadata):
+ pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
+ pkgname = pkginfo['pkgname']
+
+ if pkgname in blacklist:
+ warn_or_die('package is blacklisted: {:s}'.format(pkgname))
+ if pkgname in providers:
+ warn_or_die('package already provided by [{:s}]: {:s}'.format(
+ providers[pkgname], pkgname))
+
+ cur = conn.execute("SELECT COUNT(*) FROM Packages WHERE Name = ? " +
+ "AND PackageBaseID <> ?", [pkgname, pkgbase_id])
+ if cur.fetchone()[0] > 0:
+ die('cannot overwrite package: {:s}'.format(pkgname))
+
+ # Create a new package base if it does not exist yet.
+ if pkgbase_id == 0:
+ pkgbase_id = create_pkgbase(conn, pkgbase, user)
+
+ # Store package base details in the database.
+ save_metadata(metadata, conn, user)
+
+ # Create (or update) a branch with the name of the package base for better
+ # accessibility.
+ branchref = 'refs/heads/' + pkgbase
+ repo.create_reference(branchref, sha1_new, True)
+
+ # Work around a Git bug: The HEAD ref is not updated when using
+ # gitnamespaces. This can be removed once the bug fix is included in Git
+ # mainline. See
+ # http://git.661346.n2.nabble.com/PATCH-receive-pack-Create-a-HEAD-ref-for-ref-namespace-td7632149.html
+ # for details.
+ headref = 'refs/namespaces/' + pkgbase + '/HEAD'
+ repo.create_reference(headref, sha1_new, True)
+
+ # Send package update notifications.
+ update_notify(conn, user, pkgbase_id)
+
+ # Close the database.
+ cur.close()
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/__init__.py b/aurweb/scripts/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/aurweb/scripts/__init__.py
diff --git a/aurweb/scripts/aurblup.py b/aurweb/scripts/aurblup.py
new file mode 100755
index 0000000..1b6de2f
--- /dev/null
+++ b/aurweb/scripts/aurblup.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python3
+
+import pyalpm
+import re
+
+import aurweb.config
+import aurweb.db
+
+db_path = aurweb.config.get('aurblup', 'db-path')
+sync_dbs = aurweb.config.get('aurblup', 'sync-dbs').split(' ')
+server = aurweb.config.get('aurblup', 'server')
+
+
+def main():
+ blacklist = set()
+ providers = set()
+ repomap = dict()
+
+ h = pyalpm.Handle("/", db_path)
+ for sync_db in sync_dbs:
+ repo = h.register_syncdb(sync_db, pyalpm.SIG_DATABASE_OPTIONAL)
+ repo.servers = [server.replace("%s", sync_db)]
+ t = h.init_transaction()
+ repo.update(False)
+ t.release()
+
+ for pkg in repo.pkgcache:
+ blacklist.add(pkg.name)
+ [blacklist.add(x) for x in pkg.replaces]
+ providers.add((pkg.name, pkg.name))
+ repomap[(pkg.name, pkg.name)] = repo.name
+ for provision in pkg.provides:
+ provisionname = re.sub(r'(<|=|>).*', '', provision)
+ providers.add((pkg.name, provisionname))
+ repomap[(pkg.name, provisionname)] = repo.name
+
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT Name, Provides FROM OfficialProviders")
+ oldproviders = set(cur.fetchall())
+
+ for pkg, provides in providers.difference(oldproviders):
+ repo = repomap[(pkg, provides)]
+ conn.execute("INSERT INTO OfficialProviders (Name, Repo, Provides) "
+ "VALUES (?, ?, ?)", [pkg, repo, provides])
+ for pkg, provides in oldproviders.difference(providers):
+ conn.execute("DELETE FROM OfficialProviders "
+ "WHERE Name = ? AND Provides = ?", [pkg, provides])
+
+ conn.commit()
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/mkpkglists.py b/aurweb/scripts/mkpkglists.py
new file mode 100755
index 0000000..8a0f2e9
--- /dev/null
+++ b/aurweb/scripts/mkpkglists.py
@@ -0,0 +1,38 @@
+#!/usr/bin/python3
+
+import datetime
+import gzip
+
+import aurweb.config
+import aurweb.db
+
+packagesfile = aurweb.config.get('mkpkglists', 'packagesfile')
+pkgbasefile = aurweb.config.get('mkpkglists', 'pkgbasefile')
+
+
+def main():
+ conn = aurweb.db.Connection()
+
+ datestr = datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT")
+ pkglist_header = "# AUR package list, generated on " + datestr
+ pkgbaselist_header = "# AUR package base list, generated on " + datestr
+
+ with gzip.open(packagesfile, "w") as f:
+ f.write(bytes(pkglist_header + "\n", "UTF-8"))
+ cur = conn.execute("SELECT Packages.Name FROM Packages " +
+ "INNER JOIN PackageBases " +
+ "ON PackageBases.ID = Packages.PackageBaseID " +
+ "WHERE PackageBases.PackagerUID IS NOT NULL")
+ f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()])
+
+ with gzip.open(pkgbasefile, "w") as f:
+ f.write(bytes(pkgbaselist_header + "\n", "UTF-8"))
+ cur = conn.execute("SELECT Name FROM PackageBases " +
+ "WHERE PackagerUID IS NOT NULL")
+ f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()])
+
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/notify.py b/aurweb/scripts/notify.py
new file mode 100755
index 0000000..ddd6e49
--- /dev/null
+++ b/aurweb/scripts/notify.py
@@ -0,0 +1,455 @@
+#!/usr/bin/python3
+
+import email.mime.text
+import subprocess
+import sys
+import textwrap
+
+import aurweb.config
+import aurweb.db
+
+aur_location = aurweb.config.get('options', 'aur_location')
+aur_request_ml = aurweb.config.get('options', 'aur_request_ml')
+
+sendmail = aurweb.config.get('notifications', 'sendmail')
+sender = aurweb.config.get('notifications', 'sender')
+reply_to = aurweb.config.get('notifications', 'reply-to')
+
+
+def headers_cc(cclist):
+ return {'Cc': str.join(', ', cclist)}
+
+
+def headers_msgid(thread_id):
+ return {'Message-ID': thread_id}
+
+
+def headers_reply(thread_id):
+ return {'In-Reply-To': thread_id, 'References': thread_id}
+
+
+def send_notification(to, subject, body, refs, headers={}):
+ wrapped = ''
+ for line in body.splitlines():
+ wrapped += textwrap.fill(line, break_long_words=False) + '\n'
+ if refs:
+ body = wrapped + '\n' + refs
+ else:
+ body = wrapped
+
+ for recipient in to:
+ msg = email.mime.text.MIMEText(body, 'plain', 'utf-8')
+ msg['Subject'] = subject
+ msg['From'] = sender
+ msg['Reply-to'] = reply_to
+ msg['To'] = recipient
+
+ for key, value in headers.items():
+ msg[key] = value
+
+ p = subprocess.Popen([sendmail, '-t', '-oi'], stdin=subprocess.PIPE)
+ p.communicate(msg.as_bytes())
+
+
+def username_from_id(conn, uid):
+ cur = conn.execute('SELECT UserName FROM Users WHERE ID = ?', [uid])
+ return cur.fetchone()[0]
+
+
+def pkgbase_from_id(conn, pkgbase_id):
+ cur = conn.execute('SELECT Name FROM PackageBases WHERE ID = ?',
+ [pkgbase_id])
+ return cur.fetchone()[0]
+
+
+def pkgbase_from_pkgreq(conn, reqid):
+ cur = conn.execute('SELECT PackageBaseID FROM PackageRequests ' +
+ 'WHERE ID = ?', [reqid])
+ return cur.fetchone()[0]
+
+
+def get_user_email(conn, uid):
+ cur = conn.execute('SELECT Email FROM Users WHERE ID = ?', [uid])
+ return cur.fetchone()[0]
+
+
+def get_maintainer_email(conn, pkgbase_id):
+ cur = conn.execute('SELECT Users.Email FROM Users ' +
+ 'INNER JOIN PackageBases ' +
+ 'ON PackageBases.MaintainerUID = Users.ID WHERE ' +
+ 'PackageBases.ID = ?', [pkgbase_id])
+ return cur.fetchone()[0]
+
+
+def get_recipients(conn, pkgbase_id, uid):
+ cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'PackageNotifications.UserID != ? AND ' +
+ 'PackageNotifications.PackageBaseID = ?',
+ [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_comment_recipients(conn, pkgbase_id, uid):
+ cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'Users.CommentNotify = 1 AND ' +
+ 'PackageNotifications.UserID != ? AND ' +
+ 'PackageNotifications.PackageBaseID = ?',
+ [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_update_recipients(conn, pkgbase_id, uid):
+ cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'Users.UpdateNotify = 1 AND ' +
+ 'PackageNotifications.UserID != ? AND ' +
+ 'PackageNotifications.PackageBaseID = ?',
+ [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_ownership_recipients(conn, pkgbase_id, uid):
+ cur = conn.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'Users.OwnershipNotify = 1 AND ' +
+ 'PackageNotifications.UserID != ? AND ' +
+ 'PackageNotifications.PackageBaseID = ?',
+ [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_request_recipients(conn, reqid):
+ cur = conn.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' +
+ 'INNER JOIN PackageBases ' +
+ 'ON PackageBases.ID = PackageRequests.PackageBaseID ' +
+ 'INNER JOIN Users ' +
+ 'ON Users.ID = PackageRequests.UsersID ' +
+ 'OR Users.ID = PackageBases.MaintainerUID ' +
+ 'WHERE PackageRequests.ID = ?', [reqid])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_tu_vote_reminder_recipients(conn, vote_id):
+ cur = conn.execute('SELECT Users.Email FROM Users ' +
+ 'WHERE AccountTypeID = 2 ' +
+ 'EXCEPT SELECT Users.Email FROM Users ' +
+ 'INNER JOIN TU_Votes ' +
+ 'ON TU_Votes.UserID = Users.ID ' +
+ 'WHERE TU_Votes.VoteID = ?', [vote_id])
+ return [row[0] for row in cur.fetchall()]
+
+
+def get_comment(conn, comment_id):
+ cur = conn.execute('SELECT Comments FROM PackageComments WHERE ID = ?',
+ [comment_id])
+ return cur.fetchone()[0]
+
+
+def get_flagger_comment(conn, pkgbase_id):
+ cur = conn.execute('SELECT FlaggerComment FROM PackageBases WHERE ID = ?',
+ [pkgbase_id])
+ return cur.fetchone()[0]
+
+
+def get_request_comment(conn, reqid):
+ cur = conn.execute('SELECT Comments FROM PackageRequests WHERE ID = ?',
+ [reqid])
+ return cur.fetchone()[0]
+
+
+def get_request_closure_comment(conn, reqid):
+ cur = conn.execute('SELECT ClosureComment FROM PackageRequests ' +
+ 'WHERE ID = ?', [reqid])
+ return cur.fetchone()[0]
+
+
+def send_resetkey(conn, uid):
+ cur = conn.execute('SELECT UserName, Email, ResetKey FROM Users ' +
+ 'WHERE ID = ?', [uid])
+ username, to, resetkey = cur.fetchone()
+
+ subject = 'AUR Password Reset'
+ body = 'A password reset request was submitted for the account %s ' \
+ 'associated with your email address. If you wish to reset your ' \
+ 'password follow the link [1] below, otherwise ignore this ' \
+ 'message and nothing will happen.' % (username)
+ refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey
+
+ send_notification([to], subject, body, refs)
+
+
+def welcome(conn, uid):
+ cur = conn.execute('SELECT UserName, Email, ResetKey FROM Users ' +
+ 'WHERE ID = ?', [uid])
+ username, to, resetkey = cur.fetchone()
+
+ subject = 'Welcome to the Arch User Repository'
+ body = 'Welcome to the Arch User Repository! In order to set an initial ' \
+ 'password for your new account, please click the link [1] below. ' \
+ 'If the link does not work, try copying and pasting it into your ' \
+ 'browser.'
+ refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey
+
+ send_notification([to], subject, body, refs)
+
+
+def comment(conn, uid, pkgbase_id, comment_id):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = get_comment_recipients(conn, pkgbase_id, uid)
+ text = get_comment(conn, comment_id)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Comment for %s' % (pkgbase)
+ body = '%s [1] added the following comment to %s [2]:' % (user, pkgbase)
+ body += '\n\n' + text + '\n\n'
+ body += 'If you no longer wish to receive notifications about this ' \
+ 'package, please go to the package page [2] and select "%s".' % \
+ ('Disable notifications')
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri
+ thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>'
+ headers = headers_reply(thread_id)
+
+ send_notification(to, subject, body, refs, headers)
+
+
+def update(conn, uid, pkgbase_id):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = get_update_recipients(conn, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Package Update: %s' % (pkgbase)
+ body = '%s [1] pushed a new commit to %s [2].' % (user, pkgbase)
+ body += '\n\n'
+ body += 'If you no longer wish to receive notifications about this ' \
+ 'package, please go to the package page [2] and select "%s".' % \
+ ('Disable notifications')
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri
+ thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>'
+ headers = headers_reply(thread_id)
+
+ send_notification(to, subject, body, refs, headers)
+
+
+def flag(conn, uid, pkgbase_id):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = [get_maintainer_email(conn, pkgbase_id)]
+ text = get_flagger_comment(conn, pkgbase_id)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Out-of-date Notification for %s' % (pkgbase)
+ body = 'Your package %s [1] has been flagged out-of-date by %s [2]:' % \
+ (pkgbase, user)
+ body += '\n\n' + text
+ refs = '[1] ' + pkgbase_uri + '\n'
+ refs += '[2] ' + user_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def adopt(conn, pkgbase_id, uid):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = get_ownership_recipients(conn, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Ownership Notification for %s' % (pkgbase)
+ body = 'The package %s [1] was adopted by %s [2].' % (pkgbase, user)
+ refs = '[1] ' + pkgbase_uri + '\n'
+ refs += '[2] ' + user_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def disown(conn, pkgbase_id, uid):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = get_ownership_recipients(conn, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Ownership Notification for %s' % (pkgbase)
+ body = 'The package %s [1] was disowned by %s [2].' % (pkgbase, user)
+ refs = '[1] ' + pkgbase_uri + '\n'
+ refs += '[2] ' + user_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def comaintainer_add(conn, pkgbase_id, uid):
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = [get_user_email(conn, uid)]
+
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase)
+ body = 'You were added to the co-maintainer list of %s [1].' % (pkgbase)
+ refs = '[1] ' + pkgbase_uri + '\n'
+
+ send_notification(to, subject, body, refs)
+
+
+def comaintainer_remove(conn, pkgbase_id, uid):
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = [get_user_email(conn, uid)]
+
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase)
+ body = ('You were removed from the co-maintainer list of %s [1].' %
+ (pkgbase))
+ refs = '[1] ' + pkgbase_uri + '\n'
+
+ send_notification(to, subject, body, refs)
+
+
+def delete(conn, uid, old_pkgbase_id, new_pkgbase_id=None):
+ user = username_from_id(conn, uid)
+ old_pkgbase = pkgbase_from_id(conn, old_pkgbase_id)
+ if new_pkgbase_id:
+ new_pkgbase = pkgbase_from_id(conn, new_pkgbase_id)
+ to = get_recipients(conn, old_pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + old_pkgbase + '/'
+
+ subject = 'AUR Package deleted: %s' % (old_pkgbase)
+ if new_pkgbase_id:
+ new_pkgbase_uri = aur_location + '/pkgbase/' + new_pkgbase + '/'
+ body = '%s [1] merged %s [2] into %s [3].\n\n' \
+ 'If you no longer wish receive notifications about the new ' \
+ 'package, please go to [3] and click "%s".' %\
+ (user, old_pkgbase, new_pkgbase, 'Disable notifications')
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri + '\n'
+ refs += '[3] ' + new_pkgbase_uri
+ else:
+ body = '%s [1] deleted %s [2].\n\n' \
+ 'You will no longer receive notifications about this ' \
+ 'package.' % (user, old_pkgbase)
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def request_open(conn, uid, reqid, reqtype, pkgbase_id, merge_into=None):
+ user = username_from_id(conn, uid)
+ pkgbase = pkgbase_from_id(conn, pkgbase_id)
+ to = [aur_request_ml]
+ cc = get_request_recipients(conn, reqid)
+ text = get_request_comment(conn, reqid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = '[PRQ#%d] %s Request for %s' % \
+ (int(reqid), reqtype.title(), pkgbase)
+ if merge_into:
+ merge_into_uri = aur_location + '/pkgbase/' + merge_into + '/'
+ body = '%s [1] filed a request to merge %s [2] into %s [3]:' % \
+ (user, pkgbase, merge_into)
+ body += '\n\n' + text
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri + '\n'
+ refs += '[3] ' + merge_into_uri
+ else:
+ body = '%s [1] filed a %s request for %s [2]:' % \
+ (user, reqtype, pkgbase)
+ body += '\n\n' + text
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri + '\n'
+ thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>'
+ # Use a deterministic Message-ID for the first email referencing a request.
+ headers = headers_msgid(thread_id)
+ headers.update(headers_cc(cc))
+
+ send_notification(to, subject, body, refs, headers)
+
+
+def request_close(conn, uid, reqid, reason):
+ to = [aur_request_ml]
+ cc = get_request_recipients(conn, reqid)
+ text = get_request_closure_comment(conn, reqid)
+
+ subject = '[PRQ#%d] Request %s' % (int(reqid), reason.title())
+ if int(uid):
+ user = username_from_id(conn, uid)
+ user_uri = aur_location + '/account/' + user + '/'
+ body = 'Request #%d has been %s by %s [1]' % (int(reqid), reason, user)
+ refs = '[1] ' + user_uri
+ else:
+ body = 'Request #%d has been %s automatically by the Arch User ' \
+ 'Repository package request system' % (int(reqid), reason)
+ refs = None
+ if text.strip() == '':
+ body += '.'
+ else:
+ body += ':\n\n' + text
+ thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>'
+ headers = headers_reply(thread_id)
+ headers.update(headers_cc(cc))
+
+ send_notification(to, subject, body, refs, headers)
+
+
+def tu_vote_reminder(conn, vote_id):
+ to = get_tu_vote_reminder_recipients(conn, vote_id)
+
+ vote_uri = aur_location + '/tu/?id=' + vote_id
+
+ subject = 'TU Vote Reminder: Proposal %d' % (int(vote_id))
+ body = 'Please remember to cast your vote on proposal %d [1]. ' \
+ 'The voting period ends in less than 48 hours.' % (int(vote_id))
+ refs = '[1] ' + vote_uri
+
+ send_notification(to, subject, body, refs)
+
+
+def main():
+ action = sys.argv[1]
+ action_map = {
+ 'send-resetkey': send_resetkey,
+ 'welcome': welcome,
+ 'comment': comment,
+ 'update': update,
+ 'flag': flag,
+ 'adopt': adopt,
+ 'disown': disown,
+ 'comaintainer-add': comaintainer_add,
+ 'comaintainer-remove': comaintainer_remove,
+ 'delete': delete,
+ 'request-open': request_open,
+ 'request-close': request_close,
+ 'tu-vote-reminder': tu_vote_reminder,
+ }
+
+ conn = aurweb.db.Connection()
+
+ action_map[action](conn, *sys.argv[2:])
+
+ conn.commit()
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/pkgmaint.py b/aurweb/scripts/pkgmaint.py
new file mode 100755
index 0000000..3ad9ed8
--- /dev/null
+++ b/aurweb/scripts/pkgmaint.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python3
+
+import time
+
+import aurweb.db
+
+
+def main():
+ conn = aurweb.db.Connection()
+
+ limit_to = int(time.time()) - 86400
+ conn.execute("DELETE FROM PackageBases WHERE " +
+ "SubmittedTS < ? AND PackagerUID IS NULL", [limit_to])
+
+ conn.commit()
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/popupdate.py b/aurweb/scripts/popupdate.py
new file mode 100755
index 0000000..58cd018
--- /dev/null
+++ b/aurweb/scripts/popupdate.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python3
+
+import time
+
+import aurweb.db
+
+
+def main():
+ conn = aurweb.db.Connection()
+
+ conn.execute("UPDATE PackageBases SET NumVotes = (" +
+ "SELECT COUNT(*) FROM PackageVotes " +
+ "WHERE PackageVotes.PackageBaseID = PackageBases.ID)")
+
+ now = int(time.time())
+ conn.execute("UPDATE PackageBases SET Popularity = (" +
+ "SELECT COALESCE(SUM(POWER(0.98, (? - VoteTS) / 86400)), 0.0) " +
+ "FROM PackageVotes WHERE PackageVotes.PackageBaseID = " +
+ "PackageBases.ID AND NOT VoteTS IS NULL)", [now])
+
+ conn.commit()
+ conn.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/aurweb/scripts/tuvotereminder.py b/aurweb/scripts/tuvotereminder.py
new file mode 100755
index 0000000..97b1d12
--- /dev/null
+++ b/aurweb/scripts/tuvotereminder.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python3
+
+import subprocess
+import time
+
+import aurweb.config
+import aurweb.db
+
+notify_cmd = aurweb.config.get('notifications', 'notify-cmd')
+
+
+def main():
+ conn = aurweb.db.Connection()
+
+ now = int(time.time())
+ filter_from = now + 500
+ filter_to = now + 172800
+
+ cur = conn.execute("SELECT ID FROM TU_VoteInfo " +
+ "WHERE End >= ? AND End <= ?",
+ [filter_from, filter_to])
+
+ for vote_id in [row[0] for row in cur.fetchall()]:
+ subprocess.Popen((notify_cmd, 'tu-vote-reminder', str(vote_id))).wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/conf/config.proto b/conf/config.proto
index 64af774..96fad80 100644
--- a/conf/config.proto
+++ b/conf/config.proto
@@ -1,5 +1,5 @@
[database]
-dsn_prefix = mysql
+backend = mysql
host = localhost
socket = /var/run/mysqld/mysqld.sock
name = AUR
@@ -46,17 +46,24 @@ RSA = SHA256:Ju+yWiMb/2O+gKQ9RJCDqvRg7l+Q95KFAeqM5sr6l2s
[auth]
valid-keytypes = ssh-rsa ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519
username-regex = [a-zA-Z0-9]+[.\-_]?[a-zA-Z0-9]+$
-git-serve-cmd = /srv/http/aurweb/git-interface/git-serve.py
-ssh-options = no-port-forwarding,no-X11-forwarding,no-pty
+git-serve-cmd = /usr/local/bin/aurweb-git-serve
+ssh-options = restrict
[serve]
repo-path = /srv/http/aurweb/aur.git/
repo-regex = [a-z0-9][a-z0-9.+_-]*$
git-shell-cmd = /usr/bin/git-shell
-git-update-cmd = /srv/http/aurweb/git-interface/git-update.py
+git-update-cmd = /usr/local/bin/aurweb-git-update
ssh-cmdline = ssh aur@aur.archlinux.org
+[update]
+max-blob-size = 256000
+
[aurblup]
db-path = /srv/http/aurweb/aurblup/
sync-dbs = core extra community multilib testing community-testing
-servers = ftp://mirrors.kernel.org/archlinux/%s/os/x86_64
+server = ftp://mirrors.kernel.org/archlinux/%s/os/x86_64
+
+[mkpkglists]
+packagesfile = /srv/http/aurweb/web/html/packages.gz
+pkgbasefile = /srv/http/aurweb/web/html/pkgbase.gz
diff --git a/doc/git-interface.txt b/doc/git-interface.txt
index 4a24eef..14ff0c5 100644
--- a/doc/git-interface.txt
+++ b/doc/git-interface.txt
@@ -22,15 +22,15 @@ Authentication: git-auth
Pushing to package repositories is possible via SSH. In order to access the SSH
interface, users first need to add an SSH public key to their account using the
web interface. Authentication is performed by the git-auth
-AuthorizedKeysCommand script (see sshd_config(5) for details) that looks up the
-public key in the AUR user table. Using this concept of "virtual users", there
-is no need to create separate UNIX accounts for each registered AUR user.
+AuthorizedKeysCommand script (see sshd_config(5) for details) which looks up
+the public key in the AUR user table. Using this concept of "virtual users",
+there is no need to create separate UNIX accounts for each registered AUR user.
If the public key is found, the corresponding authorized_keys line is printed
to stdout. If the public key does not exist, the login is denied. The
authorized_keys line also contains a forced command such that authenticated
users cannot access anything on the server except for the aurweb SSH interface.
-The forced command can be configured in the aurweb configuration file and
+The forced command can be configured in the aurweb configuration file and it
usually points to the git-serve program.
The INSTALL file in the top-level directory contains detailed instructions on
@@ -43,17 +43,18 @@ The git-serve command, the "aurweb shell", provides different subcommands:
* The help command shows a list of available commands.
* The list-repos command lists all repositories of the authenticated user.
+* The set-keywords command modifies the keywords assigned to a package base.
* The setup-repo command can be used to create a new repository.
* The restore command can be used to restore a deleted package base.
* The git-{receive,upload}-pack commands are redirected to git-shell(1).
-The requested command is extracted from the SSH_ORIGINAL_COMMAND environment
-variable which is usually set by the SSH daemon. If no command is specified,
-git-serve displays a message that aurweb does not provide an interactive shell.
+The command is extracted from the SSH_ORIGINAL_COMMAND environment variable
+which is usually set by the SSH daemon. If no command is specified, git-serve
+displays a message stating that aurweb does not provide an interactive shell.
When invoking git-shell(1), the git-serve command also redirects all paths to
the shared Git repository and sets up the GIT_NAMESPACE environment variable
-such that Git updates the right namespaced branch.
+such that Git updates the correct namespaced branch.
The Update Hook: git-update
---------------------------
@@ -62,7 +63,7 @@ The Git update hook, called git-update, performs several subtasks:
* Prevent from creating branches or tags other than master.
* Deny non-fast-forwards, except for Trusted Users and Developers.
-* Check each new commit (validate meta data, impose file size limits, ...)
+* Verify each new commit (validate meta data, impose file size limits, ...)
* Update package base information and package information in the database.
* Update the named branch and the namespaced HEAD ref of the package.
@@ -74,9 +75,8 @@ Accessing Git repositories via HTTP
Git repositories can also be accessed via HTTP by configuring the web server to
forward specific requests to git-http-backend(1). Note that, since Git
-namespaces are used internally, the web server also needs to rewrite URIs and
-setup the GIT_NAMESPACE environment variable accordingly before forwarding a
-request.
+namespaces are used internally, the web server needs to rewrite URIs and setup
+the GIT_NAMESPACE environment variable accordingly before forwarding a request.
An example configuration for nginx and fcgiwrap can be found in the INSTALL
instructions in the top-level directory.
@@ -86,10 +86,11 @@ Further Configuration
When using Git namespaces, Git advertises refs outside the current namespace as
so-called "have" lines. This is normally used to reduce traffic but it has the
-opposite effect in the case of aurweb: Many essentially useless lines are
-transferred to the Git client during `git push` operations.
-
-In order to omit these advertisements, add the strings "^refs/" and "!refs/" to
-the transfer.hideRefs configuration setting. Note that the order of these
-patterns is important ("^refs/" must come first) and that Git 2.7 or newer is
-required for them to work.
+opposite effect in the case of aurweb: Most of the refs transferred to the
+client during `git push` operations belong to branches of other package bases
+and are essentially useless.
+
+In order to omit these advertisements, one can add the strings "^refs/",
+"!refs/" and "!HEAD" to the transfer.hideRefs configuration setting. Note that
+the order of these patterns is important ("^refs/" must come first) and that
+Git 2.7 or newer is required for them to work.
diff --git a/doc/i18n.txt b/doc/i18n.txt
index d5b6764..a1c21fe 100644
--- a/doc/i18n.txt
+++ b/doc/i18n.txt
@@ -21,7 +21,7 @@ strings for the translation to be usable, and it may have to be disabled.
1. Check out the aurweb source using git:
-$ git clone git://projects.archlinux.org/aurweb.git aurweb-git
+$ git clone git://git.archlinux.org/aurweb.git aurweb-git
2. Go into the "po/" directory in the aurweb source and run msginit(1) to
create a initial translation file from our translation catalog:
diff --git a/git-interface/Makefile b/git-interface/Makefile
deleted file mode 100644
index 8865790..0000000
--- a/git-interface/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-GIT_INTERFACE_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
-
-include config.mk
-
-git-auth.sh:
- sed 's#%GIT_INTERFACE_DIR%#$(GIT_INTERFACE_DIR)#' <git-auth.sh.in >git-auth.sh
- chmod +x git-auth.sh
-
-install: git-auth.sh
- install -Dm0755 git-auth.sh "$(DESTDIR)$(PREFIX)/bin/aur-git-auth"
-
-uninstall:
- rm -f "$(DESTDIR)$(PREFIX)/bin/aur-git-auth"
-
-clean:
- rm -f git-auth.sh
-
-.PHONY: install uninstall clean
diff --git a/git-interface/config.mk b/git-interface/config.mk
deleted file mode 100644
index 4d794a1..0000000
--- a/git-interface/config.mk
+++ /dev/null
@@ -1 +0,0 @@
-PREFIX = /usr/local
diff --git a/git-interface/git-auth.py b/git-interface/git-auth.py
deleted file mode 100755
index 83bd20c..0000000
--- a/git-interface/git-auth.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import shlex
-import os
-import re
-import sys
-
-
-def format_command(env_vars, command, ssh_opts, ssh_key):
- environment = ''
- for key, var in env_vars.items():
- environment += '{}={} '.format(key, shlex.quote(var))
-
- command = shlex.quote(command)
- command = '{}{}'.format(environment, command)
-
- # The command is being substituted into an authorized_keys line below,
- # so we need to escape the double quotes.
- command = command.replace('"', '\\"')
- msg = 'command="{}",{} {}'.format(command, ssh_opts, ssh_key)
- return msg
-
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-valid_keytypes = config.get('auth', 'valid-keytypes').split()
-username_regex = config.get('auth', 'username-regex')
-git_serve_cmd = config.get('auth', 'git-serve-cmd')
-ssh_opts = config.get('auth', 'ssh-options')
-
-keytype = sys.argv[1]
-keytext = sys.argv[2]
-if keytype not in valid_keytypes:
- exit(1)
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-
-cur = db.cursor()
-cur.execute("SELECT Users.Username, Users.AccountTypeID FROM Users " +
- "INNER JOIN SSHPubKeys ON SSHPubKeys.UserID = Users.ID "
- "WHERE SSHPubKeys.PubKey = %s AND Users.Suspended = 0",
- (keytype + " " + keytext,))
-
-if cur.rowcount != 1:
- exit(1)
-
-user, account_type = cur.fetchone()
-if not re.match(username_regex, user):
- exit(1)
-
-
-env_vars = {
- 'AUR_USER': user,
- 'AUR_PRIVILEGED': '1' if account_type > 1 else '0',
-}
-key = keytype + ' ' + keytext
-
-print(format_command(env_vars, git_serve_cmd, ssh_opts, key))
diff --git a/git-interface/git-auth.sh.in b/git-interface/git-auth.sh.in
deleted file mode 100644
index 223816a..0000000
--- a/git-interface/git-auth.sh.in
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-%GIT_INTERFACE_DIR%/git-auth.py "$1" "$2"
diff --git a/git-interface/git-serve.py b/git-interface/git-serve.py
deleted file mode 100755
index 35c6b3a..0000000
--- a/git-interface/git-serve.py
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import os
-import re
-import shlex
-import sys
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-repo_path = config.get('serve', 'repo-path')
-repo_regex = config.get('serve', 'repo-regex')
-git_shell_cmd = config.get('serve', 'git-shell-cmd')
-git_update_cmd = config.get('serve', 'git-update-cmd')
-ssh_cmdline = config.get('serve', 'ssh-cmdline')
-
-enable_maintenance = config.getboolean('options', 'enable-maintenance')
-maintenance_exc = config.get('options', 'maintenance-exceptions').split()
-
-
-def pkgbase_from_name(pkgbase):
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket)
- cur = db.cursor()
- cur.execute("SELECT ID FROM PackageBases WHERE Name = %s", [pkgbase])
- db.close()
-
- row = cur.fetchone()
- return row[0] if row else None
-
-
-def pkgbase_exists(pkgbase):
- return pkgbase_from_name(pkgbase) is not None
-
-
-def list_repos(user):
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket)
- cur = db.cursor()
-
- cur.execute("SELECT ID FROM Users WHERE Username = %s ", [user])
- userid = cur.fetchone()[0]
- if userid == 0:
- die('{:s}: unknown user: {:s}'.format(action, user))
-
- cur.execute("SELECT Name, PackagerUID FROM PackageBases " +
- "WHERE MaintainerUID = %s ", [userid])
- for row in cur:
- print((' ' if row[1] else '*') + row[0])
- db.close()
-
-
-def create_pkgbase(pkgbase, user):
- if not re.match(repo_regex, pkgbase):
- die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
- if pkgbase_exists(pkgbase):
- die('{:s}: package base already exists: {:s}'.format(action, pkgbase))
-
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket)
- cur = db.cursor()
-
- cur.execute("SELECT ID FROM Users WHERE Username = %s ", [user])
- userid = cur.fetchone()[0]
- if userid == 0:
- die('{:s}: unknown user: {:s}'.format(action, user))
-
- cur.execute("INSERT INTO PackageBases (Name, SubmittedTS, ModifiedTS, " +
- "SubmitterUID, MaintainerUID) VALUES (%s, UNIX_TIMESTAMP(), " +
- "UNIX_TIMESTAMP(), %s, %s)", [pkgbase, userid, userid])
- pkgbase_id = cur.lastrowid
-
- cur.execute("INSERT INTO PackageNotifications (PackageBaseID, UserID) " +
- "VALUES (%s, %s)", [pkgbase_id, userid])
-
- db.commit()
- db.close()
-
-
-def pkgbase_set_keywords(pkgbase, keywords):
- pkgbase_id = pkgbase_from_name(pkgbase)
- if not pkgbase_id:
- die('{:s}: package base not found: {:s}'.format(action, pkgbase))
-
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket)
- cur = db.cursor()
-
- cur.execute("DELETE FROM PackageKeywords WHERE PackageBaseID = %s",
- [pkgbase_id])
- for keyword in keywords:
- cur.execute("INSERT INTO PackageKeywords (PackageBaseID, Keyword) "
- "VALUES (%s, %s)", [pkgbase_id, keyword])
-
- db.commit()
- db.close()
-
-
-def check_permissions(pkgbase, user):
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
- cur = db.cursor()
-
- if os.environ.get('AUR_PRIVILEGED', '0') == '1':
- return True
-
- cur.execute("SELECT COUNT(*) FROM PackageBases " +
- "LEFT JOIN PackageComaintainers " +
- "ON PackageComaintainers.PackageBaseID = PackageBases.ID " +
- "INNER JOIN Users ON Users.ID = PackageBases.MaintainerUID " +
- "OR PackageBases.MaintainerUID IS NULL " +
- "OR Users.ID = PackageComaintainers.UsersID " +
- "WHERE Name = %s AND Username = %s", [pkgbase, user])
- return cur.fetchone()[0] > 0
-
-
-def die(msg):
- sys.stderr.write("{:s}\n".format(msg))
- exit(1)
-
-
-def die_with_help(msg):
- die(msg + "\nTry `{:s} help` for a list of commands.".format(ssh_cmdline))
-
-
-user = os.environ.get("AUR_USER")
-cmd = os.environ.get("SSH_ORIGINAL_COMMAND")
-if not cmd:
- die_with_help("Interactive shell is disabled.")
-cmdargv = shlex.split(cmd)
-action = cmdargv[0]
-
-if enable_maintenance:
- remote_addr = os.environ["SSH_CLIENT"].split(" ")[0]
- if remote_addr not in maintenance_exc:
- die("The AUR is down due to maintenance. We will be back soon.")
-
-if action == 'git-upload-pack' or action == 'git-receive-pack':
- if len(cmdargv) < 2:
- die_with_help("{:s}: missing path".format(action))
-
- path = cmdargv[1].rstrip('/')
- if not path.startswith('/'):
- path = '/' + path
- if not path.endswith('.git'):
- path = path + '.git'
- pkgbase = path[1:-4]
- if not re.match(repo_regex, pkgbase):
- die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
-
- if not pkgbase_exists(pkgbase):
- create_pkgbase(pkgbase, user)
-
- if action == 'git-receive-pack':
- if not check_permissions(pkgbase, user):
- die('{:s}: permission denied: {:s}'.format(action, user))
-
- os.environ["AUR_USER"] = user
- os.environ["AUR_PKGBASE"] = pkgbase
- os.environ["GIT_NAMESPACE"] = pkgbase
- cmd = action + " '" + repo_path + "'"
- os.execl(git_shell_cmd, git_shell_cmd, '-c', cmd)
-elif action == 'set-keywords':
- if len(cmdargv) < 2:
- die_with_help("{:s}: missing repository name".format(action))
- pkgbase_set_keywords(cmdargv[1], cmdargv[2:])
-elif action == 'list-repos':
- if len(cmdargv) > 1:
- die_with_help("{:s}: too many arguments".format(action))
- list_repos(user)
-elif action == 'setup-repo':
- if len(cmdargv) < 2:
- die_with_help("{:s}: missing repository name".format(action))
- if len(cmdargv) > 2:
- die_with_help("{:s}: too many arguments".format(action))
- create_pkgbase(cmdargv[1], user)
-elif action == 'restore':
- if len(cmdargv) < 2:
- die_with_help("{:s}: missing repository name".format(action))
- if len(cmdargv) > 2:
- die_with_help("{:s}: too many arguments".format(action))
-
- pkgbase = cmdargv[1]
- if not re.match(repo_regex, pkgbase):
- die('{:s}: invalid repository name: {:s}'.format(action, pkgbase))
-
- if pkgbase_exists(pkgbase):
- die('{:s}: package base exists: {:s}'.format(action, pkgbase))
- create_pkgbase(pkgbase, user)
-
- os.environ["AUR_USER"] = user
- os.environ["AUR_PKGBASE"] = pkgbase
- os.execl(git_update_cmd, git_update_cmd, 'restore')
-elif action == 'help':
- die("Commands:\n" +
- " help Show this help message and exit.\n" +
- " list-repos List all your repositories.\n" +
- " restore <name> Restore a deleted package base.\n" +
- " set-keywords <name> [...] Change package base keywords.\n" +
- " setup-repo <name> Create an empty repository.\n" +
- " git-receive-pack Internal command used with Git.\n" +
- " git-upload-pack Internal command used with Git.")
-else:
- die_with_help("invalid command: {:s}".format(action))
diff --git a/git-interface/git-update.py b/git-interface/git-update.py
deleted file mode 100755
index e54e0e6..0000000
--- a/git-interface/git-update.py
+++ /dev/null
@@ -1,363 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import os
-import pygit2
-import re
-import subprocess
-import sys
-
-import srcinfo.parse
-import srcinfo.utils
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-notify_cmd = config.get('notifications', 'notify-cmd')
-
-repo_path = config.get('serve', 'repo-path')
-repo_regex = config.get('serve', 'repo-regex')
-
-
-def extract_arch_fields(pkginfo, field):
- values = []
-
- if field in pkginfo:
- for val in pkginfo[field]:
- values.append({"value": val, "arch": None})
-
- for arch in ['i686', 'x86_64']:
- if field + '_' + arch in pkginfo:
- for val in pkginfo[field + '_' + arch]:
- values.append({"value": val, "arch": arch})
-
- return values
-
-
-def parse_dep(depstring):
- dep, _, desc = depstring.partition(': ')
- depname = re.sub(r'(<|=|>).*', '', dep)
- depcond = dep[len(depname):]
-
- if (desc):
- return (depname + ': ' + desc, depcond)
- else:
- return (depname, depcond)
-
-
-def save_metadata(metadata, db, cur, user):
- # Obtain package base ID and previous maintainer.
- pkgbase = metadata['pkgbase']
- cur.execute("SELECT ID, MaintainerUID FROM PackageBases "
- "WHERE Name = %s", [pkgbase])
- (pkgbase_id, maintainer_uid) = cur.fetchone()
- was_orphan = not maintainer_uid
-
- # Obtain the user ID of the new maintainer.
- cur.execute("SELECT ID FROM Users WHERE Username = %s", [user])
- user_id = int(cur.fetchone()[0])
-
- # Update package base details and delete current packages.
- cur.execute("UPDATE PackageBases SET ModifiedTS = UNIX_TIMESTAMP(), " +
- "PackagerUID = %s, OutOfDateTS = NULL WHERE ID = %s",
- [user_id, pkgbase_id])
- cur.execute("UPDATE PackageBases SET MaintainerUID = %s " +
- "WHERE ID = %s AND MaintainerUID IS NULL",
- [user_id, pkgbase_id])
- cur.execute("DELETE FROM Packages WHERE PackageBaseID = %s",
- [pkgbase_id])
-
- for pkgname in srcinfo.utils.get_package_names(metadata):
- pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
-
- if 'epoch' in pkginfo and int(pkginfo['epoch']) > 0:
- ver = '{:d}:{:s}-{:s}'.format(int(pkginfo['epoch']),
- pkginfo['pkgver'],
- pkginfo['pkgrel'])
- else:
- ver = '{:s}-{:s}'.format(pkginfo['pkgver'], pkginfo['pkgrel'])
-
- for field in ('pkgdesc', 'url'):
- if field not in pkginfo:
- pkginfo[field] = None
-
- # Create a new package.
- cur.execute("INSERT INTO Packages (PackageBaseID, Name, " +
- "Version, Description, URL) " +
- "VALUES (%s, %s, %s, %s, %s)",
- [pkgbase_id, pkginfo['pkgname'], ver,
- pkginfo['pkgdesc'], pkginfo['url']])
- db.commit()
- pkgid = cur.lastrowid
-
- # Add package sources.
- for source_info in extract_arch_fields(pkginfo, 'source'):
- cur.execute("INSERT INTO PackageSources (PackageID, Source, " +
- "SourceArch) VALUES (%s, %s, %s)",
- [pkgid, source_info['value'], source_info['arch']])
-
- # Add package dependencies.
- for deptype in ('depends', 'makedepends',
- 'checkdepends', 'optdepends'):
- cur.execute("SELECT ID FROM DependencyTypes WHERE Name = %s",
- [deptype])
- deptypeid = cur.fetchone()[0]
- for dep_info in extract_arch_fields(pkginfo, deptype):
- depname, depcond = parse_dep(dep_info['value'])
- deparch = dep_info['arch']
- cur.execute("INSERT INTO PackageDepends (PackageID, " +
- "DepTypeID, DepName, DepCondition, DepArch) " +
- "VALUES (%s, %s, %s, %s, %s)",
- [pkgid, deptypeid, depname, depcond, deparch])
-
- # Add package relations (conflicts, provides, replaces).
- for reltype in ('conflicts', 'provides', 'replaces'):
- cur.execute("SELECT ID FROM RelationTypes WHERE Name = %s",
- [reltype])
- reltypeid = cur.fetchone()[0]
- for rel_info in extract_arch_fields(pkginfo, reltype):
- relname, relcond = parse_dep(rel_info['value'])
- relarch = rel_info['arch']
- cur.execute("INSERT INTO PackageRelations (PackageID, " +
- "RelTypeID, RelName, RelCondition, RelArch) " +
- "VALUES (%s, %s, %s, %s, %s)",
- [pkgid, reltypeid, relname, relcond, relarch])
-
- # Add package licenses.
- if 'license' in pkginfo:
- for license in pkginfo['license']:
- cur.execute("SELECT ID FROM Licenses WHERE Name = %s",
- [license])
- if cur.rowcount == 1:
- licenseid = cur.fetchone()[0]
- else:
- cur.execute("INSERT INTO Licenses (Name) VALUES (%s)",
- [license])
- db.commit()
- licenseid = cur.lastrowid
- cur.execute("INSERT INTO PackageLicenses (PackageID, " +
- "LicenseID) VALUES (%s, %s)",
- [pkgid, licenseid])
-
- # Add package groups.
- if 'groups' in pkginfo:
- for group in pkginfo['groups']:
- cur.execute("SELECT ID FROM Groups WHERE Name = %s",
- [group])
- if cur.rowcount == 1:
- groupid = cur.fetchone()[0]
- else:
- cur.execute("INSERT INTO Groups (Name) VALUES (%s)",
- [group])
- db.commit()
- groupid = cur.lastrowid
- cur.execute("INSERT INTO PackageGroups (PackageID, "
- "GroupID) VALUES (%s, %s)", [pkgid, groupid])
-
- # Add user to notification list on adoption.
- if was_orphan:
- cur.execute("SELECT COUNT(*) FROM PackageNotifications WHERE " +
- "PackageBaseID = %s AND UserID = %s",
- [pkgbase_id, user_id])
- if cur.fetchone()[0] == 0:
- cur.execute("INSERT INTO PackageNotifications (PackageBaseID, UserID) " +
- "VALUES (%s, %s)", [pkgbase_id, user_id])
-
- db.commit()
-
-def update_notify(db, cur, user, pkgbase_id):
- # Obtain the user ID of the new maintainer.
- cur.execute("SELECT ID FROM Users WHERE Username = %s", [user])
- user_id = int(cur.fetchone()[0])
-
- # Execute the notification script.
- subprocess.Popen((notify_cmd, 'update', str(user_id), str(pkgbase_id)))
-
-def die(msg):
- sys.stderr.write("error: {:s}\n".format(msg))
- exit(1)
-
-
-def warn(msg):
- sys.stderr.write("warning: {:s}\n".format(msg))
-
-
-def die_commit(msg, commit):
- sys.stderr.write("error: The following error " +
- "occurred when parsing commit\n")
- sys.stderr.write("error: {:s}:\n".format(commit))
- sys.stderr.write("error: {:s}\n".format(msg))
- exit(1)
-
-
-repo = pygit2.Repository(repo_path)
-
-user = os.environ.get("AUR_USER")
-pkgbase = os.environ.get("AUR_PKGBASE")
-privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1')
-
-if len(sys.argv) == 2 and sys.argv[1] == "restore":
- if 'refs/heads/' + pkgbase not in repo.listall_references():
- die('{:s}: repository not found: {:s}'.format(sys.argv[1], pkgbase))
- refname = "refs/heads/master"
- sha1_old = sha1_new = repo.lookup_reference('refs/heads/' + pkgbase).target
-elif len(sys.argv) == 4:
- refname, sha1_old, sha1_new = sys.argv[1:4]
-else:
- die("invalid arguments")
-
-if refname != "refs/heads/master":
- die("pushing to a branch other than master is restricted")
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-cur = db.cursor()
-
-# Detect and deny non-fast-forwards.
-if sha1_old != "0000000000000000000000000000000000000000":
- walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL)
- walker.hide(sha1_new)
- if next(walker, None) is not None:
- cur.execute("SELECT AccountTypeID FROM Users WHERE UserName = %s ",
- [user])
- if cur.fetchone()[0] == 1:
- die("denying non-fast-forward (you should pull first)")
-
-# Prepare the walker that validates new commits.
-walker = repo.walk(sha1_new, pygit2.GIT_SORT_TOPOLOGICAL)
-if sha1_old != "0000000000000000000000000000000000000000":
- walker.hide(sha1_old)
-
-# Validate all new commits.
-for commit in walker:
- for fname in ('.SRCINFO', 'PKGBUILD'):
- if fname not in commit.tree:
- die_commit("missing {:s}".format(fname), str(commit.id))
-
- for treeobj in commit.tree:
- blob = repo[treeobj.id]
-
- if isinstance(blob, pygit2.Tree):
- die_commit("the repository must not contain subdirectories",
- str(commit.id))
-
- if not isinstance(blob, pygit2.Blob):
- die_commit("not a blob object: {:s}".format(treeobj),
- str(commit.id))
-
- if blob.size > 250000:
- die_commit("maximum blob size (250kB) exceeded", str(commit.id))
-
- metadata_raw = repo[commit.tree['.SRCINFO'].id].data.decode()
- (metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw)
- if errors:
- sys.stderr.write("error: The following errors occurred "
- "when parsing .SRCINFO in commit\n")
- sys.stderr.write("error: {:s}:\n".format(str(commit.id)))
- for error in errors:
- for err in error['error']:
- sys.stderr.write("error: line {:d}: {:s}\n".format(error['line'], err))
- exit(1)
-
- metadata_pkgbase = metadata['pkgbase']
- if not re.match(repo_regex, metadata_pkgbase):
- die_commit('invalid pkgbase: {:s}'.format(metadata_pkgbase),
- str(commit.id))
-
- for pkgname in set(metadata['packages'].keys()):
- pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
-
- for field in ('pkgver', 'pkgrel', 'pkgname'):
- if field not in pkginfo:
- die_commit('missing mandatory field: {:s}'.format(field),
- str(commit.id))
-
- if 'epoch' in pkginfo and not pkginfo['epoch'].isdigit():
- die_commit('invalid epoch: {:s}'.format(pkginfo['epoch']),
- str(commit.id))
-
- if not re.match(r'[a-z0-9][a-z0-9\.+_-]*$', pkginfo['pkgname']):
- die_commit('invalid package name: {:s}'.format(pkginfo['pkgname']),
- str(commit.id))
-
- for field in ('pkgname', 'pkgdesc', 'url'):
- if field in pkginfo and len(pkginfo[field]) > 255:
- die_commit('{:s} field too long: {:s}'.format(field, pkginfo[field]),
- str(commit.id))
-
- for field in ('install', 'changelog'):
- if field in pkginfo and not pkginfo[field] in commit.tree:
- die_commit('missing {:s} file: {:s}'.format(field, pkginfo[field]),
- str(commit.id))
-
- for field in extract_arch_fields(pkginfo, 'source'):
- fname = field['value']
- if "://" in fname or "lp:" in fname:
- continue
- if fname not in commit.tree:
- die_commit('missing source file: {:s}'.format(fname),
- str(commit.id))
-
-
-# Display a warning if .SRCINFO is unchanged.
-if sha1_old not in ("0000000000000000000000000000000000000000", sha1_new):
- srcinfo_id_old = repo[sha1_old].tree['.SRCINFO'].id
- srcinfo_id_new = repo[sha1_new].tree['.SRCINFO'].id
- if srcinfo_id_old == srcinfo_id_new:
- warn(".SRCINFO unchanged. The package database will not be updated!")
-
-# Read .SRCINFO from the HEAD commit.
-metadata_raw = repo[repo[sha1_new].tree['.SRCINFO'].id].data.decode()
-(metadata, errors) = srcinfo.parse.parse_srcinfo(metadata_raw)
-
-# Ensure that the package base name matches the repository name.
-metadata_pkgbase = metadata['pkgbase']
-if metadata_pkgbase != pkgbase:
- die('invalid pkgbase: {:s}, expected {:s}'.format(metadata_pkgbase, pkgbase))
-
-# Ensure that packages are neither blacklisted nor overwritten.
-pkgbase = metadata['pkgbase']
-cur.execute("SELECT ID FROM PackageBases WHERE Name = %s", [pkgbase])
-pkgbase_id = cur.fetchone()[0] if cur.rowcount == 1 else 0
-
-cur.execute("SELECT Name FROM PackageBlacklist")
-blacklist = [row[0] for row in cur.fetchall()]
-
-for pkgname in srcinfo.utils.get_package_names(metadata):
- pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata)
- pkgname = pkginfo['pkgname']
-
- if pkgname in blacklist and not privileged:
- die('package is blacklisted: {:s}'.format(pkgname))
-
- cur.execute("SELECT COUNT(*) FROM Packages WHERE Name = %s AND " +
- "PackageBaseID <> %s", [pkgname, pkgbase_id])
- if cur.fetchone()[0] > 0:
- die('cannot overwrite package: {:s}'.format(pkgname))
-
-# Store package base details in the database.
-save_metadata(metadata, db, cur, user)
-
-# Create (or update) a branch with the name of the package base for better
-# accessibility.
-repo.create_reference('refs/heads/' + pkgbase, sha1_new, True)
-
-# Work around a Git bug: The HEAD ref is not updated when using gitnamespaces.
-# This can be removed once the bug fix is included in Git mainline. See
-# http://git.661346.n2.nabble.com/PATCH-receive-pack-Create-a-HEAD-ref-for-ref-namespace-td7632149.html
-# for details.
-repo.create_reference('refs/namespaces/' + pkgbase + '/HEAD', sha1_new, True)
-
-# Send package update notifications.
-update_notify(db, cur, user, pkgbase_id)
-
-# Close the database.
-db.close()
diff --git a/po/ar.po b/po/ar.po
index 931d2e1..7258e64 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -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 "إحصائيّاتي"
diff --git a/po/ast.po b/po/ast.po
index 8203718..2a80e03 100644
--- a/po/ast.po
+++ b/po/ast.po
@@ -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"
diff --git a/po/aur.pot b/po/aur.pot
index 0ff0bb7..bbe34d6 100644
--- a/po/aur.pot
+++ b/po/aur.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: AUR v4.1.1\n"
+"Project-Id-Version: AUR v4.3.0\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -26,6 +26,24 @@ msgstr ""
msgid "Sorry, the page you've requested does not exist."
msgstr ""
+#: html/404.php template/pkgreq_close_form.php
+msgid "Note"
+msgstr ""
+
+#: html/404.php
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+
+#: html/404.php
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#: html/404.php
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
#: html/503.php
msgid "Service Unavailable"
msgstr ""
@@ -1077,6 +1095,10 @@ msgid "Real Name"
msgstr ""
#: template/account_details.php template/account_edit_form.php
+msgid "Homepage"
+msgstr ""
+
+#: template/account_details.php template/account_edit_form.php
#: template/account_search_results.php template/search_accounts_form.php
msgid "IRC Nick"
msgstr ""
@@ -1100,6 +1122,10 @@ msgid "Active"
msgstr ""
#: template/account_details.php
+msgid "Registration date:"
+msgstr ""
+
+#: template/account_details.php
msgid "Last Login"
msgstr ""
@@ -1121,6 +1147,11 @@ msgid "Click %shere%s if you want to permanently delete this account."
msgstr ""
#: template/account_edit_form.php
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
+#: template/account_edit_form.php
msgid "required"
msgstr ""
@@ -1172,7 +1203,7 @@ msgstr ""
msgid "Notification settings"
msgstr ""
-#: template/account_edit_form.php template/pkgbase_actions.php
+#: template/account_edit_form.php
msgid "Notify of new comments"
msgstr ""
@@ -1180,6 +1211,10 @@ msgstr ""
msgid "Notify of package updates"
msgstr ""
+#: template/account_edit_form.php
+msgid "Notify of ownership changes"
+msgstr ""
+
#: template/account_edit_form.php template/pkgbase_details.php
#: template/pkg_details.php
msgid "Update"
@@ -1313,6 +1348,10 @@ msgid "Disable notifications"
msgstr ""
#: template/pkgbase_actions.php
+msgid "Enable notifications"
+msgstr ""
+
+#: template/pkgbase_actions.php
msgid "Manage Co-Maintainers"
msgstr ""
@@ -1510,10 +1549,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
#: template/pkgreq_close_form.php
-msgid "Note"
-msgstr ""
-
-#: template/pkgreq_close_form.php
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1556,6 +1591,29 @@ msgstr ""
msgid "Merge into"
msgstr ""
+#: template/pkgreq_form.php
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+#: template/pkgreq_form.php
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+#: template/pkgreq_form.php
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#: template/pkgreq_results.php
#, php-format
msgid "%d package request found."
@@ -1582,8 +1640,10 @@ msgstr ""
#: template/pkgreq_results.php
#, php-format
-msgid "~%d days left"
-msgstr ""
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] ""
+msgstr[1] ""
#: template/pkgreq_results.php
#, php-format
@@ -1713,9 +1773,10 @@ msgid "Version"
msgstr ""
#: template/pkg_search_results.php
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
#: template/pkg_search_results.php template/tu_details.php template/tu_list.php
diff --git a/po/ca.po b/po/ca.po
index de3eecc..3cab9e5 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -3,15 +3,15 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
-# Adolfo Jayme Barrientos, 2014
+# Adolfo Jayme-Barrientos, 2014
# Hector Mtz-Seara <hseara@gmail.com>, 2011,2013
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Catalan (http://www.transifex.com/lfleischer/aur/language/"
"ca/)\n"
@@ -27,6 +27,20 @@ msgstr "No s’ha trobat la pàgina"
msgid "Sorry, the page you've requested does not exist."
msgstr "Ho sentim, la pàgina que ha sol·licitat no existeix."
+msgid "Note"
+msgstr ""
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
msgid "Service Unavailable"
msgstr ""
@@ -852,6 +866,9 @@ msgstr ""
msgid "Real Name"
msgstr "Nom real"
+msgid "Homepage"
+msgstr ""
+
msgid "IRC Nick"
msgstr "Nom d'usuari IRC"
@@ -867,6 +884,9 @@ msgstr ""
msgid "Active"
msgstr "Actiu"
+msgid "Registration date:"
+msgstr ""
+
msgid "Last Login"
msgstr ""
@@ -883,6 +903,10 @@ msgstr ""
msgid "Click %shere%s if you want to permanently delete this account."
msgstr ""
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
msgid "required"
msgstr "requerit"
@@ -929,6 +953,9 @@ msgstr "Notificar comentaris nous"
msgid "Notify of package updates"
msgstr ""
+msgid "Notify of ownership changes"
+msgstr ""
+
msgid "Update"
msgstr "Actualitza"
@@ -1029,6 +1056,9 @@ msgstr "Vota per aquest paquet"
msgid "Disable notifications"
msgstr "Deshabilitar notificacions"
+msgid "Enable notifications"
+msgstr ""
+
msgid "Manage Co-Maintainers"
msgstr ""
@@ -1175,9 +1205,6 @@ msgstr "Fonts"
msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
-msgid "Note"
-msgstr ""
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1210,6 +1237,26 @@ msgstr ""
msgid "Merge into"
msgstr "Combinar amb"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1230,8 +1277,10 @@ msgid "Date"
msgstr "Data"
#, php-format
-msgid "~%d days left"
-msgstr ""
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] ""
+msgstr[1] ""
#, php-format
msgid "~%d hour left"
@@ -1329,9 +1378,10 @@ msgstr[1] ""
msgid "Version"
msgstr "Versió"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
msgid "Yes"
diff --git a/po/cs.po b/po/cs.po
index f9e7461..d5abe1c 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -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"
diff --git a/po/da.po b/po/da.po
index 1425327..2f31a15 100644
--- a/po/da.po
+++ b/po/da.po
@@ -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"
diff --git a/po/de.po b/po/de.po
index 1fc461f..5aa6e53 100644
--- a/po/de.po
+++ b/po/de.po
@@ -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"
diff --git a/po/el.po b/po/el.po
index 6d0c9a4..254c02a 100644
--- a/po/el.po
+++ b/po/el.po
@@ -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"
diff --git a/po/es.po b/po/es.po
index 6e70688..c61e657 100644
--- a/po/es.po
+++ b/po/es.po
@@ -3,20 +3,23 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
-# Adolfo Jayme Barrientos, 2015
+# Adolfo Jayme-Barrientos, 2015
# Angel Velasquez <angvp@archlinux.org>, 2011
# juantascon <juantascon@gmail.com>, 2011
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
# neiko <neikokz+tsfx@gmail.com>, 2011
# Nicolás de la Torre <ndelatorre@gmail.com>, 2012
-# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2012
-# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2013-2015
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2012
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2013-2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Spanish (http://www.transifex.com/lfleischer/aur/language/"
"es/)\n"
@@ -32,6 +35,20 @@ msgstr "Página no encontrada"
msgid "Sorry, the page you've requested does not exist."
msgstr "La página solicitada no existe."
+msgid "Note"
+msgstr "Nota"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "Servicio no disponible"
@@ -88,7 +105,7 @@ msgid "Submit a proposal to vote on."
msgstr "Envía una propuesta a la cual votar."
msgid "Applicant/TU"
-msgstr "Candidato/Usuario de confianza (TU)"
+msgstr "Candidato/Usuario de confianza (UC)"
msgid "(empty if not applicable)"
msgstr "(vacío si no aplica)"
@@ -231,7 +248,7 @@ msgstr ""
"detalles."
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr "Las siguientes huellas SSH están en uso para AUR."
+msgstr "Las siguientes huellas SSH están en uso para el AUR."
msgid "Discussion"
msgstr "Debate"
@@ -365,7 +382,7 @@ msgid ""
"message to the %saur-general%s mailing list."
msgstr ""
"Si olvidaste la dirección de correo que usaste para registrarte, envía un "
-"mensaje a la %slista de correo aur-general%s."
+"mensaje a la %slista de correo general del AUR%s."
msgid "Enter your e-mail address:"
msgstr "Introduce tu dirección de correo:"
@@ -457,7 +474,7 @@ msgstr ""
"de paquetes."
msgid "Flag Comment"
-msgstr ""
+msgstr "Marcar comentario"
msgid "Flag Package Out-Of-Date"
msgstr "Marcado como desactualizado"
@@ -528,7 +545,7 @@ msgstr ""
"Solamente usuarios de confianza y desarrolladores pueden unir paquetes."
msgid "Submit Request"
-msgstr ""
+msgstr "Enviar solicitud"
msgid "Close Request"
msgstr "Cerrar solicitud"
@@ -719,19 +736,19 @@ msgid "Missing comment ID."
msgstr "Falta el identificador del comentario."
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "No pueden fijarse más de 5 comentarios."
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "No tienes permitido fijar este comentario."
msgid "You are not allowed to unpin this comment."
-msgstr ""
+msgstr "No tienes permitido desfijar este comentario."
msgid "Comment has been pinned."
-msgstr ""
+msgstr "El comentario ha sido fijado."
msgid "Comment has been unpinned."
-msgstr ""
+msgstr "El comentario ha sido desfijado."
msgid "Error retrieving package details."
msgstr "Error al recuperar los detalles del paquete."
@@ -816,10 +833,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "Haz sido eliminado de la lista de notificaciones de comentarios de %s."
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "No estás autorizado a restablecer este comentario."
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "El comentario se ha restablecido."
msgid "You are not allowed to delete this comment."
msgstr "No estás autorizado para eliminar este comentario."
@@ -917,6 +934,9 @@ msgstr "oculto"
msgid "Real Name"
msgstr "Nombre real"
+msgid "Homepage"
+msgstr "Página principal"
+
msgid "IRC Nick"
msgstr "Alias de IRC"
@@ -932,6 +952,9 @@ msgstr "Inactivo desde"
msgid "Active"
msgstr "Activo"
+msgid "Registration date:"
+msgstr ""
+
msgid "Last Login"
msgstr "Última autentificación"
@@ -948,6 +971,10 @@ msgstr "Editar la cuenta de este usuario"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "Haz clic %saquí%s si deseas eliminar permanentemente esta cuenta."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
msgid "required"
msgstr "obligatorio"
@@ -990,13 +1017,16 @@ msgid "SSH Public Key"
msgstr "Clave pública SSH"
msgid "Notification settings"
-msgstr ""
+msgstr "Gestión de notificaciones"
msgid "Notify of new comments"
msgstr "Notificación de nuevos comentarios"
msgid "Notify of package updates"
-msgstr ""
+msgstr "Notificar de actualizaciones de un paquete"
+
+msgid "Notify of ownership changes"
+msgstr "Notificar de cambios de propietario"
msgid "Update"
msgstr "Actualizar"
@@ -1044,22 +1074,25 @@ msgstr "Guardar"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "Marcar comentario como desactualizado: %s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
msgstr ""
+"%s%s%s se ha marcado %s%s%s como desactualizado %s%s%s por la siguiente "
+"razón:"
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s no está marcado como desactualizado."
msgid "Return to Details"
-msgstr ""
+msgstr "Regresar a detalles"
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
msgstr ""
+"Derechos de autor %s 2004 - %d, equipo desarrollador de la web del AUR."
msgid "My Packages"
msgstr "Mis paquetes"
@@ -1084,7 +1117,7 @@ msgstr "Buscar en la wiki"
#, php-format
msgid "Flagged out-of-date (%s)"
-msgstr ""
+msgstr "Marcado como desactualizado (%s)"
msgid "Flag package out-of-date"
msgstr "Marcar paquete como desactualizado"
@@ -1101,6 +1134,9 @@ msgstr "Votar por este paquete"
msgid "Disable notifications"
msgstr "Deshabilitar notificaciones"
+msgid "Enable notifications"
+msgstr "Habilitar notificaciones"
+
msgid "Manage Co-Maintainers"
msgstr "Administrar coencargados"
@@ -1160,7 +1196,7 @@ msgid "View all comments"
msgstr "Ver todos los comentarios"
msgid "Pinned Comments"
-msgstr ""
+msgstr "Comentarios fijados"
msgid "Latest Comments"
msgstr "Últimos comentarios"
@@ -1179,27 +1215,27 @@ msgstr "borrado el %s por %s"
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "borrado el %s"
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "editado el %s por %s"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "editado el %s"
msgid "Undelete comment"
-msgstr ""
+msgstr "Comentario restablecido"
msgid "Delete comment"
msgstr "Eliminar comentario"
msgid "Pin comment"
-msgstr ""
+msgstr "Comentario fijado"
msgid "Unpin comment"
-msgstr ""
+msgstr "Comentario desfijado"
msgid "All comments"
msgstr "Todos los comentarios"
@@ -1248,9 +1284,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
"Usa este formulario para cerrar la solicitud para el paquete base %s%s%s."
-msgid "Note"
-msgstr "Nota"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1287,6 +1320,40 @@ msgstr "Orfandad"
msgid "Merge into"
msgstr "Unir en"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"Al enviar una solicitud de eliminación, le preguntas a un usuario de "
+"confianza que elimine el paquete base. Este tipo de solicitud debe ser "
+"utilizado para los duplicados, programas abandonados por el desarrollador "
+"principal o encargado, así como programas ilegales e irreparablemente rotos."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"Al enviar una solicitud de unión, le preguntas a un usuario de confianza que "
+"elimine el paquete base y transfiera sus votos y comentarios a otro paquete "
+"base. La unión de un paquete no afecta a los correspondientes repositorios "
+"Git. Por tanto asegúrate de actualizar el historia Git del paquete de "
+"destino tú mismo."
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"Al enviar una solicitud de orfandad, le preguntas a un usuario de confianza "
+"que remueva la propiedad sobre el paquete base al encargado principal de "
+"este. Por favor, haz esto solamente si el paquete necesita una acción de "
+"mantenención, el encargado no presenta signos de actividad y ya intentaste "
+"ponerte en contacto con él anteriormente."
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1307,8 +1374,10 @@ msgid "Date"
msgstr "Fecha"
#, php-format
-msgid "~%d days left"
-msgstr "Aprox. %d días restantes"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d día restante"
+msgstr[1] "~%d días restantes"
#, php-format
msgid "~%d hour left"
@@ -1406,12 +1475,13 @@ msgstr[1] "%d paquetes fueron encontrados."
msgid "Version"
msgstr "Versión"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
-"La popularidad se calcula como la suma de todos los votos con cada voto "
-"ponderado con un factor de 0,98 por día desde la creación del paquete."
+"La popularidad se calcula como la suma de todos los votos y cada uno "
+"ponderado con un factor de %.2f por día desde la creación del paquete."
msgid "Yes"
msgstr "Sí"
@@ -1471,7 +1541,7 @@ msgid "Recent Updates"
msgstr "Actualizaciones recientes"
msgid "more"
-msgstr ""
+msgstr "más"
msgid "My Statistics"
msgstr "Mis estadísticas"
diff --git a/po/es_419.po b/po/es_419.po
index 962917e..14adaf9 100644
--- a/po/es_419.po
+++ b/po/es_419.po
@@ -8,13 +8,16 @@
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
# neiko <neikokz+tsfx@gmail.com>, 2011
# Nicolás de la Torre <ndelatorre@gmail.com>, 2012
-# Pablo Roberto Francisco Lezaeta Reyes <prflr88@gmail.com>, 2012,2015
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2012,2015-2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
+# Pablo Roberto “Jristz†Lezaeta Reyes <prflr88@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Spanish (Latin America) (http://www.transifex.com/lfleischer/"
"aur/language/es_419/)\n"
@@ -30,6 +33,20 @@ msgstr "Página no encontrada"
msgid "Sorry, the page you've requested does not exist."
msgstr "Disculpe, la página que solicitó no existe."
+msgid "Note"
+msgstr "Nota"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "Servicio no disponible"
@@ -86,7 +103,7 @@ msgid "Submit a proposal to vote on."
msgstr "Envíe una propuesta a la cual votar."
msgid "Applicant/TU"
-msgstr "Candidato/Usuario de confianza (TU)"
+msgstr "Candidato/Usuario de confianza (UC)"
msgid "(empty if not applicable)"
msgstr "(vacío si no aplica)"
@@ -95,13 +112,13 @@ msgid "Type"
msgstr "Tipo"
msgid "Addition of a TU"
-msgstr "Agregar a un nuevo usuario de confianza"
+msgstr "Agregar a un nuevo Usuario de Confianza"
msgid "Removal of a TU"
-msgstr "Remover a un usuario de confianza"
+msgstr "Remover a un Usuario de Confianza"
msgid "Removal of a TU (undeclared inactivity)"
-msgstr "Remover a un usuario de confianza (no declarado inactivo)"
+msgstr "Remover a un Usuario de Confianza (no declarado inactivo)"
msgid "Amendment of Bylaws"
msgstr "Enmienda a las Bylaws (Reglas de los TU)"
@@ -127,7 +144,7 @@ msgid ""
"Guidelines%s for more information."
msgstr ""
"¡Bienvenido al repositorio de usuarios de Arch! Lea la %sGuía del usuario "
-"del AUR%s y la %sGuía del usuario de confianza del AUR%s para mayor "
+"del AUR%s y la %sGuía del usuario de Confianza del AUR%s para mayor "
"información."
#, php-format
@@ -152,8 +169,8 @@ msgid ""
"AUR packages are user produced content. Any use of the provided files is at "
"your own risk."
msgstr ""
-"Los paquetes en AUR son producidos por los usuarios. Cualquier uso de ellos "
-"o sus archivos es a su propio riesgo."
+"Los paquetes en el AUR son producidos por los usuarios. Cualquier uso de "
+"ellos o sus archivos es a su propio riesgo."
msgid "Learn more..."
msgstr "Aprenda más..."
@@ -228,7 +245,7 @@ msgstr ""
"información."
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr "Las siguientes huellas SSH están en uso para AUR."
+msgstr "Las siguientes huellas SSH están en uso para el AUR."
msgid "Discussion"
msgstr "Debate"
@@ -453,7 +470,7 @@ msgstr ""
"paquetes."
msgid "Flag Comment"
-msgstr ""
+msgstr "Marcar comentario"
msgid "Flag Package Out-Of-Date"
msgstr "Marcado como desactualizado"
@@ -524,7 +541,7 @@ msgid "Only Trusted Users and Developers can merge packages."
msgstr "Solo Usuarios de Confianza y Desarrolladores pueden fusionar paquetes."
msgid "Submit Request"
-msgstr ""
+msgstr "Enviar petición"
msgid "Close Request"
msgstr "Cerrar Petición"
@@ -713,19 +730,19 @@ msgid "Missing comment ID."
msgstr "Falta el identificador del comentario."
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "No pueden ser anclar más de 5 comentarios."
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "No tiene permitido anclar este comentario."
msgid "You are not allowed to unpin this comment."
-msgstr ""
+msgstr "No tiene permitido desanclar este comentario."
msgid "Comment has been pinned."
-msgstr ""
+msgstr "El comentario fue anclado."
msgid "Comment has been unpinned."
-msgstr ""
+msgstr "El comentario fue desanclado."
msgid "Error retrieving package details."
msgstr "Error al recuperar los detalles del paquete."
@@ -810,10 +827,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "Ha sido eliminado de la lista de notificaciones de comentarios de %s."
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "No está autorizado a restablecer este comentario."
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "El comentario fue restablecido."
msgid "You are not allowed to delete this comment."
msgstr "No está autorizado a borrar este comentario."
@@ -910,6 +927,9 @@ msgstr "oculto"
msgid "Real Name"
msgstr "Nombre real"
+msgid "Homepage"
+msgstr "Página principal"
+
msgid "IRC Nick"
msgstr "Alias de IRC"
@@ -925,6 +945,9 @@ msgstr "Inactivo desde"
msgid "Active"
msgstr "Activo"
+msgid "Registration date:"
+msgstr ""
+
msgid "Last Login"
msgstr "Última autentificación"
@@ -941,6 +964,10 @@ msgstr "Editar la cuenta de este usuario"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "Haga clic %saquí%s si desea borrar permanentemente esa cuenta."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
msgid "required"
msgstr "obligatorio"
@@ -983,13 +1010,16 @@ msgid "SSH Public Key"
msgstr "Clave pública SSH"
msgid "Notification settings"
-msgstr ""
+msgstr "Configuración de notificaciones"
msgid "Notify of new comments"
msgstr "Notificación de nuevos comentarios"
msgid "Notify of package updates"
-msgstr ""
+msgstr "Notificar sobre actualizaciones de un paquete"
+
+msgid "Notify of ownership changes"
+msgstr "Notificarme de cambios de propietario"
msgid "Update"
msgstr "Actualizar"
@@ -1037,22 +1067,24 @@ msgstr "Guardar"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "Marcar comentario como desactualizado: %s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
msgstr ""
+"%s%s%s fue marcado %s%s%s como desactualizado %s%s%s por la siguiente razón:"
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s no está marcado como desactualizado."
msgid "Return to Details"
-msgstr ""
+msgstr "Regresar a detalles"
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
msgstr ""
+"Derechos de autor %s 2004 - %d, equipo de desarrollo de la web del AUR."
msgid "My Packages"
msgstr "Mis paquetes"
@@ -1077,7 +1109,7 @@ msgstr "Buscar en la wiki"
#, php-format
msgid "Flagged out-of-date (%s)"
-msgstr ""
+msgstr "Marcado como desactualizado (%s)"
msgid "Flag package out-of-date"
msgstr "Marcar paquete como desactualizado"
@@ -1094,6 +1126,9 @@ msgstr "Votar por este paquete"
msgid "Disable notifications"
msgstr "Deshabilitar notificaciones"
+msgid "Enable notifications"
+msgstr "Habilitar notificaciones"
+
msgid "Manage Co-Maintainers"
msgstr "Administrar coencargados"
@@ -1153,7 +1188,7 @@ msgid "View all comments"
msgstr "Ver todos los comentarios"
msgid "Pinned Comments"
-msgstr ""
+msgstr "Comentarios anclados"
msgid "Latest Comments"
msgstr "Últimos comentarios"
@@ -1172,27 +1207,27 @@ msgstr "borrado el %s por %s"
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "borrado el %s"
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "editado el %s por %s"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "editado el %s"
msgid "Undelete comment"
-msgstr ""
+msgstr "Comentario restablecido"
msgid "Delete comment"
msgstr "Borrar comentario"
msgid "Pin comment"
-msgstr ""
+msgstr "Comentario anclado"
msgid "Unpin comment"
-msgstr ""
+msgstr "Comentario desanclado"
msgid "All comments"
msgstr "Todos los comentarios"
@@ -1241,9 +1276,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
"Use este formulario para cerrar la petición para el paquete base %s%s%s."
-msgid "Note"
-msgstr "Nota"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1280,6 +1312,40 @@ msgstr "Orfandad"
msgid "Merge into"
msgstr "Fusionar en"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"Al enviar una Petición de Borrado, le preguntará a un Usuario de Confianza "
+"que elimine dicho paquete base. Este tipo de peticiones debe ser utilizada "
+"para duplicados, programas abandonados por el desarrollador principal o "
+"encargado, así como programas ilegales e irreparablemente rotos."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"Al enviar una Petición de Fusión, le preguntará a un Usuario de Confianza "
+"que borre el paquete base y transfiera sus votos y comentarios a otro "
+"paquete base. La fusión de un paquete no afecta a los correspondientes "
+"repositorios Git. Por lo tanto asegúrese de actualizar el historia Git del "
+"paquete de destino uste mismo."
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"Al enviar una Petición de Orfandad, le preguntarás a un Usuario de Confianza "
+"que le quite la propiedad sobre el paquete base al encargado principal de "
+"este. Por favor, haga esto solo si el paquete necesita acciones de "
+"mantenención para funcionar, el encargado no presenta da de actividad y ya "
+"intentó ponerse en contacto con él anteriormente."
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1300,8 +1366,10 @@ msgid "Date"
msgstr "Fecha"
#, php-format
-msgid "~%d days left"
-msgstr "Aprox. %d días restantes"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d día restante"
+msgstr[1] "~%d días restantes"
#, php-format
msgid "~%d hour left"
@@ -1399,12 +1467,13 @@ msgstr[1] "%d paquetes fueron encontrados."
msgid "Version"
msgstr "Versión"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
"La Popularidad es calculada como la suma de todos los votos ponderados con "
-"un factor de 0,98 por día desde la creación del paquete."
+"un factor de %.2f por día desde la creación del paquete."
msgid "Yes"
msgstr "Sí"
@@ -1464,7 +1533,7 @@ msgid "Recent Updates"
msgstr "Actualizaciones recientes"
msgid "more"
-msgstr ""
+msgstr "más"
msgid "My Statistics"
msgstr "Mis estadísticas"
@@ -1498,7 +1567,7 @@ msgid "Participation"
msgstr "Participación"
msgid "Last Votes by TU"
-msgstr "Último voto del usuario de confianza"
+msgstr "Último voto del Usuario de Confianza"
msgid "Last vote"
msgstr "Último voto"
diff --git a/po/fi.po b/po/fi.po
index e24409a..6e20ae2 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -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"
diff --git a/po/fr.po b/po/fr.po
index b05f0e9..0c10f9f 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -5,7 +5,7 @@
# Translators:
# Antoine Lubineau <antoine@lubignon.info>, 2012
# Antoine Lubineau <antoine@lubignon.info>, 2012-2016
-# Cedric Girard <girard.cedric@gmail.com>, 2011,2014
+# Cedric Girard <girard.cedric@gmail.com>, 2011,2014,2016
# lordheavy <lordheavym@gmail.com>, 2011
# lordheavy <lordheavym@gmail.com>, 2013-2014
# lordheavy <lordheavym@gmail.com>, 2011-2012
@@ -15,8 +15,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 21:38+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-11 20:06+0000\n"
"Last-Translator: Antoine Lubineau <antoine@lubignon.info>\n"
"Language-Team: French (http://www.transifex.com/lfleischer/aur/language/"
"fr/)\n"
@@ -32,6 +32,21 @@ msgstr "Page non trouvée"
msgid "Sorry, the page you've requested does not exist."
msgstr "Désolé, la page que vous avez demandée n’existe pas."
+msgid "Note"
+msgstr "Note"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+"Les URL de clone Git ne sont pas censées être ouvertes depuis un navigateur."
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "Pour cloner le dépôt Git de %s, exécutez %s."
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "Cliquez %sici%s pour retourner à la page des détails de %s."
+
msgid "Service Unavailable"
msgstr "Service indisponible"
@@ -536,7 +551,7 @@ msgstr ""
"paquets."
msgid "Submit Request"
-msgstr "Soumettre la demande"
+msgstr "Soumettre une demande"
msgid "Close Request"
msgstr "Fermer la requête"
@@ -931,6 +946,9 @@ msgstr "caché"
msgid "Real Name"
msgstr "Nom réel"
+msgid "Homepage"
+msgstr "Accueil"
+
msgid "IRC Nick"
msgstr "Pseudo IRC"
@@ -946,6 +964,9 @@ msgstr "Inactif depuis"
msgid "Active"
msgstr "Actif"
+msgid "Registration date:"
+msgstr "Date d'enregistrement :"
+
msgid "Last Login"
msgstr "Dernière connexion."
@@ -962,6 +983,10 @@ msgstr "Éditer le compte de cet utilisateur."
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "Cliquez %sici%s si vous voulez effacer ce compte de façon définitive."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "Cliquer %sici%s pour obtenir les détails de l'utilisateur."
+
msgid "required"
msgstr "requis"
@@ -1012,6 +1037,9 @@ msgstr "Avertir des nouveaux commentaires"
msgid "Notify of package updates"
msgstr "Notifications de mises à jour de paquets"
+msgid "Notify of ownership changes"
+msgstr "Notifier des changements de propriétaire"
+
msgid "Update"
msgstr "Mise à jour"
@@ -1115,6 +1143,9 @@ msgstr "Voter pour ce paquet"
msgid "Disable notifications"
msgstr "Désactiver les notifications"
+msgid "Enable notifications"
+msgstr "Activer les notifications"
+
msgid "Manage Co-Maintainers"
msgstr "Gérer les co-mainteneurs"
@@ -1262,9 +1293,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
"Utiliser ce formulaire pour fermer la requête pour le paquet de base %s%s%s."
-msgid "Note"
-msgstr "Note"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1301,6 +1329,40 @@ msgstr "Rendre orphelin"
msgid "Merge into"
msgstr "Fusionner dans"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"En soumettant une requète de suppression, vous demandez à un utilisateur de "
+"confiance de supprimer le paquet de base. Ce type de requète doit être "
+"utilisé pour les doublons, les logiciels abandonnés par l'upstream ainsi que "
+"pour les paquets illégaux ou irréparables."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"En soumettant une requète de fusion, vous demandez à un utilisateur de "
+"confiance de supprimer le paquet de base et de transférer les votes et les "
+"commentaires vers un autre paquet de base. Fusionner un paquet n'impacte pas "
+"le dépot Git correspondant. Assurez-vous de mettre à jour l'historique Git "
+"du paquet cible vous-même."
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"En soumettant une requète pour rendre orphelin, vous demandez à un "
+"utilisateur de confiance de retirer le mainteneur du paquet de base. Merci "
+"de ne faire ceci que si le paquet nécessite l'action d'un mainteneur, que le "
+"mainteneur ne répond pas et que vous avez préalablement essayé de contacter "
+"le mainteneur."
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1321,8 +1383,10 @@ msgid "Date"
msgstr "Date"
#, php-format
-msgid "~%d days left"
-msgstr "~%d jours restants"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d jour restant"
+msgstr[1] "~%d jours restants"
#, php-format
msgid "~%d hour left"
@@ -1420,12 +1484,13 @@ msgstr[1] "%d paquets trouvés."
msgid "Version"
msgstr "Version"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
"La popularité est calculée à partir de la somme de tous les votes, chacun "
-"étant pondéré par un facteur de 0.98 par jour depuis sa création."
+"étant pondéré par un facteur de %.2f par jour depuis sa création."
msgid "Yes"
msgstr "Oui"
diff --git a/po/he.po b/po/he.po
index bfcdf8b..75321be 100644
--- a/po/he.po
+++ b/po/he.po
@@ -3,13 +3,15 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
+# GenghisKhan <genghiskhan@gmx.ca>, 2016
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Hebrew (http://www.transifex.com/lfleischer/aur/language/"
"he/)\n"
@@ -20,20 +22,34 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Page Not Found"
-msgstr ""
+msgstr "העמוד ×œ× × ×ž×¦×"
msgid "Sorry, the page you've requested does not exist."
+msgstr "העמוד שביקשת ×ינו קיי×, עמך הסליחה."
+
+msgid "Note"
+msgstr "הערה"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
msgstr ""
-msgid "Service Unavailable"
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
msgstr ""
+msgid "Service Unavailable"
+msgstr "השירות ×ינו זמין"
+
msgid ""
"Don't panic! This site is down due to maintenance. We will be back soon."
-msgstr ""
+msgstr "×ל בהלה! ×תר ×–×” הושבת לטובת עבודות תחזוקה. נשוב במהרה."
msgid "Account"
-msgstr ""
+msgstr "חשבון"
msgid "Accounts"
msgstr "חשבונות"
@@ -51,23 +67,23 @@ msgid "Use this form to search existing accounts."
msgstr "× × ×œ×”×©×ª×ž×© בטופס על מנת לחפש ×חר חשבונות קיימי×."
msgid "You must log in to view user information."
-msgstr "עליך להתחבר על מנת לצפות בנתוני משתמש."
+msgstr "עליך להיכנס על מנת לצפות בנתוני משתמש."
msgid "Add Proposal"
msgstr "הוספת הצעה"
msgid "Invalid token for user action."
-msgstr ""
+msgstr "×סימון שגוי לפעולת משתמש."
msgid "Username does not exist."
msgstr "×©× ×”×ž×©×ª×ž×© ×œ× ×§×™×™×."
#, php-format
msgid "%s already has proposal running for them."
-msgstr "%s יש כבר הצעה קיימת."
+msgstr "ל־%s יש כבר הצעה קיימת."
msgid "Invalid type."
-msgstr ""
+msgstr "סוג שגוי."
msgid "Proposal cannot be empty."
msgstr "הצעה ×œ× ×™×›×•×œ×” להיות ריקה."
@@ -79,7 +95,7 @@ msgid "Submit a proposal to vote on."
msgstr "שליחת הצבעה עבור הפעלת הצבעה."
msgid "Applicant/TU"
-msgstr ""
+msgstr "מועמד/משתמש מהימן"
msgid "(empty if not applicable)"
msgstr "(ריק ×× ××™× ×” מת×ימה)"
@@ -88,13 +104,13 @@ msgid "Type"
msgstr "סוג"
msgid "Addition of a TU"
-msgstr ""
+msgstr "הוספת משתמש מהימן"
msgid "Removal of a TU"
-msgstr ""
+msgstr "הסרת משתמש מהימן"
msgid "Removal of a TU (undeclared inactivity)"
-msgstr ""
+msgstr "הסרת משתמש מהימן (חוסר פעילות בלתי מוצהרת)"
msgid "Amendment of Bylaws"
msgstr ""
@@ -106,10 +122,10 @@ msgid "Submit"
msgstr "שליחה"
msgid "Manage Co-maintainers"
-msgstr ""
+msgstr "ניהול ×©×•×ª×¤×™× ×œ×ª×—×–×•×§×”"
msgid "Edit comment"
-msgstr ""
+msgstr "עריכת תגובה"
msgid "Home"
msgstr "בית"
@@ -119,52 +135,62 @@ msgid ""
"Welcome to the AUR! Please read the %sAUR User Guidelines%s and %sAUR TU "
"Guidelines%s for more information."
msgstr ""
+"ברוך בו×ך ל־AUR, מ×גר תרומות ×”×ž×©×ª×ž×©×™× ×©×œ ×רץ׳! × × ×œ×§×¨×•× ×ת %s×”×›×œ×œ×™× ×œ×ž×©×ª×ž×© ב־"
+"AUR%s ו×ת %s×”×›×œ×œ×™× ×œ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×‘Ö¾AUR%s."
#, php-format
msgid ""
"Contributed PKGBUILDs %smust%s conform to the %sArch Packaging Standards%s "
"otherwise they will be deleted!"
msgstr ""
+"הגדרות PKGBUILD שנתרמו %sחייבות%s לעמוד ב%sתקני ×”×ריזה של ×רץ׳%s ×חרת הן "
+"תמחקנה!"
msgid "Remember to vote for your favourite packages!"
-msgstr ""
+msgstr "×œ× ×œ×©×›×•×— להצביע לחבילות המועדפות עליך!"
msgid "Some packages may be provided as binaries in [community]."
-msgstr ""
+msgstr "יתכן שחלק מהחבילות מסופקות בתור ×§×‘×¦×™× ×‘×™× ×¨×™×™× ×ª×—×ª [community] (קהילה)."
msgid "DISCLAIMER"
-msgstr ""
+msgstr "הבהרה"
msgid ""
"AUR packages are user produced content. Any use of the provided files is at "
"your own risk."
msgstr ""
+"חבילות AUR הן תוכן שנוצר על ידי המשתמשי×. כל שימוש ×‘×§×‘×¦×™× ×©×¡×•×¤×§×• ×”×•× ×¢×œ "
+"×חריותך בלבד."
msgid "Learn more..."
-msgstr ""
+msgstr "מידע נוסף..."
msgid "Support"
-msgstr ""
+msgstr "תמיכה"
msgid "Package Requests"
-msgstr ""
+msgstr "בקשות חבילה"
#, php-format
msgid ""
"There are three types of requests that can be filed in the %sPackage Actions"
"%s box on the package details page:"
msgstr ""
+"×™×©× × ×©×œ×•×©×” ×¡×•×’×™× ×©×œ בקשות שניתן להגיש בתיבה %sפעולות על חבילה%s בעמוד פרטי "
+"החבילה:"
msgid "Orphan Request"
-msgstr ""
+msgstr "בקשה יתומה"
msgid ""
"Request a package to be disowned, e.g. when the maintainer is inactive and "
"the package has been flagged out-of-date for a long time."
msgstr ""
+"הגשת בקשה לניתוק בעלות על חבילה, למשל ×›×שר המתחזק ×ינו פעיל והחבילה סומנה "
+"×›×œ× ×¢×“×›× ×™×ª במשך זמן מה."
msgid "Deletion Request"
-msgstr ""
+msgstr "בקשת מחיקה"
msgid ""
"Request a package to be removed from the Arch User Repository. Please do not "
@@ -173,7 +199,7 @@ msgid ""
msgstr ""
msgid "Merge Request"
-msgstr ""
+msgstr "בקשת מיזוג"
msgid ""
"Request a package to be merged into another one. Can be used when a package "
@@ -187,7 +213,7 @@ msgid ""
msgstr ""
msgid "Submitting Packages"
-msgstr ""
+msgstr "שליחת חבילות"
#, php-format
msgid ""
@@ -195,9 +221,11 @@ msgid ""
"packages%s section of the Arch User Repository ArchWiki page for more "
"details."
msgstr ""
+"Git על גבי SSH ×”×™× ×”×ª×©×ª×™×ª העדכנית להגשת חבילות ל־AUR. ניתן לעיין בסעיף "
+"%sהגשת חבילות%s בעמוד Arch User Repository ב־ArchWiki לקבלת ×¤×¨×˜×™× × ×•×¡×¤×™×."
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr ""
+msgstr "טביעות ×”×צבע מסוג SSH הב×ות נמצ×ות בשימוש עבור AUR:"
msgid "Discussion"
msgstr "דיון"
@@ -210,7 +238,7 @@ msgid ""
msgstr ""
msgid "Bug Reporting"
-msgstr ""
+msgstr "דיווח על ב××’×™×"
#, php-format
msgid ""
@@ -221,10 +249,10 @@ msgid ""
msgstr ""
msgid "Package Search"
-msgstr ""
+msgstr "חיפוש חבילות"
msgid "Adopt"
-msgstr ""
+msgstr "×ימוץ"
msgid "Vote"
msgstr "הצבעה"
@@ -239,7 +267,7 @@ msgid "UnNotify"
msgstr "ביטול התרעה"
msgid "UnFlag"
-msgstr ""
+msgstr "ביטול סימון"
msgid "Login"
msgstr "כניסה"
@@ -252,10 +280,10 @@ msgid "Logout"
msgstr "ניתוק"
msgid "Enter login credentials"
-msgstr ""
+msgstr "× × ×œ×”×–×™×Ÿ פרטי גישה"
msgid "User name or email address"
-msgstr ""
+msgstr "×©× ×ž×©×ª×ž×© ×ו כתובת דו×״ל"
msgid "Password"
msgstr "ססמה"
@@ -264,12 +292,12 @@ msgid "Remember me"
msgstr "שמירת הפרטי×"
msgid "Forgot Password"
-msgstr ""
+msgstr "שכחתי ×ת הססמה"
#, php-format
msgid ""
"HTTP login is disabled. Please %sswitch to HTTPs%s if you want to login."
-msgstr ""
+msgstr "כניסה ב×מצעות HTTP מנוטרלת. × × %sלעבור ל־HTTPs%s ×× ×‘×¨×¦×•× ×š להיכנס."
msgid "Search Criteria"
msgstr "×§×¨×™×˜×¨×™×•× ×™× ×œ×—×™×¤×•×©"
@@ -291,16 +319,16 @@ msgid "Your password must be at least %s characters."
msgstr "הססמה חייבת להיות ב×ורך של %s ×ותיות לפחות."
msgid "Invalid e-mail."
-msgstr ""
+msgstr "כתובת דו×״ל שגויה."
msgid "Password Reset"
msgstr "×יפוס ססמה"
msgid "Check your e-mail for the confirmation link."
-msgstr ""
+msgstr "× × ×œ×‘×“×•×§ בתיבת הדו×״ל שלך ×× ×”×ª×§×‘×œ קישור ל×ישור."
msgid "Your password has been reset successfully."
-msgstr ""
+msgstr "הססמה שלך הת×פסה בהצלחה."
msgid "Confirm your e-mail address:"
msgstr "×ישור כתובת הדו×״ל שלך"
@@ -312,13 +340,15 @@ msgid "Confirm your new password:"
msgstr "×ישור הססמה החדשה:"
msgid "Continue"
-msgstr ""
+msgstr "המשך"
#, php-format
msgid ""
"If you have forgotten the e-mail address you used to register, please send a "
"message to the %saur-general%s mailing list."
msgstr ""
+"×× ×©×›×—×ª ×ת כתובת הדו×״ל בה השתמש כדי להירש×, × × ×œ×©×œ×•×— הודעה לקבוצת הדיוור "
+"%saur-general%s."
msgid "Enter your e-mail address:"
msgstr "× × ×œ×”×–×™×Ÿ ×ת כתובת הדו×״ל שלך:"
@@ -326,23 +356,23 @@ msgstr "× × ×œ×”×–×™×Ÿ ×ת כתובת הדו×״ל שלך:"
msgid ""
"The selected packages have not been disowned, check the confirmation "
"checkbox."
-msgstr ""
+msgstr "החבילות הב×ות ×œ× × ×•×ª×§×• מבעליהן, × × ×œ×¡×ž×Ÿ ×ת התיבה ל×ישור."
msgid "Cannot find package to merge votes and comments into."
-msgstr ""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×—×‘×™×œ×” למיזוג הצבעות ותגובות ×ליה."
msgid "Cannot merge a package base with itself."
-msgstr ""
+msgstr "××™ ×פשר למזג בסיס חבילה ×¢× ×¢×¦×ž×•."
msgid ""
"The selected packages have not been deleted, check the confirmation checkbox."
msgstr "החבילות שנבחרו ×œ× × ×ž×—×§×•, × × ×œ×‘×—×•×¨ בתיבת ×”×ישור."
msgid "Package Deletion"
-msgstr ""
+msgstr "מחיקת חבילות"
msgid "Delete Package"
-msgstr ""
+msgstr "מחיקת חבילה"
#, php-format
msgid ""
@@ -351,22 +381,22 @@ msgid ""
msgstr ""
msgid "Deletion of a package is permanent. "
-msgstr ""
+msgstr "מחיקת חבילה ×”×™× ×œ×¦×ž×™×ª×•×ª."
msgid "Select the checkbox to confirm action."
-msgstr ""
+msgstr "× × ×œ×‘×—×•×¨ ×ת תיבת הסימון כדי ל×שר ×ת הפעולה."
msgid "Confirm package deletion"
-msgstr ""
+msgstr "×ישור מחיקת חבילה"
msgid "Delete"
-msgstr ""
+msgstr "מחיקה"
msgid "Only Trusted Users and Developers can delete packages."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×ž×—×•×§ חבילות."
msgid "Disown Package"
-msgstr ""
+msgstr "ניתוק בעלות על חבילה"
#, php-format
msgid ""
@@ -379,25 +409,27 @@ msgid ""
"By selecting the checkbox, you confirm that you want to disown the package "
"and transfer ownership to %s%s%s."
msgstr ""
+"על ידי סימון תיבת הבחירה, ניתן ×ישורך לניתוק הבעלות על חבילה והעברת הבעלות "
+"×ל %s%s%s."
msgid ""
"By selecting the checkbox, you confirm that you want to disown the package."
-msgstr ""
+msgstr "על ידי סימון תיבת הבחירה, נתת ×ת ×ישורך לניתוק הבעלות על חבילה."
msgid "Confirm to disown the package"
-msgstr ""
+msgstr "×ישור ניתוק בעלות החבילה"
msgid "Disown"
-msgstr ""
+msgstr "ניתוק בעלות"
msgid "Only Trusted Users and Developers can disown packages."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ× ×ª×§ בעלות של חבילות."
msgid "Flag Comment"
-msgstr ""
+msgstr "סימון התגובה"
msgid "Flag Package Out-Of-Date"
-msgstr ""
+msgstr "סימון תגובה כבלתי עדכנית"
#, php-format
msgid ""
@@ -415,70 +447,72 @@ msgid ""
"Enter details on why the package is out-of-date below, preferably including "
"links to the release announcement or the new release tarball."
msgstr ""
+"× × ×œ×”×–×™×Ÿ ×ת ×”×¤×¨×˜×™× ×¢×œ מדוע החבילה ××™× ×” בתוקף, מומלץ להוסיף ×§×™×©×•×¨×™× ×œ×”×›×¨×–×•×ª "
+"המת×ימות ×ו לקובצי הגרסה העדכנית."
msgid "Comments"
-msgstr ""
+msgstr "תגובות"
msgid "Flag"
-msgstr ""
+msgstr "סימון"
msgid "Only registered users can flag packages out-of-date."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×™×›×•×œ×™× ×œ×¡×ž×Ÿ חבילות כפגות תוקף."
msgid "Package Merging"
-msgstr ""
+msgstr "מיזוג חבילות"
msgid "Merge Package"
-msgstr ""
+msgstr "מיזוג חבילה"
#, php-format
msgid "Use this form to merge the package base %s%s%s into another package. "
msgstr ""
msgid "The following packages will be deleted: "
-msgstr ""
+msgstr "החבילות הב×ות תימחקנה:"
msgid "Once the package has been merged it cannot be reversed. "
-msgstr ""
+msgstr "ל×חר מיזוג החבילות ×œ× × ×™×ª×Ÿ לחזור ×חורה בתהליך."
msgid "Enter the package name you wish to merge the package into. "
-msgstr ""
+msgstr "× × ×œ×”×–×™×Ÿ ×ת ×©× ×”×—×‘×™×œ×” ש×ליה ברצונך למזג ×ת החבילה."
msgid "Merge into:"
-msgstr ""
+msgstr "מיזוג לתוך:"
msgid "Confirm package merge"
-msgstr ""
+msgstr "×ימות מיזוג חבילה"
msgid "Merge"
-msgstr ""
+msgstr "מיזוג"
msgid "Only Trusted Users and Developers can merge packages."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×ž×–×’ חבילות."
msgid "Submit Request"
-msgstr ""
+msgstr "שליחת בקשה"
msgid "Close Request"
-msgstr ""
+msgstr "סגירת בקשה"
msgid "First"
-msgstr ""
+msgstr "ר×שון"
msgid "Previous"
-msgstr ""
+msgstr "הקוד×"
msgid "Next"
msgstr "הב×"
msgid "Last"
-msgstr ""
+msgstr "×חרון"
msgid "Requests"
-msgstr ""
+msgstr "בקשות"
msgid "Register"
-msgstr ""
+msgstr "הרשמה"
msgid "Use this form to create an account."
msgstr "ניתן להשתמש בטופס זה על מנת ליצור חשבון."
@@ -493,7 +527,7 @@ msgid "Voting is closed for this proposal."
msgstr "ההצבעה סגורה עבור הצעה זו."
msgid "Only Trusted Users are allowed to vote."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×ž×•×¨×©×™× ×œ×”×¦×‘×™×¢."
msgid "You cannot vote in an proposal about you."
msgstr "×ין ב×פשרותך להצביע עבור הצעה הקשורה בך."
@@ -505,13 +539,13 @@ msgid "Vote ID not valid."
msgstr "מס׳ הזיהוי של ההצבעה ×ינו תקין."
msgid "Current Votes"
-msgstr "הצבעות נוכחיות"
+msgstr "קולות נוכחיי×"
msgid "Past Votes"
-msgstr ""
+msgstr "קולות עבר"
msgid "Voters"
-msgstr ""
+msgstr "מצביעי×"
msgid ""
"Account registration has been disabled for your IP address, probably due to "
@@ -519,7 +553,7 @@ msgid ""
msgstr ""
msgid "Missing User ID"
-msgstr "חסר מס׳ הזיהוי של המשתמש"
+msgstr "מס׳ הזיהוי של המשתמש חסר"
msgid "The username is invalid."
msgstr "×©× ×”×ž×©×ª×ž×© ×ינו חוקי."
@@ -538,58 +572,60 @@ msgid "The email address is invalid."
msgstr "כתובת הדו×״ל שהוזנה ××™× ×” תקינה."
msgid "The PGP key fingerprint is invalid."
-msgstr ""
+msgstr "טביעת ×”×צבע מסוג PGP שגויה."
msgid "The SSH public key is invalid."
-msgstr ""
+msgstr "מפתח ה־SSH הציבורי שגוי."
msgid "Cannot increase account permissions."
-msgstr ""
+msgstr "×œ× × ×™×ª×Ÿ להגדיל ×ת הרש×ות החשבון."
msgid "Language is not currently supported."
msgstr "שפה כרגע ×œ× × ×ª×ž×›×ª."
#, php-format
msgid "The username, %s%s%s, is already in use."
-msgstr ""
+msgstr "×©× ×”×ž×©×ª×ž×©, %s%s%s, כבר × ×ž×¦× ×‘×©×™×ž×•×©."
#, php-format
msgid "The address, %s%s%s, is already in use."
-msgstr ""
+msgstr "הכתובת, %s%s%s, כבר נמצ×ת בשימוש."
#, php-format
msgid "The SSH public key, %s%s%s, is already in use."
-msgstr ""
+msgstr "מפתח ×”Ö¾SSH הציבורי, %s%s%s, כבר × ×ž×¦× ×‘×©×™×ž×•×©."
#, php-format
msgid "Error trying to create account, %s%s%s."
-msgstr ""
+msgstr "×ירעה שגי××” בניסיון ליצירת חשבון, %s%s%s."
#, php-format
msgid "The account, %s%s%s, has been successfully created."
-msgstr ""
+msgstr "החשבון, %s%s%s, נוצר בהצלחה."
msgid "A password reset key has been sent to your e-mail address."
-msgstr ""
+msgstr "מפתח ×יפוס ססמה נשלח לכתובת הדו×״ל שלך."
msgid "Click on the Login link above to use your account."
-msgstr ""
+msgstr "× × ×œ×œ×—×•×¥ על קישור הכניסה להלן כדי להשתמש בחשבון שלך."
#, php-format
msgid "No changes were made to the account, %s%s%s."
-msgstr ""
+msgstr "×œ× ×‘×•×¦×¢×• ×©×™× ×•×™×™× ×‘×—×©×‘×•×Ÿ, %s%s%s."
#, php-format
msgid "The account, %s%s%s, has been successfully modified."
-msgstr ""
+msgstr "החשבון, %s%s%s, השתנה בהצלחה."
msgid ""
"The login form is currently disabled for your IP address, probably due to "
"sustained spam attacks. Sorry for the inconvenience."
msgstr ""
+"כתובת הכניסה מנוטרלת לכתובת ×”Ö¾ IP שלך, כנר××” עקב מתקפות ספ×× ×ž×ª×ž×©×›×•×ª. ×נו "
+"×ž×ª× ×¦×œ×™× ×¢×œ ××™ הנוחות."
msgid "Account suspended"
-msgstr ""
+msgstr "חשבון מושעה"
#, php-format
msgid ""
@@ -599,35 +635,35 @@ msgid ""
msgstr ""
msgid "Bad username or password."
-msgstr ""
+msgstr "×©× ×”×ž×©×ª×ž×© ×ו הססמה שגויי×."
msgid "An error occurred trying to generate a user session."
-msgstr ""
+msgstr "×ירעה שגי××” בעת הניסיון ליצירת הפעלת משתמש."
msgid "Invalid e-mail and reset key combination."
-msgstr ""
+msgstr "השילוב בין כתובת דו×״ל למפתח ×יפוס שגוי."
msgid "None"
-msgstr ""
+msgstr "לל×"
#, php-format
msgid "View account information for %s"
-msgstr ""
+msgstr "הצגת פרטי החשבון %s"
msgid "Package base ID or package base name missing."
msgstr ""
msgid "You are not allowed to edit this comment."
-msgstr ""
+msgstr "×ין לך הרש××” לערוך ×ת התגובה הזו."
msgid "Comment does not exist."
-msgstr ""
+msgstr "התגובה ××™× ×” קיימת."
msgid "Comment cannot be empty."
-msgstr ""
+msgstr "התגובה ×œ× ×™×›×•×œ×” להיש×ר ריקה."
msgid "Comment has been added."
-msgstr ""
+msgstr "נוספה תגובה."
msgid "You must be logged in before you can edit package information."
msgstr "עליך להיכנס לפני שיהיה ב×פשרותך לערוך נתוני חבילה."
@@ -636,19 +672,19 @@ msgid "Missing comment ID."
msgstr "חסר מס׳ זיהוי להערה."
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "××™ ×פשר להצמיד למעלה מ־5 תגובות."
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "×ין לך הרש××” להצמיד תגובה זו."
msgid "You are not allowed to unpin this comment."
-msgstr ""
+msgstr "×ין לך הרשה לבטל ×ת ההצמדה של תגובה זו."
msgid "Comment has been pinned."
-msgstr ""
+msgstr "התגובה הוצמדה."
msgid "Comment has been unpinned."
-msgstr ""
+msgstr "הצמדת התגובה בוטלה."
msgid "Error retrieving package details."
msgstr "שגי××” בקבלת נתוני חבילה."
@@ -663,7 +699,7 @@ msgid "You did not select any packages to flag."
msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª לסימון."
msgid "The selected packages have not been flagged, please enter a comment."
-msgstr ""
+msgstr "החבילות הנבחרות ×œ× ×¡×•×ž× ×•, × × ×œ×›×ª×•×‘ תגובה."
msgid "The selected packages have been flagged out-of-date."
msgstr "החבילות שנבחרו מסומנות ×›×œ× ×¢×“×›× ×™×•×ª."
@@ -678,7 +714,7 @@ msgid "The selected packages have been unflagged."
msgstr "החבילות שנבחרו בוטלו מהסימון."
msgid "You do not have permission to delete packages."
-msgstr ""
+msgstr "×ין לך הרש××” למחוק חבילות."
msgid "You did not select any packages to delete."
msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª למחיקה."
@@ -690,19 +726,19 @@ msgid "You must be logged in before you can adopt packages."
msgstr "עליך להיכנס לפני שיהיה ב×פשרותך ל×מץ חבילות."
msgid "You must be logged in before you can disown packages."
-msgstr "עליך להיכנס לפני שיהיה ב×פשרותך לבטל בעלות מחבילות."
+msgstr "עליך להיכנס לפני שיהיה ב×פשרותך לנתק בעלות על חבילות."
msgid "You did not select any packages to adopt."
msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª ל×ימוץ."
msgid "You did not select any packages to disown."
-msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª להסרת בעלותך מהן."
+msgstr "×œ× ×‘×—×¨×ª ×©×•× ×—×‘×™×œ×•×ª לניתוק בעלותך מהן."
msgid "The selected packages have been adopted."
msgstr "החבילות שנבחרו ×ומצו."
msgid "The selected packages have been disowned."
-msgstr "החבילות המסומנות ננטשו"
+msgstr "החבילות המסומנות ננטשו על ידי בעליהן."
msgid "You must be logged in before you can vote for packages."
msgstr "עליך להיכנס לפני שתהיה ב×פשרותך להצביע לחבילות."
@@ -731,10 +767,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "הוסרת מרשימה ההתרעות עבור ההערות של %s."
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "×ין לך הרש××” לשחזר ×ת התגובה הזו."
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "התגובה שוחזרה."
msgid "You are not allowed to delete this comment."
msgstr "×ין לך הרש××” למחוק הערה זו."
@@ -743,7 +779,7 @@ msgid "Comment has been deleted."
msgstr "הערה נמחקה."
msgid "Comment has been edited."
-msgstr ""
+msgstr "התגובה נערכה."
msgid "You are not allowed to edit the keywords of this package base."
msgstr ""
@@ -752,56 +788,56 @@ msgid "The package base keywords have been updated."
msgstr ""
msgid "You are not allowed to manage co-maintainers of this package base."
-msgstr ""
+msgstr "×ין לך הרש××” לנהל ×ת מתחזקי המשנה לבסיס חבילה ×–×”."
#, php-format
msgid "Invalid user name: %s"
-msgstr ""
+msgstr "×©× ×ž×©×ª×ž×© שגוי: %s"
msgid "The package base co-maintainers have been updated."
-msgstr ""
+msgstr "מתחזקי המשנה של בסיס החבילה עודכנו."
msgid "View packages details for"
-msgstr ""
+msgstr "הצגת פרטי החבילה עבור"
#, php-format
msgid "requires %s"
msgstr ""
msgid "You must be logged in to file package requests."
-msgstr ""
+msgstr "עליך להיכנס כדי להגיש בקשות חבילה."
msgid "Invalid name: only lowercase letters are allowed."
msgstr "×©× ×œ× ×—×•×§×™: רק ×ותיות קטנות מותרות."
msgid "The comment field must not be empty."
-msgstr ""
+msgstr "שדה התגובה ×œ× ×™×›×•×œ להיש×ר ריק."
msgid "Invalid request type."
-msgstr ""
+msgstr "סוג הבקשה שגוי."
msgid "Added request successfully."
-msgstr ""
+msgstr "התגובה נוספה בהצלחה."
msgid "Invalid reason."
-msgstr ""
+msgstr "הסיבה שגויה."
msgid "Only TUs and developers can close requests."
-msgstr ""
+msgstr "רק ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™× ×•×ž×¤×ª×—×™× ×™×›×•×œ×™× ×œ×¡×’×•×¨ בקשות."
msgid "Request closed successfully."
-msgstr ""
+msgstr "הבקשה נסגרה בהצלחה."
#, php-format
msgid "You can use this form to permanently delete the AUR account %s."
-msgstr ""
+msgstr "ניתן להשתמש בטופס ×–×” כדי למחוק ×ת חשבון ×”Ö¾AUR ×‘×©× %s לצמיתות."
#, php-format
msgid "%sWARNING%s: This action cannot be undone."
-msgstr ""
+msgstr "%s×זהרה%s: ×œ× × ×™×ª×Ÿ לחזור בך מפעולה זו."
msgid "Confirm deletion"
-msgstr ""
+msgstr "×ימות מחיקה"
msgid "Username"
msgstr "×©× ×ž×©×ª×ž×©"
@@ -816,7 +852,7 @@ msgid "Developer"
msgstr "מפתח"
msgid "Trusted User & Developer"
-msgstr ""
+msgstr "משתמש מהימן ומפתח"
msgid "Email Address"
msgstr "כתובת דו×״ל"
@@ -827,24 +863,30 @@ msgstr ""
msgid "Real Name"
msgstr "×©× ×מתי"
+msgid "Homepage"
+msgstr "עמוד הבית"
+
msgid "IRC Nick"
-msgstr "כינוי ב־IRC"
+msgstr "כינוי IRC"
msgid "PGP Key Fingerprint"
-msgstr ""
+msgstr "טביעת ×צבע מסוג PGP"
msgid "Status"
msgstr "מצב"
msgid "Inactive since"
-msgstr ""
+msgstr "×ין פעילות מ××–"
msgid "Active"
msgstr "פעיל"
-msgid "Last Login"
+msgid "Registration date:"
msgstr ""
+msgid "Last Login"
+msgstr "כניסה ×חרונה"
+
msgid "Never"
msgstr "לעול×"
@@ -852,10 +894,14 @@ msgid "View this user's packages"
msgstr "צפייה בחבילות המשתמש"
msgid "Edit this user's account"
-msgstr ""
+msgstr "עריכת החשבון של משתמש זה"
#, php-format
msgid "Click %shere%s if you want to permanently delete this account."
+msgstr "× × ×œ×œ×—×•×¥ %s×›×ן%s ×× ×¨×¦×•× ×š ×”×•× ×œ×ž×—×•×§ ×ת החשבון ×”×–×” לצמיתות."
+
+#, php-format
+msgid "Click %shere%s for user details."
msgstr ""
msgid "required"
@@ -871,15 +917,15 @@ msgid "Account Suspended"
msgstr "חשבון מושעה"
msgid "Inactive"
-msgstr ""
+msgstr "בלתי פעיל"
msgid ""
"Please ensure you correctly entered your email address, otherwise you will "
"be locked out."
-msgstr ""
+msgstr "× × ×œ×•×•×“× ×©×”×–× ×ª ×ת כתובת הדו×״ל שלך כר×וי, ×חרת חשבונך יינעל."
msgid "Hide Email Address"
-msgstr ""
+msgstr "הסתרת כתובת דו×״ל"
msgid "Re-type password"
msgstr "הקלדת הססמה מחדש"
@@ -890,19 +936,22 @@ msgstr "שפה"
msgid ""
"The following information is only required if you want to submit packages to "
"the Arch User Repository."
-msgstr ""
+msgstr "המידע ×”×‘× × ×—×•×¥ רק ×× ×‘×¨×¦×•× ×š להגיש חבילות למ×גר החבילות של ×רץ׳."
msgid "SSH Public Key"
-msgstr ""
+msgstr "מפתח SSH ציבורי"
msgid "Notification settings"
-msgstr ""
+msgstr "הגדרות התרעה"
msgid "Notify of new comments"
-msgstr ""
+msgstr "להודיע לי על תגובות חדשות"
msgid "Notify of package updates"
-msgstr ""
+msgstr "להודיע לי ל ×¢×“×›×•× ×™× ×‘×—×‘×™×œ×”"
+
+msgid "Notify of ownership changes"
+msgstr "להודיע לי על ×©×™× ×•×™×™× ×‘×‘×¢×œ×•×ª"
msgid "Update"
msgstr "עדכון"
@@ -923,7 +972,7 @@ msgid "Suspended"
msgstr "השעייה"
msgid "Edit"
-msgstr ""
+msgstr "עריכה"
msgid "Less"
msgstr "פחות"
@@ -938,12 +987,13 @@ msgstr "×ין יותר תוצ×ות להצגה."
msgid ""
"Use this form to add co-maintainers for %s%s%s (one user name per line):"
msgstr ""
+"ניתן להשתמש בטופס ×–×” כדי להוסיף מתחזקי משנה %s%s%s (×©× ×ž×©×ª×ž×© ×חד בשורה):"
msgid "Users"
-msgstr ""
+msgstr "משתמשי×"
msgid "Save"
-msgstr ""
+msgstr "שמירה"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
@@ -955,35 +1005,35 @@ msgstr ""
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s ××™× ×” מסומנת כפגת תוקף."
msgid "Return to Details"
-msgstr ""
+msgstr "חזרה לפרטי×"
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
-msgstr ""
+msgstr "כל הזכויות שמורות %s 2004-%d לצוות הפיתוח של aurweb."
msgid "My Packages"
msgstr "החבילות שלי"
msgid " My Account"
-msgstr ""
+msgstr "החשבון שלי"
msgid "Package Actions"
-msgstr ""
+msgstr "פעולות חבילה"
msgid "View PKGBUILD"
-msgstr ""
+msgstr "הצגת ה־PKGBUILD"
msgid "View Changes"
-msgstr ""
+msgstr "הצגת השינויי×"
msgid "Download snapshot"
-msgstr ""
+msgstr "הורדת לכידה עדכנית"
msgid "Search wiki"
-msgstr ""
+msgstr "חיפוש בוויקי"
#, php-format
msgid "Flagged out-of-date (%s)"
@@ -993,43 +1043,46 @@ msgid "Flag package out-of-date"
msgstr ""
msgid "Unflag package"
-msgstr ""
+msgstr "ביטול סימון חבילה"
msgid "Remove vote"
-msgstr ""
+msgstr "הסרת הצבעה"
msgid "Vote for this package"
-msgstr ""
+msgstr "להצביע לחבילה זו"
msgid "Disable notifications"
-msgstr ""
+msgstr "נטרול התרעות"
+
+msgid "Enable notifications"
+msgstr "הפעלת התרעות"
msgid "Manage Co-Maintainers"
-msgstr ""
+msgstr "ניהול מתחזקי משנה"
#, php-format
msgid "%d pending request"
msgid_plural "%d pending requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "בקשה %d ממתינה"
+msgstr[1] "%d בקשות ממתינות"
msgid "Adopt Package"
-msgstr ""
+msgstr "×ימוץ חבילה"
msgid "unknown"
-msgstr ""
+msgstr "×œ× ×ž×•×›×¨"
msgid "Package Base Details"
-msgstr ""
+msgstr "פרטי בסיס החבילה"
msgid "Git Clone URL"
-msgstr ""
+msgstr "כתובת השכפול מ־Git"
msgid "read-only"
-msgstr ""
+msgstr "לקרי××” בלבד"
msgid "Keywords"
-msgstr ""
+msgstr "מילות מפתח"
msgid "Submitter"
msgstr ""
@@ -1038,120 +1091,117 @@ msgid "Maintainer"
msgstr "מתחזק"
msgid "Last Packager"
-msgstr ""
+msgstr "× ×רז ל×חרונה ×¢×´×™"
msgid "Votes"
msgstr "הצבעות"
msgid "Popularity"
-msgstr ""
+msgstr "פופולריות"
msgid "First Submitted"
-msgstr ""
+msgstr "נשלחה לר×שונה"
msgid "Last Updated"
-msgstr ""
+msgstr "עודכנה ב×חרונה"
#, php-format
msgid "Edit comment for: %s"
-msgstr ""
+msgstr "עריכת תגובה עבור: %s"
msgid "Add Comment"
-msgstr ""
+msgstr "הוספת תגובה"
msgid "View all comments"
-msgstr ""
+msgstr "הצגת כל התגובות"
msgid "Pinned Comments"
-msgstr ""
+msgstr "תגובות נעוצות"
msgid "Latest Comments"
-msgstr ""
+msgstr "התגובות ×”×חרונות"
#, php-format
msgid "%s commented on %s"
-msgstr ""
+msgstr "נכתבה תגובה ע״י %s על %s"
#, php-format
msgid "Anonymous comment on %s"
-msgstr ""
+msgstr "תגובה ×למונית על %s"
#, php-format
msgid "deleted on %s by %s"
-msgstr ""
+msgstr "נמחקה ב־%s ע״י %s"
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "נמחקה ב־%s"
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "נערכה בת×ריך %s ×¢×´×™ %s"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "נערכה ב־%s"
msgid "Undelete comment"
-msgstr ""
+msgstr "ביטול מחיקת התגובה"
msgid "Delete comment"
msgstr "מחיקת הערה"
msgid "Pin comment"
-msgstr ""
+msgstr "הצמדת התגובה"
msgid "Unpin comment"
-msgstr ""
+msgstr "ביטול הצמדת התגובה"
msgid "All comments"
-msgstr ""
+msgstr "כל התגובות"
msgid "Package Details"
msgstr "נתוני חבילה"
msgid "Package Base"
-msgstr ""
+msgstr "בסיס החבילה"
msgid "Description"
msgstr "תי×ור"
msgid "Upstream URL"
-msgstr ""
+msgstr "כתובת מ×גר המקור"
msgid "Visit the website for"
-msgstr ""
+msgstr "ביקור ב×תר של"
msgid "Licenses"
-msgstr ""
+msgstr "רישיונות"
msgid "Groups"
-msgstr ""
+msgstr "קבוצות"
msgid "Conflicts"
-msgstr ""
+msgstr "התנגשויות"
msgid "Provides"
-msgstr ""
+msgstr "מספקת"
msgid "Replaces"
-msgstr ""
+msgstr "מחליפה"
msgid "Dependencies"
-msgstr "תלות"
+msgstr "תלויות"
msgid "Required by"
-msgstr "נדרש על ידי"
+msgstr "נדרשת על ידי"
msgid "Sources"
-msgstr ""
+msgstr "מקורות"
#, php-format
msgid "Use this form to close the request for package base %s%s%s."
-msgstr ""
-
-msgid "Note"
-msgstr ""
+msgstr "ניתן להשתמש בטופס ×–×” כדי לסגור ×ת הבקשה לבסיס החבילה %s%s%s."
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
@@ -1159,13 +1209,13 @@ msgid ""
msgstr ""
msgid "Reason"
-msgstr ""
+msgstr "סיבה"
msgid "Accepted"
-msgstr ""
+msgstr "התקבל"
msgid "Rejected"
-msgstr ""
+msgstr "נדחה"
#, php-format
msgid ""
@@ -1174,81 +1224,103 @@ msgid ""
msgstr ""
msgid "Request type"
-msgstr ""
+msgstr "סוג הבקשה"
msgid "Deletion"
-msgstr ""
+msgstr "מחיקה"
msgid "Orphan"
-msgstr ""
+msgstr "יתומה"
msgid "Merge into"
+msgstr "מיזוג לתוך"
+
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
msgstr ""
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "נמצ××” בקשה ×חת (%d) לחבילה."
+msgstr[1] "נמצ×ו %d בקשות לחבילות."
#, php-format
msgid "Page %d of %d."
-msgstr ""
+msgstr "עמוד %d מתוך %d."
msgid "Package"
-msgstr ""
+msgstr "חבילה"
msgid "Filed by"
-msgstr ""
+msgstr "הוגש ע״י"
msgid "Date"
-msgstr ""
+msgstr "ת×ריך"
#, php-format
-msgid "~%d days left"
-msgstr ""
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "נותר ~%d ×חד"
+msgstr[1] "נותרו ~%d ימי×"
#, php-format
msgid "~%d hour left"
msgid_plural "~%d hours left"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "נותרה שעה ~%d"
+msgstr[1] "~%d שעות נותרו"
msgid "<1 hour left"
-msgstr ""
+msgstr "נותרה פחות משעה"
msgid "Accept"
-msgstr ""
+msgstr "קבלה"
msgid "Locked"
-msgstr ""
+msgstr "ננעל"
msgid "Close"
-msgstr ""
+msgstr "סגירה"
msgid "Closed"
-msgstr ""
+msgstr "סגור"
msgid "Name, Description"
-msgstr ""
+msgstr "ש×, תי×ור"
msgid "Name Only"
-msgstr ""
+msgstr "×©× ×‘×œ×‘×“"
msgid "Exact Name"
-msgstr ""
+msgstr "×©× ×ž×“×•×™×§"
msgid "Exact Package Base"
-msgstr ""
+msgstr "בסיס החבילה המדויק"
msgid "All"
-msgstr ""
+msgstr "הכול"
msgid "Flagged"
-msgstr ""
+msgstr "מסומנת"
msgid "Not Flagged"
-msgstr ""
+msgstr "×œ× ×ž×¡×•×ž× ×ª"
msgid "Name"
msgstr "ש×"
@@ -1257,22 +1329,22 @@ msgid "Voted"
msgstr "הצביעו"
msgid "Last modified"
-msgstr ""
+msgstr "מועד שינוי ×חרון"
msgid "Ascending"
-msgstr ""
+msgstr "עולה"
msgid "Descending"
-msgstr ""
+msgstr "יורד"
msgid "Enter search criteria"
-msgstr ""
+msgstr "× × ×œ×”×–×™×Ÿ תנ××™ חיפוש"
msgid "Search by"
msgstr "חיפוש לפי"
msgid "Out of Date"
-msgstr ""
+msgstr "×œ× ×¢×“×›× ×™"
msgid "Sort by"
msgstr "סידור לפי"
@@ -1298,15 +1370,16 @@ msgstr "×ין חבילות התו×מות לנתוני החיפוש שלך."
#, php-format
msgid "%d package found."
msgid_plural "%d packages found."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "נמצ××” חבילה %d."
+msgstr[1] "נמצ×ו %d חבילות."
msgid "Version"
-msgstr ""
+msgstr "גרסה"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
msgid "Yes"
@@ -1325,7 +1398,7 @@ msgid "Adopt Packages"
msgstr "×ימוץ חבילות"
msgid "Disown Packages"
-msgstr "שחרור בעלות על חבילות"
+msgstr "ניתוק בעלות על חבילות"
msgid "Delete Packages"
msgstr "מחיקת חבילות"
@@ -1340,37 +1413,37 @@ msgid "Search"
msgstr "חיפוש"
msgid "Statistics"
-msgstr ""
+msgstr "סטטיסטיקות"
msgid "Orphan Packages"
-msgstr ""
+msgstr "חבילות יתומות"
msgid "Packages added in the past 7 days"
-msgstr ""
+msgstr "חבילות שנוספו בשבוע החולף"
msgid "Packages updated in the past 7 days"
-msgstr ""
+msgstr "חבילות שעודכנו בשבוע החולף"
msgid "Packages updated in the past year"
-msgstr ""
+msgstr "חבילות שעודכנו בשנה החולפת"
msgid "Packages never updated"
-msgstr ""
+msgstr "חבילות ×©×œ× ×¢×•×“×›× ×• מעול×"
msgid "Registered Users"
-msgstr ""
+msgstr "×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×"
msgid "Trusted Users"
-msgstr ""
+msgstr "×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™×"
msgid "Recent Updates"
-msgstr ""
+msgstr "×¢×“×›×•× ×™× ×חרוני×"
msgid "more"
-msgstr ""
+msgstr "עוד"
msgid "My Statistics"
-msgstr ""
+msgstr "הסטטיסטיקות שלי"
msgid "Proposal Details"
msgstr "פרטי הצעה"
@@ -1386,7 +1459,7 @@ msgid "End"
msgstr "סוף"
msgid "Result"
-msgstr ""
+msgstr "תוצ××”"
msgid "No"
msgstr "ל×"
@@ -1398,13 +1471,13 @@ msgid "Total"
msgstr "סך הכול"
msgid "Participation"
-msgstr ""
+msgstr "השתתפות"
msgid "Last Votes by TU"
-msgstr ""
+msgstr "הצבעות ×חרונות של ×ž×©×ª×ž×©×™× ×ž×”×™×ž× ×™×"
msgid "Last vote"
-msgstr ""
+msgstr "הצבעה ×חרונה"
msgid "No results found."
msgstr "תוצ×ות ×œ× × ×ž×¦×ו."
diff --git a/po/hr.po b/po/hr.po
index 71c151c..2bf3963 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-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"
diff --git a/po/hu.po b/po/hu.po
index 4c3bf82..a232069 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -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"
diff --git a/po/it.po b/po/it.po
index 21f1a5e..e0047f3 100644
--- a/po/it.po
+++ b/po/it.po
@@ -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ì"
diff --git a/po/ja.po b/po/ja.po
index add4f67..fae1a94 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -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 "自分ã®çµ±è¨ˆ"
diff --git a/po/nb.po b/po/nb.po
index a16d6c0..08597e5 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -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"
diff --git a/po/nl.po b/po/nl.po
index 80bf1f0..99432f5 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: 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"
diff --git a/po/pl.po b/po/pl.po
index a444aa5..d7338ca 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -9,15 +9,16 @@
# Chris Warrick <kwpolska@gmail.com>, 2012
# Kwpolska <kwpolska@kwpolska.tk>, 2011
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
+# Michal T <zorza2@gmail.com>, 2016
# Nuc1eoN <nucrap@hotmail.com>, 2014
# Piotr Strębski <strebski@o2.pl>, 2013-2016
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-13 13:13+0000\n"
-"Last-Translator: Piotr Strębski <strebski@o2.pl>\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-12 09:11+0000\n"
+"Last-Translator: Michal T <zorza2@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/lfleischer/aur/language/"
"pl/)\n"
"Language: pl\n"
@@ -33,6 +34,20 @@ msgstr "Nie znaleziono strony"
msgid "Sorry, the page you've requested does not exist."
msgstr "Przepraszamy, strona o którą prosiłeś nie istnieje."
+msgid "Note"
+msgstr "Uwaga"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr "Adresy URL GIT clone nie sÄ… przeznaczone do otwierania w przeglÄ…darce."
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "Aby sklonować repozytorium GIT-a %s, uruchom %s."
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "Kliknij %stutaj%s by powrócić do strony szczegółów %s."
+
msgid "Service Unavailable"
msgstr "Usługa niedostępna"
@@ -61,13 +76,13 @@ msgid "Use this form to search existing accounts."
msgstr "Przy użyciu tego formularza możesz przeszukać istniejące konta."
msgid "You must log in to view user information."
-msgstr "Musisz być zalogowany aby móc oglądać informacje o użytkownikach."
+msgstr "Musisz być zalogowany, aby móc przeglądać informacje o użytkownikach."
msgid "Add Proposal"
-msgstr "Dodaj PropozycjÄ™"
+msgstr "Dodaj propozycjÄ™"
msgid "Invalid token for user action."
-msgstr "Nieprawidłowy token dla akcji użytkownika."
+msgstr "Nieprawidłowy token dla czynności użytkownika."
msgid "Username does not exist."
msgstr "Nazwa użytkownika nie istnieje."
@@ -89,10 +104,10 @@ msgid "Submit a proposal to vote on."
msgstr "Wyślij propozycję do głosowania."
msgid "Applicant/TU"
-msgstr "Wnioskodawca/TU"
+msgstr "Wnioskodawca/ZU"
msgid "(empty if not applicable)"
-msgstr "(puste jeśli nie dotyczy)"
+msgstr "(puste, jeśli nie dotyczy)"
msgid "Type"
msgstr "Rodzaj"
@@ -153,6 +168,7 @@ msgid ""
"AUR packages are user produced content. Any use of the provided files is at "
"your own risk."
msgstr ""
+"Pakiety w AUR są tworzone przez użytkowników. Używasz ich na własne ryzyko."
msgid "Learn more..."
msgstr "Dowiedz się więcej..."
@@ -161,7 +177,7 @@ msgid "Support"
msgstr "Wsparcie"
msgid "Package Requests"
-msgstr "Propozycje pakietu"
+msgstr "Prośby o pakiet"
#, php-format
msgid ""
@@ -176,9 +192,11 @@ msgid ""
"Request a package to be disowned, e.g. when the maintainer is inactive and "
"the package has been flagged out-of-date for a long time."
msgstr ""
+"Wnioskuj o wyrzeczenie własności pakietu - np. gdy zarządzający jest "
+"nieaktywny i pakiet został oznaczony jako przestarzały dawno temu."
msgid "Deletion Request"
-msgstr "Propozycja usunięcia"
+msgstr "Prośba o usunięcie"
msgid ""
"Request a package to be removed from the Arch User Repository. Please do not "
@@ -187,7 +205,7 @@ msgid ""
msgstr ""
msgid "Merge Request"
-msgstr "Propozycja połączenia"
+msgstr "Prośba o połączenie"
msgid ""
"Request a package to be merged into another one. Can be used when a package "
@@ -211,7 +229,7 @@ msgid ""
msgstr ""
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr ""
+msgstr "Następujące odciski SSH są używane przez AUR:"
msgid "Discussion"
msgstr "Dyskusja"
@@ -222,6 +240,10 @@ msgid ""
"structure takes place on %saur-general%s. For discussion relating to the "
"development of the AUR web interface, use the %saur-dev%s mailing list."
msgstr ""
+"Ogólna dyskusja dotycząca Repozytorium Użytkowników Arch (AUR) i struktury "
+"Zaufanych Użytkowników odbywa się na %saur-general%s. Dyskusja dotycząca "
+"rozwoju interfejsu webowego AUR odbywa się zaś na liście dyskusyjnej %saur-"
+"dev%s."
msgid "Bug Reporting"
msgstr "Zgłaszanie błędów"
@@ -233,6 +255,10 @@ msgid ""
"%sonly%s. To report packaging bugs contact the package maintainer or leave a "
"comment on the appropriate package page."
msgstr ""
+"Jeśli znalazłeś błąd w interfejsie webowym AUR, zgłoś go w naszym %ssystemie "
+"śledzenia błędów%s. Używaj go %swyłącznie%s do zgłaszania błędów związanych "
+"z interfejsem webowym AUR. Błędy powiązane z pakietami zgłaszaj ich "
+"opiekunom lub zostaw komentarz pod odpowiednim pakietem."
msgid "Package Search"
msgstr "Wyszukiwanie pakietów"
@@ -346,12 +372,13 @@ msgid ""
"The selected packages have not been disowned, check the confirmation "
"checkbox."
msgstr ""
+"Wybrane pakiety nie zostały porzucone, sprawdź pole wyboru potwierdzenia."
msgid "Cannot find package to merge votes and comments into."
msgstr "Nie można znaleźć pakietu do scalenia głosów i komentarzy."
msgid "Cannot merge a package base with itself."
-msgstr "Nie można połączyć bazowego pakietu z nim samym."
+msgstr "Nie można połączyć bazy pakietu z nią samą."
msgid ""
"The selected packages have not been deleted, check the confirmation checkbox."
@@ -395,25 +422,29 @@ msgid ""
"Use this form to disown the package base %s%s%s which includes the following "
"packages: "
msgstr ""
+"Użyj tego formularza, aby złożyć prośbę wyrzeczenie własności bazie pakietu "
+"%s%s%s, która zawiera następujące pakiety:"
#, php-format
msgid ""
"By selecting the checkbox, you confirm that you want to disown the package "
"and transfer ownership to %s%s%s."
msgstr ""
+"Zaznaczając pole wyboru potwierdzasz, że chcesz porzucić pakiet i przenieść "
+"własność na %s%s%s."
msgid ""
"By selecting the checkbox, you confirm that you want to disown the package."
-msgstr ""
+msgstr "Zaznaczając pole wyboru potwierdzasz, że chcesz porzucić pakiet."
msgid "Confirm to disown the package"
-msgstr ""
+msgstr "Potwierdź porzucenie pakietu"
msgid "Disown"
msgstr "Porzuć"
msgid "Only Trusted Users and Developers can disown packages."
-msgstr ""
+msgstr "Tylko Zaufani Użytkownicy i Programiści mogą porzucać pakiety."
msgid "Flag Comment"
msgstr "Oznacz komentarz"
@@ -426,17 +457,24 @@ msgid ""
"Use this form to flag the package base %s%s%s and the following packages out-"
"of-date: "
msgstr ""
+"Użyj tego formularza, aby oznaczyć bazę pakietu %s%s%s i następujące pakiety "
+"jako nieaktualne:"
#, php-format
msgid ""
"Please do %snot%s use this form to report bugs. Use the package comments "
"instead."
msgstr ""
+"Prosimy %snie%s używać tego formularza do zgłaszania błędów. Użyj do tego "
+"systemu komentowania pakietu."
msgid ""
"Enter details on why the package is out-of-date below, preferably including "
"links to the release announcement or the new release tarball."
msgstr ""
+"Wprowadź poniżej szczegóły, dlaczego pakiet został oznaczony jako "
+"nieaktualny, najlepiej łącznie z odnośnikiem do ogłoszenia o nowym wydaniu "
+"lub do archiwum tarball nowego wydania."
msgid "Comments"
msgstr "Kommentarze"
@@ -446,6 +484,7 @@ msgstr "Oznacz"
msgid "Only registered users can flag packages out-of-date."
msgstr ""
+"Tylko zarejestrowani użytkownicy mogą oznaczać pakiety jako nieaktualne."
msgid "Package Merging"
msgstr "Scalanie pakietów"
@@ -481,10 +520,10 @@ msgid "Only Trusted Users and Developers can merge packages."
msgstr "Tylko Zaufani Użytkownicy i Deweloperzy mogą scalać pakiety."
msgid "Submit Request"
-msgstr "Prześlij propozycję"
+msgstr "Prześlij prośbę"
msgid "Close Request"
-msgstr "Zamknij propozycjÄ™"
+msgstr "Zamknij prośbę"
msgid "First"
msgstr "Pierwsza"
@@ -499,7 +538,7 @@ msgid "Last"
msgstr "Ostatnia"
msgid "Requests"
-msgstr "Propozycje"
+msgstr "Prośby"
msgid "Register"
msgstr "Zarejestruj siÄ™"
@@ -526,13 +565,13 @@ msgid "You've already voted for this proposal."
msgstr "Już zagłosowałeś na tą propozycję"
msgid "Vote ID not valid."
-msgstr "ID głosowania nieprawidłowe."
+msgstr "Nieprawidłowy identyfikator głosowania."
msgid "Current Votes"
-msgstr "Obecne GÅ‚osy"
+msgstr "Obecne głosy"
msgid "Past Votes"
-msgstr "Poprzednie GÅ‚osy"
+msgstr "Poprzednie głosy"
msgid "Voters"
msgstr "GÅ‚osujÄ…cych"
@@ -586,7 +625,7 @@ msgstr "Adres, %s%s%s, jest już używany."
#, php-format
msgid "The SSH public key, %s%s%s, is already in use."
-msgstr ""
+msgstr "Publiczny klucz SSH, %s%s%s, jest już używany."
#, php-format
msgid "Error trying to create account, %s%s%s."
@@ -649,16 +688,16 @@ msgid "View account information for %s"
msgstr "Wyświetl informacje o koncie %s"
msgid "Package base ID or package base name missing."
-msgstr ""
+msgstr "Brakuje identyfikatora lub nazwy bazy pakietów."
msgid "You are not allowed to edit this comment."
-msgstr ""
+msgstr "Nie masz uprawnień do edycji tego komentarza."
msgid "Comment does not exist."
-msgstr ""
+msgstr "Komentarz nie istnieje."
msgid "Comment cannot be empty."
-msgstr ""
+msgstr "Komentarz nie może być pusty."
msgid "Comment has been added."
msgstr "Komentarz został dodany."
@@ -670,19 +709,19 @@ msgid "Missing comment ID."
msgstr "Brakuje identyfikatora komentarza."
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "Można przypiąć nie więcej niż 5 komentarzy."
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "Nie masz uprawnień do przypięcia tego komentarza."
msgid "You are not allowed to unpin this comment."
-msgstr ""
+msgstr "Nie masz uprawnień do odpięcia tego komentarza."
msgid "Comment has been pinned."
-msgstr ""
+msgstr "Komentarz został przypięty."
msgid "Comment has been unpinned."
-msgstr ""
+msgstr "Komentarz został odpięty."
msgid "Error retrieving package details."
msgstr "BÅ‚Ä…d podczas pobierania informacji o pakiecie."
@@ -698,6 +737,7 @@ msgstr "Nie wybrałeś żadnych pakietów do oznaczenia."
msgid "The selected packages have not been flagged, please enter a comment."
msgstr ""
+"Zaznaczone pakiety nie zostały oznaczone, prosimy o wpisanie komentarza."
msgid "The selected packages have been flagged out-of-date."
msgstr "Wybrane pakiety zostały oznaczone jako nieaktualne."
@@ -724,7 +764,7 @@ msgid "You must be logged in before you can adopt packages."
msgstr "Musisz być zalogowany aby móc przejmować pakiety."
msgid "You must be logged in before you can disown packages."
-msgstr "Musisz być zalogowany aby móc porzucać pakiety."
+msgstr "Musisz być zalogowany, aby móc porzucać pakiety."
msgid "You did not select any packages to adopt."
msgstr "Nie wybrałeś żadnych pakietów do przejęcia."
@@ -765,10 +805,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "Zostałeś usunięty z listy powiadamiania o komentarzach dla %s."
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "Nie masz uprawnień do cofnięcia usunięcia tego komentarza."
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "Zostało cofnięte usunięcie komentarza."
msgid "You are not allowed to delete this comment."
msgstr "Nie masz uprawnień do usunięcia tego komentarza."
@@ -777,33 +817,33 @@ msgid "Comment has been deleted."
msgstr "Komentarz został usunięty."
msgid "Comment has been edited."
-msgstr ""
+msgstr "Komentarz został zmodyfikowany."
msgid "You are not allowed to edit the keywords of this package base."
-msgstr ""
+msgstr "Nie masz uprawnień, by modyfikować słowa kluczowe tej bazy pakietów."
msgid "The package base keywords have been updated."
-msgstr ""
+msgstr "Słowa kluczowe bazy pakietu zostały zaktualizowane."
msgid "You are not allowed to manage co-maintainers of this package base."
-msgstr ""
+msgstr "Nie masz uprawnień, by zarządzać współutrzymującymi tej bazy pakietu."
#, php-format
msgid "Invalid user name: %s"
msgstr "Niepoprawna nazwa użytkownika: %s"
msgid "The package base co-maintainers have been updated."
-msgstr ""
+msgstr "Współutrzymujący bazy pakietu zostali zaktualizowani."
msgid "View packages details for"
msgstr "Wyświetl informacje o pakiecie"
#, php-format
msgid "requires %s"
-msgstr ""
+msgstr "wymaga %s"
msgid "You must be logged in to file package requests."
-msgstr "Musisz być zalogowanym, aby złożyć propozycje pakietu."
+msgstr "Musisz być zalogowanym, aby złożyć prośbę o pakiet."
msgid "Invalid name: only lowercase letters are allowed."
msgstr "Nieprawidłowa nazwa: tylko małe litery są dozwolone."
@@ -812,19 +852,19 @@ msgid "The comment field must not be empty."
msgstr "Pole komentarzy nie może pozostać pustę."
msgid "Invalid request type."
-msgstr "Nieprawidłowy rodzaj propozycji."
+msgstr "Nieprawidłowy rodzaj prośby."
msgid "Added request successfully."
-msgstr "Pomyślnie dodano propozycję."
+msgstr "Pomyślnie dodano prośbę."
msgid "Invalid reason."
msgstr "Nieprawidłowy powód."
msgid "Only TUs and developers can close requests."
-msgstr "Tylko Zaufani Użytkownicy i Deweloperzy mogą zamykać propozycje."
+msgstr "Tylko Zaufani Użytkownicy i programiści mogą zamykać prośby."
msgid "Request closed successfully."
-msgstr "Pomyślnie zamknięto propozycję."
+msgstr "Pomyślnie zamknięto prośbę."
#, php-format
msgid "You can use this form to permanently delete the AUR account %s."
@@ -856,11 +896,14 @@ msgid "Email Address"
msgstr "Adres e-mail"
msgid "hidden"
-msgstr ""
+msgstr "ukryte"
msgid "Real Name"
msgstr "ImiÄ™ i nazwisko"
+msgid "Homepage"
+msgstr "Strona główna"
+
msgid "IRC Nick"
msgstr "Nick na IRC-u"
@@ -876,6 +919,9 @@ msgstr "Nieaktywny od"
msgid "Active"
msgstr "Aktywne"
+msgid "Registration date:"
+msgstr "Data rejestracji:"
+
msgid "Last Login"
msgstr "Ostatnie logowanie"
@@ -890,7 +936,11 @@ msgstr "Edycja tego konta użytkownika"
#, php-format
msgid "Click %shere%s if you want to permanently delete this account."
-msgstr "Kliknij %stutaj%s jeśli chcesz nieodwracalnie usunąć to konto."
+msgstr "Kliknij %stutaj%s, jeśli chcesz nieodwracalnie usunąć to konto."
+
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "Kliknij %stutaj%s by wyświetlić szczegóły użytkownika."
msgid "required"
msgstr "wymagane"
@@ -911,9 +961,11 @@ msgid ""
"Please ensure you correctly entered your email address, otherwise you will "
"be locked out."
msgstr ""
+"Upewnij siÄ™, czy poprawnie wpisano adres e-mail, w przeciwnym razie "
+"zostaniesz zablokowany."
msgid "Hide Email Address"
-msgstr ""
+msgstr "Ukryj adres e-mail"
msgid "Re-type password"
msgstr "Hasło (ponownie)"
@@ -925,18 +977,23 @@ msgid ""
"The following information is only required if you want to submit packages to "
"the Arch User Repository."
msgstr ""
+"Następująca informacja jest wymagana jedynie w sytuacji, gdy chcesz przesłać "
+"pakiety do Repozytorium Użytkowników Arch."
msgid "SSH Public Key"
msgstr "Klucz publiczny SSH"
msgid "Notification settings"
-msgstr ""
+msgstr "Ustawienia powiadomień"
msgid "Notify of new comments"
msgstr "Powiadom o nowych komentarzach"
msgid "Notify of package updates"
-msgstr ""
+msgstr "Powiadom o aktualizacjach pakietu"
+
+msgid "Notify of ownership changes"
+msgstr "Powiadom o zmianie właściciela"
msgid "Update"
msgstr "Aktualizuj"
@@ -972,6 +1029,8 @@ msgstr "Brak wyników do wyświetlenia."
msgid ""
"Use this form to add co-maintainers for %s%s%s (one user name per line):"
msgstr ""
+"Użyj tego formularza, aby dodać współutrzymujących %s%s%s (jedna nazwa "
+"użytkownika na wiersz):"
msgid "Users"
msgstr "Użytkownicy"
@@ -981,22 +1040,23 @@ msgstr "Zapisz"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "Komentarz do oznaczenia jako nieaktualny: %s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
msgstr ""
+"%s%s%s oznaczył %s%s%s jako nieaktualny dnia %s%s%s z następującego powodu:"
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s nie jest oznaczone jako nieaktualne."
msgid "Return to Details"
-msgstr ""
+msgstr "Powrót do szczegółów"
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
-msgstr ""
+msgstr "Prawa autorskie %s 2004-%d Zespół Programistów aurweb."
msgid "My Packages"
msgstr "Moje pakiety"
@@ -1014,14 +1074,14 @@ msgid "View Changes"
msgstr "Zobacz zmiany"
msgid "Download snapshot"
-msgstr ""
+msgstr "Pobierz migawkÄ™"
msgid "Search wiki"
msgstr "Przeszukaj wiki"
#, php-format
msgid "Flagged out-of-date (%s)"
-msgstr ""
+msgstr "Oznaczono jako nieaktualny (%s)"
msgid "Flag package out-of-date"
msgstr "Oznacz pakiet jako nieaktualny"
@@ -1038,15 +1098,18 @@ msgstr "Zagłosuj na ten pakiet"
msgid "Disable notifications"
msgstr "Wyłącz powiadomienia"
+msgid "Enable notifications"
+msgstr "WÅ‚Ä…cz powiadomienia"
+
msgid "Manage Co-Maintainers"
-msgstr ""
+msgstr "Zarządzanie współutrzymującymi"
#, php-format
msgid "%d pending request"
msgid_plural "%d pending requests"
-msgstr[0] "%d propozycja w toku"
-msgstr[1] "%d propozycje w toku"
-msgstr[2] "%d propozycji w toku"
+msgstr[0] "%d prośba w toku"
+msgstr[1] "%d prośby w toku"
+msgstr[2] "%d próśb w toku"
msgid "Adopt Package"
msgstr "Przejmij pakiet"
@@ -1058,10 +1121,10 @@ msgid "Package Base Details"
msgstr "Szczegóły bazy pakietu"
msgid "Git Clone URL"
-msgstr ""
+msgstr "URL klonu Git"
msgid "read-only"
-msgstr ""
+msgstr "tylko do odczytu"
msgid "Keywords"
msgstr "SÅ‚owa kluczowe"
@@ -1082,14 +1145,14 @@ msgid "Popularity"
msgstr "Popularność"
msgid "First Submitted"
-msgstr "Wysłany"
+msgstr "Umieszczony"
msgid "Last Updated"
msgstr "Ostatnia aktualizacja"
#, php-format
msgid "Edit comment for: %s"
-msgstr ""
+msgstr "Edycja komentarza do: %s"
msgid "Add Comment"
msgstr "Dodaj komentarz"
@@ -1098,46 +1161,46 @@ msgid "View all comments"
msgstr "Pokaż wszystkie komentarze"
msgid "Pinned Comments"
-msgstr ""
+msgstr "Przypięte komentarze"
msgid "Latest Comments"
msgstr "Ostatnie komentarze"
#, php-format
msgid "%s commented on %s"
-msgstr ""
+msgstr "%s skomentował dnia %s"
#, php-format
msgid "Anonymous comment on %s"
-msgstr ""
+msgstr "Anonimowy komentarz do %s"
#, php-format
msgid "deleted on %s by %s"
-msgstr ""
+msgstr "usunięte %s przez %s"
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "usunięte %s"
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "edytowane %s przez %s"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "edytowane %s"
msgid "Undelete comment"
-msgstr ""
+msgstr "Cofnij usunięcie komentarza"
msgid "Delete comment"
msgstr "Usuń komentarz"
msgid "Pin comment"
-msgstr ""
+msgstr "Przypnij komentarz"
msgid "Unpin comment"
-msgstr ""
+msgstr "Odepnij komentarz"
msgid "All comments"
msgstr "Wszystkie komentarze"
@@ -1152,7 +1215,7 @@ msgid "Description"
msgstr "Opis"
msgid "Upstream URL"
-msgstr "URL upstreamu"
+msgstr "URL źródła"
msgid "Visit the website for"
msgstr "Odwiedź stronę pakietu"
@@ -1183,15 +1246,14 @@ msgstr "Źródła"
#, php-format
msgid "Use this form to close the request for package base %s%s%s."
-msgstr ""
-
-msgid "Note"
-msgstr "Uwaga"
+msgstr "Użyj tego formularza, aby zamknąć prośbę o bazę pakietów %s%s%s."
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
msgstr ""
+"Pole komentarza może zostać pozostawione pustym. Jednakże w przypadku "
+"odrzucenia prośby dodanie komentarza jest wysoce polecane."
msgid "Reason"
msgstr "Powód"
@@ -1207,11 +1269,11 @@ msgid ""
"Use this form to file a request against package base %s%s%s which includes "
"the following packages:"
msgstr ""
-"Użyj tego formularza, aby złożyć propozycję na bazę pakietu %s%s%s i "
-"następujące pakiety:"
+"Użyj tego formularza, aby złożyć prośbę przeciwko bazie pakietu %s%s%s, "
+"która zawiera następujące pakiety:"
msgid "Request type"
-msgstr "Rodzaj propozycji"
+msgstr "Rodzaj prośby"
msgid "Deletion"
msgstr "Usunięcie"
@@ -1222,12 +1284,32 @@ msgstr "Bez opiekuna"
msgid "Merge into"
msgstr "Scal z"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
-msgstr[0] "%d propozycje znaleziono"
-msgstr[1] "%d propozycje znaleziono."
-msgstr[2] "%d propozycji znaleziono."
+msgstr[0] "%d prośba odnaleziona."
+msgstr[1] "%d prośby odnalezione."
+msgstr[2] "%d próśb odnaleziono."
#, php-format
msgid "Page %d of %d."
@@ -1243,8 +1325,11 @@ msgid "Date"
msgstr "Data"
#, php-format
-msgid "~%d days left"
-msgstr "pozostało ~%d dni"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "pozostało ~%d dzień"
+msgstr[1] "pozostało ~%d dni"
+msgstr[2] "pozostało ~%d dni"
#, php-format
msgid "~%d hour left"
@@ -1293,10 +1378,10 @@ msgid "Name"
msgstr "Nazwa"
msgid "Voted"
-msgstr "GÅ‚os"
+msgstr "Zagłosowany"
msgid "Last modified"
-msgstr ""
+msgstr "Ostatnio zmienione"
msgid "Ascending"
msgstr "RosnÄ…co"
@@ -1344,9 +1429,10 @@ msgstr[2] "%d pakietów znaleziono"
msgid "Version"
msgstr "Wersja"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
msgid "Yes"
@@ -1407,7 +1493,7 @@ msgid "Recent Updates"
msgstr "Ostatnie aktualizacje"
msgid "more"
-msgstr ""
+msgstr "więcej"
msgid "My Statistics"
msgstr "Moje statystyki"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index b5fec0d..f653b43 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -4,8 +4,9 @@
#
# Translators:
# Albino Biasutti Neto Bino <biasuttin@gmail.com>, 2011
+# Fábio Nogueira <deb.user.ba@gmail.com>, 2016
# Rafael Fontenelle <rffontenelle@gmail.com>, 2012-2015
-# Rafael Fontenelle <rffontenelle@gmail.com>, 2011,2015
+# Rafael Fontenelle <rffontenelle@gmail.com>, 2011,2015-2016
# Rafael Fontenelle <rffontenelle@gmail.com>, 2011
# Sandro <sandrossv@hotmail.com>, 2011
# Sandro <sandrossv@hotmail.com>, 2011
@@ -13,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 21:44+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 14:05+0000\n"
"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/lfleischer/aur/"
"language/pt_BR/)\n"
@@ -30,8 +31,22 @@ msgstr "Página não encontrada"
msgid "Sorry, the page you've requested does not exist."
msgstr "Desculpe, a página que você solicitou não existe."
+msgid "Note"
+msgstr "Nota"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr "URLs de git-clone não servem para ser abertas em um navegador."
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "Para clonar o repositório Git de %s, execute %s."
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "Clique %saqui%s para retornar para a página de detalhes de %s."
+
msgid "Service Unavailable"
-msgstr "Serviço Indisponível"
+msgstr "Serviço indisponível"
msgid ""
"Don't panic! This site is down due to maintenance. We will be back soon."
@@ -86,7 +101,7 @@ msgid "Submit a proposal to vote on."
msgstr "Enviar uma proposta para ser votada."
msgid "Applicant/TU"
-msgstr "Requerente/TU"
+msgstr "Requerente/UC"
msgid "(empty if not applicable)"
msgstr "(vazio se não aplicável)"
@@ -95,13 +110,13 @@ msgid "Type"
msgstr "Tipo"
msgid "Addition of a TU"
-msgstr "Adição de um TU"
+msgstr "Adição de um UC"
msgid "Removal of a TU"
-msgstr "Remoção de um TU"
+msgstr "Remoção de um UC"
msgid "Removal of a TU (undeclared inactivity)"
-msgstr "Remoção de um TU (inatividade não declarada)"
+msgstr "Remoção de um UC (inatividade não declarada)"
msgid "Amendment of Bylaws"
msgstr "Emenda ao Estatuto"
@@ -127,7 +142,7 @@ msgid ""
"Guidelines%s for more information."
msgstr ""
"Bem-vindo ao AUR! Por favor, leia as %sDiretrizes de Usuário do AUR%s e "
-"%sDiretrizes de TU do AUR%s para mais informações."
+"%sDiretrizes de UC do AUR%s para mais informações."
#, php-format
msgid ""
@@ -227,7 +242,7 @@ msgstr ""
"detalhes."
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr "As seguintes fingeprints SSH são usadas para o AUR:"
+msgstr "As seguintes impressões digitais SSH são usadas para o AUR:"
msgid "Discussion"
msgstr "Discussão"
@@ -239,8 +254,9 @@ msgid ""
"development of the AUR web interface, use the %saur-dev%s mailing list."
msgstr ""
"Discussões gerais no que se refere à estrutura do Arch User Repository (AUR) "
-"e do Trusted User acontecem no %saur-general%s. Para discussão relacionada "
-"ao desenvolvimento do AUR web, use a lista de discussão do %saur-dev%s"
+"e do Usuário Confiável acontecem no %saur-general%s. Para discussão "
+"relacionada ao desenvolvimento do AUR web, use a lista de discussão do %saur-"
+"dev%s"
msgid "Bug Reporting"
msgstr "Relatório de erros"
@@ -410,7 +426,7 @@ msgid "Delete"
msgstr "Excluir"
msgid "Only Trusted Users and Developers can delete packages."
-msgstr "Somente Trusted Users e Desenvolvedores podem excluir pacotes."
+msgstr "Somente Usuários Confiáveis e Desenvolvedores podem excluir pacotes."
msgid "Disown Package"
msgstr "Abandonar pacote"
@@ -443,7 +459,7 @@ msgid "Disown"
msgstr "Abandonar"
msgid "Only Trusted Users and Developers can disown packages."
-msgstr "Apenas Trusted Users e Desenvolvedores podem abandonar pacotes."
+msgstr "Apenas Usuários Confiáveis e Desenvolvedores podem abandonar pacotes."
msgid "Flag Comment"
msgstr "Comentário da marcação"
@@ -515,7 +531,7 @@ msgid "Merge"
msgstr "Mesclar"
msgid "Only Trusted Users and Developers can merge packages."
-msgstr "Somente Trusted Users e Desenvolvedores podem mesclar pacotes."
+msgstr "Somente Usuários Confiáveis e Desenvolvedores podem mesclar pacotes."
msgid "Submit Request"
msgstr "Enviar requisição"
@@ -545,7 +561,7 @@ msgid "Use this form to create an account."
msgstr "Utilize este formulário para criar uma conta."
msgid "Trusted User"
-msgstr "Trusted User"
+msgstr "Usuário confiável"
msgid "Could not retrieve proposal details."
msgstr "Não foi possível adquirir detalhes da proposta."
@@ -554,7 +570,7 @@ msgid "Voting is closed for this proposal."
msgstr "A votação está encerrada para esta proposta."
msgid "Only Trusted Users are allowed to vote."
-msgstr "Apenas Trusted Users têm permissão para votar."
+msgstr "Apenas Usuários Confiáveis têm permissão para votar."
msgid "You cannot vote in an proposal about you."
msgstr "Você não pode votar em uma proposta sobre você."
@@ -630,7 +646,7 @@ msgstr "Erro ao tentar criar uma conta, %s%s%s."
#, php-format
msgid "The account, %s%s%s, has been successfully created."
-msgstr "A conta, %s%s%s, foi criada com sucesso."
+msgstr "A conta %s%s%s foi criada com sucesso."
msgid "A password reset key has been sent to your e-mail address."
msgstr ""
@@ -645,7 +661,7 @@ msgstr "Nenhuma alteração foi feita na conta, %s%s%s."
#, php-format
msgid "The account, %s%s%s, has been successfully modified."
-msgstr "A conta, %s%s%s, foi modificada com sucesso."
+msgstr "A conta %s%s%s foi modificada com sucesso."
msgid ""
"The login form is currently disabled for your IP address, probably due to "
@@ -861,7 +877,7 @@ msgid "Invalid reason."
msgstr "Motivo inválido"
msgid "Only TUs and developers can close requests."
-msgstr "Apenas TUs e desenvolvedores podem fechar requisições"
+msgstr "Apenas UCs e desenvolvedores podem fechar requisições."
msgid "Request closed successfully."
msgstr "Requisição fechada com sucesso"
@@ -892,7 +908,7 @@ msgid "Developer"
msgstr "Desenvolvedor"
msgid "Trusted User & Developer"
-msgstr "Trusted User & Desenvolvedor"
+msgstr "Usuário Confiável & Desenvolvedor"
msgid "Email Address"
msgstr "Endereço de e-mail"
@@ -903,6 +919,9 @@ msgstr "oculto"
msgid "Real Name"
msgstr "Nome real"
+msgid "Homepage"
+msgstr "Página inicial"
+
msgid "IRC Nick"
msgstr "Apelido no IRC"
@@ -918,6 +937,9 @@ msgstr "Inativo desde"
msgid "Active"
msgstr "Ativa"
+msgid "Registration date:"
+msgstr "Data de registro:"
+
msgid "Last Login"
msgstr "Último login"
@@ -934,6 +956,10 @@ msgstr "Edite a conta desse usuário"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "Clique %saqui%s se você deseja excluir permanentemente esta conta."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "Clique %saqui%s para os detalhes do usuário."
+
msgid "required"
msgstr "obrigatório"
@@ -984,6 +1010,9 @@ msgstr "Notificar sobre novos comentários"
msgid "Notify of package updates"
msgstr "Notificar sobre atualizações de pacotes"
+msgid "Notify of ownership changes"
+msgstr "Notificar sobre mudanças de mantenedor"
+
msgid "Update"
msgstr "Atualizar"
@@ -1087,6 +1116,9 @@ msgstr "Votar neste pacote"
msgid "Disable notifications"
msgstr "Desabilitar notificações"
+msgid "Enable notifications"
+msgstr "Habilitar notificações"
+
msgid "Manage Co-Maintainers"
msgstr "Gerenciar comantenedores"
@@ -1234,9 +1266,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
"Use esse formulário para fechar a requisição para o pacote base %s%s%s."
-msgid "Note"
-msgstr "Nota"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1273,6 +1302,39 @@ msgstr "Tornar órfão"
msgid "Merge into"
msgstr "Mesclar em"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"Ao enviar uma requisição de exclusão, você solicita que um Trusted User "
+"exclua o pacote base. Esse tipo de requisição deveria ser usada em caso de "
+"duplicidade, softwares abandonados pelo upstream, assim como pacotes ilegais "
+"ou irreparavelmente quebrados."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"Ao enviar uma requisição de mesclagem, você solicita que um Trusted User "
+"exclua o pacote base e transfira seus votos e comentários para um outro "
+"pacote base. Mesclar um pacote não afeta os repositórios Git "
+"correspondentes. Certifique-se de você mesmo atualizar o histórico Git do "
+"pacote alvo."
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"Ao enviar uma requisição de tornar órfão, você pede que um Trusted User "
+"abandona o pacote base. Por favor, apenas faça isto se o pacote precise de "
+"ação do mantenedor, estando este ausente por muito tempo, e você já tentou - "
+"e não conseguiu - contatá-lo anteriormente."
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1293,8 +1355,10 @@ msgid "Date"
msgstr "Data"
#, php-format
-msgid "~%d days left"
-msgstr "~%d dias restantes"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d dia restante"
+msgstr[1] "~%d dias restantes"
#, php-format
msgid "~%d hour left"
@@ -1392,12 +1456,13 @@ msgstr[1] "%d pacotes encontrados."
msgid "Version"
msgstr "Versão"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
"Popularidade é calculada como a soma de todos os votos, sendo cada voto "
-"pesado com um fator de 0.98 por dia desde sua criação."
+"pesado com um fator de %.2f por dia desde sua criação."
msgid "Yes"
msgstr "Sim"
@@ -1451,7 +1516,7 @@ msgid "Registered Users"
msgstr "Usuários registrados"
msgid "Trusted Users"
-msgstr "Trusted Users"
+msgstr "Usuários Confiáveis"
msgid "Recent Updates"
msgstr "Atualizações recentes"
@@ -1491,7 +1556,7 @@ msgid "Participation"
msgstr "Participação"
msgid "Last Votes by TU"
-msgstr "Últimos votos por TU"
+msgstr "Últimos votos por UC"
msgid "Last vote"
msgstr "Último voto"
diff --git a/po/pt_PT.po b/po/pt_PT.po
index fa61d35..59ecb4f 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Portuguese (Portugal) (http://www.transifex.com/lfleischer/"
"aur/language/pt_PT/)\n"
@@ -29,6 +29,20 @@ msgstr "Página Não Encontrada"
msgid "Sorry, the page you've requested does not exist."
msgstr "As nossas desculpas, a página que pediu não existe."
+msgid "Note"
+msgstr ""
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
msgid "Service Unavailable"
msgstr "Serviço não disponível"
@@ -876,6 +890,9 @@ msgstr ""
msgid "Real Name"
msgstr "Nome real"
+msgid "Homepage"
+msgstr ""
+
msgid "IRC Nick"
msgstr "Nick IRC"
@@ -891,6 +908,9 @@ msgstr "Inativo desde"
msgid "Active"
msgstr "Activo"
+msgid "Registration date:"
+msgstr ""
+
msgid "Last Login"
msgstr "Última sessão"
@@ -907,6 +927,10 @@ msgstr "Editar a conta deste utilizador"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr ""
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
msgid "required"
msgstr "necessário"
@@ -953,6 +977,9 @@ msgstr "Notificar-me sobre novos comentários"
msgid "Notify of package updates"
msgstr ""
+msgid "Notify of ownership changes"
+msgstr ""
+
msgid "Update"
msgstr "Actualizar"
@@ -1053,6 +1080,9 @@ msgstr "Votar neste pacote"
msgid "Disable notifications"
msgstr "Desativar notificações"
+msgid "Enable notifications"
+msgstr ""
+
msgid "Manage Co-Maintainers"
msgstr ""
@@ -1199,9 +1229,6 @@ msgstr "Fontes"
msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
-msgid "Note"
-msgstr ""
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1236,6 +1263,26 @@ msgstr "Orfão"
msgid "Merge into"
msgstr "Juntar em"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1256,8 +1303,10 @@ msgid "Date"
msgstr "Data"
#, php-format
-msgid "~%d days left"
-msgstr ""
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] ""
+msgstr[1] ""
#, php-format
msgid "~%d hour left"
@@ -1355,9 +1404,10 @@ msgstr[1] "%d pacotes encontrados."
msgid "Version"
msgstr "Versão"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
msgid "Yes"
diff --git a/po/ro.po b/po/ro.po
index 250c7ff..85172d9 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -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"
diff --git a/po/ru.po b/po/ru.po
index e55f487..530947e 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -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 "ГолоÑование продолжаетÑÑ."
diff --git a/po/sk.po b/po/sk.po
index d96c4ac..4a564e9 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -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"
diff --git a/po/sr.po b/po/sr.po
index e0c352b..32a5739 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -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"
diff --git a/po/tr.po b/po/tr.po
index 2e6fdf8..b5ddf23 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -9,14 +9,15 @@
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
# Samed Beyribey <ras0ir@eventualis.org>, 2012
# Samed Beyribey <samed@ozguryazilim.com.tr>, 2012
+# Serpil Acar <acarserpil89@gmail.com>, 2016
# Atilla Öntaş <tarakbumba@gmail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
-"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-09 05:38+0000\n"
+"Last-Translator: Serpil Acar <acarserpil89@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/lfleischer/aur/language/"
"tr/)\n"
"Language: tr\n"
@@ -31,6 +32,20 @@ msgstr "Sayfa Bulunamadı"
msgid "Sorry, the page you've requested does not exist."
msgstr "Üzgünüz, talep ettiğiniz sayfa bulunamadı."
+msgid "Note"
+msgstr "Not"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr "Git clone linkleri bir tarayıcıda açılamazlar."
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "%s'in Git deposunu kopyalamak için, %s komutunu çalıştırın."
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "Detaylar sayfasına %s geri dönmek için %sburaya%s tıklayınız."
+
msgid "Service Unavailable"
msgstr "Hizmete EriÅŸilemiyor"
@@ -290,7 +305,7 @@ msgid "Enter login credentials"
msgstr "GiriÅŸ bilgilerinizi doldurun"
msgid "User name or email address"
-msgstr ""
+msgstr "Kullanıcı adı veya e-posta adresi"
msgid "Password"
msgstr "Parola"
@@ -443,10 +458,10 @@ msgstr ""
"bırakabilir."
msgid "Flag Comment"
-msgstr ""
+msgstr "Yorumu Ä°ÅŸaretle"
msgid "Flag Package Out-Of-Date"
-msgstr ""
+msgstr "Paketi güncel değil olarak işaretle"
#, php-format
msgid ""
@@ -464,6 +479,8 @@ msgid ""
"Enter details on why the package is out-of-date below, preferably including "
"links to the release announcement or the new release tarball."
msgstr ""
+"Paketin neden güncel olmadığıyla ilgili detayları aşağıya girin, tercihen "
+"sürüm bildirilerinin veya yeni tarball sürümünün linklerini dahil ederek."
msgid "Comments"
msgstr "Yorumlar"
@@ -473,6 +490,7 @@ msgstr "Ä°ÅŸaretle"
msgid "Only registered users can flag packages out-of-date."
msgstr ""
+"Sadece kayıtlı kullanıcılar paketleri güncel değil olarak işaretleyebilir."
msgid "Package Merging"
msgstr "Paket birleÅŸtirme"
@@ -673,16 +691,16 @@ msgid "View account information for %s"
msgstr "%s için hesap bilgilerini görüntüle"
msgid "Package base ID or package base name missing."
-msgstr ""
+msgstr "Paket ID'si veya paket ismi eksik."
msgid "You are not allowed to edit this comment."
-msgstr ""
+msgstr "Bu yorumu düzenlemek için yetkiniz yok."
msgid "Comment does not exist."
-msgstr ""
+msgstr "Yorum bulunamadı."
msgid "Comment cannot be empty."
-msgstr ""
+msgstr "Yorum boÅŸ olamaz."
msgid "Comment has been added."
msgstr "Yorum eklendi."
@@ -694,16 +712,16 @@ msgid "Missing comment ID."
msgstr "Yorum kimliği bulunamadı."
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "5 taneden fazla yorum iÄŸnelenemez."
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "Bu yorumu iğnelemek için yetkiniz yok."
msgid "You are not allowed to unpin this comment."
msgstr ""
msgid "Comment has been pinned."
-msgstr ""
+msgstr "Yorum iÄŸnelendi."
msgid "Comment has been unpinned."
msgstr ""
@@ -721,7 +739,7 @@ msgid "You did not select any packages to flag."
msgstr "İşaretlenecek paketleri seçmediniz."
msgid "The selected packages have not been flagged, please enter a comment."
-msgstr ""
+msgstr "Seçilen paketler işaretlenmedi, lütfen bir yorum giriniz."
msgid "The selected packages have been flagged out-of-date."
msgstr "Seçilen paketler güncelliğini yitirmiş olarak işaretlendi."
@@ -789,10 +807,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "%s bildirim listesinden başarıyla çıktınız."
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "Bu silinmiş yorumu geri almak için yetkili değilsiniz."
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "Yorum silindi."
msgid "You are not allowed to delete this comment."
msgstr "Bu yorumu silme yetkiniz yok."
@@ -801,7 +819,7 @@ msgid "Comment has been deleted."
msgstr "Yorum silindi."
msgid "Comment has been edited."
-msgstr ""
+msgstr "Yorum düzenlendi."
msgid "You are not allowed to edit the keywords of this package base."
msgstr ""
@@ -826,7 +844,7 @@ msgstr "Paket detaylarını görüntüle"
#, php-format
msgid "requires %s"
-msgstr ""
+msgstr "%s'ye ihtiyaç duyuyor."
msgid "You must be logged in to file package requests."
msgstr "Paket gereksinimlerinin kaydını tutmalısın."
@@ -882,11 +900,14 @@ msgid "Email Address"
msgstr "E-posta adresi"
msgid "hidden"
-msgstr ""
+msgstr "gizli"
msgid "Real Name"
msgstr "Gerçek İsim"
+msgid "Homepage"
+msgstr "Anasayfa"
+
msgid "IRC Nick"
msgstr "IRC Rumuzu"
@@ -902,6 +923,9 @@ msgstr "Åžu tarihten beri etkin deÄŸil:"
msgid "Active"
msgstr "Etkin"
+msgid "Registration date:"
+msgstr "Kayıt tarihi:"
+
msgid "Last Login"
msgstr "Son giriÅŸ"
@@ -918,6 +942,10 @@ msgstr "Bu kullanıcının hesabını düzenleyin"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "Bu hesabı temelli olarak silmek istiyorsanız %sburaya%s tıklayın."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "Kullanıcı detayları için %sburaya%s tıklayın."
+
msgid "required"
msgstr "gerekli"
@@ -937,9 +965,11 @@ msgid ""
"Please ensure you correctly entered your email address, otherwise you will "
"be locked out."
msgstr ""
+"Lütfen e-posta adresinizi doğru girdiğinizden emin olun, aksi halde "
+"hesabınız kilitlenecektir."
msgid "Hide Email Address"
-msgstr ""
+msgstr "E-posta Adresini Gizle"
msgid "Re-type password"
msgstr "Parolayı tekrar girin"
@@ -958,13 +988,16 @@ msgid "SSH Public Key"
msgstr "SSH Kamu Anahtarı"
msgid "Notification settings"
-msgstr ""
+msgstr "Bildirim ayarları"
msgid "Notify of new comments"
msgstr "Yeni yorumları bildir"
msgid "Notify of package updates"
-msgstr ""
+msgstr "Paket güncellemelerini bildir"
+
+msgid "Notify of ownership changes"
+msgstr "Sahiplik deÄŸiÅŸikliklerini bildir."
msgid "Update"
msgstr "Güncelle"
@@ -1011,7 +1044,7 @@ msgstr "Kaydet"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "Güncel olmayan olarak işaretli yorum: %s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
@@ -1019,10 +1052,10 @@ msgstr ""
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s güncel değil olarak işaretlenmedi."
msgid "Return to Details"
-msgstr ""
+msgstr "Detaylara Geri Dön."
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
@@ -1051,7 +1084,7 @@ msgstr "Wikide ara"
#, php-format
msgid "Flagged out-of-date (%s)"
-msgstr ""
+msgstr "Güncel değil olarak işaretlendi (%s)"
msgid "Flag package out-of-date"
msgstr "Güncelliğini yitirmiş olarak işaretle"
@@ -1068,6 +1101,9 @@ msgstr "Pakete oy ver"
msgid "Disable notifications"
msgstr "Bildirimleri kapat"
+msgid "Enable notifications"
+msgstr "Bildirimleri etkinleÅŸtir"
+
msgid "Manage Co-Maintainers"
msgstr "Yardımcı Bakımcıları Yönet"
@@ -1118,7 +1154,7 @@ msgstr "Son Güncelleme"
#, php-format
msgid "Edit comment for: %s"
-msgstr ""
+msgstr "Yorumu düzenle: %s"
msgid "Add Comment"
msgstr "Yorum Ekle"
@@ -1127,43 +1163,43 @@ msgid "View all comments"
msgstr "Tüm yorumları görünüle"
msgid "Pinned Comments"
-msgstr ""
+msgstr "Ä°ÄŸnelenmiÅŸ Yorumlar"
msgid "Latest Comments"
msgstr "Son Yorumlar"
#, php-format
msgid "%s commented on %s"
-msgstr ""
+msgstr "%s, %s'e yorum yaptı."
#, php-format
msgid "Anonymous comment on %s"
-msgstr ""
+msgstr "%s'e isimsiz yorum"
#, php-format
msgid "deleted on %s by %s"
-msgstr ""
+msgstr "%s'te, %s tarafından silindi."
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "%s'te silindi."
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "%s'te, %s tarafından düzenlendi"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "%s'te düzenlendi."
msgid "Undelete comment"
-msgstr ""
+msgstr "Yorumu silmeyi geri al."
msgid "Delete comment"
msgstr "Yorumu sil"
msgid "Pin comment"
-msgstr ""
+msgstr "Yorumu iÄŸnele"
msgid "Unpin comment"
msgstr ""
@@ -1215,9 +1251,6 @@ msgid "Use this form to close the request for package base %s%s%s."
msgstr ""
"Bu formu %s%s%s paket temeli için yapılan talebi kapatmak için kullanın."
-msgid "Note"
-msgstr "Not"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1254,6 +1287,34 @@ msgstr "Öksüz"
msgid "Merge into"
msgstr "Åžununla iliÅŸkilendir:"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"Silme talebi göndererek, Güvenilir Kullanıcıdan paketi silmesini "
+"istiyorsunuz. Bu tür bir istek birden fazla olan paketlerde, geliştirilmesi "
+"durdurulmuş yazılımlarda, ve aynı zamanda yasadışı ve onarılamaz bozuklukta "
+"olan paketler için kullanılmalıdır."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"Birleştirme talebi göndererek, Güvenilir Kullanıcıdan paketi silmesini ve bu "
+"paketin oylarını ve yorumlarını diğer pakete transfer etmesini istiyorsunuz. "
+"Bir paketi birleÅŸtirmek ilgili Git deposunu etkilemeyecektir. Hedef paketin "
+"Git geçmişini bizzat güncellediğinizden emin olun. "
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1274,8 +1335,10 @@ msgid "Date"
msgstr "Tarih"
#, php-format
-msgid "~%d days left"
-msgstr "~%d gün kaldı"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d gün kaldı"
+msgstr[1] "~%d gün kaldı"
#, php-format
msgid "~%d hour left"
@@ -1326,7 +1389,7 @@ msgid "Voted"
msgstr "Oylanmış"
msgid "Last modified"
-msgstr ""
+msgstr "Son düzenleme"
msgid "Ascending"
msgstr "Eskiden yeniye"
@@ -1373,12 +1436,13 @@ msgstr[1] "%d adet paket bulundu."
msgid "Version"
msgstr "Sürüm"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
-"Beğenilirlik, oluşturulmasından itibaren günlük 0.98 oranı ile çarpılarak "
-"bulunan her oyun toplamı ile ölçülür."
+"Popülarite, oluşturulmasından itibaren günlük %.2f oranı ile "
+"ağırlaştırılarak bulunan her oyun toplamı ile ölçülür."
msgid "Yes"
msgstr "Evet"
diff --git a/po/uk.po b/po/uk.po
index b2ac3dc..8e26a4f 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 23:36+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 15:11+0000\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian (http://www.transifex.com/lfleischer/aur/language/"
"uk/)\n"
@@ -30,6 +30,21 @@ msgstr "Сторінку не знайдено"
msgid "Sorry, the page you've requested does not exist."
msgstr "Ðа жаль, запитаної Ñторінки не Ñ–Ñнує."
+msgid "Note"
+msgstr "Примітка"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr ""
+"ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñховища Git не вдаÑÑ‚ÑŒÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ в переглÑдарці."
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "Щоб клонувати Ñховище Git з %s, виконайте %s."
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "Клацніть %sтут%s Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½Ð° Ñторінку деталей %s."
+
msgid "Service Unavailable"
msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð½ÐµÐ´Ð¾Ñтупний"
@@ -895,6 +910,9 @@ msgstr "приховано"
msgid "Real Name"
msgstr "Справжнє ім'Ñ"
+msgid "Homepage"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка"
+
msgid "IRC Nick"
msgstr "ПÑевдонім IRC"
@@ -910,6 +928,9 @@ msgstr "Ðеактивний з"
msgid "Active"
msgstr "Ðктивний"
+msgid "Registration date:"
+msgstr "Дата реєÑтрації:"
+
msgid "Last Login"
msgstr "ОÑтанній вхід"
@@ -926,6 +947,10 @@ msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ цього кориÑтувача"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "ÐатиÑніть %sтут%s, Ñкщо Ви бажаєте безповоротно вилучити цей рахунок."
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "Клацніть %sтут%s Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ про кориÑтувача."
+
msgid "required"
msgstr "обов'Ñзково"
@@ -976,6 +1001,9 @@ msgstr "Сповіщати про нові коментарі"
msgid "Notify of package updates"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÑ–Ð²"
+msgid "Notify of ownership changes"
+msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ зміну влаÑника"
+
msgid "Update"
msgstr "Оновити"
@@ -1021,7 +1049,7 @@ msgstr "Зберегти"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "Позначено Ñк заÑтарілий коментар: %s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
@@ -1078,6 +1106,9 @@ msgstr "ГолоÑувати за цей пакунок"
msgid "Disable notifications"
msgstr "Відключити ÑповіщеннÑ"
+msgid "Enable notifications"
+msgstr "Включити ÑповіщеннÑ"
+
msgid "Manage Co-Maintainers"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¡ÑƒÐ¿Ñ€Ð¾Ð²Ñ–Ð´Ð½Ð¸ÐºÐ°Ð¼Ð¸"
@@ -1225,9 +1256,6 @@ msgstr "Сирці"
msgid "Use this form to close the request for package base %s%s%s."
msgstr "ВикориÑтайте цю форму Ð´Ð»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ щодо бази пакетів %s%s%s."
-msgid "Note"
-msgstr "Примітка"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1264,6 +1292,36 @@ msgstr "Позначити заÑтарілим"
msgid "Merge into"
msgstr "Об'єднати в"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"ÐадÑилаючи запит на вилученнÑ, Ви проÑите Довіреного КориÑтувача вилучити "
+"пакунок з бази. Цей тип запиту повинен викориÑтовуватиÑÑ Ð´Ð»Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð², "
+"неоновлюваних програм, а також нелегальних і невиправно пошкоджених пакунків."
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"ÐадÑилаючи запит на об'єднаннÑ, Ви проÑите Довіреного КориÑтувача вилучити "
+"пакунок Ñ– перенеÑти вÑÑ– його голоÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ– коментарі до іншого пакунку. "
+"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÑƒ не впливає на відповідні Ñховища Git. ВпевнітьÑÑ, що Ви "
+"оновили Ñамі Ñ–Ñторію Git доцільового пакунку."
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"ÐадÑилаючи запит на зреченнÑ, Ви проÑите Довіреного КориÑтувача позбавити "
+"пакунок влаÑника. Робіть це, Ñкщо пакунок потребує ÑкоїÑÑŒ дії, Ñупровідник "
+"не робить жодних дій Ñ– Ви вже попередньо намагалиÑÑ Ð·Ð²'ÑзатиÑÑ Ð· ним."
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1285,8 +1343,11 @@ msgid "Date"
msgstr "Дата"
#, php-format
-msgid "~%d days left"
-msgstr "~%d днів залишилоÑÑ"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "~%d день залишивÑÑ"
+msgstr[1] "~%d днів залишилоÑÑ"
+msgstr[2] "~%d днів залишилоÑÑ"
#, php-format
msgid "~%d hour left"
@@ -1386,12 +1447,13 @@ msgstr[2] "Знайдено %d пакунків."
msgid "Version"
msgstr "ВерÑÑ–Ñ"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
"ПопулÑрніÑÑ‚ÑŒ розраховуєтьÑÑ Ñк Ñума вÑÑ–Ñ… голоÑувань, де кожен Ð³Ð¾Ð»Ð¾Ñ Ð±ÐµÑ€ÐµÑ‚ÑŒÑÑ "
-"з ваговим коефіцієнтом 0.98 за кожен день з чаÑу ÑтвореннÑ."
+"з ваговим коефіцієнтом %.2f за кожен день з чаÑу ÑтвореннÑ."
msgid "Yes"
msgstr "Так"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 928d9fa..453e768 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -3,18 +3,19 @@
# This file is distributed under the same license as the AUR package.
#
# Translators:
-# leonfeng <chaofeng111@gmail.com>, 2015
+# leonfeng <chaofeng111@gmail.com>, 2015-2016
# dongfengweixiao <dongfengweixiao@gmail.com>, 2015
# Felix Yan <felixonmars@gmail.com>, 2014
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
# leonfeng <chaofeng111@gmail.com>, 2012
# Weiwen Zhao <panda.hust@gmail.com>, 2013
+# Xiaodong Qi <xiaodong.que+github@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-09 20:59+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-08 12:59+0000\n"
"Last-Translator: Lukas Fleischer <transifex@cryptocrack.de>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/lfleischer/aur/"
"language/zh_CN/)\n"
@@ -30,12 +31,26 @@ msgstr "页é¢æœªæ‰¾åˆ°"
msgid "Sorry, the page you've requested does not exist."
msgstr "请求的页é¢ä¸å­˜åœ¨ã€‚"
-msgid "Service Unavailable"
+msgid "Note"
+msgstr "æ示"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
msgstr ""
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr ""
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr ""
+
+msgid "Service Unavailable"
+msgstr "æœåŠ¡ä¸å¯ç”¨"
+
msgid ""
"Don't panic! This site is down due to maintenance. We will be back soon."
-msgstr ""
+msgstr "别怕ï¼æœ¬ç«™æ­£åœ¨ç»´æŠ¤ä¸­ï¼Œæˆ‘们会回æ¥çš„。"
msgid "Account"
msgstr "å¸æˆ·"
@@ -111,10 +126,10 @@ msgid "Submit"
msgstr "æ交"
msgid "Manage Co-maintainers"
-msgstr ""
+msgstr "管ç†å…±åŒç»´æŠ¤è€…"
msgid "Edit comment"
-msgstr ""
+msgstr "编辑评论"
msgid "Home"
msgstr "首页"
@@ -145,56 +160,64 @@ msgstr "å…责声明"
msgid ""
"AUR packages are user produced content. Any use of the provided files is at "
"your own risk."
-msgstr ""
+msgstr "AUR 包为用户产生的内容。使用它们造æˆçš„åŽæžœè‡ªè´Ÿã€‚"
msgid "Learn more..."
-msgstr ""
+msgstr "了解更多..."
msgid "Support"
-msgstr ""
+msgstr "支æŒ"
msgid "Package Requests"
-msgstr ""
+msgstr "软件包请求"
#, php-format
msgid ""
"There are three types of requests that can be filed in the %sPackage Actions"
"%s box on the package details page:"
-msgstr ""
+msgstr "在软件包详情页é¢ä¸Šæœ‰ä¸‰ç§å¯ä»¥åœ¨ %s软件包æ“作%s 框中æ交的请求:"
msgid "Orphan Request"
-msgstr ""
+msgstr "弃置请求"
msgid ""
"Request a package to be disowned, e.g. when the maintainer is inactive and "
"the package has been flagged out-of-date for a long time."
msgstr ""
+"请求标记这个软件包为无主的,比如维护者ä¸æ´»è·ƒè€Œä¸”这个软件包已ç»è¢«æ ‡è®°ä¸ºè¿‡æ—¶å¾ˆ"
+"久了。"
msgid "Deletion Request"
-msgstr ""
+msgstr "删除请求"
msgid ""
"Request a package to be removed from the Arch User Repository. Please do not "
"use this if a package is broken and can be fixed easily. Instead, contact "
"the package maintainer and file orphan request if necessary."
msgstr ""
+"请求软件包从 AUR 中移除。如果这个包虽然æŸå了但是å¯ä»¥è¢«è½»æ˜“地修好,请ä¸è¦è¿›è¡Œ"
+"æ­¤æ“作,您应该è”系包的维护者或者有必è¦çš„情况下å‘é€ orphan request。"
msgid "Merge Request"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚"
msgid ""
"Request a package to be merged into another one. Can be used when a package "
"needs to be renamed or replaced by a split package."
msgstr ""
+"请求一个软件包被åˆå¹¶åˆ°å¦ä¸€ä¸ªä¸­ã€‚在一个包需è¦è¢«é‡å‘½å或者被分离æˆå¤šä¸ªåŒ…的情况"
+"下使用。"
#, php-format
msgid ""
"If you want to discuss a request, you can use the %saur-requests%s mailing "
"list. However, please do not use that list to file requests."
msgstr ""
+"如果你想讨论一个请求,你å¯ä»¥åœ¨ %saur-requests%s 邮件列表上å‘é€æ¶ˆæ¯ã€‚然而,ä¸"
+"è¦åœ¨é‚£é‡Œå‘é€è¯·æ±‚。"
msgid "Submitting Packages"
-msgstr ""
+msgstr "æ交软件包"
#, php-format
msgid ""
@@ -202,9 +225,11 @@ msgid ""
"packages%s section of the Arch User Repository ArchWiki page for more "
"details."
msgstr ""
+"现在请使用 Git over SSH æ¥å‘ AUR æ交软件包。如果想知é“更多,请查看 Arch "
+"Wiki 上的 Arch User Repository (简体中文) 页é¢ä¸­ %sæ交软件包%s 章节。"
msgid "The following SSH fingerprints are used for the AUR:"
-msgstr ""
+msgstr "AUR 使用以下 SSH 指纹:"
msgid "Discussion"
msgstr "邮件列表"
@@ -215,6 +240,8 @@ msgid ""
"structure takes place on %saur-general%s. For discussion relating to the "
"development of the AUR web interface, use the %saur-dev%s mailing list."
msgstr ""
+"与 Arch 用户仓库(AUR)或者å—信用户结构相关的一般讨论在 %saur-general%s 邮件"
+"列表。若是与 AUR web 页é¢å¼€å‘相关的讨论,请使用 %saur-dev%s 邮件列表。"
msgid "Bug Reporting"
msgstr "Bug 报告"
@@ -226,6 +253,9 @@ msgid ""
"%sonly%s. To report packaging bugs contact the package maintainer or leave a "
"comment on the appropriate package page."
msgstr ""
+"如果你在 AUR web 页é¢ä¸­å‘现了一个 Bug,请æ交到我们的 %sBug 追踪系统%s。请%s"
+"ä»…ä»…%s使用追踪系统报告 AUR 自身的 Bug。如果想è¦æŠ¥å‘Šæ‰“包方é¢çš„ Bug,请è”系相应"
+"的包维护者,或者在相应的软件包页é¢ä¸­ç•™ä¸‹ä¸€æ¡è¯„论。"
msgid "Package Search"
msgstr "软件包æœç´¢"
@@ -262,7 +292,7 @@ msgid "Enter login credentials"
msgstr "输入账户信æ¯"
msgid "User name or email address"
-msgstr ""
+msgstr "用户å或 E-mail"
msgid "Password"
msgstr "密ç "
@@ -334,7 +364,7 @@ msgstr "输入您的邮箱地å€:"
msgid ""
"The selected packages have not been disowned, check the confirmation "
"checkbox."
-msgstr ""
+msgstr "选中的软件包未被弃置,请检查确认å¤é€‰æ¡†ã€‚"
msgid "Cannot find package to merge votes and comments into."
msgstr "找ä¸åˆ°åˆå¹¶æŠ•ç¥¨ä¸Žè¯„论的目标包。"
@@ -380,49 +410,51 @@ msgstr "弃置软件包"
msgid ""
"Use this form to disown the package base %s%s%s which includes the following "
"packages: "
-msgstr ""
+msgstr "使用这个表格æ¥å¼ƒç½®åŒ…基础 %s%s%s,其中包括下列软件包:"
#, php-format
msgid ""
"By selecting the checkbox, you confirm that you want to disown the package "
"and transfer ownership to %s%s%s."
-msgstr ""
+msgstr "通过选中å¤é€‰æ¡†ï¼Œæ‚¨å°†ç¡®è®¤æ‚¨å°†å¼ƒç½®è¿™ä¸ªåŒ…并将其所有æƒè½¬ç§»ç»™ %s%s%s。"
msgid ""
"By selecting the checkbox, you confirm that you want to disown the package."
-msgstr ""
+msgstr "通过选中å¤é€‰æ¡†ï¼Œæ‚¨å°†ç¡®è®¤æ‚¨å°†å¼ƒç½®è¿™ä¸ªåŒ…。"
msgid "Confirm to disown the package"
-msgstr ""
+msgstr "继续以弃置包"
msgid "Disown"
msgstr "弃置"
msgid "Only Trusted Users and Developers can disown packages."
-msgstr ""
+msgstr "åªæœ‰å—信用户和开å‘人员能弃置软件包。"
msgid "Flag Comment"
-msgstr ""
+msgstr "标记评论"
msgid "Flag Package Out-Of-Date"
-msgstr ""
+msgstr "将软件包标记为过期"
#, php-format
msgid ""
"Use this form to flag the package base %s%s%s and the following packages out-"
"of-date: "
-msgstr ""
+msgstr "使用这个表å•å°†åŒ…基础 %s%s%s 和以下包标记为已过期 :"
#, php-format
msgid ""
"Please do %snot%s use this form to report bugs. Use the package comments "
"instead."
-msgstr ""
+msgstr "请 %sä¸%s è¦ç”¨è¿™ä¸ªè¡¨å•æ交问题。请您使用包评论功能。"
msgid ""
"Enter details on why the package is out-of-date below, preferably including "
"links to the release announcement or the new release tarball."
msgstr ""
+"在下é¢è¾“入为什么这个软件包过期了,最好写一下更新日志的链接或者新版软件压缩包"
+"的地å€ã€‚"
msgid "Comments"
msgstr "评论"
@@ -431,7 +463,7 @@ msgid "Flag"
msgstr "标记"
msgid "Only registered users can flag packages out-of-date."
-msgstr ""
+msgstr "åªæœ‰å·²æ³¨å†Œçš„用户æ‰èƒ½æŠŠè½¯ä»¶æ ‡è®°ä¸ºå·²è¿‡æœŸã€‚"
msgid "Package Merging"
msgstr "软件包åˆå¹¶"
@@ -465,7 +497,7 @@ msgid "Only Trusted Users and Developers can merge packages."
msgstr "åªæœ‰å—信用户和开å‘人员æ‰èƒ½åˆ é™¤è½¯ä»¶åŒ…。"
msgid "Submit Request"
-msgstr ""
+msgstr "æ交请求"
msgid "Close Request"
msgstr "关闭请求"
@@ -551,7 +583,7 @@ msgid "The PGP key fingerprint is invalid."
msgstr "PGP 密钥指纹无效。"
msgid "The SSH public key is invalid."
-msgstr ""
+msgstr "此 SSH 公钥无效。"
msgid "Cannot increase account permissions."
msgstr "ä¸èƒ½æ高账户æƒé™ã€‚"
@@ -569,7 +601,7 @@ msgstr "è¯¥åœ°å€ %s%s%s 已被使用。"
#, php-format
msgid "The SSH public key, %s%s%s, is already in use."
-msgstr ""
+msgstr "SSH 公钥 %s%s%s 已被使用。"
#, php-format
msgid "Error trying to create account, %s%s%s."
@@ -629,16 +661,16 @@ msgid "View account information for %s"
msgstr "查看 %s 的账户信æ¯"
msgid "Package base ID or package base name missing."
-msgstr ""
+msgstr "缺少软件包基础 ID 或软件包å。"
msgid "You are not allowed to edit this comment."
-msgstr ""
+msgstr "你没有æƒé™ç¼–辑评论。"
msgid "Comment does not exist."
-msgstr ""
+msgstr "评论ä¸å­˜åœ¨ã€‚"
msgid "Comment cannot be empty."
-msgstr ""
+msgstr "评论ä¸èƒ½ä¸ºç©ºã€‚"
msgid "Comment has been added."
msgstr "å·²ç»æ·»åŠ è¯„论。"
@@ -650,19 +682,19 @@ msgid "Missing comment ID."
msgstr "评论标识丢失。"
msgid "No more than 5 comments can be pinned."
-msgstr ""
+msgstr "ä¸èƒ½åŒæ—¶é”定 5 æ¡ä»¥ä¸Šçš„评论。"
msgid "You are not allowed to pin this comment."
-msgstr ""
+msgstr "你没有æƒé™é”定这æ¡è¯„论。"
msgid "You are not allowed to unpin this comment."
-msgstr ""
+msgstr "你没有æƒé™è§£é”è¿™æ¡è¯„论。"
msgid "Comment has been pinned."
-msgstr ""
+msgstr "评论已é”定。"
msgid "Comment has been unpinned."
-msgstr ""
+msgstr "评论已解é”。"
msgid "Error retrieving package details."
msgstr "获å–软件包详情时å‘生错误。"
@@ -677,7 +709,7 @@ msgid "You did not select any packages to flag."
msgstr "您没有选择è¦æ ‡è®°çš„软件包。"
msgid "The selected packages have not been flagged, please enter a comment."
-msgstr ""
+msgstr "选中的软件包已被标记,请输入评论。"
msgid "The selected packages have been flagged out-of-date."
msgstr "选择的软件包已被标记为过期。"
@@ -745,10 +777,10 @@ msgid "You have been removed from the comment notification list for %s."
msgstr "您将ä¸å†æ”¶åˆ° %s 的评论通知。"
msgid "You are not allowed to undelete this comment."
-msgstr ""
+msgstr "你没有æƒé™æ¢å¤è¿™æ¡è¯„论。"
msgid "Comment has been undeleted."
-msgstr ""
+msgstr "评论已æ¢å¤ã€‚"
msgid "You are not allowed to delete this comment."
msgstr "您没有æƒé™åˆ é™¤æ­¤è¯„论。"
@@ -757,30 +789,30 @@ msgid "Comment has been deleted."
msgstr "评论已被删除。"
msgid "Comment has been edited."
-msgstr ""
+msgstr "评论已编辑。"
msgid "You are not allowed to edit the keywords of this package base."
-msgstr ""
+msgstr "你没有æƒé™ç¼–辑这个软件包基础的关键è¯ã€‚"
msgid "The package base keywords have been updated."
-msgstr ""
+msgstr "软件包基础的关键è¯å·²è¢«æ›´æ–°ã€‚"
msgid "You are not allowed to manage co-maintainers of this package base."
-msgstr ""
+msgstr "你没有æƒé™ç®¡ç†è¿™ä¸ªè½¯ä»¶åŒ…基础的共åŒç®¡ç†è€…。"
#, php-format
msgid "Invalid user name: %s"
-msgstr ""
+msgstr "éžæ³•ç”¨æˆ·å:%s"
msgid "The package base co-maintainers have been updated."
-msgstr ""
+msgstr "软件包基础的共åŒç»´æŠ¤è€…已更新。"
msgid "View packages details for"
msgstr "查看软件包详细信æ¯"
#, php-format
msgid "requires %s"
-msgstr ""
+msgstr "éœ€è¦ %s"
msgid "You must be logged in to file package requests."
msgstr "登录之åŽæ‰èƒ½æ交软件包需求。"
@@ -836,11 +868,14 @@ msgid "Email Address"
msgstr "Email"
msgid "hidden"
-msgstr ""
+msgstr "å·²éšè—"
msgid "Real Name"
msgstr "真实åå­—"
+msgid "Homepage"
+msgstr ""
+
msgid "IRC Nick"
msgstr "IRC昵称"
@@ -856,6 +891,9 @@ msgstr "ä¸æ´»è·ƒè‡ª"
msgid "Active"
msgstr "激活"
+msgid "Registration date:"
+msgstr ""
+
msgid "Last Login"
msgstr "最åŽç™»é™†"
@@ -872,6 +910,10 @@ msgstr "编辑此用户的å¸å·"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "如果你想è¦å½»åº•åˆ é™¤è¿™ä¸ªå¸å·ï¼Œè¯·ç‚¹å‡»%s这里%s。"
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr ""
+
msgid "required"
msgstr "å¿…å¡«"
@@ -890,10 +932,10 @@ msgstr "ä¸æ´»è·ƒ"
msgid ""
"Please ensure you correctly entered your email address, otherwise you will "
"be locked out."
-msgstr ""
+msgstr "请确认你正确地输入了你的 E-mail,或者你将会被é”定。"
msgid "Hide Email Address"
-msgstr ""
+msgstr "éšè— E-mail"
msgid "Re-type password"
msgstr "确认密ç "
@@ -904,18 +946,21 @@ msgstr "语言"
msgid ""
"The following information is only required if you want to submit packages to "
"the Arch User Repository."
-msgstr ""
+msgstr "仅仅当你想è¦å‘ AUR æ交软件包时æ‰éœ€è¦å¡«å†™ä»¥ä¸‹ä¿¡æ¯ã€‚"
msgid "SSH Public Key"
-msgstr ""
+msgstr "SSH 公钥"
msgid "Notification settings"
-msgstr ""
+msgstr "æ醒设置"
msgid "Notify of new comments"
msgstr "当有新评论的时候æ醒我"
msgid "Notify of package updates"
+msgstr "软件包更新æ醒"
+
+msgid "Notify of ownership changes"
msgstr ""
msgid "Update"
@@ -951,32 +996,32 @@ msgstr "没有更多的结果供显示。"
#, php-format
msgid ""
"Use this form to add co-maintainers for %s%s%s (one user name per line):"
-msgstr ""
+msgstr "使用这个表å•æ¥æ·»åŠ  %s%s%s çš„å…±åŒç»´æŠ¤è€…(一个用户å一行):"
msgid "Users"
-msgstr ""
+msgstr "用户"
msgid "Save"
-msgstr ""
+msgstr "ä¿å­˜"
#, php-format
msgid "Flagged Out-of-Date Comment: %s"
-msgstr ""
+msgstr "已标记为过期的评论:%s"
#, php-format
msgid "%s%s%s flagged %s%s%s out-of-date on %s%s%s for the following reason:"
-msgstr ""
+msgstr "%s%s%s 标记了 %s%s%s 为过期,在 %s%s%s,因为以下原因:"
#, php-format
msgid "%s%s%s is not flagged out-of-date."
-msgstr ""
+msgstr "%s%s%s 未被标记为过期。"
msgid "Return to Details"
-msgstr ""
+msgstr "返回详情"
#, php-format
msgid "Copyright %s 2004-%d aurweb Development Team."
-msgstr ""
+msgstr "版æƒæ‰€æœ‰ %s 2004-%d aurweb å¼€å‘组"
msgid "My Packages"
msgstr "我的软件包"
@@ -991,17 +1036,17 @@ msgid "View PKGBUILD"
msgstr "查看 PKGBUILD"
msgid "View Changes"
-msgstr ""
+msgstr "查看更改"
msgid "Download snapshot"
-msgstr ""
+msgstr "下载快照"
msgid "Search wiki"
msgstr "æœç´¢ Wiki"
#, php-format
msgid "Flagged out-of-date (%s)"
-msgstr ""
+msgstr "已标记为过期 (%s)"
msgid "Flag package out-of-date"
msgstr "将软件包标记为过期"
@@ -1018,9 +1063,12 @@ msgstr "为这个软件包投票"
msgid "Disable notifications"
msgstr "ç¦ç”¨é€šçŸ¥"
-msgid "Manage Co-Maintainers"
+msgid "Enable notifications"
msgstr ""
+msgid "Manage Co-Maintainers"
+msgstr "管ç†å…±åŒç»´æŠ¤è€…"
+
#, php-format
msgid "%d pending request"
msgid_plural "%d pending requests"
@@ -1036,10 +1084,10 @@ msgid "Package Base Details"
msgstr "包基础详情"
msgid "Git Clone URL"
-msgstr ""
+msgstr "Git 克隆地å€"
msgid "read-only"
-msgstr ""
+msgstr "åªè¯»"
msgid "Keywords"
msgstr "关键字"
@@ -1057,7 +1105,7 @@ msgid "Votes"
msgstr "得票"
msgid "Popularity"
-msgstr ""
+msgstr "å—欢迎度"
msgid "First Submitted"
msgstr "首次æ交"
@@ -1067,7 +1115,7 @@ msgstr "最åŽæ›´æ–°"
#, php-format
msgid "Edit comment for: %s"
-msgstr ""
+msgstr "编辑 %s 的评论"
msgid "Add Comment"
msgstr "添加评论"
@@ -1076,46 +1124,46 @@ msgid "View all comments"
msgstr "查看所有评论"
msgid "Pinned Comments"
-msgstr ""
+msgstr "å·²é”定评论"
msgid "Latest Comments"
msgstr "最新的评论"
#, php-format
msgid "%s commented on %s"
-msgstr ""
+msgstr "%s 在 %s å‘表了评论"
#, php-format
msgid "Anonymous comment on %s"
-msgstr ""
+msgstr "在 %s å‘表的匿å评论"
#, php-format
msgid "deleted on %s by %s"
-msgstr ""
+msgstr "在 %s 被 %s 删除"
#, php-format
msgid "deleted on %s"
-msgstr ""
+msgstr "在 %s 被删除"
#, php-format
msgid "edited on %s by %s"
-msgstr ""
+msgstr "在 %s 被 %s 编辑"
#, php-format
msgid "edited on %s"
-msgstr ""
+msgstr "在 %s 被编辑"
msgid "Undelete comment"
-msgstr ""
+msgstr "æ¢å¤è¯„论"
msgid "Delete comment"
msgstr "删除评论"
msgid "Pin comment"
-msgstr ""
+msgstr "é”定评论"
msgid "Unpin comment"
-msgstr ""
+msgstr "解é”评论"
msgid "All comments"
msgstr "全部评论"
@@ -1163,9 +1211,6 @@ msgstr "æºä»£ç :"
msgid "Use this form to close the request for package base %s%s%s."
msgstr "使用这个表å•æ¥å…³é—­å¯¹åŒ…基础 %s%s%s 的请求。"
-msgid "Note"
-msgstr "æ示"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1198,6 +1243,26 @@ msgstr "弃置"
msgid "Merge into"
msgstr "åˆå¹¶åˆ°"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1217,8 +1282,9 @@ msgid "Date"
msgstr "日期"
#, php-format
-msgid "~%d days left"
-msgstr "剩余~%d天"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] ""
#, php-format
msgid "~%d hour left"
@@ -1268,7 +1334,7 @@ msgid "Voted"
msgstr "已投票"
msgid "Last modified"
-msgstr ""
+msgstr "上次修改"
msgid "Ascending"
msgstr "从å°åˆ°å¤§"
@@ -1314,9 +1380,10 @@ msgstr[0] "找到了 %d 个软件包。"
msgid "Version"
msgstr "版本"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
+"weighted with a factor of %.2f per day since its creation."
msgstr ""
msgid "Yes"
@@ -1377,7 +1444,7 @@ msgid "Recent Updates"
msgstr "最新更新"
msgid "more"
-msgstr ""
+msgstr "更多"
msgid "My Statistics"
msgstr "我的统计"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index bb26fd5..5d1a424 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Arch User Repository (AUR)\n"
"Report-Msgid-Bugs-To: https://bugs.archlinux.org/index.php?project=2\n"
-"POT-Creation-Date: 2016-02-09 21:58+0100\n"
-"PO-Revision-Date: 2016-02-11 13:26+0000\n"
+"POT-Creation-Date: 2016-10-08 14:59+0200\n"
+"PO-Revision-Date: 2016-10-09 09:21+0000\n"
"Last-Translator: Jeff Huang <s8321414@gmail.com>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/lfleischer/aur/"
"language/zh_TW/)\n"
@@ -25,6 +25,20 @@ msgstr "é é¢æ‰¾ä¸åˆ°"
msgid "Sorry, the page you've requested does not exist."
msgstr "抱歉,您所請求的é é¢ä¸å­˜åœ¨ã€‚"
+msgid "Note"
+msgstr "注æ„"
+
+msgid "Git clone URLs are not meant to be opened in a browser."
+msgstr "Git clone 的網å€ä¸¦ä¸ä»£è¡¨å¯ä»¥åœ¨ç€è¦½å™¨ä¸­é–‹å•Ÿã€‚"
+
+#, php-format
+msgid "To clone the Git repository of %s, run %s."
+msgstr "è¦ clone %s çš„ Git 倉庫,執行 %s。"
+
+#, php-format
+msgid "Click %shere%s to return to the %s details page."
+msgstr "é»žé¸ %s此處%s 以回到 %s 的詳細資訊é é¢ã€‚"
+
msgid "Service Unavailable"
msgstr "æœå‹™ä¸å¯ç”¨"
@@ -857,6 +871,9 @@ msgstr "已隱è—"
msgid "Real Name"
msgstr "真實å稱"
+msgid "Homepage"
+msgstr "首é "
+
msgid "IRC Nick"
msgstr "IRC 暱稱"
@@ -872,6 +889,9 @@ msgstr "ä¸æ´»èºè‡ª"
msgid "Active"
msgstr "æ´»èº"
+msgid "Registration date:"
+msgstr "註冊日期:"
+
msgid "Last Login"
msgstr "最後登入"
@@ -888,6 +908,10 @@ msgstr "編輯此使用者的帳號"
msgid "Click %shere%s if you want to permanently delete this account."
msgstr "如果您想è¦æ°¸ä¹…刪除此帳號,請點擊 %s這裡%s 。"
+#, php-format
+msgid "Click %shere%s for user details."
+msgstr "é»žé¸ %s此處%s 來å–得使用者的詳細資訊。"
+
msgid "required"
msgstr "å¿…å¡«"
@@ -934,6 +958,9 @@ msgstr "接收新評論通知"
msgid "Notify of package updates"
msgstr "通知套件更新"
+msgid "Notify of ownership changes"
+msgstr "æ“有者變更通知"
+
msgid "Update"
msgstr "æ›´æ–°"
@@ -1034,6 +1061,9 @@ msgstr "為此套件投票"
msgid "Disable notifications"
msgstr "åœç”¨é€šçŸ¥"
+msgid "Enable notifications"
+msgstr "啟用通知"
+
msgid "Manage Co-Maintainers"
msgstr "管ç†å…±åŒç¶­è­·è€…"
@@ -1179,9 +1209,6 @@ msgstr "來æº"
msgid "Use this form to close the request for package base %s%s%s."
msgstr "使用這個表單以關閉請求套件基礎 %s%s%s 。"
-msgid "Note"
-msgstr "注æ„"
-
msgid ""
"The comments field can be left empty. However, it is highly recommended to "
"add a comment when rejecting a request."
@@ -1214,6 +1241,33 @@ msgstr "棄置"
msgid "Merge into"
msgstr "åˆä½µåˆ°"
+msgid ""
+"By submitting a deletion request, you ask a Trusted User to delete the "
+"package base. This type of request should be used for duplicates, software "
+"abandoned by upstream, as well as illegal and irreparably broken packages."
+msgstr ""
+"é€éŽéžäº¤åˆªé™¤è«‹æ±‚,您會請求å—信使用者刪除套件基礎。這個類型的請求應該用於é‡"
+"複ã€è¢«ä¸Šæ¸¸æ”¾æ£„的軟體,以åŠé•æ³•èˆ‡ç„¡æ³•ä¿®å¾©çš„æ壞套件。"
+
+msgid ""
+"By submitting a merge request, you ask a Trusted User to delete the package "
+"base and transfer its votes and comments to another package base. Merging a "
+"package does not affect the corresponding Git repositories. Make sure you "
+"update the Git history of the target package yourself."
+msgstr ""
+"é€éŽéžäº¤åˆä½µè«‹æ±‚,您會請求å—信使用者刪除套件基礎並轉移其投票數到其他的套件基"
+"礎。åˆä½µä¸€å€‹å¥—件ä¸æœƒå½±éŸ¿ç›¸å°æ‡‰çš„ Git 倉庫。確ä¿æ‚¨å¯ä»¥è‡ªå·±æ›´æ–°ç›®æ¨™å¥—件的 Git "
+"æ­·å²ã€‚"
+
+msgid ""
+"By submitting an orphan request, you ask a Trusted User to disown the "
+"package base. Please only do this if the package needs maintainer action, "
+"the maintainer is MIA and you already tried to contact the maintainer "
+"previously."
+msgstr ""
+"é€éŽéžäº¤æ£„置請求,您會請求å—信使用者棄置套件基礎。請僅在該套件需è¦æœ‰ç¶­è­·è€…å‹•"
+"作ã€ç¶­è­·è€…çªç„¶æ¶ˆå¤±ä¸”您先å‰å·²ç¶“連絡éŽç¶­è­·è€…時åšæ­¤å‹•ä½œã€‚"
+
#, php-format
msgid "%d package request found."
msgid_plural "%d package requests found."
@@ -1233,8 +1287,9 @@ msgid "Date"
msgstr "日期"
#, php-format
-msgid "~%d days left"
-msgstr "剩餘 ~%d 天"
+msgid "~%d day left"
+msgid_plural "~%d days left"
+msgstr[0] "剩餘 ~%d 天"
#, php-format
msgid "~%d hour left"
@@ -1330,10 +1385,11 @@ msgstr[0] "找到 %d 個套件。"
msgid "Version"
msgstr "版本"
+#, php-format
msgid ""
"Popularity is calculated as the sum of all votes with each vote being "
-"weighted with a factor of 0.98 per day since its creation."
-msgstr "人氣的計算方å¼ç‚ºï¼Œå°‡æ‰€æœ‰ç¥¨æ•¸åŠ ç¸½ï¼Œä¸”æ¯ä¸€ç¥¨è‡ªå»ºç«‹ä»¥ä¾†æ¯å¤©ä¹˜ä¸Š 0.98。"
+"weighted with a factor of %.2f per day since its creation."
+msgstr "人氣的計算方å¼ç‚ºï¼Œå°‡æ‰€æœ‰ç¥¨æ•¸åŠ ç¸½ï¼Œä¸”æ¯ä¸€ç¥¨è‡ªå»ºç«‹ä»¥ä¾†æ¯å¤©ä¹˜ä¸Š %.2f。"
msgid "Yes"
msgstr "是"
diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql
index aa5ed9d..30209bd 100644
--- a/schema/aur-schema.sql
+++ b/schema/aur-schema.sql
@@ -31,28 +31,23 @@ CREATE TABLE Users (
Salt CHAR(32) NOT NULL DEFAULT '',
ResetKey CHAR(32) NOT NULL DEFAULT '',
RealName VARCHAR(64) NOT NULL DEFAULT '',
- LangPreference VARCHAR(5) NOT NULL DEFAULT 'en',
+ LangPreference VARCHAR(6) NOT NULL DEFAULT 'en',
+ Homepage TEXT NULL DEFAULT NULL,
IRCNick VARCHAR(32) NOT NULL DEFAULT '',
PGPKey VARCHAR(40) NULL DEFAULT NULL,
LastLogin BIGINT UNSIGNED NOT NULL DEFAULT 0,
- LastLoginIPAddress VARCHAR(40) NULL DEFAULT NULL,
+ LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL,
InactivityTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
RegistrationTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CommentNotify TINYINT(1) NOT NULL DEFAULT 1,
UpdateNotify TINYINT(1) NOT NULL DEFAULT 0,
+ OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (ID),
UNIQUE (Username),
UNIQUE (Email),
- INDEX (AccountTypeID),
FOREIGN KEY (AccountTypeID) REFERENCES AccountTypes(ID) ON DELETE NO ACTION
) ENGINE = InnoDB;
--- A default developer account for testing purposes
-INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES (
- 1, 3, 'dev', 'dev@localhost', MD5('dev'));
-INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES (
- 2, 2, 'tu', 'tu@localhost', MD5('tu'));
-INSERT INTO Users (ID, AccountTypeID, Username, Email, Passwd) VALUES (
- 3, 1, 'user', 'user@localhost', MD5('user'));
+CREATE INDEX UsersAccountTypeID ON Users (AccountTypeID);
-- SSH public keys used for the aurweb SSH/Git interface.
@@ -94,16 +89,16 @@ CREATE TABLE PackageBases (
PackagerUID INTEGER UNSIGNED NULL DEFAULT NULL, -- Last packager
PRIMARY KEY (ID),
UNIQUE (Name),
- INDEX (NumVotes),
- INDEX (SubmitterUID),
- INDEX (MaintainerUID),
- INDEX (PackagerUID),
FOREIGN KEY (FlaggerUID) REFERENCES Users(ID) ON DELETE SET NULL,
-- deleting a user will cause packages to be orphaned, not deleted
FOREIGN KEY (SubmitterUID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (MaintainerUID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (PackagerUID) REFERENCES Users(ID) ON DELETE SET NULL
) ENGINE = InnoDB;
+CREATE INDEX BasesNumVotes ON PackageBases (NumVotes);
+CREATE INDEX BasesSubmitterUID ON PackageBases (SubmitterUID);
+CREATE INDEX BasesMaintainerUID ON PackageBases (MaintainerUID);
+CREATE INDEX BasesPackagerUID ON PackageBases (PackagerUID);
-- Keywords of package bases
@@ -124,7 +119,7 @@ CREATE TABLE Packages (
Name VARCHAR(255) NOT NULL,
Version VARCHAR(255) NOT NULL DEFAULT '',
Description VARCHAR(255) NULL DEFAULT NULL,
- URL VARCHAR(255) NULL DEFAULT NULL,
+ URL VARCHAR(8000) NULL DEFAULT NULL,
PRIMARY KEY (ID),
UNIQUE (Name),
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
@@ -194,11 +189,11 @@ CREATE TABLE PackageDepends (
DepName VARCHAR(255) NOT NULL,
DepCondition VARCHAR(255),
DepArch VARCHAR(255) NULL DEFAULT NULL,
- INDEX (PackageID),
- INDEX (DepName),
FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
FOREIGN KEY (DepTypeID) REFERENCES DependencyTypes(ID) ON DELETE NO ACTION
) ENGINE = InnoDB;
+CREATE INDEX DependsPackageID ON PackageDepends (PackageID);
+CREATE INDEX DependsDepName ON PackageDepends (DepName);
-- Define the package relation types
@@ -221,22 +216,22 @@ CREATE TABLE PackageRelations (
RelName VARCHAR(255) NOT NULL,
RelCondition VARCHAR(255),
RelArch VARCHAR(255) NULL DEFAULT NULL,
- INDEX (PackageID),
- INDEX (RelName),
FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
FOREIGN KEY (RelTypeID) REFERENCES RelationTypes(ID) ON DELETE NO ACTION
) ENGINE = InnoDB;
+CREATE INDEX RelationsPackageID ON PackageRelations (PackageID);
+CREATE INDEX RelationsRelName ON PackageRelations (RelName);
-- Track which sources a package has
--
CREATE TABLE PackageSources (
PackageID INTEGER UNSIGNED NOT NULL,
- Source VARCHAR(255) NOT NULL DEFAULT "/dev/null",
+ Source VARCHAR(8000) NOT NULL DEFAULT "/dev/null",
SourceArch VARCHAR(255) NULL DEFAULT NULL,
- INDEX (PackageID),
FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
+CREATE INDEX SourcesPackageID ON PackageSources (PackageID);
-- Track votes for packages
@@ -245,12 +240,12 @@ CREATE TABLE PackageVotes (
UsersID INTEGER UNSIGNED NOT NULL,
PackageBaseID INTEGER UNSIGNED NOT NULL,
VoteTS BIGINT UNSIGNED NULL DEFAULT NULL,
- INDEX (UsersID),
- INDEX (PackageBaseID),
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE CASCADE,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
CREATE UNIQUE INDEX VoteUsersIDPackageID ON PackageVotes (UsersID, PackageBaseID);
+CREATE INDEX VotesUsersID ON PackageVotes (UsersID);
+CREATE INDEX VotesPackageBaseID ON PackageVotes (PackageBaseID);
-- Record comments for packages
--
@@ -266,13 +261,13 @@ CREATE TABLE PackageComments (
DelUsersID INTEGER UNSIGNED NULL DEFAULT NULL,
PinnedTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (ID),
- INDEX (UsersID),
- INDEX (PackageBaseID),
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (EditedUsersID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (DelUsersID) REFERENCES Users(ID) ON DELETE CASCADE,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
+CREATE INDEX CommentsUsersID ON PackageComments (UsersID);
+CREATE INDEX CommentsPackageBaseID ON PackageComments (PackageBaseID);
-- Package base co-maintainers
--
@@ -280,11 +275,11 @@ CREATE TABLE PackageComaintainers (
UsersID INTEGER UNSIGNED NOT NULL,
PackageBaseID INTEGER UNSIGNED NOT NULL,
Priority INTEGER UNSIGNED NOT NULL,
- INDEX (UsersID),
- INDEX (PackageBaseID),
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE CASCADE,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
+CREATE INDEX ComaintainersUsersID ON PackageComaintainers (UsersID);
+CREATE INDEX ComaintainersPackageBaseID ON PackageComaintainers (PackageBaseID);
-- Package base notifications
--
@@ -310,6 +305,7 @@ CREATE TABLE PackageBlacklist (
CREATE TABLE OfficialProviders (
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(64) NOT NULL,
+ Repo VARCHAR(64) NOT NULL,
Provides VARCHAR(64) NOT NULL,
PRIMARY KEY (ID)
) ENGINE = InnoDB;
@@ -340,27 +336,27 @@ CREATE TABLE PackageRequests (
RequestTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
Status TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (ID),
- INDEX (UsersID),
- INDEX (PackageBaseID),
FOREIGN KEY (ReqTypeID) REFERENCES RequestTypes(ID) ON DELETE NO ACTION,
FOREIGN KEY (UsersID) REFERENCES Users(ID) ON DELETE SET NULL,
FOREIGN KEY (PackageBaseID) REFERENCES PackageBases(ID) ON DELETE SET NULL
) ENGINE = InnoDB;
+CREATE INDEX RequestsUsersID ON PackageRequests (UsersID);
+CREATE INDEX RequestsPackageBaseID ON PackageRequests (PackageBaseID);
-- Vote information
--
CREATE TABLE IF NOT EXISTS TU_VoteInfo (
- ID int(10) unsigned NOT NULL auto_increment,
- Agenda text NOT NULL,
+ ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+ Agenda TEXT NOT NULL,
User VARCHAR(32) NOT NULL,
- Submitted bigint(20) unsigned NOT NULL,
- End bigint(20) unsigned NOT NULL,
- Quorum decimal(2, 2) unsigned NOT NULL,
- SubmitterID int(10) unsigned NOT NULL,
- Yes tinyint(3) unsigned NOT NULL default '0',
- No tinyint(3) unsigned NOT NULL default '0',
- Abstain tinyint(3) unsigned NOT NULL default '0',
- ActiveTUs tinyint(3) unsigned NOT NULL default '0',
+ Submitted BIGINT UNSIGNED NOT NULL,
+ End BIGINT UNSIGNED NOT NULL,
+ Quorum DECIMAL(2, 2) UNSIGNED NOT NULL,
+ SubmitterID INTEGER UNSIGNED NOT NULL,
+ Yes TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
+ No TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
+ Abstain TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
+ ActiveTUs TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (ID),
FOREIGN KEY (SubmitterID) REFERENCES Users(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
@@ -368,8 +364,8 @@ CREATE TABLE IF NOT EXISTS TU_VoteInfo (
-- Individual vote records
--
CREATE TABLE IF NOT EXISTS TU_Votes (
- VoteID int(10) unsigned NOT NULL,
- UserID int(10) unsigned NOT NULL,
+ VoteID INTEGER UNSIGNED NOT NULL,
+ UserID INTEGER UNSIGNED NOT NULL,
FOREIGN KEY (VoteID) REFERENCES TU_VoteInfo(ID) ON DELETE CASCADE,
FOREIGN KEY (UserID) REFERENCES Users(ID) ON DELETE CASCADE
) ENGINE = InnoDB;
diff --git a/scripts/aurblup.py b/scripts/aurblup.py
deleted file mode 100755
index 325ef3d..0000000
--- a/scripts/aurblup.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import os
-import pyalpm
-import re
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-db_path = config.get('aurblup', 'db-path')
-sync_dbs = config.get('aurblup', 'sync-dbs').split(' ')
-servers = config.get('aurblup', 'servers').split(' ')
-
-blacklist = set()
-providers = set()
-
-h = pyalpm.Handle("/", db_path)
-for sync_db in sync_dbs:
- repo = h.register_syncdb(sync_db, pyalpm.SIG_DATABASE_OPTIONAL)
- repo.servers = [server.replace("%s", sync_db) for server in servers]
- t = h.init_transaction()
- repo.update(False)
- t.release()
-
- for pkg in repo.pkgcache:
- blacklist.add(pkg.name)
- [blacklist.add(x) for x in pkg.replaces]
- providers.add((pkg.name, pkg.name))
- for provision in pkg.provides:
- provisionname = re.sub(r'(<|=|>).*', '', provision)
- providers.add((pkg.name, provisionname))
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-cur = db.cursor()
-
-cur.execute("SELECT Name FROM PackageBlacklist")
-oldblacklist = set([row[0] for row in cur.fetchall()])
-
-for pkg in blacklist.difference(oldblacklist):
- cur.execute("INSERT INTO PackageBlacklist (Name) VALUES (%s)", [pkg])
-for pkg in oldblacklist.difference(blacklist):
- cur.execute("DELETE FROM PackageBlacklist WHERE Name = %s", [pkg])
-
-cur.execute("SELECT Name, Provides FROM OfficialProviders")
-oldproviders = set(cur.fetchall())
-
-for pkg, provides in providers.difference(oldproviders):
- cur.execute("INSERT INTO OfficialProviders (Name, Provides) "
- "VALUES (%s, %s)", [pkg, provides])
-for pkg, provides in oldproviders.difference(providers):
- cur.execute("DELETE FROM OfficialProviders "
- "WHERE Name = %s AND Provides = %s", [pkg, provides])
-
-db.commit()
-db.close()
diff --git a/scripts/mkpkglists.py b/scripts/mkpkglists.py
deleted file mode 100755
index a6f8a19..0000000
--- a/scripts/mkpkglists.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import datetime
-import gzip
-import mysql.connector
-import os
-
-docroot = os.path.dirname(os.path.realpath(__file__)) + "/../web/html/"
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-cur = db.cursor()
-
-datestr = datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT")
-pkglist_header = "# AUR package list, generated on " + datestr
-pkgbaselist_header = "# AUR package base list, generated on " + datestr
-
-with gzip.open(docroot + "packages.gz", "w") as f:
- f.write(bytes(pkglist_header + "\n", "UTF-8"))
- cur.execute("SELECT Packages.Name FROM Packages INNER JOIN PackageBases " +
- "ON PackageBases.ID = Packages.PackageBaseID " +
- "WHERE PackageBases.PackagerUID IS NOT NULL")
- f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()])
-
-with gzip.open(docroot + "pkgbase.gz", "w") as f:
- f.write(bytes(pkgbaselist_header + "\n", "UTF-8"))
- cur.execute("SELECT Name FROM PackageBases WHERE PackagerUID IS NOT NULL")
- f.writelines([bytes(x[0] + "\n", "UTF-8") for x in cur.fetchall()])
-
-db.close()
diff --git a/scripts/notify.py b/scripts/notify.py
deleted file mode 100755
index 25102a2..0000000
--- a/scripts/notify.py
+++ /dev/null
@@ -1,382 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import email.mime.text
-import mysql.connector
-import os
-import subprocess
-import sys
-import textwrap
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + '/../conf/config')
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-aur_location = config.get('options', 'aur_location')
-aur_request_ml = config.get('options', 'aur_request_ml')
-
-sendmail = config.get('notifications', 'sendmail')
-sender = config.get('notifications', 'sender')
-reply_to = config.get('notifications', 'reply-to')
-
-
-def headers_cc(cclist):
- return {'Cc': str.join(', ', cclist)}
-
-
-def headers_msgid(thread_id):
- return {'Message-ID': thread_id}
-
-
-def headers_reply(thread_id):
- return {'In-Reply-To': thread_id, 'References': thread_id}
-
-
-def send_notification(to, subject, body, refs, headers={}):
- wrapped = ''
- for line in body.splitlines():
- wrapped += textwrap.fill(line, break_long_words=False) + '\n'
- body = wrapped + '\n' + refs
-
- for recipient in to:
- msg = email.mime.text.MIMEText(body, 'plain', 'utf-8')
- msg['Subject'] = subject
- msg['From'] = sender
- msg['Reply-to'] = reply_to
- msg['To'] = recipient
-
- for key, value in headers.items():
- msg[key] = value
-
- p = subprocess.Popen([sendmail, '-t', '-oi'], stdin=subprocess.PIPE)
- p.communicate(msg.as_bytes())
-
-
-def username_from_id(cur, uid):
- cur.execute('SELECT UserName FROM Users WHERE ID = %s', [uid])
- return cur.fetchone()[0]
-
-
-def pkgbase_from_id(cur, pkgbase_id):
- cur.execute('SELECT Name FROM PackageBases WHERE ID = %s', [pkgbase_id])
- return cur.fetchone()[0]
-
-
-def pkgbase_from_pkgreq(cur, reqid):
- cur.execute('SELECT PackageBaseID FROM PackageRequests WHERE ID = %s',
- [reqid])
- return cur.fetchone()[0]
-
-
-def get_user_email(cur, uid):
- cur.execute('SELECT Email FROM Users WHERE ID = %s', [uid])
- return cur.fetchone()[0]
-
-
-def get_maintainer_email(cur, pkgbase_id):
- cur.execute('SELECT Users.Email FROM Users ' +
- 'INNER JOIN PackageBases ' +
- 'ON PackageBases.MaintainerUID = Users.ID WHERE ' +
- 'PackageBases.ID = %s', [pkgbase_id])
- return cur.fetchone()[0]
-
-
-def get_recipients(cur, pkgbase_id, uid):
- cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
- 'INNER JOIN PackageNotifications ' +
- 'ON PackageNotifications.UserID = Users.ID WHERE ' +
- 'PackageNotifications.UserID != %s AND ' +
- 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id])
- return [row[0] for row in cur.fetchall()]
-
-
-def get_comment_recipients(cur, pkgbase_id, uid):
- cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
- 'INNER JOIN PackageNotifications ' +
- 'ON PackageNotifications.UserID = Users.ID WHERE ' +
- 'Users.CommentNotify = 1 AND ' +
- 'PackageNotifications.UserID != %s AND ' +
- 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id])
- return [row[0] for row in cur.fetchall()]
-
-
-def get_update_recipients(cur, pkgbase_id, uid):
- cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
- 'INNER JOIN PackageNotifications ' +
- 'ON PackageNotifications.UserID = Users.ID WHERE ' +
- 'Users.UpdateNotify = 1 AND ' +
- 'PackageNotifications.UserID != %s AND ' +
- 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id])
- return [row[0] for row in cur.fetchall()]
-
-
-def get_request_recipients(cur, reqid):
- cur.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' +
- 'INNER JOIN PackageBases ' +
- 'ON PackageBases.ID = PackageRequests.PackageBaseID ' +
- 'INNER JOIN Users ' +
- 'ON Users.ID = PackageRequests.UsersID ' +
- 'OR Users.ID = PackageBases.MaintainerUID ' +
- 'WHERE PackageRequests.ID = %s', [reqid])
- return [row[0] for row in cur.fetchall()]
-
-
-def get_comment(cur, comment_id):
- cur.execute('SELECT Comments FROM PackageComments WHERE ID = %s',
- [comment_id])
- return cur.fetchone()[0]
-
-
-def get_flagger_comment(cur, pkgbase_id):
- cur.execute('SELECT FlaggerComment FROM PackageBases WHERE ID = %s',
- [pkgbase_id])
- return cur.fetchone()[0]
-
-
-def get_request_comment(cur, reqid):
- cur.execute('SELECT Comments FROM PackageRequests WHERE ID = %s', [reqid])
- return cur.fetchone()[0]
-
-
-def get_request_closure_comment(cur, reqid):
- cur.execute('SELECT ClosureComment FROM PackageRequests WHERE ID = %s',
- [reqid])
- return cur.fetchone()[0]
-
-
-def send_resetkey(cur, uid):
- cur.execute('SELECT UserName, Email, ResetKey FROM Users WHERE ID = %s',
- [uid])
- username, to, resetkey = cur.fetchone()
-
- subject = 'AUR Password Reset'
- body = 'A password reset request was submitted for the account %s ' \
- 'associated with your email address. If you wish to reset your ' \
- 'password follow the link [1] below, otherwise ignore this ' \
- 'message and nothing will happen.' % (username)
- refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey
-
- send_notification([to], subject, body, refs)
-
-
-def welcome(cur, uid):
- cur.execute('SELECT UserName, Email, ResetKey FROM Users WHERE ID = %s',
- [uid])
- username, to, resetkey = cur.fetchone()
-
- subject = 'Welcome to the Arch User Repository'
- body = 'Welcome to the Arch User Repository! In order to set an initial ' \
- 'password for your new account, please click the link [1] below. ' \
- 'If the link does not work, try copying and pasting it into your ' \
- 'browser.'
- refs = '[1] ' + aur_location + '/passreset/?resetkey=' + resetkey
-
- send_notification([to], subject, body, refs)
-
-
-def comment(cur, uid, pkgbase_id, comment_id):
- user = username_from_id(cur, uid)
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = get_comment_recipients(cur, pkgbase_id, uid)
- text = get_comment(cur, comment_id)
-
- user_uri = aur_location + '/account/' + user + '/'
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = 'AUR Comment for %s' % (pkgbase)
- body = '%s [1] added the following comment to %s [2]:' % (user, pkgbase)
- body += '\n\n' + text + '\n\n'
- body += 'If you no longer wish to receive notifications about this ' \
- 'package, please go to the package page [2] and select "%s".' % \
- ('Disable notifications')
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri
- thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>'
- headers = headers_reply(thread_id)
-
- send_notification(to, subject, body, refs, headers)
-
-
-def update(cur, uid, pkgbase_id):
- user = username_from_id(cur, uid)
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = get_update_recipients(cur, pkgbase_id, uid)
-
- user_uri = aur_location + '/account/' + user + '/'
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = 'AUR Package Update: %s' % (pkgbase)
- body = '%s [1] pushed a new commit to %s [2].' % (user, pkgbase)
- body += '\n\n'
- body += 'If you no longer wish to receive notifications about this ' \
- 'package, please go to the package page [2] and select "%s".' % \
- ('Disable notifications')
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri
- thread_id = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>'
- headers = headers_reply(thread_id)
-
- send_notification(to, subject, body, refs, headers)
-
-
-def flag(cur, uid, pkgbase_id):
- user = username_from_id(cur, uid)
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = [get_maintainer_email(cur, pkgbase_id)]
- text = get_flagger_comment(cur, pkgbase_id)
-
- user_uri = aur_location + '/account/' + user + '/'
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = 'AUR Out-of-date Notification for %s' % (pkgbase)
- body = 'Your package %s [1] has been flagged out-of-date by %s [2]:' % \
- (pkgbase, user)
- body += '\n\n' + text
- refs = '[1] ' + pkgbase_uri + '\n'
- refs += '[2] ' + user_uri
-
- send_notification(to, subject, body, refs)
-
-
-def comaintainer_add(cur, pkgbase_id, uid):
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = [get_user_email(cur, uid)]
-
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase)
- body = 'You were added to the co-maintainer list of %s [1].' % (pkgbase)
- refs = '[1] ' + pkgbase_uri + '\n'
-
- send_notification(to, subject, body, refs)
-
-
-def comaintainer_remove(cur, pkgbase_id, uid):
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = [get_user_email(cur, uid)]
-
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = 'AUR Co-Maintainer Notification for %s' % (pkgbase)
- body = ('You were removed from the co-maintainer list of %s [1].' %
- (pkgbase))
- refs = '[1] ' + pkgbase_uri + '\n'
-
- send_notification(to, subject, body, refs)
-
-
-def delete(cur, uid, old_pkgbase_id, new_pkgbase_id=None):
- user = username_from_id(cur, uid)
- old_pkgbase = pkgbase_from_id(cur, old_pkgbase_id)
- if new_pkgbase_id:
- new_pkgbase = pkgbase_from_id(cur, new_pkgbase_id)
- to = get_recipients(cur, old_pkgbase_id, uid)
-
- user_uri = aur_location + '/account/' + user + '/'
- pkgbase_uri = aur_location + '/pkgbase/' + old_pkgbase + '/'
-
- subject = 'AUR Package deleted: %s' % (old_pkgbase)
- if new_pkgbase_id:
- new_pkgbase_uri = aur_location + '/pkgbase/' + new_pkgbase + '/'
- body = '%s [1] merged %s [2] into %s [3].\n\n' \
- 'If you no longer wish receive notifications about the new ' \
- 'package, please go to [3] and click "%s".' %\
- (user, old_pkgbase, new_pkgbase, 'Disable notifications')
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri + '\n'
- refs += '[3] ' + new_pkgbase_uri
- else:
- body = '%s [1] deleted %s [2].\n\n' \
- 'You will no longer receive notifications about this ' \
- 'package.' % (user, old_pkgbase)
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri
-
- send_notification(to, subject, body, refs)
-
-
-def request_open(cur, uid, reqid, reqtype, pkgbase_id, merge_into=None):
- user = username_from_id(cur, uid)
- pkgbase = pkgbase_from_id(cur, pkgbase_id)
- to = [aur_request_ml]
- cc = get_request_recipients(cur, reqid)
- text = get_request_comment(cur, reqid)
-
- user_uri = aur_location + '/account/' + user + '/'
- pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
-
- subject = '[PRQ#%d] %s Request for %s' % \
- (int(reqid), reqtype.title(), pkgbase)
- if merge_into:
- merge_into_uri = aur_location + '/pkgbase/' + merge_into + '/'
- body = '%s [1] filed a request to merge %s [2] into %s [3]:' % \
- (user, pkgbase, merge_into)
- body += '\n\n' + text
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri + '\n'
- refs += '[3] ' + merge_into_uri
- else:
- body = '%s [1] filed a %s request for %s [2]:' % \
- (user, reqtype, pkgbase)
- body += '\n\n' + text
- refs = '[1] ' + user_uri + '\n'
- refs += '[2] ' + pkgbase_uri + '\n'
- thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>'
- # Use a deterministic Message-ID for the first email referencing a request.
- headers = headers_msgid(thread_id)
- headers.update(headers_cc(cc))
-
- send_notification(to, subject, body, refs, headers)
-
-
-def request_close(cur, uid, reqid, reason):
- user = username_from_id(cur, uid)
- to = [aur_request_ml]
- cc = get_request_recipients(cur, reqid)
- text = get_request_closure_comment(cur, reqid)
-
- user_uri = aur_location + '/account/' + user + '/'
-
- subject = '[PRQ#%d] Request %s' % (int(reqid), reason.title())
- body = 'Request #%d has been %s by %s [1]' % (int(reqid), reason, user)
- if text.strip() == '':
- body += '.'
- else:
- body += ':\n\n' + text
- refs = '[1] ' + user_uri
- thread_id = '<pkg-request-' + reqid + '@aur.archlinux.org>'
- headers = headers_reply(thread_id)
- headers.update(headers_cc(cc))
-
- send_notification(to, subject, body, refs, headers)
-
-
-if __name__ == '__main__':
- action = sys.argv[1]
- action_map = {
- 'send-resetkey': send_resetkey,
- 'welcome': welcome,
- 'comment': comment,
- 'update': update,
- 'flag': flag,
- 'comaintainer-add': comaintainer_add,
- 'comaintainer-remove': comaintainer_remove,
- 'delete': delete,
- 'request-open': request_open,
- 'request-close': request_close,
- }
-
- db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
- cur = db.cursor()
-
- action_map[action](cur, *sys.argv[2:])
-
- db.commit()
- db.close()
diff --git a/scripts/pkgmaint.py b/scripts/pkgmaint.py
deleted file mode 100755
index 0eb9422..0000000
--- a/scripts/pkgmaint.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import os
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-cur = db.cursor()
-
-cur.execute("DELETE FROM PackageBases WHERE " +
- "UNIX_TIMESTAMP() - SubmittedTS > 86400 AND PackagerUID IS NULL")
-
-db.commit()
-db.close()
diff --git a/scripts/popupdate.py b/scripts/popupdate.py
deleted file mode 100755
index f3ba513..0000000
--- a/scripts/popupdate.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/python3
-
-import configparser
-import mysql.connector
-import os
-
-config = configparser.RawConfigParser()
-config.read(os.path.dirname(os.path.realpath(__file__)) + "/../conf/config")
-
-aur_db_host = config.get('database', 'host')
-aur_db_name = config.get('database', 'name')
-aur_db_user = config.get('database', 'user')
-aur_db_pass = config.get('database', 'password')
-aur_db_socket = config.get('database', 'socket')
-
-db = mysql.connector.connect(host=aur_db_host, user=aur_db_user,
- passwd=aur_db_pass, db=aur_db_name,
- unix_socket=aur_db_socket, buffered=True)
-cur = db.cursor()
-
-cur.execute("UPDATE PackageBases SET NumVotes = (SELECT COUNT(*) FROM " +
- "PackageVotes WHERE PackageVotes.PackageBaseID = PackageBases.ID)")
-
-cur.execute("UPDATE PackageBases SET Popularity = (" +
- "SELECT COALESCE(SUM(POWER(0.98, (UNIX_TIMESTAMP() - VoteTS) / 86400)), 0.0) " +
- "FROM PackageVotes WHERE PackageVotes.PackageBaseID = " +
- "PackageBases.ID AND NOT VoteTS IS NULL)")
-
-db.commit()
-db.close()
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..99dbfed
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,33 @@
+import re
+from setuptools import setup, find_packages
+import sys
+
+version = None
+with open('web/lib/version.inc.php', 'r') as f:
+ for line in f.readlines():
+ match = re.match(r'^define\("AURWEB_VERSION", "v([0-9.]+)"\);$', line)
+ if match:
+ version = match.group(1)
+
+if not version:
+ sys.stderr.write('error: Failed to parse version file!')
+ sys.exit(1)
+
+setup(
+ name="aurweb",
+ version=version,
+ packages=find_packages(),
+ entry_points={
+ 'console_scripts': [
+ 'aurweb-git-auth = aurweb.git.auth:main',
+ 'aurweb-git-serve = aurweb.git.serve:main',
+ 'aurweb-git-update = aurweb.git.update:main',
+ 'aurweb-aurblup = aurweb.scripts.aurblup:main',
+ 'aurweb-mkpkglists = aurweb.scripts.mkpkglists:main',
+ 'aurweb-notify = aurweb.scripts.notify:main',
+ 'aurweb-pkgmaint = aurweb.scripts.pkgmaint:main',
+ 'aurweb-popupdate = aurweb.scripts.popupdate:main',
+ 'aurweb-tuvotereminder = aurweb.scripts.tuvotereminder:main',
+ ],
+ },
+)
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..d6f0f74
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,11 @@
+T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
+
+check: $(T)
+
+clean:
+ $(RM) -r test-results/
+
+$(T):
+ @echo "*** $@ ***"; $(SHELL) $@
+
+.PHONY: check clean $(T)
diff --git a/test/setup.sh b/test/setup.sh
new file mode 100644
index 0000000..d02d298
--- /dev/null
+++ b/test/setup.sh
@@ -0,0 +1,218 @@
+TEST_DIRECTORY="$(pwd)"
+TOPLEVEL="$(cd .. && pwd)"
+
+. ./sharness.sh
+
+# Configure python search path.
+PYTHONPATH="$TOPLEVEL"
+export PYTHONPATH
+
+# Configure paths to the Git interface scripts.
+GIT_AUTH="$TOPLEVEL/aurweb/git/auth.py"
+GIT_SERVE="$TOPLEVEL/aurweb/git/serve.py"
+GIT_UPDATE="$TOPLEVEL/aurweb/git/update.py"
+MKPKGLISTS="$TOPLEVEL/scripts/mkpkglists.py"
+TUVOTEREMINDER="$TOPLEVEL/scripts/tuvotereminder.py"
+PKGMAINT="$TOPLEVEL/scripts/pkgmaint.py"
+AURBLUP="$TOPLEVEL/scripts/aurblup.py"
+NOTIFY="$TOPLEVEL/scripts/notify.py"
+
+# Create the configuration file and a dummy notification script.
+cat >config <<-EOF
+[database]
+backend = sqlite
+name = aur.db
+
+[options]
+aur_location = https://aur.archlinux.org
+aur_request_ml = aur-requests@archlinux.org
+enable-maintenance = 0
+maintenance-exceptions = 127.0.0.1
+
+[notifications]
+notify-cmd = $NOTIFY
+sendmail = ./sendmail.sh
+sender = notify@aur.archlinux.org
+reply-to = noreply@aur.archlinux.org
+
+[auth]
+valid-keytypes = ssh-rsa ssh-dss ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 ssh-ed25519
+username-regex = [a-zA-Z0-9]+[.\-_]?[a-zA-Z0-9]+$
+git-serve-cmd = $GIT_SERVE
+ssh-options = restrict
+
+[serve]
+repo-path = ./aur.git/
+repo-regex = [a-z0-9][a-z0-9.+_-]*$
+git-shell-cmd = ./git-shell.sh
+git-update-cmd = ./update.sh
+ssh-cmdline = ssh aur@aur.archlinux.org
+
+[update]
+max-blob-size = 256000
+
+[aurblup]
+db-path = $(pwd)/sync/
+sync-dbs = test
+server = file://$(pwd)/remote/
+
+[mkpkglists]
+packagesfile = packages.gz
+pkgbasefile = pkgbase.gz
+EOF
+
+cat >sendmail.sh <<-\EOF
+#!/bin/sh
+cat >>sendmail.out
+EOF
+chmod +x sendmail.sh
+
+cat >git-shell.sh <<-\EOF
+#!/bin/sh
+echo $AUR_USER
+echo $AUR_PKGBASE
+echo $GIT_NAMESPACE
+EOF
+chmod +x git-shell.sh
+
+cat >update.sh <<-\EOF
+#!/bin/sh
+echo $AUR_USER
+echo $AUR_PKGBASE
+EOF
+chmod +x update.sh
+
+AUR_CONFIG=config
+export AUR_CONFIG
+
+# Create SSH public keys which will be used by the test users later.
+AUTH_KEYTYPE_USER=ssh-rsa
+AUTH_KEYTEXT_USER=AAAAB3NzaC1yc2EAAAADAQABAAABAQCeUafDK4jqUiRHNQfwHcYjBKLZ4Rc1sNUofHApBP6j91nIvDHZe2VUqeBmFUhBz7kXK4VbXD9nlHMun2HeshL8hXnMzymZ8Wk7+IKefj61pajJkIdttw9Tnayfg7uhg5RbFy9zpEjmGjnIVjSzOXKCwppNT+CNujpKM5FD8gso/Z+l3fD+IwrPwS1SzF1Z99nqI9n2FM/JWZqluvTqnW9WdAvBDfutXxp0R5ZiLI5TAKL2Ssp5rpL70pkLXhv+9sK545zKKlXUFmw6Pi2iVBdqdRsk9ocl49dLiNIh8CYDCO3CRQn+8EnpBhTor2TKQxGJI3mzoBwWJJxoKhD/XlYJ
+AUTH_FINGERPRINT_USER=SHA256:F/OFtYAy0JCytAGUi4RUZnOsThhQtFMK7fH1YvFBCpo
+
+AUTH_KEYTYPE_TU=ssh-rsa
+AUTH_KEYTEXT_TU=AAAAB3NzaC1yc2EAAAADAQABAAABAQC4Q2Beg6jf2r1LZ4vwT5y10dK8+/c5RaNyTwv77wF2OSLXh32xW0ovhE2lW2gqoakdGsxgM2fTtqMTl29WOsAxlGF7x9XbWhFXFUT88Daq1fAeuihkiRjfBbInSW/WcrFZ+biLBch67addtfkkd4PmAafDeeCtszAXqza+ltBG1oxAGiTXgI3LOhA1/GtLLxsi5sPUO3ZlhvwDn4Sy0aXYx8l9hop/PU4Cjn82hyRa9r+SRxQ3KtjKxcVMnZ8IyXOrBwXTukgSBR/6nSdEmO0JPkYUFuNwh3UGFKuNkrPguL5T+4YDym6czYmZJzQ7NNl2pLKYmYgBwBe5rORlWfN5
+AUTH_FINGERPRINT_TU=SHA256:xQGC6j/U1Q3NDXLl04pm+Shr1mjYUXbGMUzlm9vby4k
+
+AUTH_KEYTYPE_MISSING=sha-rsa
+AUTH_KEYTEXT_MISSING=AAAAB3NzaC1yc2EAAAADAQABAAABAQC9UTpssBunuTBCT3KFtv+yb+cN0VmI2C9O9U7wHlkEZWxNBK8is6tnDHXBxRuvRk0LHILkTidLLFX22ZF0+TFgSz7uuEvGZVNpa2Fn2+vKJJYMvZEvb/f8VHF5/Jddt21VOyu23royTN/duiT7WIZdCtEmq5C9Y43NPfsB8FbUc+FVSYT2Lq7g1/bzvFF+CZxwCrGjC3qC7p3pshICfFR8bbWgRN33ClxIQ7MvkcDtfNu38dLotJqdfEa7NdQgba5/S586f1A4OWKc/mQJFyTaGhRBxw/cBSjqonvO0442VYLHFxlrTHoUunKyOJ8+BJfKgjWmfENC9ESY3mL/IEn5
+AUTH_FINGERPRINT_MISSING=SHA256:uB0B+30r2WA1TDMUmFcaEBjosjnFGzn33XFhiyvTL9w
+
+# Initialize the test database.
+rm -f aur.db
+sed \
+ -e '/^DROP DATABASE /d' \
+ -e '/^CREATE DATABASE /d' \
+ -e '/^USE /d' \
+ -e 's/ ENGINE = InnoDB//' \
+ -e 's/ [A-Z]* UNSIGNED NOT NULL AUTO_INCREMENT/ INTEGER NOT NULL/' \
+ -e 's/([0-9, ]*) UNSIGNED / UNSIGNED /' \
+ "$TOPLEVEL/schema/aur-schema.sql" | sqlite3 aur.db
+
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (1, 'user', '!', 'user@localhost', 1);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (2, 'tu', '!', 'tu@localhost', 2);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (3, 'dev', '!', 'dev@localhost', 3);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (4, 'user2', '!', 'user2@localhost', 1);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (5, 'user3', '!', 'user3@localhost', 1);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (6, 'user4', '!', 'user4@localhost', 1);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (7, 'tu2', '!', 'tu2@localhost', 2);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (8, 'tu3', '!', 'tu3@localhost', 2);" | sqlite3 aur.db
+echo "INSERT INTO Users (ID, UserName, Passwd, Email, AccountTypeID) VALUES (9, 'tu4', '!', 'tu4@localhost', 2);" | sqlite3 aur.db
+
+echo "INSERT INTO SSHPubKeys (UserID, Fingerprint, PubKey) VALUES (1, '$AUTH_FINGERPRINT_USER', '$AUTH_KEYTYPE_USER $AUTH_KEYTEXT_USER');" | sqlite3 aur.db
+echo "INSERT INTO SSHPubKeys (UserID, Fingerprint, PubKey) VALUES (2, '$AUTH_FINGERPRINT_TU', '$AUTH_KEYTYPE_TU $AUTH_KEYTEXT_TU');" | sqlite3 aur.db
+
+echo "INSERT INTO PackageBlacklist (Name) VALUES ('forbidden');" | sqlite3 aur.db
+echo "INSERT INTO OfficialProviders (Name, Repo, Provides) VALUES ('official', 'core', 'official');" | sqlite3 aur.db
+
+# Initialize a Git repository and test packages.
+GIT_AUTHOR_EMAIL=author@example.com
+GIT_AUTHOR_NAME='A U Thor'
+GIT_COMMITTER_EMAIL=committer@example.com
+GIT_COMMITTER_NAME='C O Mitter'
+export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
+export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
+
+(
+ mkdir aur.git
+ cd aur.git
+ git init -q
+
+ git checkout -q --orphan refs/namespaces/foobar/refs/heads/master
+
+ cat >PKGBUILD <<-EOF
+ pkgname=foobar
+ pkgver=1
+ pkgrel=1
+ pkgdesc='aurweb test package.'
+ url='https://aur.archlinux.org/'
+ license=('GPL')
+ arch=('any')
+ depends=('python-pygit2')
+ source=()
+ md5sums=()
+
+ package() {
+ echo 'Hello world!'
+ }
+ EOF
+
+ cat >.SRCINFO <<-EOF
+ pkgbase = foobar
+ pkgdesc = aurweb test package.
+ pkgver = 1
+ pkgrel = 1
+ url = https://aur.archlinux.org/
+ arch = any
+ license = GPL
+ depends = python-pygit2
+
+ pkgname = foobar
+ EOF
+
+ git add PKGBUILD .SRCINFO
+ git commit -q -m 'Initial import'
+
+ sed 's/\(pkgrel.*\)1/\12/' PKGBUILD >PKGBUILD.new
+ sed 's/\(pkgrel.*\)1/\12/' .SRCINFO >.SRCINFO.new
+ mv PKGBUILD.new PKGBUILD
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am 'Bump pkgrel'
+
+ git checkout -q --orphan refs/namespaces/foobar2/refs/heads/master
+
+ cat >PKGBUILD <<-EOF
+ pkgname=foobar2
+ pkgver=1
+ pkgrel=1
+ pkgdesc='aurweb test package.'
+ url='https://aur.archlinux.org/'
+ license=('MIT')
+ arch=('any')
+ depends=('python-pygit2')
+ source=()
+ md5sums=()
+
+ package() {
+ echo 'Hello world!'
+ }
+ EOF
+
+ cat >.SRCINFO <<-EOF
+ pkgbase = foobar2
+ pkgdesc = aurweb test package.
+ pkgver = 1
+ pkgrel = 1
+ url = https://aur.archlinux.org/
+ arch = any
+ license = MIT
+ depends = python-pygit2
+
+ pkgname = foobar2
+ EOF
+
+ git add PKGBUILD .SRCINFO
+ git commit -q -m 'Initial import'
+
+ git checkout -q refs/namespaces/foobar/refs/heads/master
+)
diff --git a/test/sharness.sh b/test/sharness.sh
new file mode 100644
index 0000000..1d57ce9
--- /dev/null
+++ b/test/sharness.sh
@@ -0,0 +1,851 @@
+#!/bin/sh
+#
+# Copyright (c) 2011-2012 Mathias Lafeldt
+# Copyright (c) 2005-2012 Git project
+# Copyright (c) 2005-2012 Junio C Hamano
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see http://www.gnu.org/licenses/ .
+
+# Public: Current version of Sharness.
+SHARNESS_VERSION="1.0.0"
+export SHARNESS_VERSION
+
+# Public: The file extension for tests. By default, it is set to "t".
+: ${SHARNESS_TEST_EXTENSION:=t}
+export SHARNESS_TEST_EXTENSION
+
+# Reset TERM to original terminal if found, otherwise save orignal TERM
+[ "x" = "x$SHARNESS_ORIG_TERM" ] &&
+ SHARNESS_ORIG_TERM="$TERM" ||
+ TERM="$SHARNESS_ORIG_TERM"
+# Public: The unsanitized TERM under which sharness is originally run
+export SHARNESS_ORIG_TERM
+
+# Export SHELL_PATH
+: ${SHELL_PATH:=$SHELL}
+export SHELL_PATH
+
+# For repeatability, reset the environment to a known state.
+# TERM is sanitized below, after saving color control sequences.
+LANG=C
+LC_ALL=C
+PAGER=cat
+TZ=UTC
+EDITOR=:
+export LANG LC_ALL PAGER TZ EDITOR
+unset VISUAL CDPATH GREP_OPTIONS
+
+# Line feed
+LF='
+'
+
+[ "x$TERM" != "xdumb" ] && (
+ [ -t 1 ] &&
+ tput bold >/dev/null 2>&1 &&
+ tput setaf 1 >/dev/null 2>&1 &&
+ tput sgr0 >/dev/null 2>&1
+ ) &&
+ color=t
+
+while test "$#" -ne 0; do
+ case "$1" in
+ -d|--d|--de|--deb|--debu|--debug)
+ debug=t; shift ;;
+ -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
+ immediate=t; shift ;;
+ -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
+ TEST_LONG=t; export TEST_LONG; shift ;;
+ --in|--int|--inte|--inter|--intera|--interac|--interact|--interacti|--interactiv|--interactive|--interactive-|--interactive-t|--interactive-te|--interactive-tes|--interactive-test|--interactive-tests):
+ TEST_INTERACTIVE=t; export TEST_INTERACTIVE; verbose=t; shift ;;
+ -h|--h|--he|--hel|--help)
+ help=t; shift ;;
+ -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
+ verbose=t; shift ;;
+ -q|--q|--qu|--qui|--quie|--quiet)
+ # Ignore --quiet under a TAP::Harness. Saying how many tests
+ # passed without the ok/not ok details is always an error.
+ test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
+ --chain-lint)
+ chain_lint=t; shift ;;
+ --no-chain-lint)
+ chain_lint=; shift ;;
+ --no-color)
+ color=; shift ;;
+ --root=*)
+ root=$(expr "z$1" : 'z[^=]*=\(.*\)')
+ shift ;;
+ *)
+ echo "error: unknown test option '$1'" >&2; exit 1 ;;
+ esac
+done
+
+if test -n "$color"; then
+ # Save the color control sequences now rather than run tput
+ # each time say_color() is called. This is done for two
+ # reasons:
+ # * TERM will be changed to dumb
+ # * HOME will be changed to a temporary directory and tput
+ # might need to read ~/.terminfo from the original HOME
+ # directory to get the control sequences
+ # Note: This approach assumes the control sequences don't end
+ # in a newline for any terminal of interest (command
+ # substitutions strip trailing newlines). Given that most
+ # (all?) terminals in common use are related to ECMA-48, this
+ # shouldn't be a problem.
+ say_color_error=$(tput bold; tput setaf 1) # bold red
+ say_color_skip=$(tput setaf 4) # blue
+ say_color_warn=$(tput setaf 3) # brown/yellow
+ say_color_pass=$(tput setaf 2) # green
+ say_color_info=$(tput setaf 6) # cyan
+ say_color_reset=$(tput sgr0)
+ say_color_="" # no formatting for normal text
+ say_color() {
+ test -z "$1" && test -n "$quiet" && return
+ eval "say_color_color=\$say_color_$1"
+ shift
+ printf "%s\\n" "$say_color_color$*$say_color_reset"
+ }
+else
+ say_color() {
+ test -z "$1" && test -n "$quiet" && return
+ shift
+ printf "%s\n" "$*"
+ }
+fi
+
+TERM=dumb
+export TERM
+
+error() {
+ say_color error "error: $*"
+ EXIT_OK=t
+ exit 1
+}
+
+say() {
+ say_color info "$*"
+}
+
+test -n "$test_description" || error "Test script did not set test_description."
+
+if test "$help" = "t"; then
+ echo "$test_description"
+ exit 0
+fi
+
+exec 5>&1
+exec 6<&0
+if test "$verbose" = "t"; then
+ exec 4>&2 3>&1
+else
+ exec 4>/dev/null 3>/dev/null
+fi
+
+test_failure=0
+test_count=0
+test_fixed=0
+test_broken=0
+test_success=0
+
+die() {
+ code=$?
+ if test -n "$EXIT_OK"; then
+ exit $code
+ else
+ echo >&5 "FATAL: Unexpected exit with code $code"
+ exit 1
+ fi
+}
+
+EXIT_OK=
+trap 'die' EXIT
+
+# Public: Define that a test prerequisite is available.
+#
+# The prerequisite can later be checked explicitly using test_have_prereq or
+# implicitly by specifying the prerequisite name in calls to test_expect_success
+# or test_expect_failure.
+#
+# $1 - Name of prerequiste (a simple word, in all capital letters by convention)
+#
+# Examples
+#
+# # Set PYTHON prerequisite if interpreter is available.
+# command -v python >/dev/null && test_set_prereq PYTHON
+#
+# # Set prerequisite depending on some variable.
+# test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
+#
+# Returns nothing.
+test_set_prereq() {
+ satisfied_prereq="$satisfied_prereq$1 "
+}
+satisfied_prereq=" "
+
+# Public: Check if one or more test prerequisites are defined.
+#
+# The prerequisites must have previously been set with test_set_prereq.
+# The most common use of this is to skip all the tests if some essential
+# prerequisite is missing.
+#
+# $1 - Comma-separated list of test prerequisites.
+#
+# Examples
+#
+# # Skip all remaining tests if prerequisite is not set.
+# if ! test_have_prereq PERL; then
+# skip_all='skipping perl interface tests, perl not available'
+# test_done
+# fi
+#
+# Returns 0 if all prerequisites are defined or 1 otherwise.
+test_have_prereq() {
+ # prerequisites can be concatenated with ','
+ save_IFS=$IFS
+ IFS=,
+ set -- $*
+ IFS=$save_IFS
+
+ total_prereq=0
+ ok_prereq=0
+ missing_prereq=
+
+ for prerequisite; do
+ case "$prerequisite" in
+ !*)
+ negative_prereq=t
+ prerequisite=${prerequisite#!}
+ ;;
+ *)
+ negative_prereq=
+ esac
+
+ total_prereq=$(($total_prereq + 1))
+ case "$satisfied_prereq" in
+ *" $prerequisite "*)
+ satisfied_this_prereq=t
+ ;;
+ *)
+ satisfied_this_prereq=
+ esac
+
+ case "$satisfied_this_prereq,$negative_prereq" in
+ t,|,t)
+ ok_prereq=$(($ok_prereq + 1))
+ ;;
+ *)
+ # Keep a list of missing prerequisites; restore
+ # the negative marker if necessary.
+ prerequisite=${negative_prereq:+!}$prerequisite
+ if test -z "$missing_prereq"; then
+ missing_prereq=$prerequisite
+ else
+ missing_prereq="$prerequisite,$missing_prereq"
+ fi
+ esac
+ done
+
+ test $total_prereq = $ok_prereq
+}
+
+# You are not expected to call test_ok_ and test_failure_ directly, use
+# the text_expect_* functions instead.
+
+test_ok_() {
+ test_success=$(($test_success + 1))
+ say_color "" "ok $test_count - $@"
+}
+
+test_failure_() {
+ test_failure=$(($test_failure + 1))
+ say_color error "not ok $test_count - $1"
+ shift
+ echo "$@" | sed -e 's/^/# /'
+ test "$immediate" = "" || { EXIT_OK=t; exit 1; }
+}
+
+test_known_broken_ok_() {
+ test_fixed=$(($test_fixed + 1))
+ say_color error "ok $test_count - $@ # TODO known breakage vanished"
+}
+
+test_known_broken_failure_() {
+ test_broken=$(($test_broken + 1))
+ say_color warn "not ok $test_count - $@ # TODO known breakage"
+}
+
+# Public: Execute commands in debug mode.
+#
+# Takes a single argument and evaluates it only when the test script is started
+# with --debug. This is primarily meant for use during the development of test
+# scripts.
+#
+# $1 - Commands to be executed.
+#
+# Examples
+#
+# test_debug "cat some_log_file"
+#
+# Returns the exit code of the last command executed in debug mode or 0
+# otherwise.
+test_debug() {
+ test "$debug" = "" || eval "$1"
+}
+
+# Public: Stop execution and start a shell.
+#
+# This is useful for debugging tests and only makes sense together with "-v".
+# Be sure to remove all invocations of this command before submitting.
+test_pause() {
+ if test "$verbose" = t; then
+ "$SHELL_PATH" <&6 >&3 2>&4
+ else
+ error >&5 "test_pause requires --verbose"
+ fi
+}
+
+test_eval_() {
+ # This is a separate function because some tests use
+ # "return" to end a test_expect_success block early.
+ case ",$test_prereq," in
+ *,INTERACTIVE,*)
+ eval "$*"
+ ;;
+ *)
+ eval </dev/null >&3 2>&4 "$*"
+ ;;
+ esac
+}
+
+test_run_() {
+ test_cleanup=:
+ expecting_failure=$2
+ test_eval_ "$1"
+ eval_ret=$?
+
+ if test "$chain_lint" = "t"; then
+ test_eval_ "(exit 117) && $1"
+ if test "$?" != 117; then
+ error "bug in the test script: broken &&-chain: $1"
+ fi
+ fi
+
+ if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"; then
+ test_eval_ "$test_cleanup"
+ fi
+ if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
+ echo ""
+ fi
+ return "$eval_ret"
+}
+
+test_skip_() {
+ test_count=$(($test_count + 1))
+ to_skip=
+ for skp in $SKIP_TESTS; do
+ case $this_test.$test_count in
+ $skp)
+ to_skip=t
+ break
+ esac
+ done
+ if test -z "$to_skip" && test -n "$test_prereq" && ! test_have_prereq "$test_prereq"; then
+ to_skip=t
+ fi
+ case "$to_skip" in
+ t)
+ of_prereq=
+ if test "$missing_prereq" != "$test_prereq"; then
+ of_prereq=" of $test_prereq"
+ fi
+
+ say_color skip >&3 "skipping test: $@"
+ say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
+ : true
+ ;;
+ *)
+ false
+ ;;
+ esac
+}
+
+# Public: Run test commands and expect them to succeed.
+#
+# When the test passed, an "ok" message is printed and the number of successful
+# tests is incremented. When it failed, a "not ok" message is printed and the
+# number of failed tests is incremented.
+#
+# With --immediate, exit test immediately upon the first failed test.
+#
+# Usually takes two arguments:
+# $1 - Test description
+# $2 - Commands to be executed.
+#
+# With three arguments, the first will be taken to be a prerequisite:
+# $1 - Comma-separated list of test prerequisites. The test will be skipped if
+# not all of the given prerequisites are set. To negate a prerequisite,
+# put a "!" in front of it.
+# $2 - Test description
+# $3 - Commands to be executed.
+#
+# Examples
+#
+# test_expect_success \
+# 'git-write-tree should be able to write an empty tree.' \
+# 'tree=$(git-write-tree)'
+#
+# # Test depending on one prerequisite.
+# test_expect_success TTY 'git --paginate rev-list uses a pager' \
+# ' ... '
+#
+# # Multiple prerequisites are separated by a comma.
+# test_expect_success PERL,PYTHON 'yo dawg' \
+# ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" '
+#
+# Returns nothing.
+test_expect_success() {
+ test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
+ test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_success"
+ export test_prereq
+ if ! test_skip_ "$@"; then
+ say >&3 "expecting success: $2"
+ if test_run_ "$2"; then
+ test_ok_ "$1"
+ else
+ test_failure_ "$@"
+ fi
+ fi
+ echo >&3 ""
+}
+
+# Public: Run test commands and expect them to fail. Used to demonstrate a known
+# breakage.
+#
+# This is NOT the opposite of test_expect_success, but rather used to mark a
+# test that demonstrates a known breakage.
+#
+# When the test passed, an "ok" message is printed and the number of fixed tests
+# is incremented. When it failed, a "not ok" message is printed and the number
+# of tests still broken is incremented.
+#
+# Failures from these tests won't cause --immediate to stop.
+#
+# Usually takes two arguments:
+# $1 - Test description
+# $2 - Commands to be executed.
+#
+# With three arguments, the first will be taken to be a prerequisite:
+# $1 - Comma-separated list of test prerequisites. The test will be skipped if
+# not all of the given prerequisites are set. To negate a prerequisite,
+# put a "!" in front of it.
+# $2 - Test description
+# $3 - Commands to be executed.
+#
+# Returns nothing.
+test_expect_failure() {
+ test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
+ test "$#" = 2 || error "bug in the test script: not 2 or 3 parameters to test_expect_failure"
+ export test_prereq
+ if ! test_skip_ "$@"; then
+ say >&3 "checking known breakage: $2"
+ if test_run_ "$2" expecting_failure; then
+ test_known_broken_ok_ "$1"
+ else
+ test_known_broken_failure_ "$1"
+ fi
+ fi
+ echo >&3 ""
+}
+
+# Public: Run command and ensure that it fails in a controlled way.
+#
+# Use it instead of "! <command>". For example, when <command> dies due to a
+# segfault, test_must_fail diagnoses it as an error, while "! <command>" would
+# mistakenly be treated as just another expected failure.
+#
+# This is one of the prefix functions to be used inside test_expect_success or
+# test_expect_failure.
+#
+# $1.. - Command to be executed.
+#
+# Examples
+#
+# test_expect_success 'complain and die' '
+# do something &&
+# do something else &&
+# test_must_fail git checkout ../outerspace
+# '
+#
+# Returns 1 if the command succeeded (exit code 0).
+# Returns 1 if the command died by signal (exit codes 130-192)
+# Returns 1 if the command could not be found (exit code 127).
+# Returns 0 otherwise.
+test_must_fail() {
+ "$@"
+ exit_code=$?
+ if test $exit_code = 0; then
+ echo >&2 "test_must_fail: command succeeded: $*"
+ return 1
+ elif test $exit_code -gt 129 -a $exit_code -le 192; then
+ echo >&2 "test_must_fail: died by signal: $*"
+ return 1
+ elif test $exit_code = 127; then
+ echo >&2 "test_must_fail: command not found: $*"
+ return 1
+ fi
+ return 0
+}
+
+# Public: Run command and ensure that it succeeds or fails in a controlled way.
+#
+# Similar to test_must_fail, but tolerates success too. Use it instead of
+# "<command> || :" to catch failures caused by a segfault, for instance.
+#
+# This is one of the prefix functions to be used inside test_expect_success or
+# test_expect_failure.
+#
+# $1.. - Command to be executed.
+#
+# Examples
+#
+# test_expect_success 'some command works without configuration' '
+# test_might_fail git config --unset all.configuration &&
+# do something
+# '
+#
+# Returns 1 if the command died by signal (exit codes 130-192)
+# Returns 1 if the command could not be found (exit code 127).
+# Returns 0 otherwise.
+test_might_fail() {
+ "$@"
+ exit_code=$?
+ if test $exit_code -gt 129 -a $exit_code -le 192; then
+ echo >&2 "test_might_fail: died by signal: $*"
+ return 1
+ elif test $exit_code = 127; then
+ echo >&2 "test_might_fail: command not found: $*"
+ return 1
+ fi
+ return 0
+}
+
+# Public: Run command and ensure it exits with a given exit code.
+#
+# This is one of the prefix functions to be used inside test_expect_success or
+# test_expect_failure.
+#
+# $1 - Expected exit code.
+# $2.. - Command to be executed.
+#
+# Examples
+#
+# test_expect_success 'Merge with d/f conflicts' '
+# test_expect_code 1 git merge "merge msg" B master
+# '
+#
+# Returns 0 if the expected exit code is returned or 1 otherwise.
+test_expect_code() {
+ want_code=$1
+ shift
+ "$@"
+ exit_code=$?
+ if test $exit_code = $want_code; then
+ return 0
+ fi
+
+ echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*"
+ return 1
+}
+
+# Public: Compare two files to see if expected output matches actual output.
+#
+# The TEST_CMP variable defines the command used for the comparision; it
+# defaults to "diff -u". Only when the test script was started with --verbose,
+# will the command's output, the diff, be printed to the standard output.
+#
+# This is one of the prefix functions to be used inside test_expect_success or
+# test_expect_failure.
+#
+# $1 - Path to file with expected output.
+# $2 - Path to file with actual output.
+#
+# Examples
+#
+# test_expect_success 'foo works' '
+# echo expected >expected &&
+# foo >actual &&
+# test_cmp expected actual
+# '
+#
+# Returns the exit code of the command set by TEST_CMP.
+test_cmp() {
+ ${TEST_CMP:-diff -u} "$@"
+}
+
+# Public: portably print a sequence of numbers.
+#
+# seq is not in POSIX and GNU seq might not be available everywhere,
+# so it is nice to have a seq implementation, even a very simple one.
+#
+# $1 - Starting number.
+# $2 - Ending number.
+#
+# Examples
+#
+# test_expect_success 'foo works 10 times' '
+# for i in $(test_seq 1 10)
+# do
+# foo || return
+# done
+# '
+#
+# Returns 0 if all the specified numbers can be displayed.
+test_seq() {
+ i="$1"
+ j="$2"
+ while test "$i" -le "$j"
+ do
+ echo "$i" || return
+ i=$(expr "$i" + 1)
+ done
+}
+
+# Public: Check if the file expected to be empty is indeed empty, and barfs
+# otherwise.
+#
+# $1 - File to check for emptyness.
+#
+# Returns 0 if file is empty, 1 otherwise.
+test_must_be_empty() {
+ if test -s "$1"
+ then
+ echo "'$1' is not empty, it contains:"
+ cat "$1"
+ return 1
+ fi
+}
+
+# Public: Schedule cleanup commands to be run unconditionally at the end of a
+# test.
+#
+# If some cleanup command fails, the test will not pass. With --immediate, no
+# cleanup is done to help diagnose what went wrong.
+#
+# This is one of the prefix functions to be used inside test_expect_success or
+# test_expect_failure.
+#
+# $1.. - Commands to prepend to the list of cleanup commands.
+#
+# Examples
+#
+# test_expect_success 'test core.capslock' '
+# git config core.capslock true &&
+# test_when_finished "git config --unset core.capslock" &&
+# do_something
+# '
+#
+# Returns the exit code of the last cleanup command executed.
+test_when_finished() {
+ test_cleanup="{ $*
+ } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
+}
+
+# Public: Schedule cleanup commands to be run unconditionally when all tests
+# have run.
+#
+# This can be used to clean up things like test databases. It is not needed to
+# clean up temporary files, as test_done already does that.
+#
+# Examples:
+#
+# cleanup mysql -e "DROP DATABASE mytest"
+#
+# Returns the exit code of the last cleanup command executed.
+final_cleanup=
+cleanup() {
+ final_cleanup="{ $*
+ } && (exit \"\$eval_ret\"); eval_ret=\$?; $final_cleanup"
+}
+
+# Public: Summarize test results and exit with an appropriate error code.
+#
+# Must be called at the end of each test script.
+#
+# Can also be used to stop tests early and skip all remaining tests. For this,
+# set skip_all to a string explaining why the tests were skipped before calling
+# test_done.
+#
+# Examples
+#
+# # Each test script must call test_done at the end.
+# test_done
+#
+# # Skip all remaining tests if prerequisite is not set.
+# if ! test_have_prereq PERL; then
+# skip_all='skipping perl interface tests, perl not available'
+# test_done
+# fi
+#
+# Returns 0 if all tests passed or 1 if there was a failure.
+test_done() {
+ EXIT_OK=t
+
+ if test -z "$HARNESS_ACTIVE"; then
+ test_results_dir="$SHARNESS_TEST_DIRECTORY/test-results"
+ mkdir -p "$test_results_dir"
+ test_results_path="$test_results_dir/$this_test.$$.counts"
+
+ cat >>"$test_results_path" <<-EOF
+ total $test_count
+ success $test_success
+ fixed $test_fixed
+ broken $test_broken
+ failed $test_failure
+
+ EOF
+ fi
+
+ if test "$test_fixed" != 0; then
+ say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
+ fi
+ if test "$test_broken" != 0; then
+ say_color warn "# still have $test_broken known breakage(s)"
+ fi
+ if test "$test_broken" != 0 || test "$test_fixed" != 0; then
+ test_remaining=$(( $test_count - $test_broken - $test_fixed ))
+ msg="remaining $test_remaining test(s)"
+ else
+ test_remaining=$test_count
+ msg="$test_count test(s)"
+ fi
+
+ case "$test_failure" in
+ 0)
+ # Maybe print SKIP message
+ if test -n "$skip_all" && test $test_count -gt 0; then
+ error "Can't use skip_all after running some tests"
+ fi
+ [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
+
+ if test $test_remaining -gt 0; then
+ say_color pass "# passed all $msg"
+ fi
+ say "1..$test_count$skip_all"
+
+ test_eval_ "$final_cleanup"
+
+ test -d "$remove_trash" &&
+ cd "$(dirname "$remove_trash")" &&
+ rm -rf "$(basename "$remove_trash")"
+
+ exit 0 ;;
+
+ *)
+ say_color error "# failed $test_failure among $msg"
+ say "1..$test_count"
+
+ exit 1 ;;
+
+ esac
+}
+
+# Public: Root directory containing tests. Tests can override this variable,
+# e.g. for testing Sharness itself.
+: ${SHARNESS_TEST_DIRECTORY:=$(pwd)}
+export SHARNESS_TEST_DIRECTORY
+
+# Public: Source directory of test code and sharness library.
+# This directory may be different from the directory in which tests are
+# being run.
+: ${SHARNESS_TEST_SRCDIR:=$(cd $(dirname $0) && pwd)}
+export SHARNESS_TEST_SRCDIR
+
+# Public: Build directory that will be added to PATH. By default, it is set to
+# the parent directory of SHARNESS_TEST_DIRECTORY.
+: ${SHARNESS_BUILD_DIRECTORY:="$SHARNESS_TEST_DIRECTORY/.."}
+PATH="$SHARNESS_BUILD_DIRECTORY:$PATH"
+export PATH SHARNESS_BUILD_DIRECTORY
+
+# Public: Path to test script currently executed.
+SHARNESS_TEST_FILE="$0"
+export SHARNESS_TEST_FILE
+
+# Prepare test area.
+SHARNESS_TRASH_DIRECTORY="trash directory.$(basename "$SHARNESS_TEST_FILE" ".$SHARNESS_TEST_EXTENSION")"
+test -n "$root" && SHARNESS_TRASH_DIRECTORY="$root/$SHARNESS_TRASH_DIRECTORY"
+case "$SHARNESS_TRASH_DIRECTORY" in
+/*) ;; # absolute path is good
+ *) SHARNESS_TRASH_DIRECTORY="$SHARNESS_TEST_DIRECTORY/$SHARNESS_TRASH_DIRECTORY" ;;
+esac
+test "$debug" = "t" || remove_trash="$SHARNESS_TRASH_DIRECTORY"
+rm -rf "$SHARNESS_TRASH_DIRECTORY" || {
+ EXIT_OK=t
+ echo >&5 "FATAL: Cannot prepare test area"
+ exit 1
+}
+
+
+#
+# Load any extensions in $srcdir/sharness.d/*.sh
+#
+if test -d "${SHARNESS_TEST_SRCDIR}/sharness.d"
+then
+ for file in "${SHARNESS_TEST_SRCDIR}"/sharness.d/*.sh
+ do
+ # Ensure glob was not an empty match:
+ test -e "${file}" || break
+
+ if test -n "$debug"
+ then
+ echo >&5 "sharness: loading extensions from ${file}"
+ fi
+ . "${file}"
+ if test $? != 0
+ then
+ echo >&5 "sharness: Error loading ${file}. Aborting."
+ exit 1
+ fi
+ done
+fi
+
+# Public: Empty trash directory, the test area, provided for each test. The HOME
+# variable is set to that directory too.
+export SHARNESS_TRASH_DIRECTORY
+
+HOME="$SHARNESS_TRASH_DIRECTORY"
+export HOME
+
+mkdir -p "$SHARNESS_TRASH_DIRECTORY" || exit 1
+# Use -P to resolve symlinks in our working directory so that the cwd
+# in subprocesses like git equals our $PWD (for pathname comparisons).
+cd -P "$SHARNESS_TRASH_DIRECTORY" || exit 1
+
+this_test=${SHARNESS_TEST_FILE##*/}
+this_test=${this_test%.$SHARNESS_TEST_EXTENSION}
+for skp in $SKIP_TESTS; do
+ case "$this_test" in
+ $skp)
+ say_color info >&3 "skipping test $this_test altogether"
+ skip_all="skip all tests in $this_test"
+ test_done
+ esac
+done
+
+test -n "$TEST_LONG" && test_set_prereq EXPENSIVE
+test -n "$TEST_INTERACTIVE" && test_set_prereq INTERACTIVE
+
+# Make sure this script ends with code 0
+:
+
+# vi: set ts=4 sw=4 noet :
diff --git a/test/t1100-git-auth.sh b/test/t1100-git-auth.sh
new file mode 100755
index 0000000..71d526f
--- /dev/null
+++ b/test/t1100-git-auth.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+test_description='git-auth tests'
+
+. ./setup.sh
+
+test_expect_success 'Test basic authentication.' '
+ "$GIT_AUTH" "$AUTH_KEYTYPE_USER" "$AUTH_KEYTEXT_USER" >out &&
+ grep -q AUR_USER=user out &&
+ grep -q AUR_PRIVILEGED=0 out
+'
+
+test_expect_success 'Test Trusted User authentication.' '
+ "$GIT_AUTH" "$AUTH_KEYTYPE_TU" "$AUTH_KEYTEXT_TU" >out &&
+ grep -q AUR_USER=tu out &&
+ grep -q AUR_PRIVILEGED=1 out
+'
+
+test_expect_success 'Test authentication with an unsupported key type.' '
+ test_must_fail "$GIT_AUTH" ssh-xxx "$AUTH_KEYTEXT_USER"
+'
+
+test_expect_success 'Test authentication with a wrong key.' '
+ "$GIT_AUTH" "$AUTH_KEYTYPE_MISSING" "$AUTH_KEYTEXT_MISSING" >out
+ test_must_be_empty out
+'
+
+test_done
diff --git a/test/t1200-git-serve.sh b/test/t1200-git-serve.sh
new file mode 100755
index 0000000..5054ce3
--- /dev/null
+++ b/test/t1200-git-serve.sh
@@ -0,0 +1,343 @@
+#!/bin/sh
+
+test_description='git-serve tests'
+
+. ./setup.sh
+
+test_expect_success 'Test interactive shell.' '
+ "$GIT_SERVE" 2>&1 | grep -q "Interactive shell is disabled."
+'
+
+test_expect_success 'Test help.' '
+ SSH_ORIGINAL_COMMAND=help "$GIT_SERVE" 2>actual &&
+ save_IFS=$IFS
+ IFS=
+ while read -r line; do
+ echo $line | grep -q "^Commands:$" && continue
+ echo $line | grep -q "^ [a-z]" || return 1
+ [ ${#line} -le 80 ] || return 1
+ done <actual
+ IFS=$save_IFS
+'
+
+test_expect_success 'Test setup-repo and list-repos.' '
+ SSH_ORIGINAL_COMMAND="setup-repo foobar" AUR_USER=user \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="setup-repo foobar2" AUR_USER=tu \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ *foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test git-receive-pack.' '
+ cat >expected <<-EOF &&
+ user
+ foobar
+ foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="git-receive-pack /foobar.git/" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test git-receive-pack with an invalid repository name.' '
+ SSH_ORIGINAL_COMMAND="git-receive-pack /!.git/" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1 >actual
+'
+
+test_expect_success "Test git-upload-pack." '
+ cat >expected <<-EOF &&
+ user
+ foobar
+ foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="git-upload-pack /foobar.git/" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Try to pull from someone else's repository." '
+ cat >expected <<-EOF &&
+ user
+ foobar2
+ foobar2
+ EOF
+ SSH_ORIGINAL_COMMAND="git-upload-pack /foobar2.git/" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Try to push to someone else's repository." '
+ SSH_ORIGINAL_COMMAND="git-receive-pack /foobar2.git/" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Try to push to someone else's repository as Trusted User." '
+ cat >expected <<-EOF &&
+ tu
+ foobar
+ foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="git-receive-pack /foobar.git/" \
+ AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Test restore." '
+ echo "DELETE FROM PackageBases WHERE Name = \"foobar\";" | \
+ sqlite3 aur.db &&
+ cat >expected <<-EOF &&
+ user
+ foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="restore foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual
+ test_cmp expected actual
+'
+
+test_expect_success "Try to restore an existing package base." '
+ SSH_ORIGINAL_COMMAND="restore foobar2" AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Disown all package bases." '
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Adopt a package base as a regular user." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ *foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Adopt an already adopted package base." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Adopt a package base as a Trusted User." '
+ SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ *foobar2
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Disown one's own package base as a regular user." '
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Disown one's own package base as a Trusted User." '
+ SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Try to steal another user's package as a regular user." '
+ SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ cat >expected <<-EOF &&
+ *foobar2
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Try to steal another user's package as a Trusted User." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ cat >expected <<-EOF &&
+ *foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Try to disown another user's package as a regular user." '
+ SSH_ORIGINAL_COMMAND="adopt foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ *foobar2
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ SSH_ORIGINAL_COMMAND="disown foobar2" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Try to disown another user's package as a Trusted User." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1
+'
+
+test_expect_success "Adopt a package base and add co-maintainers." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ SSH_ORIGINAL_COMMAND="set-comaintainers foobar user3 user4" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ 5|3|1
+ 6|3|2
+ EOF
+ echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \
+ sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Update package base co-maintainers." '
+ SSH_ORIGINAL_COMMAND="set-comaintainers foobar user2 user3 user4" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ 4|3|1
+ 5|3|2
+ 6|3|3
+ EOF
+ echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \
+ sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Try to add co-maintainers to an orphan package base." '
+ SSH_ORIGINAL_COMMAND="set-comaintainers foobar2 user2 user3 user4" \
+ AUR_USER=user AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ 4|3|1
+ 5|3|2
+ 6|3|3
+ EOF
+ echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \
+ sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Disown a package base and check (co-)maintainer list." '
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ *foobar
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user2 AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ cat >expected <<-EOF &&
+ 5|3|1
+ 6|3|2
+ EOF
+ echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \
+ sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Force-disown a package base and check (co-)maintainer list." '
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=tu AUR_PRIVILEGED=1 \
+ "$GIT_SERVE" 2>&1 &&
+ cat >expected <<-EOF &&
+ EOF
+ SSH_ORIGINAL_COMMAND="list-repos" AUR_USER=user3 AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 >actual &&
+ test_cmp expected actual &&
+ cat >expected <<-EOF &&
+ EOF
+ echo "SELECT * FROM PackageComaintainers ORDER BY Priority;" | \
+ sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success "Check whether package requests are closed when disowning." '
+ SSH_ORIGINAL_COMMAND="adopt foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat <<-EOD | sqlite3 aur.db &&
+ INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (1, 2, 3, "foobar", 4);
+ INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (2, 3, 3, "foobar", 5);
+ INSERT INTO PackageRequests (ID, ReqTypeID, PackageBaseID, PackageBaseName, UsersID) VALUES (3, 2, 2, "foobar2", 6);
+ EOD
+ >sendmail.out &&
+ SSH_ORIGINAL_COMMAND="disown foobar" AUR_USER=user AUR_PRIVILEGED=0 \
+ "$GIT_SERVE" 2>&1 &&
+ cat <<-EOD >expected &&
+ Subject: [PRQ#1] Request Accepted
+ EOD
+ grep "^Subject.*PRQ" sendmail.out >sendmail.parts &&
+ test_cmp sendmail.parts expected &&
+ cat <<-EOD >expected &&
+ 1|2|3|foobar||4||The user user disowned the package.|0|2
+ EOD
+ echo "SELECT * FROM PackageRequests WHERE Status = 2;" | sqlite3 aur.db >actual &&
+ test_cmp actual expected
+'
+
+test_done
diff --git a/test/t1300-git-update.sh b/test/t1300-git-update.sh
new file mode 100755
index 0000000..a65ca3a
--- /dev/null
+++ b/test/t1300-git-update.sh
@@ -0,0 +1,464 @@
+#!/bin/sh
+
+test_description='git-update tests'
+
+. ./setup.sh
+
+test_expect_success 'Test update hook on a fresh repository.' '
+ old=0000000000000000000000000000000000000000 &&
+ new=$(git -C aur.git rev-parse HEAD^) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 &&
+ cat >expected <<-EOF &&
+ 1|1|foobar|1-1|aurweb test package.|https://aur.archlinux.org/
+ 1|GPL
+ 1|1
+ 1|1|python-pygit2||
+ 1|1
+ EOF
+ >actual &&
+ for t in Packages Licenses PackageLicenses Groups PackageGroups \
+ PackageDepends PackageRelations PackageSources \
+ PackageNotifications; do
+ echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual
+ done &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test update hook on another fresh repository.' '
+ old=0000000000000000000000000000000000000000 &&
+ test_when_finished "git -C aur.git checkout refs/namespaces/foobar/refs/heads/master" &&
+ git -C aur.git checkout -q refs/namespaces/foobar2/refs/heads/master &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar2 AUR_PRIVILEGED=0 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 &&
+ cat >expected <<-EOF &&
+ 1|1|foobar|1-1|aurweb test package.|https://aur.archlinux.org/
+ 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/
+ 1|GPL
+ 2|MIT
+ 1|1
+ 2|2
+ 1|1|python-pygit2||
+ 2|1|python-pygit2||
+ 1|1
+ 2|1
+ EOF
+ >actual &&
+ for t in Packages Licenses PackageLicenses Groups PackageGroups \
+ PackageDepends PackageRelations PackageSources \
+ PackageNotifications; do
+ echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual
+ done &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test update hook on an updated repository.' '
+ old=$(git -C aur.git rev-parse HEAD^) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 &&
+ cat >expected <<-EOF &&
+ 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/
+ 3|1|foobar|1-2|aurweb test package.|https://aur.archlinux.org/
+ 1|GPL
+ 2|MIT
+ 2|2
+ 3|1
+ 2|1|python-pygit2||
+ 3|1|python-pygit2||
+ 1|1
+ 2|1
+ EOF
+ >actual &&
+ for t in Packages Licenses PackageLicenses Groups PackageGroups \
+ PackageDepends PackageRelations PackageSources \
+ PackageNotifications; do
+ echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual
+ done &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test restore mode.' '
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ "$GIT_UPDATE" restore 2>&1 &&
+ cat >expected <<-EOF &&
+ 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/
+ 3|1|foobar|1-2|aurweb test package.|https://aur.archlinux.org/
+ 1|GPL
+ 2|MIT
+ 2|2
+ 3|1
+ 2|1|python-pygit2||
+ 3|1|python-pygit2||
+ 1|1
+ 2|1
+ EOF
+ >actual &&
+ for t in Packages Licenses PackageLicenses Groups PackageGroups \
+ PackageDepends PackageRelations PackageSources \
+ PackageNotifications; do
+ echo "SELECT * FROM $t;" | sqlite3 aur.db >>actual
+ done &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Test restore mode on a non-existent repository.' '
+ cat >expected <<-EOD &&
+ error: restore: repository not found: foobar3
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar3 AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" restore >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Pushing to a branch other than master.' '
+ old=0000000000000000000000000000000000000000 &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ error: pushing to a branch other than master is restricted
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/pu "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Performing a non-fast-forward ref update.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ new=$(git -C aur.git rev-parse HEAD^) &&
+ cat >expected <<-EOD &&
+ error: denying non-fast-forward (you should pull first)
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Performing a non-fast-forward ref update as Trusted User.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ new=$(git -C aur.git rev-parse HEAD^) &&
+ AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1
+'
+
+test_expect_success 'Removing .SRCINFO.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ git -C aur.git rm -q .SRCINFO &&
+ git -C aur.git commit -q -m "Remove .SRCINFO" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing .SRCINFO$" actual
+'
+
+test_expect_success 'Removing .SRCINFO with a follow-up fix.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ git -C aur.git rm -q .SRCINFO &&
+ git -C aur.git commit -q -m "Remove .SRCINFO" &&
+ git -C aur.git revert --no-edit HEAD &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing .SRCINFO$" actual
+'
+
+test_expect_success 'Removing PKGBUILD.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ git -C aur.git rm -q PKGBUILD &&
+ git -C aur.git commit -q -m "Remove PKGBUILD" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing PKGBUILD$" actual
+'
+
+test_expect_success 'Pushing a tree with a subdirectory.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ mkdir aur.git/subdir &&
+ touch aur.git/subdir/file &&
+ git -C aur.git add subdir/file &&
+ git -C aur.git commit -q -m "Add subdirectory" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: the repository must not contain subdirectories$" actual
+'
+
+test_expect_success 'Pushing a tree with a large blob.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ printf "%256001s" x >aur.git/file &&
+ git -C aur.git add file &&
+ git -C aur.git commit -q -m "Add large blob" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: maximum blob size (250.00KiB) exceeded$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with a non-matching package base.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/\(pkgbase.*\)foobar/\1foobar2/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Change package base"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: invalid pkgbase: foobar2, expected foobar$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with invalid syntax.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/=//" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Break .SRCINFO"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1
+'
+
+test_expect_success 'Pushing .SRCINFO without pkgver.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "/pkgver/d" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Remove pkgver"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing mandatory field: pkgver$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO without pkgrel.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "/pkgrel/d" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Remove pkgrel"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing mandatory field: pkgrel$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with epoch.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/.*pkgrel.*/\\0\\nepoch = 1/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Add epoch"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" 2>&1 &&
+ cat >expected <<-EOF &&
+ 2|2|foobar2|1-1|aurweb test package.|https://aur.archlinux.org/
+ 3|1|foobar|1:1-2|aurweb test package.|https://aur.archlinux.org/
+ EOF
+ echo "SELECT * FROM Packages;" | sqlite3 aur.db >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Pushing .SRCINFO with invalid pkgname.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/\(pkgname.*\)foobar/\1!/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Change pkgname"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: invalid package name: !$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with invalid epoch.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/.*pkgrel.*/\\0\\nepoch = !/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Change epoch"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: invalid epoch: !$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with too long URL.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ url="http://$(printf "%7993s" x | sed "s/ /x/g")/" &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s#.*url.*#\\0\\nurl = $url#" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Change URL"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: url field too long: $url\$" actual
+'
+
+test_expect_success 'Missing install file.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/.*depends.*/\\0\\ninstall = install/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Add install field"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing install file: install$" actual
+'
+
+test_expect_success 'Missing changelog file.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/.*depends.*/\\0\\nchangelog = changelog/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Add changelog field"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing changelog file: changelog$" actual
+'
+
+test_expect_success 'Missing source file.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s/.*depends.*/\\0\\nsource = file/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Add file to the source array"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: missing source file: file$" actual
+'
+
+test_expect_success 'Pushing .SRCINFO with too long source URL.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ url="http://$(printf "%7993s" x | sed "s/ /x/g")/" &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ (
+ cd aur.git &&
+ sed "s#.*depends.*#\\0\\nsource = $url#" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Add huge source URL"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ grep -q "^error: source entry too long: $url\$" actual
+'
+
+test_expect_success 'Pushing a blacklisted package.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ echo "pkgname = forbidden" >>aur.git/.SRCINFO &&
+ git -C aur.git commit -q -am "Add blacklisted package" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ error: package is blacklisted: forbidden
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Pushing a blacklisted package as Trusted User.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ echo "pkgname = forbidden" >>aur.git/.SRCINFO &&
+ git -C aur.git commit -q -am "Add blacklisted package" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ warning: package is blacklisted: forbidden
+ EOD
+ AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Pushing a package already in the official repositories.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ echo "pkgname = official" >>aur.git/.SRCINFO &&
+ git -C aur.git commit -q -am "Add official package" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ error: package already provided by [core]: official
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Pushing a package already in the official repositories as Trusted User.' '
+ old=$(git -C aur.git rev-parse HEAD) &&
+ test_when_finished "git -C aur.git reset --hard $old" &&
+ echo "pkgname = official" >>aur.git/.SRCINFO &&
+ git -C aur.git commit -q -am "Add official package" &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ warning: package already provided by [core]: official
+ EOD
+ AUR_USER=tu AUR_PKGBASE=foobar AUR_PRIVILEGED=1 \
+ "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_expect_success 'Trying to hijack a package.' '
+ old=0000000000000000000000000000000000000000 &&
+ test_when_finished "git -C aur.git checkout refs/namespaces/foobar/refs/heads/master" &&
+ (
+ cd aur.git &&
+ git checkout -q refs/namespaces/foobar2/refs/heads/master &&
+ sed "s/\\(.*pkgname.*\\)2/\\1/" .SRCINFO >.SRCINFO.new
+ mv .SRCINFO.new .SRCINFO
+ git commit -q -am "Change package name"
+ ) &&
+ new=$(git -C aur.git rev-parse HEAD) &&
+ cat >expected <<-EOD &&
+ error: cannot overwrite package: foobar
+ EOD
+ AUR_USER=user AUR_PKGBASE=foobar2 AUR_PRIVILEGED=0 \
+ test_must_fail "$GIT_UPDATE" refs/heads/master "$old" "$new" >actual 2>&1 &&
+ test_cmp expected actual
+'
+
+test_done
diff --git a/test/t2100-mkpkglists.sh b/test/t2100-mkpkglists.sh
new file mode 100755
index 0000000..a84a1b6
--- /dev/null
+++ b/test/t2100-mkpkglists.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+test_description='mkpkglists tests'
+
+. ./setup.sh
+
+test_expect_success 'Test package list generation with no packages.' '
+ echo "DELETE FROM Packages;" | sqlite3 aur.db &&
+ echo "DELETE FROM PackageBases;" | sqlite3 aur.db &&
+ "$MKPKGLISTS" &&
+ test $(zcat packages.gz | wc -l) -eq 1 &&
+ test $(zcat pkgbase.gz | wc -l) -eq 1
+'
+
+test_expect_success 'Test package list generation.' '
+ cat <<-EOD | sqlite3 aur.db &&
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (1, "foobar", 1, 0, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (2, "foobar2", 2, 0, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (3, "foobar3", NULL, 0, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (4, "foobar4", 1, 0, 0);
+ INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (1, 1, "pkg1");
+ INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (2, 1, "pkg2");
+ INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (3, 1, "pkg3");
+ INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (4, 2, "pkg4");
+ INSERT INTO Packages (ID, PackageBaseID, Name) VALUES (5, 3, "pkg5");
+ EOD
+ "$MKPKGLISTS" &&
+ cat <<-EOD >expected &&
+ foobar
+ foobar2
+ foobar4
+ EOD
+ gunzip pkgbase.gz &&
+ sed "/^#/d" pkgbase >actual &&
+ test_cmp actual expected &&
+ cat <<-EOD >expected &&
+ pkg1
+ pkg2
+ pkg3
+ pkg4
+ EOD
+ gunzip packages.gz &&
+ sed "/^#/d" packages >actual &&
+ test_cmp actual expected
+'
+
+test_done
diff --git a/test/t2200-tuvotereminder.sh b/test/t2200-tuvotereminder.sh
new file mode 100755
index 0000000..c82ce87
--- /dev/null
+++ b/test/t2200-tuvotereminder.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='tuvotereminder tests'
+
+. ./setup.sh
+
+test_expect_success 'Test Trusted User vote reminders.' '
+ now=$(date -d now +%s) &&
+ tomorrow=$(date -d tomorrow +%s) &&
+ threedays=$(date -d "3 days" +%s) &&
+ cat <<-EOD | sqlite3 aur.db &&
+ INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (1, "Lorem ipsum.", "user", 0, $now, 0.00, 2);
+ INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (2, "Lorem ipsum.", "user", 0, $tomorrow, 0.00, 2);
+ INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (3, "Lorem ipsum.", "user", 0, $tomorrow, 0.00, 2);
+ INSERT INTO TU_VoteInfo (ID, Agenda, User, Submitted, End, Quorum, SubmitterID) VALUES (4, "Lorem ipsum.", "user", 0, $threedays, 0.00, 2);
+ EOD
+ >sendmail.out &&
+ "$TUVOTEREMINDER" &&
+ grep -q "Proposal 2" sendmail.out &&
+ grep -q "Proposal 3" sendmail.out &&
+ test_must_fail grep -q "Proposal 1" sendmail.out &&
+ test_must_fail grep -q "Proposal 4" sendmail.out
+'
+
+test_expect_success 'Check that only TUs who did not vote receive reminders.' '
+ cat <<-EOD | sqlite3 aur.db &&
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 2);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (2, 2);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (3, 2);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (4, 2);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 7);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (3, 7);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (2, 8);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (4, 8);
+ INSERT INTO TU_Votes (VoteID, UserID) VALUES (1, 9);
+ EOD
+ >sendmail.out &&
+ "$TUVOTEREMINDER" &&
+ cat <<-EOD >expected &&
+ Subject: TU Vote Reminder: Proposal 2
+ To: tu2@localhost
+ Subject: TU Vote Reminder: Proposal 2
+ To: tu4@localhost
+ Subject: TU Vote Reminder: Proposal 3
+ To: tu3@localhost
+ Subject: TU Vote Reminder: Proposal 3
+ To: tu4@localhost
+ EOD
+ grep "^\(Subject\|To\)" sendmail.out >sendmail.parts &&
+ test_cmp sendmail.parts expected
+'
+
+test_done
diff --git a/test/t2300-pkgmaint.sh b/test/t2300-pkgmaint.sh
new file mode 100755
index 0000000..5c55aaf
--- /dev/null
+++ b/test/t2300-pkgmaint.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+test_description='pkgmaint tests'
+
+. ./setup.sh
+
+test_expect_success 'Test package base cleanup script.' '
+ now=$(date -d now +%s) &&
+ threedaysago=$(date -d "3 days ago" +%s) &&
+ cat <<-EOD | sqlite3 aur.db &&
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (1, "foobar", 1, $now, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (2, "foobar2", 2, $threedaysago, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (3, "foobar3", NULL, $now, 0);
+ INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS) VALUES (4, "foobar4", NULL, $threedaysago, 0);
+ EOD
+ "$PKGMAINT" &&
+ cat <<-EOD >expected &&
+ foobar
+ foobar2
+ foobar3
+ EOD
+ echo "SELECT Name FROM PackageBases;" | sqlite3 aur.db >actual &&
+ test_cmp actual expected
+'
+
+test_done
diff --git a/test/t2400-aurblup.sh b/test/t2400-aurblup.sh
new file mode 100755
index 0000000..708281c
--- /dev/null
+++ b/test/t2400-aurblup.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='aurblup tests'
+
+. ./setup.sh
+
+test_expect_success 'Test official provider update script.' '
+ mkdir -p remote/test/foobar-1.0-1 &&
+ cat <<-EOD >remote/test/foobar-1.0-1/desc &&
+ %FILENAME%
+ foobar-1.0-any.pkg.tar.xz
+
+ %NAME%
+ foobar
+
+ %VERSION%
+ 1.0-1
+
+ %ARCH%
+ any
+ EOD
+ mkdir -p remote/test/foobar2-1.0-1 &&
+ cat <<-EOD >remote/test/foobar2-1.0-1/desc &&
+ %FILENAME%
+ foobar2-1.0-any.pkg.tar.xz
+
+ %NAME%
+ foobar2
+
+ %VERSION%
+ 1.0-1
+
+ %ARCH%
+ any
+
+ %PROVIDES%
+ foobar3
+ foobar4
+ EOD
+ ( cd remote/test && bsdtar -czf ../test.db * ) &&
+ mkdir sync &&
+ "$AURBLUP" &&
+ cat <<-EOD >expected &&
+ foobar|test|foobar
+ foobar2|test|foobar2
+ foobar2|test|foobar3
+ foobar2|test|foobar4
+ EOD
+ echo "SELECT Name, Repo, Provides FROM OfficialProviders ORDER BY Provides;" | sqlite3 aur.db >actual &&
+ test_cmp actual expected
+'
+
+test_done
diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt
new file mode 100644
index 0000000..78f9455
--- /dev/null
+++ b/upgrading/4.3.0.txt
@@ -0,0 +1,29 @@
+1. Add a column to store ownership notification settings:
+
+----
+ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1;
+----
+
+2. Resize the LastLoginIPAddress column:
+
+----
+ALTER TABLE Users MODIFY LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL;
+----
+
+3. Add a new column to store repository information of official providers:
+
+----
+ALTER TABLE OfficialProviders ADD COLUMN Repo VARCHAR(64) NOT NULL;
+----
+
+4. Add a column to store users' homepages:
+
+----
+ALTER TABLE Users ADD COLUMN Homepage TEXT NULL DEFAULT NULL;
+----
+
+5. Resize LangPreference to fit Latin American Spanish language code:
+
+--
+ALTER TABLE Users MODIFY LangPreference VARCHAR(6);
+--
diff --git a/upgrading/4.4.0.txt b/upgrading/4.4.0.txt
new file mode 100644
index 0000000..afe01be
--- /dev/null
+++ b/upgrading/4.4.0.txt
@@ -0,0 +1,17 @@
+1. Resize the URL column of the Packages table:
+
+----
+ALTER TABLE Packages MODIFY URL VARCHAR(8000) NULL DEFAULT NULL;
+----
+
+2. Resize the Source column of the PackageSources table:
+
+----
+ALTER TABLE PackageSources
+ MODIFY Source VARCHAR(8000) NOT NULL DEFAULT "/dev/null";
+----
+
+3. The location of the Git interface scripts was changed. Make sure you update
+ your aurweb configuration, as well as the SSH daemon and AUR Git repository
+ configurations to point to the new wrapper scripts which are located in
+ /usr/local/bin/ by default.
diff --git a/upgrading/4.4.1.txt b/upgrading/4.4.1.txt
new file mode 100644
index 0000000..726f9e2
--- /dev/null
+++ b/upgrading/4.4.1.txt
@@ -0,0 +1,6 @@
+1. The default configuration file search path now points to /etc/aurweb/config.
+ Make sure you copy your aurweb configuration to the new location before
+ upgrading.
+
+2. The maintenance scripts have been prefixed by "aurweb-" and can now be
+ installed using `python3 setup.py install`.
diff --git a/web/html/404.php b/web/html/404.php
index a47ae1e..757c485 100644
--- a/web/html/404.php
+++ b/web/html/404.php
@@ -2,12 +2,45 @@
set_include_path(get_include_path() . PATH_SEPARATOR . '../lib');
+$path = $_SERVER['PATH_INFO'];
+$tokens = explode('/', $path);
+
+if (preg_match('/^([a-z0-9][a-z0-9.+_-]*?)(\.git)?$/', $tokens[1], $matches)) {
+ $gitpkg = $matches[1];
+ if (pkg_from_name($gitpkg)) {
+ $gitcmd = 'git clone ' . sprintf(config_get('options', 'git_clone_uri_anon'), htmlspecialchars($gitpkg));
+ $gitlink = get_pkgbase_uri($gitpkg);
+ } else {
+ unset($gitpkg);
+ }
+} else {
+ unset($gitpkg);
+}
+
html_header( __("Page Not Found") );
?>
<div id="error-page" class="box 404">
<h2>404 - <?= __("Page Not Found") ?></h2>
<p><?= __("Sorry, the page you've requested does not exist.") ?></p>
+ <?php if (isset($gitpkg)): ?>
+ <ul>
+ <li>
+ <strong><?= __("Note") ?>:</strong>
+ <?= __("Git clone URLs are not meant to be opened in a browser.") ?>
+ </li>
+ <li>
+ <?= __("To clone the Git repository of %s, run %s.",
+ '<strong>' . htmlspecialchars($gitpkg) . '</strong>',
+ '<code>' . htmlspecialchars($gitcmd) . '</code>') ?>
+ </li>
+ <li>
+ <?= __("Click %shere%s to return to the %s details page.",
+ '<a href="' . htmlspecialchars($gitlink, ENT_QUOTES) . '">', '</a>',
+ '<strong>' . htmlspecialchars($gitpkg) . '</strong>') ?>
+ </li>
+ </ul>
+ <?php endif; ?>
</div>
<?php
diff --git a/web/html/account.php b/web/html/account.php
index 9007ace..2892f04 100644
--- a/web/html/account.php
+++ b/web/html/account.php
@@ -34,9 +34,10 @@ if ($action == "UpdateAccount") {
in_request("U"), in_request("T"), in_request("S"),
in_request("E"), in_request("H"), in_request("P"),
in_request("C"), in_request("R"), in_request("L"),
- in_request("I"), in_request("K"), in_request("PK"),
- in_request("J"), in_request("CN"), in_request("UN"),
- in_request("ID"), $row["Username"]);
+ in_request("HP"), in_request("I"), in_request("K"),
+ in_request("PK"), in_request("J"), in_request("CN"),
+ in_request("UN"), in_request("ON"), in_request("ID"),
+ $row["Username"]);
}
}
@@ -78,12 +79,26 @@ if (isset($_COOKIE["AURSID"])) {
} else {
/* Verify user has permission to edit the account */
if (can_edit_account($row)) {
- display_account_form("UpdateAccount", $row["Username"],
- $row["AccountTypeID"], $row["Suspended"], $row["Email"],
- $row["HideEmail"], "", "", $row["RealName"],
- $row["LangPreference"], $row["IRCNick"], $row["PGPKey"], $PK,
- $row["InactivityTS"] ? 1 : 0, $row["CommentNotify"],
- $row["UpdateNotify"], $row["ID"], $row["Username"]);
+ display_account_form("UpdateAccount",
+ $row["Username"],
+ $row["AccountTypeID"],
+ $row["Suspended"],
+ $row["Email"],
+ $row["HideEmail"],
+ "",
+ "",
+ $row["RealName"],
+ $row["LangPreference"],
+ $row["Homepage"],
+ $row["IRCNick"],
+ $row["PGPKey"],
+ $PK,
+ $row["InactivityTS"] ? 1 : 0,
+ $row["CommentNotify"],
+ $row["UpdateNotify"],
+ $row["OwnershipNotify"],
+ $row["ID"],
+ $row["Username"]);
} else {
print __("You do not have permission to edit this account.");
}
@@ -116,15 +131,26 @@ if (isset($_COOKIE["AURSID"])) {
print $update_account_message;
if (!$success) {
- display_account_form("UpdateAccount", in_request("U"),
- in_request("T"), in_request("S"),
- in_request("E"), in_request("H"),
- in_request("P"), in_request("C"),
- in_request("R"), in_request("L"),
- in_request("I"), in_request("K"),
- in_request("PK"), in_request("J"),
- in_request("CN"), in_request("UN"),
- in_request("ID"), $row["Username"]);
+ display_account_form("UpdateAccount",
+ in_request("U"),
+ in_request("T"),
+ in_request("S"),
+ in_request("E"),
+ in_request("H"),
+ in_request("P"),
+ in_request("C"),
+ in_request("R"),
+ in_request("L"),
+ in_request("HP"),
+ in_request("I"),
+ in_request("K"),
+ in_request("PK"),
+ in_request("J"),
+ in_request("CN"),
+ in_request("UN"),
+ in_request("ON"),
+ in_request("ID"),
+ $row["Username"]);
}
} else {
diff --git a/web/html/css/aurweb.css b/web/html/css/aurweb.css
index f5e1037..f777ab8 100644
--- a/web/html/css/aurweb.css
+++ b/web/html/css/aurweb.css
@@ -148,3 +148,8 @@ label.confirmation,
color: red;
font-weight: bold;
}
+
+#news div p {
+ max-height: 15em;
+ overflow: auto;
+}
diff --git a/web/html/index.php b/web/html/index.php
index 3787d4e..78ab6ad 100644
--- a/web/html/index.php
+++ b/web/html/index.php
@@ -167,10 +167,6 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) {
header("Content-Type: image/gif");
readfile("./$path");
break;
- case "/css/archnavbar/archlogo.gif":
- header("Content-Type: image/png");
- readfile("./$path");
- break;
case "/css/archnavbar/archlogo.png":
case "/css/archnavbar/aurlogo.png":
case "/images/favicon.ico":
diff --git a/web/html/register.php b/web/html/register.php
index 3155449..6c6d52e 100644
--- a/web/html/register.php
+++ b/web/html/register.php
@@ -20,18 +20,47 @@ echo '<h2>' . __('Register') . '</h2>';
if (in_request("Action") == "NewAccount") {
list($success, $message) = process_account_form(
- "new", "NewAccount", in_request("U"), 1, 0,
- in_request("E"), in_request("H"), '', '', in_request("R"),
- in_request("L"), in_request("I"), in_request("K"),
- in_request("PK"), 0, in_request("CN"), in_request("UN"));
+ "new",
+ "NewAccount",
+ in_request("U"),
+ 1,
+ 0,
+ in_request("E"),
+ in_request("H"),
+ '',
+ '',
+ in_request("R"),
+ in_request("L"),
+ in_request("HP"),
+ in_request("I"),
+ in_request("K"),
+ in_request("PK"),
+ 0,
+ in_request("CN"),
+ in_request("UN"),
+ in_request("ON"));
print $message;
if (!$success) {
- display_account_form("NewAccount", in_request("U"), 1, 0,
- in_request("E"), in_request("H"), '', '', in_request("R"),
- in_request("L"), in_request("I"), in_request("K"),
- in_request("PK"), 0, in_request("CN"), in_request("UN"));
+ display_account_form("NewAccount",
+ in_request("U"),
+ 1,
+ 0,
+ in_request("E"),
+ in_request("H"),
+ '',
+ '',
+ in_request("R"),
+ in_request("L"),
+ in_request("HP"),
+ in_request("I"),
+ in_request("K"),
+ in_request("PK"),
+ 0,
+ in_request("CN"),
+ in_request("UN"),
+ in_request("ON"));
}
} else {
print '<p>' . __("Use this form to create an account.") . '</p>';
diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php
index 2d70f65..172b962 100644
--- a/web/lib/acctfuncs.inc.php
+++ b/web/lib/acctfuncs.inc.php
@@ -52,19 +52,21 @@ function html_format_pgp_fingerprint($fingerprint) {
* @param string $C The confirmed password value of the displayed user
* @param string $R The real name of the displayed user
* @param string $L The language preference of the displayed user
+ * @param string $HP The homepage of the displayed user
* @param string $I The IRC nickname of the displayed user
* @param string $K The PGP key fingerprint of the displayed user
* @param string $PK The list of SSH public keys
* @param string $J The inactivity status of the displayed user
* @param string $CN Whether to notify of new comments
* @param string $UN Whether to notify of package updates
+ * @param string $ON Whether to notify of ownership changes
* @param string $UID The user ID of the displayed user
* @param string $N The username as present in the database
*
* @return void
*/
function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="",
- $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
+ $L="",$HP="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
include("account_edit_form.php");
@@ -86,19 +88,21 @@ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R=""
* @param string $C The confirmed password for the user
* @param string $R The real name of the user
* @param string $L The language preference of the user
+ * @param string $HP The homepage of the displayed user
* @param string $I The IRC nickname of the user
* @param string $K The PGP fingerprint of the user
* @param string $PK The list of public SSH keys
* @param string $J The inactivity status of the user
* @param string $CN Whether to notify of new comments
* @param string $UN Whether to notify of package updates
+ * @param string $ON Whether to notify of ownership changes
* @param string $UID The user ID of the modified account
* @param string $N The username as present in the database
*
* @return array Boolean indicating success and message to be printed
*/
function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",
- $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
+ $R="",$L="",$HP="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
$error = '';
@@ -274,13 +278,14 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C=""
$salt = $dbh->quote($salt);
$R = $dbh->quote($R);
$L = $dbh->quote($L);
+ $HP = $dbh->quote($HP);
$I = $dbh->quote($I);
$K = $dbh->quote(str_replace(" ", "", $K));
$q = "INSERT INTO Users (AccountTypeID, Suspended, ";
$q.= "InactivityTS, Username, Email, Passwd, Salt, ";
- $q.= "RealName, LangPreference, IRCNick, PGPKey) ";
+ $q.= "RealName, LangPreference, Homepage, IRCNick, PGPKey) ";
$q.= "VALUES (1, 0, 0, $U, $E, $P, $salt, $R, $L, ";
- $q.= "$I, $K)";
+ $q.= "$HP, $I, $K)";
$result = $dbh->exec($q);
if (!$result) {
$message = __("Error trying to create account, %s%s%s.",
@@ -342,11 +347,13 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C=""
}
$q.= ", RealName = " . $dbh->quote($R);
$q.= ", LangPreference = " . $dbh->quote($L);
+ $q.= ", Homepage = " . $dbh->quote($HP);
$q.= ", IRCNick = " . $dbh->quote($I);
$q.= ", PGPKey = " . $dbh->quote(str_replace(" ", "", $K));
$q.= ", InactivityTS = " . $inactivity_ts;
$q.= ", CommentNotify = " . ($CN ? "1" : "0");
$q.= ", UpdateNotify = " . ($UN ? "1" : "0");
+ $q.= ", OwnershipNotify = " . ($ON ? "1" : "0");
$q.= " WHERE ID = ".intval($UID);
$result = $dbh->exec($q);
diff --git a/web/lib/confparser.inc.php b/web/lib/confparser.inc.php
index 6368b86..789300e 100644
--- a/web/lib/confparser.inc.php
+++ b/web/lib/confparser.inc.php
@@ -4,7 +4,7 @@ function config_load() {
global $AUR_CONFIG;
if (!isset($AUR_CONFIG)) {
- $AUR_CONFIG = parse_ini_file("../../conf/config", true, INI_SCANNER_RAW);
+ $AUR_CONFIG = parse_ini_file("/etc/aurweb/config", true, INI_SCANNER_RAW);
}
}
diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php
index 1691bff..b082784 100644
--- a/web/lib/pkgbasefuncs.inc.php
+++ b/web/lib/pkgbasefuncs.inc.php
@@ -661,6 +661,9 @@ function pkgbase_adopt ($base_ids, $action=true, $via) {
$q.= "SET MaintainerUID = $uid ";
$q.= "WHERE ID IN (" . implode(",", $base_ids) . ") ";
$dbh->exec($q);
+
+ /* Add the new maintainer to the notification list. */
+ pkgbase_notify($base_ids);
} else {
/* Update the co-maintainer list when disowning a package. */
if (has_credential(CRED_PKGBASE_DISOWN)) {
@@ -692,8 +695,11 @@ function pkgbase_adopt ($base_ids, $action=true, $via) {
}
}
+ foreach ($base_ids as $base_id) {
+ notify(array($action ? 'adopt' : 'disown', $base_id, $uid));
+ }
+
if ($action) {
- pkgbase_notify($base_ids);
return array(true, __("The selected packages have been adopted."));
} else {
return array(true, __("The selected packages have been disowned."));
@@ -1056,7 +1062,6 @@ function pkgbase_set_keywords($base_id, $keywords) {
$i = 0;
foreach ($keywords as $keyword) {
$q = sprintf("INSERT INTO PackageKeywords (PackageBaseID, Keyword) VALUES (%d, %s)", $base_id, $dbh->quote($keyword));
- var_dump($q);
$dbh->exec($q);
$i++;
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index f34dbba..4b0fdba 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -230,7 +230,7 @@ function pkg_providers($name) {
* Get package dependencies for a specific package
*
* @param int $pkgid The package to get dependencies for
- * @param int $limit An upper bound on the number of packages to retrieve
+ * @param int $limit An upper bound for the number of packages to retrieve
*
* @return array All package dependencies for the package
*/
@@ -506,7 +506,7 @@ function pkg_source_link($url, $arch) {
*
* @param string $name The package name for the dependency search
* @param array $provides A list of virtual provisions of the package
- * @param int $limit An upper bound on the number of packages to retrieve
+ * @param int $limit An upper bound for the number of packages to retrieve
*
* @return array All packages that depend on the specified package name
*/
diff --git a/web/lib/pkgreqfuncs.inc.php b/web/lib/pkgreqfuncs.inc.php
index cf56663..8ceac8d 100644
--- a/web/lib/pkgreqfuncs.inc.php
+++ b/web/lib/pkgreqfuncs.inc.php
@@ -221,7 +221,7 @@ function pkgreq_close($id, $reason, $comments, $auto_close=false) {
$dbh = DB::connect();
$id = intval($id);
- $uid = uid_from_sid($_COOKIE["AURSID"]);
+ $uid = $auto_close ? 0 : uid_from_sid($_COOKIE["AURSID"]);
if (!$auto_close && !has_credential(CRED_PKGREQ_CLOSE)) {
return array(false, __("Only TUs and developers can close requests."));
diff --git a/web/lib/version.inc.php b/web/lib/version.inc.php
index 9c0a5e6..dcf5666 100644
--- a/web/lib/version.inc.php
+++ b/web/lib/version.inc.php
@@ -1,3 +1,3 @@
<?php
-define("AURWEB_VERSION", "v4.2.1");
+define("AURWEB_VERSION", "v4.4.1");
diff --git a/web/template/account_details.php b/web/template/account_details.php
index 59a6a63..024bd9c 100644
--- a/web/template/account_details.php
+++ b/web/template/account_details.php
@@ -42,6 +42,10 @@
<td><?= htmlspecialchars($row["RealName"], ENT_QUOTES) ?></td>
</tr>
<tr>
+ <th><?= __("Homepage") . ":" ?></th>
+ <td><a href="<?= htmlspecialchars($row["Homepage"], ENT_QUOTES) ?>" rel="nofollow"><?= htmlspecialchars($row["Homepage"], ENT_QUOTES) ?></a></td>
+ </tr>
+ <tr>
<th><?= __("IRC Nick") . ":" ?></th>
<td><?= htmlspecialchars($row["IRCNick"], ENT_QUOTES) ?></td>
</tr>
@@ -55,6 +59,14 @@
<?= $row["InactivityTS"] ? __("Inactive since") . ' ' . date("Y-m-d H:i", $row["InactivityTS"]) : __("Active"); ?>
</td>
</tr>
+ <tr>
+ <th><?= __("Registration date:") ?></th>
+ <?php if ($row["RegistrationTS"]): ?>
+ <td><?= (new DateTime($row["RegistrationTS"]))->format('Y-m-d') ?></td>
+ <?php else: ?>
+ <td><?= __("unknown") ?></td>
+ <?php endif; ?>
+ </tr>
<?php if (has_credential(CRED_ACCOUNT_LAST_LOGIN)): ?>
<tr>
<th><?= __("Last Login") . ":" ?></th>
diff --git a/web/template/account_edit_form.php b/web/template/account_edit_form.php
index b9affd6..19821a0 100644
--- a/web/template/account_edit_form.php
+++ b/web/template/account_edit_form.php
@@ -1,6 +1,7 @@
<?php if ($A == "UpdateAccount"): ?>
<p>
<?= __('Click %shere%s if you want to permanently delete this account.', '<a href="' . get_user_uri($N) . 'delete/' . '">', '</a>') ?>
+ <?= __('Click %shere%s for user details.', '<a href="' . get_user_uri($N) . '">', '</a>') ?>
</p>
<form id="edit-profile-form" action="<?= get_user_uri($N) . 'update/'; ?>" method="post">
@@ -99,6 +100,11 @@
</p>
<p>
+ <label for="id_homepage"><?= __("Homepage") ?>:</label>
+ <input type="text" size="30" name="HP" id="id_homepage" value="<?= htmlspecialchars($HP,ENT_QUOTES) ?>" />
+ </p>
+
+ <p>
<label for="id_irc"><?= __("IRC Nick") ?>:</label>
<input type="text" size="30" maxlength="32" name="I" id="id_irc" value="<?= htmlspecialchars($I,ENT_QUOTES) ?>" />
</p>
@@ -143,6 +149,10 @@
<label for="id_updatenotify"><?= __("Notify of package updates") ?>:</label>
<input type="checkbox" name="UN" id="id_updatenotify" <?= $UN ? 'checked="checked"' : '' ?> />
</p>
+ <p>
+ <label for="id_ownershipnotify"><?= __("Notify of ownership changes") ?>:</label>
+ <input type="checkbox" name="ON" id="id_ownershipnotify" <?= $ON ? 'checked="checked"' : '' ?> />
+ </p>
</fieldset>
<fieldset>
diff --git a/web/template/footer.php b/web/template/footer.php
index f5dc2d0..572dbb2 100644
--- a/web/template/footer.php
+++ b/web/template/footer.php
@@ -3,7 +3,7 @@
<div id="footer">
<?php if ($ver): ?>
- <p>aurweb <a href="https://projects.archlinux.org/aurweb.git/log/?h=<?= htmlspecialchars($ver, ENT_QUOTES) ?>"><?= htmlspecialchars($ver) ?></a></p>
+ <p>aurweb <a href="https://git.archlinux.org/aurweb.git/log/?h=<?= htmlspecialchars($ver, ENT_QUOTES) ?>"><?= htmlspecialchars($ver) ?></a></p>
<?php endif; ?>
<p><?= __('Copyright %s 2004-%d aurweb Development Team.', '&copy;', date('Y')) ?></p>
<p><?= __('AUR packages are user produced content. Any use of the provided files is at your own risk.') ?></p>
diff --git a/web/template/pkg_search_results.php b/web/template/pkg_search_results.php
index 3046c25..37a9032 100644
--- a/web/template/pkg_search_results.php
+++ b/web/template/pkg_search_results.php
@@ -35,7 +35,7 @@ if (!$result): ?>
<th><a href="?<?= mkurl('SB=n&SO=' . $SO_next) ?>"><?= __("Name") ?></a></th>
<th><?= __("Version") ?></th>
<th><a href="?<?= mkurl('SB=v&SO=' . $SO_next) ?>"><?= __("Votes") ?></a></th>
- <th><a href="?<?= mkurl('SB=p&SO=' . $SO_next) ?>"><?= __("Popularity") ?></a><span title="<?= __('Popularity is calculated as the sum of all votes with each vote being weighted with a factor of 0.98 per day since its creation.') ?>" class="hover-help"><sup>?</sup></span></th>
+ <th><a href="?<?= mkurl('SB=p&SO=' . $SO_next) ?>"><?= __("Popularity") ?></a><span title="<?= __('Popularity is calculated as the sum of all votes with each vote being weighted with a factor of %.2f per day since its creation.', 0.98) ?>" class="hover-help"><sup>?</sup></span></th>
<?php if ($SID): ?>
<th><a href="?<?= mkurl('SB=w&SO=' . $SO_next) ?>"><?= __("Voted") ?></a></th>
<th><a href="?<?= mkurl('SB=o&SO=' . $SO_next) ?>"><?= __("Notify") ?></a></th>
diff --git a/web/template/pkgbase_actions.php b/web/template/pkgbase_actions.php
index 237e712..d3f0592 100644
--- a/web/template/pkgbase_actions.php
+++ b/web/template/pkgbase_actions.php
@@ -24,7 +24,7 @@
<?php if (pkgbase_user_notify($uid, $base_id)): ?>
<li><?= html_action_form($base_uri . 'unnotify/', "do_UnNotify", __('Disable notifications')) ?></li>
<?php else: ?>
- <li><?= html_action_form($base_uri . 'notify/', "do_Notify", __('Notify of new comments')) ?></li>
+ <li><?= html_action_form($base_uri . 'notify/', "do_Notify", __('Enable notifications')) ?></li>
<?php endif; ?>
<?php if (has_credential(CRED_PKGBASE_EDIT_COMAINTAINERS, array($row["MaintainerUID"]))): ?>
diff --git a/web/template/pkgreq_form.php b/web/template/pkgreq_form.php
index 4fd7851..35dbef5 100644
--- a/web/template/pkgreq_form.php
+++ b/web/template/pkgreq_form.php
@@ -16,7 +16,7 @@
<input type="hidden" name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
<p>
<label for="id_type"><?= __("Request type") ?>:</label>
- <select name="type" id="id_type" onchange="showHideMergeSection()">
+ <select name="type" id="id_type" onchange="showHideMergeSection(); showHideRequestHints()">
<option value="deletion"><?= __('Deletion') ?></option>
<option value="merge"><?= __('Merge') ?></option>
<?php if (pkgbase_maintainer_uid($base_id)): ?>
@@ -35,8 +35,16 @@
}
}
+ function showHideRequestHints() {
+ $('#deletion_hint').hide();
+ $('#merge_hint').hide();
+ $('#orphan_hint').hide();
+ $('#' + $('#id_type').val() + '_hint').show();
+ }
+
$(document).ready(function() {
showHideMergeSection();
+ showHideRequestHints();
$('#id_merge_into').typeahead({
source: function(query, callback) {
@@ -59,6 +67,15 @@
<label for="id_comments"><?= __("Comments") ?>:</label>
<textarea name="comments" id="id_comments" rows="5" cols="50"></textarea>
</p>
+ <p id="deletion_hint">
+ <?= __('By submitting a deletion request, you ask a Trusted User to delete the package base. This type of request should be used for duplicates, software abandoned by upstream, as well as illegal and irreparably broken packages.') ?>
+ </p>
+ <p id="merge_hint">
+ <?= __('By submitting a merge request, you ask a Trusted User to delete the package base and transfer its votes and comments to another package base. Merging a package does not affect the corresponding Git repositories. Make sure you update the Git history of the target package yourself.') ?>
+ </p>
+ <p id="orphan_hint">
+ <?= __('By submitting an orphan request, you ask a Trusted User to disown the package base. Please only do this if the package needs maintainer action, the maintainer is MIA and you already tried to contact the maintainer previously.') ?>
+ </p>
<p>
<input type="submit" class="button" name="do_FileRequest" value="<?= __("Submit Request") ?>" />
</p>
diff --git a/web/template/pkgreq_results.php b/web/template/pkgreq_results.php
index 24ee877..b27963b 100644
--- a/web/template/pkgreq_results.php
+++ b/web/template/pkgreq_results.php
@@ -39,7 +39,7 @@
if (!$due) {
$time_left = $idle_time - (time() - intval($row['RequestTS']));
if ($time_left > 48 * 3600) {
- $time_left_fmt = __("~%d days left", round($time_left / (24 * 3600)));
+ $time_left_fmt = _n("~%d day left", "~%d days left", round($time_left / (24 * 3600)));
} elseif ($time_left > 3600) {
$time_left_fmt = _n("~%d hour left", "~%d hours left", round($time_left / 3600));
} else {