Add submodules to the superrepo if a package has never been built
[invirt/packages/invirt-dev.git] / invirtibuilder
index b4487b9..3df3539 100755 (executable)
@@ -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'