Create new package bases just before saving package metadata. This
protects from stray package bases left behind when new packages are
rejected, i.e. when the user tries to push a package that is available
from the official repositories already.

Signed-off-by: Lukas Fleischer <[email protected]>
---
 git-interface/git-serve.py  |  5 +----
 git-interface/git-update.py | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/git-interface/git-serve.py b/git-interface/git-serve.py
index d3a32c3..19c3ab2 100755
--- a/git-interface/git-serve.py
+++ b/git-interface/git-serve.py
@@ -145,10 +145,7 @@ if action == 'git-upload-pack' or action == 
'git-receive-pack':
     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 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))
 
diff --git a/git-interface/git-update.py b/git-interface/git-update.py
index e6f6410..40d834d 100755
--- a/git-interface/git-update.py
+++ b/git-interface/git-update.py
@@ -58,6 +58,25 @@ def parse_dep(depstring):
         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']
@@ -362,6 +381,10 @@ for pkgname in srcinfo.utils.get_package_names(metadata):
     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)
 
-- 
2.9.2

Reply via email to