Don't allow Merger to release the ObjectInserter in PatchListLoader
When a Merger writes out some objects, but then aborts because it detects a conflict, it releases its ObjectInserter. If the inserter isn't for the local filesystem, but is a more "exotic" type like the DfsObjectInserter that buffers data in memory before flushing to disk, Gerrit loses the successful merge results that did complete. Override flush and release in the Merger so these are no-ops, but otherwise delegate all activity to the inserter managed already in the existing try/finally block. This way when a conflict is detected and Gerrit auto-resolves it by creating the version with markers embedded within the operation can still complete. Change-Id: I86f2cb5cc2f1506444530879058661d1dcb56c1f
This commit is contained in:
@@ -255,10 +255,24 @@ class PatchListLoader extends CacheLoader<PatchListKey, PatchList> {
|
||||
|
||||
ObjectId treeId;
|
||||
ResolveMerger m = (ResolveMerger) MergeStrategy.RESOLVE.newMerger(repo, true);
|
||||
ObjectInserter ins = m.getObjectInserter();
|
||||
final ObjectInserter ins = repo.newObjectInserter();
|
||||
try {
|
||||
DirCache dc = DirCache.newInCore();
|
||||
m.setDirCache(dc);
|
||||
m.setObjectInserter(new ObjectInserter.Filter() {
|
||||
@Override
|
||||
protected ObjectInserter delegate() {
|
||||
return ins;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
}
|
||||
});
|
||||
|
||||
boolean couldMerge = false;
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user