Remove all binary packages built from a source package when rebuilding
[invirt/packages/invirt-dev.git] / invirtibuilder
index 527695a..8a6b077 100755 (executable)
@@ -56,6 +56,9 @@ def logAndRun(cmd, *args, **kwargs):
         del kwargs['stdout']
     kwargs['stderr'] = logfile
     logfile.write('---> Ran %s\n' % (cmd, ))
         del kwargs['stdout']
     kwargs['stderr'] = logfile
     logfile.write('---> Ran %s\n' % (cmd, ))
+    if 'stdin_str' in kwargs:
+        logfile.write('STDIN:\n')
+        logfile.write(kwargs['stdin_str'])
     logfile.write('STDERR:\n')
     output = c.captureOutput(cmd, *args, **kwargs)
     logfile.write('STDOUT:\n')
     logfile.write('STDERR:\n')
     output = c.captureOutput(cmd, *args, **kwargs)
     logfile.write('STDOUT:\n')
@@ -199,8 +202,9 @@ def uploadBuild(pocket, workdir):
         except subprocess.CalledProcessError, e:
             if not force:
                 raise
         except subprocess.CalledProcessError, e:
             if not force:
                 raise
-            package = deb822.Changes(open(changes).read())['Binary']
-            logAndRun(['reprepro-env', 'remove', apt, package])
+            packages = deb822.Changes(open(changes).read())['Binary']
+            for package in packages.split():
+                logAndRun(['reprepro-env', 'remove', apt, package])
             logAndRun(upload)
 
 
             logAndRun(upload)
 
 
@@ -218,7 +222,7 @@ def updateSuperproject(pocket, package, commit, principal, version, env):
     tree = logAndRun(['git', 'ls-tree', branch],
                      cwd=superproject).strip()
 
     tree = logAndRun(['git', 'ls-tree', branch],
                      cwd=superproject).strip()
 
-    tree_items = dict(k, v for v, k in (x.split("\t" for x in tree.split("\n"))))
+    tree_items = dict((k, v) for (v, k) in (x.split("\t") for x in tree.split("\n")))
 
     created = not (package in tree_items)
 
 
     created = not (package in tree_items)
 
@@ -227,15 +231,16 @@ def updateSuperproject(pocket, package, commit, principal, version, env):
     # If "created" is true, we need to check if the package is
     # mentioned in .gitmodules, and add it if not.
     if created:
     # If "created" is true, we need to check if the package is
     # mentioned in .gitmodules, and add it if not.
     if created:
-        gitmodules = c.captureOutput(['git', 'cat-file', 'blob', '%s:.gitmodules' % (branch)],
-                                     cwd=superproject)
+        gitmodules = logAndRun(['git', 'cat-file', 'blob', '%s:.gitmodules' % (branch)],
+                               cwd=superproject)
         if ('[submodule "%s"]' % (package)) not in gitmodules.split("\n"):
             gitmodules += """[submodule "%s"]
 \tpath = %s
 \turl = ../packages/%s.git
 """ % (package, package, package)
         if ('[submodule "%s"]' % (package)) not in gitmodules.split("\n"):
             gitmodules += """[submodule "%s"]
 \tpath = %s
 \turl = ../packages/%s.git
 """ % (package, package, package)
-            gitmodules_hash = c.captureOutput(['git', 'hash-object', '-w', '--stdin'],
-                                              cwd=superproject).strip()
+            gitmodules_hash = logAndRun(['git', 'hash-object', '-w', '--stdin'],
+                                        cwd=superproject,
+                                        stdin_str=gitmodules).strip()
             tree_items[package] = "100644 blob "+gitmodules_hash
 
     new_tree = "\n".join("%s\t%s" % (v, k) for (k, v) in tree_items.iteritems())
             tree_items[package] = "100644 blob "+gitmodules_hash
 
     new_tree = "\n".join("%s\t%s" % (v, k) for (k, v) in tree_items.iteritems())
@@ -248,10 +253,10 @@ def updateSuperproject(pocket, package, commit, principal, version, env):
         commit_msg = 'Add %s at version %s'
     else:
         commit_msg = 'Update %s to version %s'
         commit_msg = 'Add %s at version %s'
     else:
         commit_msg = 'Update %s to version %s'
-    commit_msg = (commit_msg + '\n\n'
-                  'Requested by %s' % (package,
-                                       version.full_version,
-                                       principal))
+    commit_msg = ((commit_msg + '\n\n'
+                   'Requested by %s') % (package,
+                                         version.full_version,
+                                         principal))
     new_commit = logAndRun(
         ['git', 'commit-tree', new_tree_id, '-p', branch],
         cwd=superproject,
     new_commit = logAndRun(
         ['git', 'commit-tree', new_tree_id, '-p', branch],
         cwd=superproject,
@@ -267,7 +272,7 @@ def makeReadable(workdir):
     os.chmod(workdir, 0755)
 
 @contextlib.contextmanager
     os.chmod(workdir, 0755)
 
 @contextlib.contextmanager
-def packageWorkdir(package, commit):
+def packageWorkdir(package, commit, build_id):
     """Checkout the package in a temporary working directory.
 
     This context manager returns that working directory. The requested
     """Checkout the package in a temporary working directory.
 
     This context manager returns that working directory. The requested
@@ -277,7 +282,7 @@ def packageWorkdir(package, commit):
     When the context wrapped with this context manager is exited, the
     working directory is automatically deleted.
     """
     When the context wrapped with this context manager is exited, the
     working directory is automatically deleted.
     """
-    workdir = tempfile.mkdtemp()
+    workdir = tempfile.mkdtemp(prefix=("b%d-" % build_id))
     try:
         p_archive = subprocess.Popen(
             ['git', 'archive',
     try:
         p_archive = subprocess.Popen(
             ['git', 'archive',
@@ -371,7 +376,7 @@ def build():
             # do the build ourselves
             else:
                 db.failed_stage = 'checking out package source'
             # do the build ourselves
             else:
                 db.failed_stage = 'checking out package source'
-                with packageWorkdir(package, commit) as workdir:
+                with packageWorkdir(package, commit, db.build_id) as workdir:
                     db.failed_stage = 'preparing source package'
                     packagedir = os.path.join(workdir, package)
 
                     db.failed_stage = 'preparing source package'
                     packagedir = os.path.join(workdir, package)