Align delete refs to the rest of Gerrit Gerrit represents the removal of refs as the transition from a non-zero SHA to a zero-SHA, see one example in DeleteRef.deleteSingleRef() method. The ChangeEditUtil.deleteRef() and StarredChangesUtilNoteDbImpl.deleteRef() failed to set the new object id in the RefUpdate, causing a situation where other parts of the code are expecting a non-null SHA1 and therefore causing potential NPEs. Align the removal of refs to the rest of Gerrit and allow more resilience in other parts of the code and in plugins, such as the global-refdb. Bug: Issue 430336832 Forward-Compatible: checked Release-Notes: Fix removal of edits that failed when used with global-refdb Change-Id: I0602aa007ed5d5d3341eca6160ce631e7bae1c04 (cherry picked from commit 9469ddfdfaf00c707a9e4854a91b3c39a7df5d65)
diff --git a/java/com/google/gerrit/server/StarredChangesUtil.java b/java/com/google/gerrit/server/StarredChangesUtil.java index 904490c..fd53586 100644 --- a/java/com/google/gerrit/server/StarredChangesUtil.java +++ b/java/com/google/gerrit/server/StarredChangesUtil.java
@@ -514,6 +514,7 @@ RefUpdate u = repo.updateRef(refName); u.setForceUpdate(true); u.setExpectedOldObjectId(oldObjectId); + u.setNewObjectId(ObjectId.zeroId()); u.setRefLogIdent(serverIdent.get()); u.setRefLogMessage("Unstar change", true); RefUpdate.Result result = u.delete();
diff --git a/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/java/com/google/gerrit/server/edit/ChangeEditUtil.java index 710916e..56f9643 100644 --- a/java/com/google/gerrit/server/edit/ChangeEditUtil.java +++ b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -245,6 +245,7 @@ String refName = edit.getRefName(); RefUpdate ru = repo.updateRef(refName, true); ru.setExpectedOldObjectId(edit.getEditCommit()); + ru.setNewObjectId(ObjectId.zeroId()); ru.setForceUpdate(true); RefUpdate.Result result = ru.delete(); switch (result) {