From 46836358e996592a33a7d3a38447d46985b3ff20 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 19 Aug 2013 12:45:04 +0000 Subject: Fix name of yarn scenario This exposed a bug in yarn: it does not notice when two scenarios have the same name, and uses the same DATADIR directory for two scenarios. Oops. Fixed this by changing one of the scenario names in the Morph test suite. Yarn itself will be fixed separately. --- yarns/branches-workspaces.yarn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarns/branches-workspaces.yarn b/yarns/branches-workspaces.yarn index 3af362a1..7c8715a7 100644 --- a/yarns/branches-workspaces.yarn +++ b/yarns/branches-workspaces.yarn @@ -90,7 +90,7 @@ to check for that locally. Similarly, attempting to branch a system branch should fail if the repository does not contain any system morphologies. - SCENARIO checking out a system branch with no systems + SCENARIO branching a system branch with no systems GIVEN a workspace AND a git server WHEN morph attempts to branch a repository with no systems -- cgit v1.2.1 From 754200f3b2bf79d5327b3926e04a8f4136dc035e Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 19 Aug 2013 10:49:30 +0000 Subject: Restore old branch and merge subcommands Most of the subcommands are available as "old-foo". The exception is edit, for which we've decided to stick with the old implementation by default. Thus the new implementation is "new-edit". This is all meant to be a safety net so that for BR10 we are not stuck in limbo in case the new implementations are broken in unexpected ways. --- morphlib/plugins/branch_and_merge_new_plugin.py | 2 +- morphlib/plugins/branch_and_merge_plugin.py | 166 +++++++++++++++++++++++- 2 files changed, 164 insertions(+), 4 deletions(-) diff --git a/morphlib/plugins/branch_and_merge_new_plugin.py b/morphlib/plugins/branch_and_merge_new_plugin.py index e5fe52e6..9dd9c915 100644 --- a/morphlib/plugins/branch_and_merge_new_plugin.py +++ b/morphlib/plugins/branch_and_merge_new_plugin.py @@ -42,7 +42,7 @@ class SimpleBranchAndMergePlugin(cliapp.Plugin): self.app.add_subcommand( 'branch', self.branch, arg_synopsis='REPO NEW [OLD]') self.app.add_subcommand( - 'edit', self.edit, arg_synopsis='SYSTEM STRATUM [CHUNK]') + 'new-edit', self.edit, arg_synopsis='SYSTEM STRATUM [CHUNK]') self.app.add_subcommand( 'show-system-branch', self.show_system_branch, arg_synopsis='') self.app.add_subcommand( diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py index 85e74501..53b94859 100644 --- a/morphlib/plugins/branch_and_merge_plugin.py +++ b/morphlib/plugins/branch_and_merge_plugin.py @@ -57,10 +57,15 @@ class BranchAndMergePlugin(cliapp.Plugin): def enable(self): # User-facing commands + self.app.add_subcommand('old-init', self.init, arg_synopsis='[DIR]') + self.app.add_subcommand('old-branch', self.branch, + arg_synopsis='REPO NEW [OLD]') + self.app.add_subcommand('old-checkout', self.checkout, + arg_synopsis='REPO BRANCH') self.app.add_subcommand('merge', self.merge, arg_synopsis='BRANCH') -# self.app.add_subcommand('edit', self.edit, -# arg_synopsis='SYSTEM STRATUM [CHUNK]') + self.app.add_subcommand('edit', self.edit, + arg_synopsis='SYSTEM STRATUM [CHUNK]') self.app.add_subcommand('petrify', self.petrify) self.app.add_subcommand('unpetrify', self.unpetrify) self.app.add_subcommand( @@ -82,6 +87,15 @@ class BranchAndMergePlugin(cliapp.Plugin): self.app.add_subcommand('foreach', self.foreach, arg_synopsis='-- COMMAND [ARGS...]') + # Plumbing commands (FIXME: should be hidden from --help by default) + self.app.add_subcommand('old-workspace', self.workspace, + arg_synopsis='') + self.app.add_subcommand( + 'old-show-system-branch', self.show_system_branch, + arg_synopsis='') + self.app.add_subcommand('old-show-branch-root', self.show_branch_root, + arg_synopsis='') + def disable(self): pass @@ -353,7 +367,7 @@ class BranchAndMergePlugin(cliapp.Plugin): 'cluster': [ 'name', 'systems', - ], + ] } also_known = { @@ -541,6 +555,50 @@ class BranchAndMergePlugin(cliapp.Plugin): return system_key, metadata_cache_id_lookup + def init(self, args): + '''Initialize a workspace directory. + + Command line argument: + + * `DIR` is the directory to use as a workspace, and defaults to + the current directory. + + This creates a workspace, either in the current working directory, + or if `DIR` is given, in that directory. If the directory doesn't + exist, it is created. If it does exist, it must be empty. + + You need to run `morph init` to initialise a workspace, or none + of the other system branching tools will work: they all assume + an existing workspace. Note that a workspace only exists on your + machine, not on the git server. + + Example: + + morph init /src/workspace + cd /src/workspace + + ''' + + if not args: + args = ['.'] + elif len(args) > 1: + raise cliapp.AppException('init must get at most one argument') + + dirname = args[0] + + # verify the workspace is empty (and thus, can be used) or + # create it if it doesn't exist yet + if os.path.exists(dirname): + if os.listdir(dirname) != []: + raise cliapp.AppException('can only initialize empty ' + 'directory as a workspace: %s' % + dirname) + else: + os.makedirs(dirname) + + os.mkdir(os.path.join(dirname, '.morph')) + self.app.status(msg='Initialized morph workspace', chatty=True) + def _create_branch(self, workspace, branch_name, repo, original_ref): '''Create a branch called branch_name based off original_ref. @@ -580,6 +638,81 @@ class BranchAndMergePlugin(cliapp.Plugin): self.remove_branch_dir_safe(workspace, branch_name) raise + @warns_git_identity + def branch(self, args): + '''Create a new system branch. + + Command line arguments: + + * `REPO` is a repository URL. + * `NEW` is the name of the new system branch. + * `OLD` is the point from which to branch, and defaults to `master`. + + This creates a new system branch. It needs to be run in an + existing workspace (see `morph workspace`). It creates a new + git branch in the clone of the repository in the workspace. The + system branch will not be visible on the git server until you + push your changes to the repository. + + Example: + + cd /src/workspace + morph branch baserock:baserock:morphs jrandom/new-feature + + ''' + + if len(args) not in [2, 3]: + raise cliapp.AppException('morph branch needs name of branch ' + 'as parameter') + + repo = args[0] + new_branch = args[1] + commit = 'master' if len(args) == 2 else args[2] + + self.lrc, self.rrc = morphlib.util.new_repo_caches(self.app) + if self.get_cached_repo(repo).ref_exists(new_branch): + raise cliapp.AppException('branch %s already exists in ' + 'repository %s' % (new_branch, repo)) + + # Create the system branch directory. + workspace = self.deduce_workspace() + self._create_branch(workspace, new_branch, repo, commit) + + @warns_git_identity + def checkout(self, args): + '''Check out an existing system branch. + + Command line arguments: + + * `REPO` is the URL to the repository to the root repository of + a system branch. + * `BRANCH` is the name of the system branch. + + This will check out an existing system branch to an existing + workspace. You must create the workspace first. This only checks + out the root repository, not the repositories for individual + components. You need to use `morph edit` to check out those. + + Example: + + cd /src/workspace + morph checkout baserock:baserock/morphs master + + ''' + + if len(args) != 2: + raise cliapp.AppException('morph checkout needs a repo and the ' + 'name of a branch as parameters') + + repo = args[0] + system_branch = args[1] + + self.lrc, self.rrc = morphlib.util.new_repo_caches(self.app) + + # Create the system branch directory. + workspace = self.deduce_workspace() + self._create_branch(workspace, system_branch, repo, system_branch) + def checkout_repository(self, branch_dir, repo, ref, parent_ref=None): '''Make a chunk or stratum repository available for a system branch @@ -1919,3 +2052,30 @@ class BranchAndMergePlugin(cliapp.Plugin): raise cliapp.AppException( 'Command failed at repo %s: %s' % (repo, ' '.join(args))) + def workspace(self, args): + '''Show the toplevel directory of the current workspace.''' + + self.app.output.write('%s\n' % self.deduce_workspace()) + + def show_system_branch(self, args): + '''Show the name of the current system branch.''' + + branch, dirname = self.deduce_system_branch() + self.app.output.write('%s\n' % branch) + + def show_branch_root(self, args): + '''Show the name of the repository holding the system morphologies. + + This would, for example, write out something like: + + /src/ws/master/baserock:baserock/morphs + + when the master branch of the `baserock:baserock/morphs` + repository is checked out. + + ''' + + workspace = self.deduce_workspace() + system_branch, branch_dir = self.deduce_system_branch() + branch_root = self.get_branch_config(branch_dir, 'branch.root') + self.app.output.write('%s\n' % branch_root) -- cgit v1.2.1 From 7f25c6bea678eb82fdfe024013dac5d0c01af152 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 19 Aug 2013 13:09:39 +0000 Subject: Use new edit instead of old one in tests The test suite got adapted so it requires the new edit instead of the old one. So use the new edit instead of the old one in the test. This is a kluge, and needs to be reverted after the BR10 release. --- tests.as-root/build-handles-stratum-build-depends.script | 2 +- tests.as-root/build-with-external-strata.script | 2 +- tests.branching/add-then-edit.script | 4 ++-- tests.branching/edit-checkouts-existing-chunk.script | 4 ++-- tests.branching/edit-clones-chunk.script | 4 ++-- tests.branching/edit-handles-submodules.script | 4 ++-- tests.branching/edit-updates-stratum-build-depends.script | 2 +- tests.branching/edit-updates-stratum.script | 2 +- tests.branching/edit-works-after-branch-root-was-renamed.script | 2 +- tests.branching/petrify.script | 2 +- tests.merging/move-chunk-repo.script | 4 ++-- tests.merging/rename-stratum.script | 2 +- yarns/implementations.yarn | 4 ++-- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests.as-root/build-handles-stratum-build-depends.script b/tests.as-root/build-handles-stratum-build-depends.script index 22d07c72..fd6a0544 100755 --- a/tests.as-root/build-handles-stratum-build-depends.script +++ b/tests.as-root/build-handles-stratum-build-depends.script @@ -39,7 +39,7 @@ cd test/stratum-build-depends/test:morphs # be updated here. Any build-depends of any altered strata also need to # be altered, such as the 'tools-stratum' which depends on linux-stratum # If they are not updated, the build command will fail. -"$SRCDIR/scripts/test-morph" edit linux-system hello-stratum +"$SRCDIR/scripts/test-morph" new-edit linux-system hello-stratum # Likewise, this command must update build-depends or the 'repo' field will # not be changed in the temporary build branch, leading to: diff --git a/tests.as-root/build-with-external-strata.script b/tests.as-root/build-with-external-strata.script index f5d86dfe..d722f907 100755 --- a/tests.as-root/build-with-external-strata.script +++ b/tests.as-root/build-with-external-strata.script @@ -34,7 +34,7 @@ cd "$DATADIR/workspace" # don't commit it, in one of the external strata, as a challenge for # 'morph build'. cd "branch1" -"$SRCDIR/scripts/test-morph" edit hello-system stratum2 +"$SRCDIR/scripts/test-morph" new-edit hello-system stratum2 cd "test:external-strata" awk ' diff --git a/tests.branching/add-then-edit.script b/tests.branching/add-then-edit.script index d6a2270f..cdb28fd2 100755 --- a/tests.branching/add-then-edit.script +++ b/tests.branching/add-then-edit.script @@ -30,7 +30,7 @@ cd "me/add-then-edit" cd test:morphs ## Sub-optimally, to alter the stratum, you have to `morph edit` it first -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum git apply <<'EOF' diff --git a/hello-stratum.morph b/hello-stratum.morph @@ -50,7 +50,7 @@ index 3b7be17..c79a9af 100644 name: hello-stratum EOF -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum goodbye +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum goodbye # check whether the stratum still contains the goodbye chunk grep -qFe goodbye hello-stratum.morph diff --git a/tests.branching/edit-checkouts-existing-chunk.script b/tests.branching/edit-checkouts-existing-chunk.script index a10a72d1..9584d1a3 100755 --- a/tests.branching/edit-checkouts-existing-chunk.script +++ b/tests.branching/edit-checkouts-existing-chunk.script @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2012 Codethink Limited +# Copyright (C) 2012-2013 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 @@ -27,7 +27,7 @@ cd "$DATADIR/workspace" # Edit the hello chunk in alfred. cd "alfred" -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello echo "Current branches:" "$SRCDIR/scripts/test-morph" foreach git branch diff --git a/tests.branching/edit-clones-chunk.script b/tests.branching/edit-clones-chunk.script index 1b6b8a04..ecc2c55e 100755 --- a/tests.branching/edit-clones-chunk.script +++ b/tests.branching/edit-clones-chunk.script @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2012 Codethink Limited +# Copyright (C) 2012-2013 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 @@ -26,7 +26,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" branch test:morphs newbranch # Edit chunk. -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello echo "Current branches:" "$SRCDIR/scripts/test-morph" foreach git branch diff --git a/tests.branching/edit-handles-submodules.script b/tests.branching/edit-handles-submodules.script index d164facc..389784ed 100755 --- a/tests.branching/edit-handles-submodules.script +++ b/tests.branching/edit-handles-submodules.script @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2012 Codethink Limited +# Copyright (C) 2012-2013 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 @@ -26,7 +26,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" branch test:morphs newbranch # Submodules should be set up automatically -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello cd "$DATADIR/workspace/newbranch/test:hello" [ -e foolib/README ] diff --git a/tests.branching/edit-updates-stratum-build-depends.script b/tests.branching/edit-updates-stratum-build-depends.script index a108ce8a..ed11b584 100755 --- a/tests.branching/edit-updates-stratum-build-depends.script +++ b/tests.branching/edit-updates-stratum-build-depends.script @@ -63,7 +63,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" branch test:morphs newbranch # Edit chunk. -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello # See what effect the editing had. "$SRCDIR/scripts/run-git-in" "newbranch/test:morphs" diff diff --git a/tests.branching/edit-updates-stratum.script b/tests.branching/edit-updates-stratum.script index bfe16c8b..84974765 100755 --- a/tests.branching/edit-updates-stratum.script +++ b/tests.branching/edit-updates-stratum.script @@ -26,7 +26,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" branch test:morphs newbranch # Edit chunk. -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello # See what effect the editing had. "$SRCDIR/scripts/run-git-in" "newbranch/test:morphs" diff diff --git a/tests.branching/edit-works-after-branch-root-was-renamed.script b/tests.branching/edit-works-after-branch-root-was-renamed.script index c7043e27..9591b587 100755 --- a/tests.branching/edit-works-after-branch-root-was-renamed.script +++ b/tests.branching/edit-works-after-branch-root-was-renamed.script @@ -35,7 +35,7 @@ cd "$DATADIR/workspace" cd "$DATADIR/workspace/master" mv test:morphs my-renamed-morphs -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello "$SRCDIR/scripts/list-tree" "$DATADIR/workspace" | grep -v '/\.git/' | sed 's,/cache/gits/file_[^/]*_,/cache/gits/file_,' | diff --git a/tests.branching/petrify.script b/tests.branching/petrify.script index fed8e965..9a276d71 100755 --- a/tests.branching/petrify.script +++ b/tests.branching/petrify.script @@ -29,7 +29,7 @@ cd "$DATADIR/workspace" cd test/petrify/test:morphs git push --quiet origin HEAD -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum goodbye +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum goodbye (cd ../test:goodbye && git push --quiet origin HEAD) "$SRCDIR/scripts/test-morph" petrify diff --git a/tests.merging/move-chunk-repo.script b/tests.merging/move-chunk-repo.script index 3a00015b..40f3cc4a 100755 --- a/tests.merging/move-chunk-repo.script +++ b/tests.merging/move-chunk-repo.script @@ -26,7 +26,7 @@ cd "$DATADIR/workspace" "$SRCDIR/scripts/test-morph" init "$SRCDIR/scripts/test-morph" branch test:morphs baserock/newbranch -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello # Chunk moves to a new location (we manually update the ref back to master # here, so 'morph edit' can create a system branch in the new repo from it). @@ -38,7 +38,7 @@ sed -e 's/"repo": "test:hello"/"repo": "test:hello-lorried"/' \ git commit -q --all -m "'hello' repository has moved" # Now we further edit the chunk, just for fun. -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum hello +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum hello cd "$DATADIR/workspace/baserock/newbranch/test:hello-lorried" touch newfile.txt git add newfile.txt diff --git a/tests.merging/rename-stratum.script b/tests.merging/rename-stratum.script index ba759fa3..5fa13130 100755 --- a/tests.merging/rename-stratum.script +++ b/tests.merging/rename-stratum.script @@ -31,7 +31,7 @@ cd "$DATADIR/workspace" # associate hello-stratum and goodbye-stratum at all. # Rename the stratum -"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum +"$SRCDIR/scripts/test-morph" new-edit hello-system hello-stratum cd baserock/newbranch/test:morphs sed -e 's/"morph": "hello-stratum"/"morph": "goodbye-stratum"/'\ diff --git a/yarns/implementations.yarn b/yarns/implementations.yarn index cfb744f7..cc3ef3e5 100644 --- a/yarns/implementations.yarn +++ b/yarns/implementations.yarn @@ -226,11 +226,11 @@ Editing morphologies with `morph edit`. IMPLEMENTS WHEN editing stratum (\S+) in system (\S+) in branch (\S+) cd "$DATADIR/workspace/$MATCH_3/test:morphs" - run_morph edit "$MATCH_2" "$MATCH_1" + run_morph new-edit "$MATCH_2" "$MATCH_1" IMPLEMENTS WHEN editing chunk (\S+) in (\S+) in (\S+) in branch (\S+) cd "$DATADIR/workspace/$MATCH_4/test:morphs" - run_morph edit "$MATCH_3" "$MATCH_2" "$MATCH_1" + run_morph new-edit "$MATCH_3" "$MATCH_2" "$MATCH_1" IMPLEMENTS THEN edited chunk (\S+) has git branch (\S+) ls -l "$DATADIR/workspace/$MATCH_2" -- cgit v1.2.1