From 8c87b1df0c0273006892d5947aad64034ee8ec9d Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 22 Oct 2015 18:56:59 +0200 Subject: git-serve: Add support for setting keywords This allows for setting keywords using the SSH interface. The syntax is `config keywords ...`. Implements FS#45627. Signed-off-by: Lukas Fleischer --- git-interface/git-serve.py | 55 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 11 deletions(-) (limited to 'git-interface') diff --git a/git-interface/git-serve.py b/git-interface/git-serve.py index 45c9a01..8bd6aa8 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 Restore a deleted package base.\n" + - " setup-repo Create an empty repository.\n" + - " git-receive-pack Internal command used with Git.\n" + - " git-upload-pack Internal command used with Git.") + " config ... Change package base settings.\n" + + " help Show this help message and exit.\n" + + " list-repos List all your repositories.\n" + + " restore Restore a deleted package base.\n" + + " setup-repo 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)) -- cgit v1.2.3-70-g09d2