diff options
-rw-r--r-- | cerbero/build/source.py | 3 | ||||
-rw-r--r-- | cerbero/utils/git.py | 37 |
2 files changed, 36 insertions, 4 deletions
diff --git a/cerbero/build/source.py b/cerbero/build/source.py index 2bc3360d..b60d00d3 100644 --- a/cerbero/build/source.py +++ b/cerbero/build/source.py @@ -161,6 +161,7 @@ class GitCache (Source): git.add_remote(self.repo_dir, remote, "file://" + cached_dir) git.fetch(self.repo_dir, fail=False) else: + cached_dir = None # add remotes from both upstream and config so user can easily # cherry-pick patches between branches for remote, url in self.remotes.iteritems(): @@ -172,6 +173,8 @@ class GitCache (Source): if checkout: commit = self.config.recipe_commit(self.name) or self.commit git.checkout(self.repo_dir, commit) + git.submodules_update(self.repo_dir, cached_dir, fail=False) + def built_version(self): return '%s+git~%s' % (self.version, git.get_hash(self.repo_dir, self.commit)) diff --git a/cerbero/utils/git.py b/cerbero/utils/git.py index 697cdc76..53717d72 100644 --- a/cerbero/utils/git.py +++ b/cerbero/utils/git.py @@ -111,6 +111,36 @@ def fetch(git_dir, fail=True): ''' return shell.call('%s fetch --all' % GIT, git_dir, fail=fail) +def submodules_update(git_dir, src_dir=None, fail=True): + ''' + Update somdules from local directory + + @param git_dir: path of the git repository + @type git_dir: str + @param src_dir: path or base URI of the source directory + @type src_dir: src + @param fail: raise an error if the command failed + @type fail: false + ''' + if src_dir: + config = shell.check_call('%s config --file=.gitmodules --list' % GIT, + git_dir) + config_array = [s.split('=', 1) for s in config.split('\n')] + for c in config_array: + if c[0].startswith('submodule.') and c[0].endswith('.path'): + submodule = c[0][len('submodule.'):-len('.path')] + shell.call("%s config --file=.gitmodules submodule.%s.url %s" % + (GIT, submodule, os.path.join(src_dir, c[1])), + git_dir) + shell.call("%s submodule init" % GIT, git_dir) + shell.call("%s submodule sync" % GIT, git_dir) + shell.call("%s submodule update" % GIT, git_dir, fail=fail) + if src_dir: + for c in config_array: + if c[0].startswith('submodule.') and c[0].endswith('.url'): + shell.call("%s config --file=.gitmodules %s %s" % + (GIT, c[0], c[1]), git_dir) + shell.call("%s submodule sync" % GIT, git_dir) def checkout(git_dir, commit): ''' @@ -156,10 +186,9 @@ def local_checkout(git_dir, local_git_dir, commit): shell.call('%s branch %s' % (GIT, branch_name), local_git_dir, fail=False) shell.call('%s checkout %s' % (GIT, branch_name), local_git_dir) shell.call('%s reset --hard %s' % (GIT, commit), local_git_dir) - return shell.call('%s clone %s -s -b %s .' % (GIT, local_git_dir, - branch_name), - git_dir) - + shell.call('%s clone %s -s -b %s .' % (GIT, local_git_dir, branch_name), + git_dir) + submodules_update(git_dir, local_git_dir) def add_remote(git_dir, name, url): ''' |