diff options
author | Zuul <zuul@review.opendev.org> | 2023-03-15 23:33:02 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2023-03-15 23:33:02 +0000 |
commit | 0e3c05ab47ece3ebf55bb151e6ee90b46431de15 (patch) | |
tree | e60da4bfaeba650598b2e64230c4f763661aacd9 /zuul/merger/merger.py | |
parent | bac514e28c99af57635981767dd4329b680551de (diff) | |
parent | 28428942f4e9ede6e3f33e811733c3c22da74b78 (diff) | |
download | zuul-0e3c05ab47ece3ebf55bb151e6ee90b46431de15.tar.gz |
Merge "merger: Keep redundant cherry-pick commits"
Diffstat (limited to 'zuul/merger/merger.py')
-rw-r--r-- | zuul/merger/merger.py | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/zuul/merger/merger.py b/zuul/merger/merger.py index e4688a1b7..1df833bc5 100644 --- a/zuul/merger/merger.py +++ b/zuul/merger/merger.py @@ -595,14 +595,32 @@ class Repo(object): log = get_annotated_logger(self.log, zuul_event_id) repo = self.createRepoObject(zuul_event_id) self.fetch(ref, zuul_event_id=zuul_event_id) - if len(repo.commit("FETCH_HEAD").parents) > 1: + fetch_head = repo.commit("FETCH_HEAD") + if len(fetch_head.parents) > 1: args = ["-s", "resolve", "FETCH_HEAD"] log.debug("Merging %s with args %s instead of cherry-picking", ref, args) repo.git.merge(*args) else: log.debug("Cherry-picking %s", ref) - repo.git.cherry_pick("FETCH_HEAD") + # Git doesn't have an option to ignore commits that are already + # applied to the working tree when cherry-picking, so pass the + # --keep-redundant-commits option, which will cause it to make an + # empty commit + repo.git.cherry_pick("FETCH_HEAD", keep_redundant_commits=True) + + # If the newly applied commit is empty, it means either: + # 1) The commit being cherry-picked was empty, in which the empty + # commit should be kept + # 2) The commit being cherry-picked was already applied to the + # tree, in which case the empty commit should be backed out + head = repo.commit("HEAD") + parent = head.parents[0] + if not any(head.diff(parent)) and \ + any(fetch_head.diff(fetch_head.parents[0])): + log.debug("%s was already applied. Removing it", ref) + self._checkout(repo, parent) + return repo.head.commit def merge(self, ref, strategy=None, zuul_event_id=None): |