diff --git a/bin/ecbundle-merge b/bin/ecbundle-merge index 86deec0..be2771f 100755 --- a/bin/ecbundle-merge +++ b/bin/ecbundle-merge @@ -44,7 +44,7 @@ def main(): nargs='+') - parser.add_argument('-o', + parser.add_argument('--output','-o', help='output file', default="merged-bundle.yml") # -------------------------------------------------------------------------- diff --git a/ecbundle/merge.py b/ecbundle/merge.py index 8369926..be278fa 100644 --- a/ecbundle/merge.py +++ b/ecbundle/merge.py @@ -34,12 +34,15 @@ def deep_merge(self, original, updates): if isinstance(original, dict) and isinstance(updates, dict): merged = copy.deepcopy(original) for key, value in updates.items(): + if isinstance(value, dict) and value.get("erase", False): + merged.pop(key, None) + continue if key in merged: if isinstance(merged[key], dict) and isinstance(value, dict): merged[key] = self.deep_merge(merged[key], value) else: merged[key] = copy.deepcopy(value) - else: + elif key != "erase": merged[key] = copy.deepcopy(value) return merged diff --git a/tests/bundle_merge/bundle-merge-erase.yml b/tests/bundle_merge/bundle-merge-erase.yml new file mode 100644 index 0000000..536d649 --- /dev/null +++ b/tests/bundle_merge/bundle-merge-erase.yml @@ -0,0 +1,6 @@ +projects : + + - project1 : + erase : true + + \ No newline at end of file diff --git a/tests/bundle_merge/test_merge.py b/tests/bundle_merge/test_merge.py index 3596077..bcca372 100644 --- a/tests/bundle_merge/test_merge.py +++ b/tests/bundle_merge/test_merge.py @@ -55,6 +55,20 @@ def test_merge_single_update(here, out_dir): assert "updated-branch" in content +def test_merge_single_erase(here, out_dir): + """Original bundle merged with a single update file.""" + base = here / "bundle-merge-base.yml" + upd = here / "bundle-merge-erase.yml" + output = out_dir / "merged.yml" + + rc = BundleMerger(**_args([base, upd], output)).merge() + + assert rc == 0 + assert output.exists() + content = output.read_text() + assert "project1" not in content + + def test_merge_multiple_updates_applied_in_order(here, out_dir): """With two updates, the later one wins on conflicting fields.""" base = here / "bundle-merge-base.yml"