diff options
-rw-r--r-- | morphlib/git.py | 22 | ||||
-rw-r--r-- | morphlib/plugins/branch_and_merge_plugin.py | 12 | ||||
-rwxr-xr-x | tests.branching/edit-handles-submodules.script | 31 | ||||
-rwxr-xr-x | tests.branching/edit-handles-submodules.setup | 40 |
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" |