From af2896a3796812f8094f9acb8ed2d1f10914f878 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Wed, 3 Oct 2012 17:54:25 +0100 Subject: 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. --- morphlib/git.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'morphlib/git.py') 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: -- cgit v1.2.1