summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/plugins/branch_and_merge_plugin.py57
-rwxr-xr-xtests.branching/petrify-no-double-petrify.script4
-rwxr-xr-xtests.branching/petrify.script11
-rw-r--r--tests.branching/petrify.stdout12
-rwxr-xr-xtests.branching/setup-second-chunk69
5 files changed, 130 insertions, 23 deletions
diff --git a/morphlib/plugins/branch_and_merge_plugin.py b/morphlib/plugins/branch_and_merge_plugin.py
index 384f0550..050410d4 100644
--- a/morphlib/plugins/branch_and_merge_plugin.py
+++ b/morphlib/plugins/branch_and_merge_plugin.py
@@ -722,7 +722,8 @@ class BranchAndMergePlugin(cliapp.Plugin):
Strata refs are not petrified, because they must all be edited to set
the new chunk refs, which requires branching them all for the current
branch - so they will not be updated outside of the user's control in
- any case.
+ any case. Chunks that have already been edited on the current branch
+ are also not petrified.
'''
@@ -733,9 +734,11 @@ class BranchAndMergePlugin(cliapp.Plugin):
branch, branch_path = self.deduce_system_branch()
root_repo = self.get_branch_config(branch_path, 'branch.root')
root_repo_dir = self.find_repository(branch_path, root_repo)
-
self.lrc, self.rrc = morphlib.util.new_repo_caches(self.app)
+ # We must first get the full set of strata. One same stratum may be
+ # in multiple systems and each system may use a different ref.
+ strata = {}
for f in glob.glob(os.path.join(root_repo_dir, '*.morph')):
name = os.path.basename(f)[:-len('.morph')]
morphology = self.load_morphology(root_repo_dir, name)
@@ -743,24 +746,42 @@ class BranchAndMergePlugin(cliapp.Plugin):
continue
for stratum_info in morphology['strata']:
- repo_dir = self.edit_stratum(
- branch, branch_path, root_repo, root_repo_dir,
- stratum_info)
-
- stratum = self.load_morphology(repo_dir, stratum_info['morph'])
-
- for chunk_info in stratum['chunks']:
- if 'unpetrify-ref' not in chunk_info:
- commit_sha1, tree_sha1 = self.app.resolve_ref(
- self.lrc, self.rrc, chunk_info['repo'],
- chunk_info['ref'],
- update=not self.app.settings['no-git-update'])
- chunk_info['unpetrify-ref'] = chunk_info['ref']
- chunk_info['ref'] = commit_sha1
- self.save_morphology(repo_dir, stratum_info['morph'], stratum)
-
+ key = (stratum_info['repo'], stratum_info['morph'])
+ if key in strata:
+ original_ref = strata[key]
+ if stratum_info['ref'] == branch:
+ strata[key] = branch
+ elif stratum_info['ref'] != original_ref:
+ if original_ref != branch:
+ self.app.output.write(
+ 'WARNING: not merging any differences from '
+ 'ref %s into %s of stratum %s\n' %
+ (stratum_info['ref'], original_ref,
+ stratum_info['morph']))
+ stratum_info['ref'] = branch
+ else:
+ strata[key] = stratum_info['ref']
+ stratum_info['ref'] = branch
self.save_morphology(root_repo_dir, name, morphology)
+ for (repo, morph), ref in strata.iteritems():
+ repo_dir = self.edit_stratum(
+ branch, branch_path, root_repo, root_repo_dir,
+ { 'repo': repo, 'ref': ref, 'morph': morph})
+
+ stratum = self.load_morphology(repo_dir, morph)
+
+ for chunk_info in stratum['chunks']:
+ if chunk_info['ref'] != branch and \
+ 'unpetrify-ref' not in chunk_info:
+ commit_sha1, tree_sha1 = self.app.resolve_ref(
+ self.lrc, self.rrc, chunk_info['repo'],
+ chunk_info['ref'],
+ update=not self.app.settings['no-git-update'])
+ chunk_info['unpetrify-ref'] = chunk_info['ref']
+ chunk_info['ref'] = commit_sha1
+ self.save_morphology(repo_dir, morph, stratum)
+
self.print_changelog('The following changes were made but have not '
'been comitted')
diff --git a/tests.branching/petrify-no-double-petrify.script b/tests.branching/petrify-no-double-petrify.script
index 3e7ac412..9fc00d39 100755
--- a/tests.branching/petrify-no-double-petrify.script
+++ b/tests.branching/petrify-no-double-petrify.script
@@ -31,9 +31,9 @@ fi
cd "$DATADIR/workspace"
"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" checkout baserock:morphs master
+"$SRCDIR/scripts/test-morph" branch baserock:morphs test/petrify
-cd master/baserock:morphs
+cd test/petrify/baserock:morphs
"$SRCDIR/scripts/test-morph" petrify
"$SRCDIR/scripts/test-morph" petrify
"$SRCDIR/scripts/test-morph" petrify
diff --git a/tests.branching/petrify.script b/tests.branching/petrify.script
index 0b5ff018..c1828bf3 100755
--- a/tests.branching/petrify.script
+++ b/tests.branching/petrify.script
@@ -15,7 +15,8 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-# Verify that "morph petrify" works.
+# Verify "morph petrify", and ensure it doesn't petrify chunks that have
+# already been edited.
set -eu
@@ -28,11 +29,15 @@ then
exit 0
fi
+. "$SRCDIR/tests.branching/setup-second-chunk"
+
cd "$DATADIR/workspace"
"$SRCDIR/scripts/test-morph" init
-"$SRCDIR/scripts/test-morph" checkout baserock:morphs master
+"$SRCDIR/scripts/test-morph" branch baserock:morphs test/petrify master
+
+cd test/petrify/baserock:morphs
+"$SRCDIR/scripts/test-morph" edit hello-system hello-stratum goodbye
-cd master/baserock:morphs
"$SRCDIR/scripts/test-morph" petrify
echo "Petrified:"
cat hello-stratum.morph
diff --git a/tests.branching/petrify.stdout b/tests.branching/petrify.stdout
index 249a8f59..6219c84e 100644
--- a/tests.branching/petrify.stdout
+++ b/tests.branching/petrify.stdout
@@ -9,6 +9,12 @@ Petrified:
"ref": "f4d032b42c0134e67bdf19a43fa99072493667d7",
"build-depends": [],
"unpetrify-ref": "master"
+ },
+ {
+ "name": "goodbye",
+ "repo": "baserock:goodbye",
+ "ref": "test/petrify",
+ "build-depends": []
}
]
}
@@ -23,6 +29,12 @@ Unpetrified:
"repo": "baserock:hello",
"ref": "master",
"build-depends": []
+ },
+ {
+ "name": "goodbye",
+ "repo": "baserock:goodbye",
+ "ref": "test/petrify",
+ "build-depends": []
}
]
}
diff --git a/tests.branching/setup-second-chunk b/tests.branching/setup-second-chunk
new file mode 100755
index 00000000..9f7aa419
--- /dev/null
+++ b/tests.branching/setup-second-chunk
@@ -0,0 +1,69 @@
+#!/bin/sh
+# 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.
+
+
+# Add a second chunk to hello-stratum.
+
+. "$SRCDIR/scripts/fix-committer-info"
+
+create_chunk() {
+ REPO="$1"
+ NAME="$2"
+
+ mkdir "$1"
+ ln -s "$1" "$1.git"
+ cd "$1"
+
+ cat <<EOF > "$1/$2.morph"
+{
+ "name": "$2",
+ "kind": "chunk",
+ "build-system": "dummy"
+}
+EOF
+
+ git init --quiet
+ git add .
+ git commit --quiet -m "Initial commit"
+}
+
+create_chunk "$DATADIR/goodbye" "hello"
+
+cd "$DATADIR/morphs"
+cat <<EOF > hello-stratum.morph
+{
+ "name": "hello-stratum",
+ "kind": "stratum",
+ "chunks": [
+ {
+ "name": "hello",
+ "repo": "baserock:hello",
+ "ref": "master",
+ "build-depends": []
+ },
+ {
+ "name": "goodbye",
+ "repo": "baserock:goodbye",
+ "ref": "master",
+ "build-depends": []
+ }
+ ]
+}
+EOF
+
+git commit -q --all -m "Add goodbye to hello-stratum"
+
+cd "$DATADIR/workspace"