From b262e63b230d435013ad900301eb1211d6c8dc9d Mon Sep 17 00:00:00 2001
From: Quentin Smith <quentin@mit.edu>
Date: Sat, 15 Oct 2011 18:12:35 -0400
Subject: [PATCH] Add submodules to the superrepo if a package has never been
 built before

---
 debian/changelog         |    8 ++++++++
 invirtibuilder           |   33 +++++++++++++++++++++++++++------
 python/invirt/builder.py |    2 +-
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index a07f957..9cca0a8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+invirt-dev (0.1.12) unstable; urgency=low
+
+  * Add submodules to the superrepo if a package has never been built
+    before
+  * Bug fixes for multi-distro support
+
+ -- Quentin Smith <quentin@mit.edu>  Sat, 15 Oct 2011 18:24:28 -0400
+
 invirt-dev (0.1.11) unstable; urgency=low
 
   * Add a prefix to binary package versions based on the distribution they
diff --git a/invirtibuilder b/invirtibuilder
index b4487b9..3df3539 100755
--- a/invirtibuilder
+++ b/invirtibuilder
@@ -218,16 +218,37 @@ def updateSuperproject(pocket, package, commit, principal, version, env):
     tree = logAndRun(['git', 'ls-tree', branch],
                      cwd=superproject).strip()
 
-    new_tree = re.compile(
-        r'^(160000 commit )[0-9a-f]*(\t%s)$' % package, re.M).sub(
-        r'\g<1>%s\g<2>' % commit,
-        tree)
+    tree_items = dict(k, v for v, k in (x.split("\t" for x in tree.split("\n"))))
+
+    created = not (package in tree_items)
+
+    tree_items[package] = "160000 commit "+commit
+
+    # 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)
+        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()
+            tree_items[package] = "100644 blob "+gitmodules_hash
+
+    new_tree = "\n".join("%s\t%s" % (v, k) for (k, v) in tree_items.iteritems())
 
     new_tree_id = logAndRun(['git', 'mktree', '--missing'],
                             cwd=superproject,
                             stdin_str=new_tree).strip()
 
-    commit_msg = ('Update %s to version %s\n\n'
+    if created:
+        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))
@@ -365,7 +386,7 @@ def build():
                               cwd=packagedir)
 
                     db.failed_stage = 'building binary packages'
-                    sbuildAll(package, commit, workdir)
+                    sbuildAll(package, commit, b.pocketToDistro(pocket), workdir)
                     db.failed_stage = 'tagging submodule'
                     tagSubmodule(pocket, package, commit, principal, version, env)
                     db.failed_stage = 'updating submodule branches'
diff --git a/python/invirt/builder.py b/python/invirt/builder.py
index 1a736bd..f864feb 100644
--- a/python/invirt/builder.py
+++ b/python/invirt/builder.py
@@ -153,7 +153,7 @@ def validateBuild(pocket, package, commit):
             continue
 
         current_version = getVersion(package, b)
-        current_distro = pocketToDistro(pocket)
+        current_distro = pocketToDistro(p)
 
         # NB: Neither current_version nor new_version will have the
         # distro-specific prefix.
-- 
1.7.9.5