diff options
author | Lukas Fleischer <lfleischer@archlinux.org> | 2015-10-22 18:56:59 +0200 |
---|---|---|
committer | Lukas Fleischer <lfleischer@archlinux.org> | 2015-10-24 16:22:43 +0200 |
commit | 8c87b1df0c0273006892d5947aad64034ee8ec9d (patch) | |
tree | 4e1faf7df75511f92c1a8bc84146711db8f82e60 | |
parent | ca954fe95ad9537ad626e16dfec9512f9403e3ca (diff) | |
download | aur-8c87b1df0c0273006892d5947aad64034ee8ec9d.tar.gz aur-8c87b1df0c0273006892d5947aad64034ee8ec9d.tar.xz |
git-serve: Add support for setting keywords
This allows for setting keywords using the SSH interface. The syntax is
`config <pkgbase> keywords <keyword1> <keyword2>...`.
Implements FS#45627.
Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rwxr-xr-x | git-interface/git-serve.py | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/git-interface/git-serve.py b/git-interface/git-serve.py index 45c9a01b..8bd6aa8d 100755 --- a/git-interface/git-serve.py +++ b/git-interface/git-serve.py @@ -25,17 +25,19 @@ ssh_cmdline = config.get('serve', 'ssh-cmdline') enable_maintenance = config.getboolean('options', 'enable-maintenance') maintenance_exc = config.get('options', 'maintenance-exceptions').split() -def pkgbase_exists(pkgbase): +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() - cur.execute("SELECT COUNT(*) FROM PackageBases WHERE Name = %s ", - [pkgbase]) + row = cur.fetchone() + return row[0] if row else None - db.close() - return (cur.fetchone()[0] > 0) +def pkgbase_exists(pkgbase): + return (pkgbase_from_name(pkgbase) > 0) def list_repos(user): db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, @@ -81,6 +83,25 @@ def create_pkgbase(pkgbase, user): db.commit() db.close() +def pkgbase_config_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, @@ -143,6 +164,17 @@ if action == 'git-upload-pack' or action == 'git-receive-pack': os.environ["GIT_NAMESPACE"] = pkgbase cmd = action + " '" + repo_path + "'" os.execl(git_shell_cmd, git_shell_cmd, '-c', cmd) +elif action == 'config': + if len(cmdargv) < 2: + die_with_help("{:s}: missing repository name".format(action)) + if len(cmdargv) < 3: + die_with_help("{:s}: missing option name".format(action)) + pkgbase = cmdargv[1] + option = cmdargv[2] + + if option == 'keywords': + pkgbase_config_keywords(pkgbase, cmdargv[3:]) + elif action == 'list-repos': if len(cmdargv) > 1: die_with_help("{:s}: too many arguments".format(action)) @@ -172,11 +204,12 @@ elif action == 'restore': 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" + - " 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.") + " config <name> <param>... Change package base settings.\n" + + " help Show this help message and exit.\n" + + " list-repos List all your repositories.\n" + + " restore <name> Restore a deleted package base.\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)) |