in src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java [773:857]
private void updateStates(Collection<RemoteRefUpdate> refUpdates)
throws UpdateRefFailureException {
Set<String> doneRefs = new HashSet<>();
boolean anyRefFailed = false;
RemoteRefUpdate.Status lastRefStatusError = RemoteRefUpdate.Status.OK;
for (RemoteRefUpdate u : refUpdates) {
RefPushResult pushStatus = RefPushResult.SUCCEEDED;
Set<ReplicationState> logStates = new HashSet<>();
logStates.addAll(stateMap.get(u.getSrcRef()));
logStates.addAll(stateMap.get(ALL_REFS));
ReplicationState[] logStatesArray = logStates.toArray(new ReplicationState[logStates.size()]);
doneRefs.add(u.getSrcRef());
switch (u.getStatus()) {
case OK:
case UP_TO_DATE:
case NON_EXISTING:
break;
case NOT_ATTEMPTED:
case AWAITING_REPORT:
case REJECTED_NODELETE:
case REJECTED_NONFASTFORWARD:
case REJECTED_REMOTE_CHANGED:
stateLog.error(
String.format(
"Failed replicate of %s to %s: status %s", u.getRemoteName(), uri, u.getStatus()),
logStatesArray);
pushStatus = RefPushResult.FAILED;
anyRefFailed = true;
lastRefStatusError = u.getStatus();
break;
case REJECTED_OTHER_REASON:
if ("non-fast-forward".equals(u.getMessage())) {
stateLog.error(
String.format(
"Failed replicate of %s to %s"
+ ", remote rejected non-fast-forward push."
+ " Check receive.denyNonFastForwards variable in config file"
+ " of destination repository.",
u.getRemoteName(), uri),
logStatesArray);
} else if (LOCK_FAILURE.equals(u.getMessage())
|| UPDATE_REF_FAILURE.equals(u.getMessage())) {
throw new UpdateRefFailureException(uri, u.getMessage());
} else {
stateLog.error(
String.format(
"Failed replicate of %s to %s, reason: %s",
u.getRemoteName(), uri, u.getMessage()),
logStatesArray);
}
pushStatus = RefPushResult.FAILED;
anyRefFailed = true;
lastRefStatusError = u.getStatus();
break;
}
for (ReplicationState rs : getStatesByRef(u.getSrcRef())) {
rs.notifyRefReplicated(projectName.get(), u.getSrcRef(), uri, pushStatus, u.getStatus());
}
}
doneRefs.add(ALL_REFS);
for (ReplicationState rs : getStatesByRef(ALL_REFS)) {
rs.notifyRefReplicated(
projectName.get(),
ALL_REFS,
uri,
anyRefFailed ? RefPushResult.FAILED : RefPushResult.SUCCEEDED,
lastRefStatusError);
}
for (Map.Entry<String, ReplicationState> entry : stateMap.entries()) {
if (!doneRefs.contains(entry.getKey())) {
entry
.getValue()
.notifyRefReplicated(
projectName.get(), entry.getKey(), uri, RefPushResult.NOT_ATTEMPTED, null);
}
}
stateMap.clear();
}