summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2012-10-12 17:16:35 +0100
committerSam Thursfield <sam.thursfield@codethink.co.uk>2012-10-12 17:27:09 +0100
commit8d4073d89ca66b2334e0e7d9fb08f6c73875ff7e (patch)
tree69efe75663b1d7f2ed8e9680295db15dfcbf26aa
parenta6bc2829211ceda1f07386d381e67a983fbb063b (diff)
downloaddefinitions-8d4073d89ca66b2334e0e7d9fb08f6c73875ff7e.tar.gz
morph status: Add initial version of command
This provides a user-friendly summary of the workspace or branch status.
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py57
-rwxr-xr-xtests.branching/status-in-clean-branch.script26
-rw-r--r--tests.branching/status-in-clean-branch.stdout3
-rwxr-xr-xtests.branching/status-in-dirty-branch.script39
-rw-r--r--tests.branching/status-in-dirty-branch.stdout5
-rwxr-xr-xtests.branching/status-in-workspace.script29
-rw-r--r--tests.branching/status-in-workspace.stdout4
7 files changed, 163 insertions, 0 deletions
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index 3b52abe1..8386f526 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -50,6 +50,7 @@ class BranchAndMergePlugin(cliapp.Plugin):
self.app.add_subcommand('unpetrify', self.unpetrify)
self.app.add_subcommand('build', self.build,
arg_synopsis='SYSTEM')
+ self.app.add_subcommand('status', self.status)
# Advanced commands
self.app.add_subcommand('foreach', self.foreach,
@@ -153,6 +154,15 @@ class BranchAndMergePlugin(cliapp.Plugin):
value = self.app.runcmd(['git', 'config', option], cwd=repo_dir)
return value.strip()
+ def get_head(self, repo_path):
+ '''Return the ref that the working tree is on for a repo'''
+
+ ref = self.app.runcmd(['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
+ cwd=repo_path).strip()
+ if ref == 'HEAD':
+ ref = 'detached HEAD'
+ return ref
+
def get_uncommitted_changes(self, repo_dir, env={}):
status = self.app.runcmd(['git', 'status', '--porcelain'],
cwd=repo_dir, env=env)
@@ -1285,6 +1295,53 @@ class BranchAndMergePlugin(cliapp.Plugin):
self.app.runcmd(['git', 'push', 'origin',
':%s' % info['build-ref']], cwd=info['dirname'])
+ def status(self, args):
+ if len(args) != 0:
+ raise cliapp.AppException('morph status takes no arguments')
+
+ workspace = self.deduce_workspace()
+ try:
+ branch, branch_path = self.deduce_system_branch()
+ except cliapp.AppException:
+ branch = None
+
+ if branch is None:
+ self.app.output.write("System branches in current workspace:\n")
+ for dirname in self.walk_special_directories(
+ workspace, special_subdir='.morph-system-branch'):
+ branch = self.get_branch_config(dirname, 'branch.name')
+ self.app.output.write(" %s\n" % branch)
+ return
+
+ root_repo = self.get_branch_config(branch_path, 'branch.root')
+ root_repo_dir = self.convert_uri_to_path(root_repo)
+ root_repo_path = os.path.join(branch_path, root_repo_dir)
+ dirs = [d for d in self.walk_special_directories(
+ branch_path, special_subdir='.git')
+ if not os.path.samefile(d, root_repo_path)]
+ dirs.sort()
+
+ self.app.output.write("On branch %s, root %s\n" % (branch, root_repo))
+
+ has_uncommitted_changes = False
+ for d in [root_repo_path] + dirs:
+ try:
+ repo = self.get_repo_config(d, 'morph.repository')
+ except cliapp.AppException:
+ self.app.output.write(
+ ' %s: not part of system branch\n' % d)
+ continue
+ head = self.get_head(d)
+ if head != branch:
+ self.app.output.write(
+ ' %s: unexpected ref checked out "%s"\n' % (repo, head))
+ if len(self.get_uncommitted_changes(d)) > 0:
+ has_uncommitted_changes = True
+ self.app.output.write(' %s: uncommitted changes\n' % repo)
+
+ if not has_uncommitted_changes:
+ self.app.output.write("\nNo repos have outstanding changes.\n")
+
def foreach(self, args):
'''Run a command in each repository checked out in a system branch
diff --git a/tests.branching/status-in-clean-branch.script b/tests.branching/status-in-clean-branch.script
new file mode 100755
index 00000000..c102d287
--- /dev/null
+++ b/tests.branching/status-in-clean-branch.script
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright (C) 2011, 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.
+
+
+# 'morph status' within a branch
+
+set -eu
+
+cd "$DATADIR/workspace"
+"$SRCDIR/scripts/test-morph" init .
+"$SRCDIR/scripts/test-morph" branch baserock:morphs test
+
+"$SRCDIR/scripts/test-morph" status
diff --git a/tests.branching/status-in-clean-branch.stdout b/tests.branching/status-in-clean-branch.stdout
new file mode 100644
index 00000000..d8468519
--- /dev/null
+++ b/tests.branching/status-in-clean-branch.stdout
@@ -0,0 +1,3 @@
+On branch test, root baserock:morphs
+
+No repos have outstanding changes.
diff --git a/tests.branching/status-in-dirty-branch.script b/tests.branching/status-in-dirty-branch.script
new file mode 100755
index 00000000..36ed781d
--- /dev/null
+++ b/tests.branching/status-in-dirty-branch.script
@@ -0,0 +1,39 @@
+#!/bin/sh
+# Copyright (C) 2011, 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.
+
+
+# 'morph status' within a branch
+
+set -eu
+
+. "$SRCDIR/tests.branching/setup-3rd-party-strata"
+
+cd "$DATADIR/workspace"
+"$SRCDIR/scripts/test-morph" branch baserock:morphs test
+
+# Make the branch have some interesting changes and pitfalls
+cd test
+"$SRCDIR/scripts/test-morph" edit hello-system stratum2 hello
+
+cd baserock:stratum2-hello
+git checkout -q master
+
+cd ..
+mkdir red-herring
+cd red-herring
+git init -q .
+
+"$SRCDIR/scripts/test-morph" status
diff --git a/tests.branching/status-in-dirty-branch.stdout b/tests.branching/status-in-dirty-branch.stdout
new file mode 100644
index 00000000..a81aa765
--- /dev/null
+++ b/tests.branching/status-in-dirty-branch.stdout
@@ -0,0 +1,5 @@
+On branch test, root baserock:morphs
+ baserock:morphs: uncommitted changes
+ baserock:external-strata: uncommitted changes
+ baserock:stratum2-hello: unexpected ref checked out "master"
+ TMP/workspace/test/red-herring: not part of system branch
diff --git a/tests.branching/status-in-workspace.script b/tests.branching/status-in-workspace.script
new file mode 100755
index 00000000..5e13b433
--- /dev/null
+++ b/tests.branching/status-in-workspace.script
@@ -0,0 +1,29 @@
+#!/bin/sh
+# Copyright (C) 2011, 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.
+
+
+# 'morph status' within a workspace
+
+set -eu
+
+cd "$DATADIR/workspace"
+"$SRCDIR/scripts/test-morph" init .
+"$SRCDIR/scripts/test-morph" checkout baserock:morphs master
+"$SRCDIR/scripts/test-morph" branch baserock:morphs a/b/c/d/e/foo
+"$SRCDIR/scripts/test-morph" branch baserock:morphs a/b/c/d/e/bar
+mkdir a/b/c/red-herring
+
+"$SRCDIR/scripts/test-morph" status
diff --git a/tests.branching/status-in-workspace.stdout b/tests.branching/status-in-workspace.stdout
new file mode 100644
index 00000000..8d34a8a6
--- /dev/null
+++ b/tests.branching/status-in-workspace.stdout
@@ -0,0 +1,4 @@
+System branches in current workspace:
+ master
+ a/b/c/d/e/bar
+ a/b/c/d/e/foo