diff options
author | Jannis Pohlmann <jannis.pohlmann@codethink.co.uk> | 2012-08-29 15:59:02 +0000 |
---|---|---|
committer | Jannis Pohlmann <jannis.pohlmann@codethink.co.uk> | 2012-08-29 18:49:31 +0100 |
commit | ce83a0afe0a51c9b8ab75e89d23f45c3ebf2be93 (patch) | |
tree | 1cb88b939109007383f4dec3da61e1b66c6d76cc | |
parent | 34c03048cc99e8a8abeb3e3c99574a92a2acb00a (diff) | |
download | morph-ce83a0afe0a51c9b8ab75e89d23f45c3ebf2be93.tar.gz |
Remember repository that was branched off from for merging and editing
With this commit, "morph branch" and "morph checkout" remember the
repository that was branched off from (the "branch root") in a special
file called
$workspace/$branch/.morph-system-branch/branch-root
This information is later used when checking out individual
repositories using "morph edit" instead of using the previously
hard-coded "$workspace/$branch/morphs" repository as the branch
root.
This commit also updates the "morph merge" code to handle repositories
specified with aliases or as full URLs in the same way "morph checkout"
does.
All affected tests are updated.
10 files changed, 69 insertions, 36 deletions
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py index 098546cf..74069200 100644 --- a/morphlib/plugins/branch_and_merge_plugin.py +++ b/morphlib/plugins/branch_and_merge_plugin.py @@ -98,6 +98,20 @@ class BranchAndMergePlugin(cliapp.Plugin): raise cliapp.AppException("Can't find the system branch directory") @staticmethod + def write_branch_root(branch_dir, repo): + filename = os.path.join(branch_dir, '.morph-system-branch', + 'branch-root') + with open(filename, 'w') as f: + f.write('%s\n' % repo) + + @staticmethod + def read_branch_root(branch_dir): + filename = os.path.join(branch_dir, '.morph-system-branch', + 'branch-root') + with open(filename, 'r') as f: + return f.read().strip() + + @staticmethod def clone_to_directory(app, dirname, reponame, ref): '''Clone a repository below a directory. @@ -259,6 +273,9 @@ class BranchAndMergePlugin(cliapp.Plugin): # this directory as a morph system branch. os.mkdir(os.path.join(new_branch, '.morph-system-branch')) + # Remember the repository we branched off from. + self.write_branch_root(new_branch, self.system_repo_base) + # Clone into system branch directory. new_repo = os.path.join(new_branch, self.system_repo_base) self.clone_to_directory(self.app, new_repo, self.system_repo_name, @@ -301,6 +318,9 @@ class BranchAndMergePlugin(cliapp.Plugin): # this directory as a morph system branch. os.mkdir(os.path.join(system_branch, '.morph-system-branch')) + # Remember the repository we branched off from. + self.write_branch_root(system_branch, repo) + # Clone into system branch directory. repo_dir = os.path.join(system_branch, self._convert_uri_to_path(repo)) self.clone_to_directory(self.app, repo_dir, repo, system_branch) @@ -313,21 +333,22 @@ class BranchAndMergePlugin(cliapp.Plugin): def merge(self, args): '''Merge specified repositories from another system branch.''' - if len(args) == 0: + if len(args) < 2: raise cliapp.AppException('morph merge must get a branch name ' 'and some repo names as arguments') - app = self.app other_branch = args[0] workspace = self.deduce_workspace() this_branch = self.deduce_system_branch() for repo in args[1:]: - repo = self.resolve_reponame(app, repo) - basename = os.path.basename(repo) - pull_from = os.path.join(workspace, other_branch, basename) - repo_dir = os.path.join(workspace, this_branch, basename) - app.runcmd(['git', 'pull', pull_from, other_branch], cwd=repo_dir) + repo_url = self.resolve_reponame(self.app, repo) + repo_path = self._convert_uri_to_path(repo) + pull_from = 'file://' + os.path.join(workspace, other_branch, + repo_path) + repo_dir = os.path.join(workspace, this_branch, repo_path) + self.app.runcmd(['git', 'pull', pull_from, other_branch], + cwd=repo_dir) def edit(self, args): '''Edit a component in a system branch.''' @@ -336,43 +357,49 @@ class BranchAndMergePlugin(cliapp.Plugin): raise cliapp.AppException('morph edit must get a repository name ' 'and commit ref as argument') - app = self.app workspace = self.deduce_workspace() system_branch = self.deduce_system_branch() - morphs_dirname = os.path.join(workspace, system_branch, 'morphs') - if morphs_dirname is None: - raise morphlib.Error('Can not find morphs directory') + # Find out which repository we branched off from. + branch_dir = os.path.join(workspace, system_branch) + branch_root = self.read_branch_root(branch_dir) + + # Convert it to a local directory in the branch. + branch_root_path = self._convert_uri_to_path(branch_root) + branch_root_dir = os.path.join(branch_dir, branch_root_path) - repo = self.resolve_reponame(app, args[0]) + # Find out which repository to edit. + repo, repo_url = args[0], self.resolve_reponame(self.app, args[0]) + # Find out which ref of the edit repo to check out. if len(args) == 2: ref = args[1] else: - ref = self.find_edit_ref(app, morphs_dirname, repo) + ref = self.find_edit_ref(self.app, branch_root_dir, repo_url) if ref is None: raise morphlib.Error('Cannot deduce commit to start edit from') - new_repo = os.path.join(workspace, system_branch, - os.path.basename(repo)) - self.clone_to_directory(app, new_repo, args[0], ref) + # Clone the repository to be edited. + repo_dir = os.path.join(branch_dir, self._convert_uri_to_path(repo)) + self.clone_to_directory(self.app, repo_dir, repo, ref) if system_branch == ref: - app.runcmd(['git', 'checkout', system_branch], - cwd=new_repo) + self.app.runcmd(['git', 'checkout', system_branch], + cwd=repo_dir) else: - app.runcmd(['git', 'checkout', '-b', system_branch, ref], - cwd=new_repo) + self.app.runcmd(['git', 'checkout', '-b', system_branch, ref], + cwd=repo_dir) - for filename, morph in self.morphs_for_repo(app, morphs_dirname, repo): + for filename, morph in \ + self.morphs_for_repo(self.app, branch_root_dir, repo_url): changed = False for spec in morph['sources']: - spec_repo = self.resolve_reponame(app, spec['repo']) - if spec_repo == repo and spec['ref'] != system_branch: - app.status(msg='Replacing ref "%(ref)s" with "%(branch)s"' - 'in %(filename)s', - ref=spec['ref'], branch=system_branch, - filename=filename, chatty=True) + spec_repo = self.resolve_reponame(self.app, spec['repo']) + if spec_repo == repo_url and spec['ref'] != system_branch: + self.app.status(msg='Replacing ref "%(ref)s" with ' + '"%(branch)s" in %(filename)s', + ref=spec['ref'], branch=system_branch, + filename=filename, chatty=True) spec['ref'] = system_branch changed = True if changed: diff --git a/tests.branching/branch-creates-new-system-branch-not-from-master.stdout b/tests.branching/branch-creates-new-system-branch-not-from-master.stdout index af1ad6cd..7dc55cc0 100644 --- a/tests.branching/branch-creates-new-system-branch-not-from-master.stdout +++ b/tests.branching/branch-creates-new-system-branch-not-from-master.stdout @@ -9,6 +9,7 @@ d ./newbranch d ./newbranch/.morph-system-branch d ./newbranch/morphs d ./newbranch/morphs/.git +f ./newbranch/.morph-system-branch/branch-root f ./newbranch/morphs/hello-stratum.morph f ./newbranch/morphs/hello-system.morph f ./newbranch/morphs/this.is.alfred diff --git a/tests.branching/branch-creates-new-system-branch.stdout b/tests.branching/branch-creates-new-system-branch.stdout index e22ef30b..c37fb0e4 100644 --- a/tests.branching/branch-creates-new-system-branch.stdout +++ b/tests.branching/branch-creates-new-system-branch.stdout @@ -9,6 +9,7 @@ d ./newbranch d ./newbranch/.morph-system-branch d ./newbranch/morphs d ./newbranch/morphs/.git +f ./newbranch/.morph-system-branch/branch-root f ./newbranch/morphs/hello-stratum.morph f ./newbranch/morphs/hello-system.morph Current branches: diff --git a/tests.branching/checkout-existing-branch.stdout b/tests.branching/checkout-existing-branch.stdout index 7ac4a149..1af2900c 100644 --- a/tests.branching/checkout-existing-branch.stdout +++ b/tests.branching/checkout-existing-branch.stdout @@ -9,6 +9,7 @@ d ./master d ./master/.morph-system-branch d ./master/baserock:morphs d ./master/baserock:morphs/.git +f ./master/.morph-system-branch/branch-root f ./master/baserock:morphs/hello-stratum.morph f ./master/baserock:morphs/hello-system.morph Current branches: diff --git a/tests.branching/checkout-non-aliased-repos.stdout b/tests.branching/checkout-non-aliased-repos.stdout index 75dcd63d..872d74aa 100644 --- a/tests.branching/checkout-non-aliased-repos.stdout +++ b/tests.branching/checkout-non-aliased-repos.stdout @@ -12,6 +12,7 @@ d ./master/TEMP_DIR d ./master/DATADIR d ./master/DATADIR/morphs d ./master/DATADIR/morphs/.git +f ./master/.morph-system-branch/branch-root f ./master/DATADIR/morphs/hello-stratum.morph f ./master/DATADIR/morphs/hello-system.morph Current branches of repo with suffix: @@ -30,6 +31,7 @@ d ./master/TEMP_DIR d ./master/DATADIR d ./master/DATADIR/morphs d ./master/DATADIR/morphs/.git +f ./master/.morph-system-branch/branch-root f ./master/DATADIR/morphs/hello-stratum.morph f ./master/DATADIR/morphs/hello-system.morph Current branches of repo without suffix: diff --git a/tests.branching/edit-checkouts-existing-chunk.script b/tests.branching/edit-checkouts-existing-chunk.script index b8480a5b..1c8e66cd 100755 --- a/tests.branching/edit-checkouts-existing-chunk.script +++ b/tests.branching/edit-checkouts-existing-chunk.script @@ -33,7 +33,7 @@ echo "Current branches, morphs:" "$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/alfred/baserock:morphs" branch echo "Current branches, hello:" -"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/alfred/hello" branch +"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/alfred/baserock:hello" branch echo "Files in hello:" -ls "$DATADIR/workspace/alfred/hello" +ls "$DATADIR/workspace/alfred/baserock:hello" diff --git a/tests.branching/edit-clones-chunk.script b/tests.branching/edit-clones-chunk.script index 20f62a27..d5e117cb 100755 --- a/tests.branching/edit-clones-chunk.script +++ b/tests.branching/edit-clones-chunk.script @@ -38,9 +38,10 @@ echo "Current origin, morphs:" sed 's,\(TMP/workspace/\.morph/cache/gits/file_\).*_,\1,g' echo "Current branches, hello:" -"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/newbranch/hello" branch +"$SRCDIR/scripts/run-git-in" \ + "$DATADIR/workspace/newbranch/baserock:hello" branch echo "Current origin, hello:" -"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/newbranch/hello" \ +"$SRCDIR/scripts/run-git-in" "$DATADIR/workspace/newbranch/baserock:hello" \ remote show origin | \ sed 's,\(TMP/workspace/\.morph/cache/gits/file_\).*_,\1,g' diff --git a/tests.branching/edit-uses-ref-from-stratum.script b/tests.branching/edit-uses-ref-from-stratum.script index ce3e0ccc..f2276f3b 100755 --- a/tests.branching/edit-uses-ref-from-stratum.script +++ b/tests.branching/edit-uses-ref-from-stratum.script @@ -29,5 +29,5 @@ cd "$DATADIR/workspace" cd newbranch/morphs "$SRCDIR/scripts/test-morph" edit baserock:hello -cd ../hello +cd ../baserock:hello git branch diff --git a/tests.branching/merge-explicitly-named-repos.script b/tests.branching/merge-explicitly-named-repos.script index 9052cd31..5a0953a7 100755 --- a/tests.branching/merge-explicitly-named-repos.script +++ b/tests.branching/merge-explicitly-named-repos.script @@ -29,7 +29,7 @@ cd "$DATADIR/workspace" # Make a change to a chunk. cd newbranch/morphs "$SRCDIR/scripts/test-morph" edit baserock:hello master -cd ../hello +cd ../baserock:hello touch newfile.txt git add newfile.txt git commit -m foo --quiet @@ -42,7 +42,7 @@ cd otherbranch/morphs "$SRCDIR/scripts/test-morph" merge newbranch baserock:hello # Check results. -cd ../hello +cd ../baserock:hello git status --short # make sure all changes are committed ls newfile.txt # make sure the new file is there diff --git a/tests.branching/workflow.script b/tests.branching/workflow.script index 64326e4a..59c7b152 100755 --- a/tests.branching/workflow.script +++ b/tests.branching/workflow.script @@ -26,7 +26,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" branch me/readme-fix cd me/readme-fix/morphs "$SRCDIR/scripts/test-morph" edit baserock:hello master -cd ../hello +cd ../baserock:hello echo > README yoyoyo git add README git commit -m "Fix README, yo!" --quiet @@ -35,5 +35,5 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" checkout baserock:morphs master cd master/baserock:morphs "$SRCDIR/scripts/test-morph" edit baserock:hello master -"$SRCDIR/scripts/test-morph" merge me/readme-fix hello +"$SRCDIR/scripts/test-morph" merge me/readme-fix baserock:hello |