in src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java [310:364]
private boolean shouldReplicate(
final Project.NameKey project, String ref, ReplicationState... states) {
try {
return threadScoper
.scope(
() -> {
ProjectState projectState;
try {
projectState = projectCache.get(project).orElseThrow(noSuchProject(project));
} catch (StorageException e) {
repLog.atWarning().withCause(e).log(
"Error reading project %s from cache", project);
return false;
}
if (projectState == null) {
repLog.atFine().log("Project %s does not exist", project);
throw new NoSuchProjectException(project);
}
if (!projectState.statePermitsRead()) {
repLog.atFine().log("Project %s does not permit read", project);
return false;
}
if (!shouldReplicate(projectState, userProvider.get())) {
repLog.atFine().log("Project %s should not be replicated", project);
return false;
}
if (PushOne.ALL_REFS.equals(ref)) {
return true;
}
if (userProvider.get().isInternalUser()) {
return true;
}
try {
permissionBackend
.user(userProvider.get())
.project(project)
.ref(ref)
.check(RefPermission.READ);
} catch (AuthException e) {
repLog.atFine().log(
"Ref %s on project %s is not visible to calling user %s",
ref, project, userProvider.get().getUserName().orElse("unknown"));
return false;
}
return true;
})
.call();
} catch (NoSuchProjectException err) {
stateLog.error(String.format(PROJECT_NOT_AVAILABLE, project), err, states);
} catch (Exception e) {
Throwables.throwIfUnchecked(e);
throw new RuntimeException(e);
}
return false;
}