Diff:
---
 calm/calm.py          | 61 +++++++++++++++++++++++++++++++++++++--------------
 calm/db.py            | 20 ++++++++++++-----
 calm/past_mistakes.py |  9 +-------
 calm/vault.py         |  2 +-
 test/test_calm.py     |  2 ++
 5 files changed, 63 insertions(+), 31 deletions(-)

diff --git a/calm/calm.py b/calm/calm.py
index 82f460c..86336f7 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -119,20 +119,14 @@ def process_relarea(args, state):
         return None
 
     # packages can be stale due to changes made directly in the release
-    # area, so first check here if there are any stale packages to vault
+    # area, or vault requests, so first check here if there are any stale
+    # packages to vault
     if args.stale:
-        fresh_packages = copy.deepcopy(packages)
-
-        stale_to_vault = remove_stale_packages(args, fresh_packages, state)
-        if stale_to_vault is not None:
-            logging.info("vaulting %d old package(s)" % (len(stale_to_vault)))
-            stale_to_vault.move_to_vault(args)
-        else:
+        packages = remove_stale_packages(args, packages, state)
+        if packages is None:
             logging.error("error while evaluating stale packages")
             return None
 
-        packages = fresh_packages
-
     # clean up any empty directories
     if not args.dryrun:
         utils.rmemptysubdirs(args.rel_area)
@@ -362,7 +356,7 @@ def _process_maintainer_uploads(scan_result, args, state, 
all_packages, m, based
     # check for packages which are stale as a result of this upload,
     # which we will want in the same report
     if args.stale:
-        stale_to_vault = remove_stale_packages(args, merged_packages, state)
+        stale_to_vault = identify_stale_packages(args, merged_packages, state)
 
         # if an error occurred ...
         if stale_to_vault is None:
@@ -431,25 +425,60 @@ def process(args, state):
 
 
 #
-# remove stale packages
+# identify and remove stale packages
 #
 
 def remove_stale_packages(args, packages, state):
-    vault_requests = db.vault_requests(args)
+    # first do other removal reasons
+    packages = _execute_stale_removal(args, packages, state, "old package(s)")
+    if packages is None:
+        return None
+
+    # then do vault requests, so we can send results to the requester
+    for m in maintainers.maintainer_list(state.args):
+        vault_requests = db.vault_requests(args, m)
+
+        if vault_requests:
+            logging.debug("processing vault requests by %s" % (m))
+
+            with logfilters.AttrFilter(maint=m):
+                packages = _execute_stale_removal(args, packages, state, 
"package(s) for %s" % m, vault_requests)
+                if packages is None:
+                    return None
+
+    return packages
+
+
+def _execute_stale_removal(args, packages, state, reason, vault_requests=None):
+    fresh_packages = copy.deepcopy(packages)
 
+    stale_to_vault = identify_stale_packages(args, fresh_packages, state, 
vault_requests)
+    if stale_to_vault is not None:
+        logging.info("vaulting %d %s" % (len(stale_to_vault), reason))
+        stale_to_vault.move_to_vault(args)
+    else:
+        return None
+
+    return fresh_packages
+
+
+def identify_stale_packages(args, packages, state, vault_requests=None):
     logging.debug("checking for stale packages")
 
+    if vault_requests is None:
+        vault_requests = []
+
     # find stale packages
     to_vault = package.stale_packages(packages, vault_requests)
 
-    # remove stale packages from package set
-    to_vault.map(lambda p, f: package.delete(packages, p, f))
-
     # if there are no stale packages, we don't have anything to do
     if not to_vault:
         logging.debug("nothing is stale")
         return to_vault
 
+    # remove stale packages from package set
+    to_vault.map(lambda p, f: package.delete(packages, p, f))
+
     # re-validate package sets
     # (this shouldn't fail, but we check just to sure...)
     error = False
diff --git a/calm/db.py b/calm/db.py
index cf2051f..a6b19f5 100644
--- a/calm/db.py
+++ b/calm/db.py
@@ -46,7 +46,8 @@ def connect(args):
 
     conn.execute('''CREATE TABLE IF NOT EXISTS vault_requests
                     (srcpackage TEXT NOT NULL,
-                     vr TEXT NOT NULL
+                     vr TEXT NOT NULL,
+                     request_by TEXT NOT NULL
                     )''')
 
     conn.execute('''CREATE TABLE IF NOT EXISTS missing_obsolete
@@ -60,6 +61,12 @@ def connect(args):
                      msgid TEXT NOT NULL
                     )''')
 
+    # migrations
+    cursor = conn.execute("SELECT * FROM vault_requests LIMIT 1")
+    cols = [row[0] for row in cursor.description]
+    if 'request_by' not in cols:
+        cursor.execute("ALTER TABLE vault_requests ADD COLUMN request_by TEXT 
NOT NULL")
+
     conn.commit()
 
     return conn
@@ -92,28 +99,29 @@ def update_package_names(args, packages):
 #
 # vault requests made via 'calm-tool vault'
 #
-def vault_requests(args):
+def vault_requests(args, m):
     requests = {}
 
     with connect(args) as conn:
         conn.row_factory = sqlite3.Row
 
-        cur = conn.execute("SELECT * FROM vault_requests")
+        cur = conn.execute("SELECT * FROM vault_requests WHERE request_by = 
?", (m,))
         for row in cur.fetchall():
             spkg = row['srcpackage']
             if spkg not in requests:
                 requests[spkg] = set()
+            requests[spkg].add(row)
             requests[spkg].add(row['vr'])
 
         # remove all rows
-        cur = conn.execute("DELETE FROM vault_requests")
+        cur = conn.execute("DELETE FROM vault_requests WHERE request_by = ?", 
(m,))
 
     return requests
 
 
-def vault_request_add(args, p, v):
+def vault_request_add(args, p, v, m):
     with connect(args) as conn:
-        conn.execute('INSERT INTO vault_requests (srcpackage, vr) VALUES 
(?,?)', (p, v))
+        conn.execute('INSERT INTO vault_requests (srcpackage, vr, request_by) 
VALUES (?,?, ?)', (p, v, m))
 
 
 #
diff --git a/calm/past_mistakes.py b/calm/past_mistakes.py
index fa23648..985257c 100644
--- a/calm/past_mistakes.py
+++ b/calm/past_mistakes.py
@@ -160,27 +160,20 @@ nonexistent_provides = historical_provides + [
     'python-gnomevfs2',
     'python-gtk2.0',
     'python-keybinder',
-    'python-orbit',
     'python-pynotify',
     'python-vte',
     'python-wnck',
     'python-zeitgeist',
     'python2-avahi',
-    'python2-avogadro',
     'python2-ayatana_appindicator',
-    'python2-fontforge',
     'python2-gobject',
     'python2-ipaddr',
     'python2-libvirt',
-    'python2-magic',
     'python2-matemenu',
     'python2-pykde4',
     'python2-pyqt4',
     'python2-pyqt5',
-    # random build-depends
-    'python2-cython',
-    'python2-wheel',
-    'python2-cairo-devel',
+    'libtidy0_99_0',
     # general
     '_windows',
     r'perl5_\d+',
diff --git a/calm/vault.py b/calm/vault.py
index b433660..f6eb236 100644
--- a/calm/vault.py
+++ b/calm/vault.py
@@ -43,7 +43,7 @@ def vault(pvr):
     args = types.SimpleNamespace()
     args.htdocs = os.path.join(common_constants.HTDOCS, 'packages')
 
-    db.vault_request_add(args, p, vr)
+    db.vault_request_add(args, p, vr, os.environ['CYGNAME'])
     logging.info("package '%s' version '%s' marked as expirable" % (p, vr))
 
 
diff --git a/test/test_calm.py b/test/test_calm.py
index e09b95a..fd7dc5c 100755
--- a/test/test_calm.py
+++ b/test/test_calm.py
@@ -393,6 +393,7 @@ class CalmTest(unittest.TestCase):
         os.system('touch "%s"' % (os.path.join(m_homedir, 'x86_64', 'release', 
'staleversion', '!ready')))
 
         state = calm.calm.CalmState()
+        state.args = args
         state.packages = calm.calm.process_relarea(args, state)
         state.packages = calm.calm.process_uploads(args, state)
         self.assertTrue(state.packages)
@@ -428,6 +429,7 @@ class CalmTest(unittest.TestCase):
         os.system('touch "%s"' % (os.path.join(m_homedir, 'x86_64', 'release', 
'testpackage', '!ready')))
 
         state = calm.calm.CalmState()
+        state.args = args
         state.packages = calm.calm.process_relarea(args, state)
         state.packages = calm.calm.process_uploads(args, state)
         self.assertTrue(state.packages)

Reply via email to