summaryrefslogtreecommitdiff
path: root/morphlib
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2013-09-04 13:44:16 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2013-09-04 13:44:16 +0000
commit3f0e3e78228e533abd7e051e5103a282a46a645f (patch)
tree0047eeb3031dc0af808fc8ce62891cad2420f0dd /morphlib
parentbe67d3d4c416394588678f67cbc69c879bfc4137 (diff)
downloadmorph-3f0e3e78228e533abd7e051e5103a282a46a645f.tar.gz
b&m: Re-implement morph foreach
The previous version attempted to separate the output of the commands run with newlines by printing a newline at the beginning if it wasn't the first repository. The check it used was for the first repository was flawed by assuming that the root repository was the first repository processed. Since the complication was not worth keeping the output identical, it has been changed to separate by printing a newline after every command and the test output has been amended to include the extra trailing newline.
Diffstat (limited to 'morphlib')
-rw-r--r--morphlib/plugins/branch_and_merge_new_plugin.py58
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py2
2 files changed, 59 insertions, 1 deletions
diff --git a/morphlib/plugins/branch_and_merge_new_plugin.py b/morphlib/plugins/branch_and_merge_new_plugin.py
index 7c326e48..98e675f1 100644
--- a/morphlib/plugins/branch_and_merge_new_plugin.py
+++ b/morphlib/plugins/branch_and_merge_new_plugin.py
@@ -47,6 +47,8 @@ class SimpleBranchAndMergePlugin(cliapp.Plugin):
'show-system-branch', self.show_system_branch, arg_synopsis='')
self.app.add_subcommand(
'show-branch-root', self.show_branch_root, arg_synopsis='')
+ self.app.add_subcommand('foreach', self.foreach,
+ arg_synopsis='-- COMMAND [ARGS...]')
def disable(self):
pass
@@ -546,3 +548,59 @@ class SimpleBranchAndMergePlugin(cliapp.Plugin):
return True
return False
+ def foreach(self, args):
+ '''Run a command in each repository checked out in a system branch.
+
+ Use -- before specifying the command to separate its arguments from
+ Morph's own arguments.
+
+ Command line arguments:
+
+ * `--` indicates the end of option processing for Morph.
+ * `COMMAND` is a command to run.
+ * `ARGS` is a list of arguments or options to be passed onto
+ `COMMAND`.
+
+ This runs the given `COMMAND` in each git repository belonging
+ to the current system branch that exists locally in the current
+ workspace. This can be a handy way to do the same thing in all
+ the local git repositories.
+
+ For example:
+
+ morph foreach -- git push
+
+ The above command would push any committed changes in each
+ repository to the git server.
+
+ '''
+
+ if not args:
+ raise cliapp.AppException('morph foreach expects a command to run')
+
+ ws = morphlib.workspace.open('.')
+ sb = morphlib.sysbranchdir.open_from_within('.')
+
+ for gd in sb.list_git_directories():
+ # Get the repository's original name
+ # Continue in the case of error, since the previous iteration
+ # worked in the case of the user cloning a repository in the
+ # system branch's directory.
+ try:
+ repo = gd.get_config('morph.repository')
+ except cliapp.AppException:
+ continue
+
+ self.app.output.write('%s\n' % repo)
+ status, output, error = self.app.runcmd_unchecked(
+ args, cwd=gd.dirname)
+ self.app.output.write(output)
+ if status != 0:
+ self.app.output.write(error)
+ pretty_command = ' '.join(cliapp.shell_quote(arg)
+ for arg in args)
+ raise cliapp.AppException(
+ 'Command failed at repo %s: %s'
+ % (repo, pretty_command))
+ self.app.output.write('\n')
+ self.app.output.flush()
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index 85e74501..c1549a5d 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -79,7 +79,7 @@ class BranchAndMergePlugin(cliapp.Plugin):
group=group_branch)
# Advanced commands
- self.app.add_subcommand('foreach', self.foreach,
+ self.app.add_subcommand('old-foreach', self.foreach,
arg_synopsis='-- COMMAND [ARGS...]')
def disable(self):