summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/git.py22
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py12
-rwxr-xr-xtests.branching/edit-handles-submodules.script31
-rwxr-xr-xtests.branching/edit-handles-submodules.setup40
4 files changed, 99 insertions, 6 deletions
diff --git a/morphlib/git.py b/morphlib/git.py
index b3dd2c45..973e4af7 100644
--- a/morphlib/git.py
+++ b/morphlib/git.py
@@ -135,6 +135,28 @@ class Submodules(object):
def __len__(self):
return len(self.submodules)
+
+def update_submodules(app, repo_dir): # pragma: no cover
+ '''Set up repo submodules, rewriting the URLs to expand prefixes
+
+ We do this automatically rather than leaving it to the user so that they
+ don't have to worry about the prefixed URLs manually.
+ '''
+
+ if os.path.exists(os.path.join(repo_dir, '.gitmodules')):
+ resolver = morphlib.repoaliasresolver.RepoAliasResolver(
+ app.settings['repo-alias'])
+ app.runcmd(['git', 'submodule', 'init'], cwd=repo_dir)
+ urls = app.runcmd(
+ ['git', 'config', '--get-regexp', r'submodule.\w+.url'],
+ cwd=repo_dir)
+ for line in urls.splitlines():
+ setting, url = line.split(' ')
+ app.runcmd(['git', 'config', setting, resolver.pull_url(url)],
+ cwd=repo_dir)
+ app.runcmd(['git', 'submodule', 'update'], cwd=repo_dir)
+
+
def get_user_name(runcmd):
'''Get user.name configuration setting. Complain if none was found.'''
if 'GIT_AUTHOR_NAME' in os.environ:
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index a3faa0c2..1deede4a 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -219,7 +219,8 @@ class BranchAndMergePlugin(cliapp.Plugin):
os.makedirs(parent_dir)
# Clone it from cache to target directory.
- repo.clone_checkout(ref, os.path.abspath(dirname))
+ target_path = os.path.abspath(dirname)
+ repo.clone_checkout(ref, target_path)
# Remember the repo name we cloned from in order to be able
# to identify the repo again later using the same name, even
@@ -230,13 +231,12 @@ class BranchAndMergePlugin(cliapp.Plugin):
# temporary refs, e.g. for building.
self.set_repo_config(dirname, 'morph.uuid', uuid.uuid4().hex)
- # Set the origin to point at the original repository.
+ # URL configuration
morphlib.git.set_remote(self.app.runcmd, dirname, 'origin', repo.url)
-
- # Add push url rewrite rule to .git/config.
self.set_repo_config(
- dirname, 'url.%s.pushInsteadOf' % resolver.push_url(reponame),
- resolver.pull_url(reponame))
+ dirname, 'url.%s.pushInsteadOf' % resolver.push_url(reponame),
+ resolver.pull_url(reponame))
+ morphlib.git.update_submodules(self.app, target_path)
self.app.runcmd(['git', 'remote', 'update'], cwd=dirname)
diff --git a/tests.branching/edit-handles-submodules.script b/tests.branching/edit-handles-submodules.script
new file mode 100755
index 00000000..6e781cbe
--- /dev/null
+++ b/tests.branching/edit-handles-submodules.script
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Copyright (C) 2012 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# 'morph edit' should set up git URL rewriting correctly so that submodule
+# commands function as usual, despite our prefixing and mirroring.
+
+set -eu
+
+cd "$DATADIR/workspace"
+"$SRCDIR/scripts/test-morph" init
+"$SRCDIR/scripts/test-morph" branch baserock:morphs newbranch
+
+# Submodules should be set up automatically
+"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello
+
+cd "$DATADIR/workspace/newbranch/baserock:hello"
+[ -e foolib/README ]
+
diff --git a/tests.branching/edit-handles-submodules.setup b/tests.branching/edit-handles-submodules.setup
new file mode 100755
index 00000000..1b3f3198
--- /dev/null
+++ b/tests.branching/edit-handles-submodules.setup
@@ -0,0 +1,40 @@
+#!/bin/sh
+# Copyright (C) 2012 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -eu
+
+# Create a dummy submodule
+mkdir "$DATADIR/foolib"
+cd "$DATADIR/foolib"
+
+echo "Thanks" > README
+git init .
+git add README
+git commit -m "Initial commit"
+
+# Use this in hello chunk
+cd "$DATADIR/hello"
+git submodule add "$DATADIR/foolib" foolib/
+git commit -m "Use Foolib submodule"
+
+# Rewrite the URL, as we would do in Trove
+cat <<EOF > "$DATADIR/hello/.gitmodules"
+[submodule "foolib"]
+ path = foolib
+ url = baserock:foolib
+EOF
+git add .gitmodules
+git commit -m "Use Foolib from baserock: prefix"