diff options
author | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2012-10-03 17:54:25 +0100 |
---|---|---|
committer | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2012-10-03 17:54:25 +0100 |
commit | af2896a3796812f8094f9acb8ed2d1f10914f878 (patch) | |
tree | ed698fd287ab6e31657ec8b27e96e7a3d0a201e4 | |
parent | a4a66fce7c6086f25b4071d5c33f07d5badf8181 (diff) | |
download | morph-af2896a3796812f8094f9acb8ed2d1f10914f878.tar.gz |
Handle submodules in 'morph edit'
We often have .gitmodules edited to contain a URI such as
upstream:gnulib, so that we can transparently mirror these in different
locations.
It would be nice to set up git url.insteadOf rules to expand these for
the submodules, but 'git submodule update' uses 'git clone' to fetch
them, which will not take into account the configuration of the
parent repository.
Instead, we set up the submodules automatically and rewrite the URLs
directly in the configuration. The user will need to recreate their
system branch checkouts if their URL configuration changes, or update
the URLs manually, but that should not happen often.
-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" |