diff options
-rw-r--r-- | morphlib/plugins/branch_and_merge_plugin.py | 24 | ||||
-rw-r--r-- | tests.branching/branch-when-branchdir-exists-locally.stderr | 2 | ||||
-rwxr-xr-x | tests.branching/branch-works-anywhere.script | 56 | ||||
-rw-r--r-- | tests.branching/branch-works-anywhere.stdout | 98 | ||||
-rwxr-xr-x | tests.branching/checkout-works-anywhere.script | 46 | ||||
-rw-r--r-- | tests.branching/checkout-works-anywhere.stdout | 35 |
6 files changed, 250 insertions, 11 deletions
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py index 6c458031..abadf8da 100644 --- a/morphlib/plugins/branch_and_merge_plugin.py +++ b/morphlib/plugins/branch_and_merge_plugin.py @@ -271,17 +271,19 @@ class BranchAndMergePlugin(cliapp.Plugin): commit = 'master' if len(args) == 2 else args[2] # Create the system branch directory. - os.makedirs(new_branch) + workspace = self.deduce_workspace() + branch_dir = os.path.join(workspace, new_branch) + os.makedirs(branch_dir) # Create a .morph-system-branch directory to clearly identify # this directory as a morph system branch. - os.mkdir(os.path.join(new_branch, '.morph-system-branch')) + os.mkdir(os.path.join(branch_dir, '.morph-system-branch')) # Remember the repository we branched off from. - self.write_branch_root(new_branch, repo) + self.write_branch_root(branch_dir, repo) # Clone into system branch directory. - repo_dir = os.path.join(new_branch, self.convert_uri_to_path(repo)) + repo_dir = os.path.join(branch_dir, self.convert_uri_to_path(repo)) self.clone_to_directory(self.app, repo_dir, repo, commit) # Create a new branch in the local morphs repository. @@ -315,17 +317,19 @@ class BranchAndMergePlugin(cliapp.Plugin): system_branch = args[1] # Create the system branch directory. - os.makedirs(system_branch) + workspace = self.deduce_workspace() + branch_dir = os.path.join(workspace, system_branch) + os.makedirs(branch_dir) # Create a .morph-system-branch directory to clearly identify # this directory as a morph system branch. - os.mkdir(os.path.join(system_branch, '.morph-system-branch')) + os.mkdir(os.path.join(branch_dir, '.morph-system-branch')) # Remember the repository we branched off from. - self.write_branch_root(system_branch, repo) + self.write_branch_root(branch_dir, repo) # Clone into system branch directory. - repo_dir = os.path.join(system_branch, self.convert_uri_to_path(repo)) + repo_dir = os.path.join(branch_dir, self.convert_uri_to_path(repo)) self.clone_to_directory(self.app, repo_dir, repo, system_branch) def show_system_branch(self, args): @@ -356,8 +360,8 @@ class BranchAndMergePlugin(cliapp.Plugin): for repo in args[1:]: 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) + pull_from = urlparse.urljoin( + '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) diff --git a/tests.branching/branch-when-branchdir-exists-locally.stderr b/tests.branching/branch-when-branchdir-exists-locally.stderr index 6c56c250..e178cf2c 100644 --- a/tests.branching/branch-when-branchdir-exists-locally.stderr +++ b/tests.branching/branch-when-branchdir-exists-locally.stderr @@ -1 +1 @@ -ERROR: newbranch: File exists +ERROR: TMP/workspace/newbranch: File exists diff --git a/tests.branching/branch-works-anywhere.script b/tests.branching/branch-works-anywhere.script new file mode 100755 index 00000000..85098f49 --- /dev/null +++ b/tests.branching/branch-works-anywhere.script @@ -0,0 +1,56 @@ +#!/bin/bash +# 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. + +# Make sure "morph branch" works anywhere in a workspace or system branch. + +set -eu + +cd "$DATADIR/workspace" +"$SRCDIR/scripts/test-morph" init + +# First, create a branch. +"$SRCDIR/scripts/test-morph" branch baserock:morphs branch1 + +echo "Workspace after creating the first branch:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' + +# Now, create a nother branch from the workspace. +"$SRCDIR/scripts/test-morph" branch baserock:morphs branch2 + +echo "Workspace after creating the second branch:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' + +# Now, enter the first branch and create a third branch, which +# should not be created in the working directory but in the +# workspace directory. +cd "$DATADIR/workspace/branch1" +"$SRCDIR/scripts/test-morph" branch baserock:morphs branch3 + +echo "Workspace after creating the third branch:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' + +# Now, go into the morphs repository of that third branch and +# create a fourth system branch from in there. This, too, should +# end up being created in the toplevel workspace directory. +cd "$DATADIR/workspace/branch3/baserock:morphs" +"$SRCDIR/scripts/test-morph" branch baserock:morphs branch4 + +echo "Workspace after creating the fourth branch:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' diff --git a/tests.branching/branch-works-anywhere.stdout b/tests.branching/branch-works-anywhere.stdout new file mode 100644 index 00000000..cddc2d76 --- /dev/null +++ b/tests.branching/branch-works-anywhere.stdout @@ -0,0 +1,98 @@ +Workspace after creating the first branch: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +d ./branch1 +d ./branch1/.morph-system-branch +d ./branch1/baserock:morphs +d ./branch1/baserock:morphs/.git +f ./branch1/.morph-system-branch/branch-root +f ./branch1/baserock:morphs/hello-stratum.morph +f ./branch1/baserock:morphs/hello-system.morph +Workspace after creating the second branch: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +d ./branch1 +d ./branch1/.morph-system-branch +d ./branch1/baserock:morphs +d ./branch1/baserock:morphs/.git +d ./branch2 +d ./branch2/.morph-system-branch +d ./branch2/baserock:morphs +d ./branch2/baserock:morphs/.git +f ./branch1/.morph-system-branch/branch-root +f ./branch1/baserock:morphs/hello-stratum.morph +f ./branch1/baserock:morphs/hello-system.morph +f ./branch2/.morph-system-branch/branch-root +f ./branch2/baserock:morphs/hello-stratum.morph +f ./branch2/baserock:morphs/hello-system.morph +Workspace after creating the third branch: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +d ./branch1 +d ./branch1/.morph-system-branch +d ./branch1/baserock:morphs +d ./branch1/baserock:morphs/.git +d ./branch2 +d ./branch2/.morph-system-branch +d ./branch2/baserock:morphs +d ./branch2/baserock:morphs/.git +d ./branch3 +d ./branch3/.morph-system-branch +d ./branch3/baserock:morphs +d ./branch3/baserock:morphs/.git +f ./branch1/.morph-system-branch/branch-root +f ./branch1/baserock:morphs/hello-stratum.morph +f ./branch1/baserock:morphs/hello-system.morph +f ./branch2/.morph-system-branch/branch-root +f ./branch2/baserock:morphs/hello-stratum.morph +f ./branch2/baserock:morphs/hello-system.morph +f ./branch3/.morph-system-branch/branch-root +f ./branch3/baserock:morphs/hello-stratum.morph +f ./branch3/baserock:morphs/hello-system.morph +Workspace after creating the fourth branch: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +d ./branch1 +d ./branch1/.morph-system-branch +d ./branch1/baserock:morphs +d ./branch1/baserock:morphs/.git +d ./branch2 +d ./branch2/.morph-system-branch +d ./branch2/baserock:morphs +d ./branch2/baserock:morphs/.git +d ./branch3 +d ./branch3/.morph-system-branch +d ./branch3/baserock:morphs +d ./branch3/baserock:morphs/.git +d ./branch4 +d ./branch4/.morph-system-branch +d ./branch4/baserock:morphs +d ./branch4/baserock:morphs/.git +f ./branch1/.morph-system-branch/branch-root +f ./branch1/baserock:morphs/hello-stratum.morph +f ./branch1/baserock:morphs/hello-system.morph +f ./branch2/.morph-system-branch/branch-root +f ./branch2/baserock:morphs/hello-stratum.morph +f ./branch2/baserock:morphs/hello-system.morph +f ./branch3/.morph-system-branch/branch-root +f ./branch3/baserock:morphs/hello-stratum.morph +f ./branch3/baserock:morphs/hello-system.morph +f ./branch4/.morph-system-branch/branch-root +f ./branch4/baserock:morphs/hello-stratum.morph +f ./branch4/baserock:morphs/hello-system.morph diff --git a/tests.branching/checkout-works-anywhere.script b/tests.branching/checkout-works-anywhere.script new file mode 100755 index 00000000..fdc3c955 --- /dev/null +++ b/tests.branching/checkout-works-anywhere.script @@ -0,0 +1,46 @@ +#!/bin/bash +# 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. + +# Make sure "morph checkout" works anywhere in a workspace or system branch. + +set -eu + +cd "$DATADIR/workspace" +"$SRCDIR/scripts/test-morph" init + +# First, check out the master branch from the workspace directory. +"$SRCDIR/scripts/test-morph" checkout baserock:morphs master + +echo "Workspace after checking out master from the workspace directory:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' + +# Reset the workspace. +cd "$DATADIR" +rm -rf workspace +mkdir workspace +cd workspace +"$SRCDIR/scripts/test-morph" init + +# This time, create a new branch and check out the master branch +# from within that branch. +"$SRCDIR/scripts/test-morph" branch baserock:morphs newbranch +cd newbranch/baserock:morphs +"$SRCDIR/scripts/test-morph" checkout baserock:morphs master + +echo "Workspace after checking out master from within a new branch:" +"$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | + sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' diff --git a/tests.branching/checkout-works-anywhere.stdout b/tests.branching/checkout-works-anywhere.stdout new file mode 100644 index 00000000..0cd18b85 --- /dev/null +++ b/tests.branching/checkout-works-anywhere.stdout @@ -0,0 +1,35 @@ +Workspace after checking out master from the workspace directory: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +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 +Workspace after checking out master from within a new branch: +d . +d ./.morph +d ./.morph/cache +d ./.morph/cache/gits +d ./.morph/cache/gits/file_morphs +d ./.morph/cache/gits/file_morphs/.git +d ./master +d ./master/.morph-system-branch +d ./master/baserock:morphs +d ./master/baserock:morphs/.git +d ./newbranch +d ./newbranch/.morph-system-branch +d ./newbranch/baserock:morphs +d ./newbranch/baserock:morphs/.git +f ./master/.morph-system-branch/branch-root +f ./master/baserock:morphs/hello-stratum.morph +f ./master/baserock:morphs/hello-system.morph +f ./newbranch/.morph-system-branch/branch-root +f ./newbranch/baserock:morphs/hello-stratum.morph +f ./newbranch/baserock:morphs/hello-system.morph |