Merge branch 'stable-2.11'

* stable-2.11:
  PatchListLoader: Synchronize MyersDiff and HistogramDiff invocations
  Update singleusergroup to latest revision
  ListTags: Fix ref in TagInfo for signed/annotated tags
  Fix review labels with AnyWithBlock function
  Fix NullPointerException in ls-project command with --has-acl-for option

Change-Id: Id758eada94c051b4137e6ffaefba1ef9093d30cc
This commit is contained in:
David Pursehouse
2015-10-09 15:38:10 +09:00
7 changed files with 72 additions and 14 deletions

View File

@@ -17,6 +17,7 @@ package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.FluentIterable; import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.PushOneCommit;
@@ -26,6 +27,11 @@ import com.google.gerrit.extensions.api.projects.TagInfo;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import org.apache.http.HttpStatus; import org.apache.http.HttpStatus;
import org.eclipse.jgit.api.PushCommand;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.transport.PushResult;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
import org.junit.Test; import org.junit.Test;
import java.util.List; import java.util.List;
@@ -84,15 +90,29 @@ public class TagsIT extends AbstractDaemonTest {
PushOneCommit.Result r2 = push2.to("refs/for/master%submit"); PushOneCommit.Result r2 = push2.to("refs/for/master%submit");
r2.assertOkStatus(); r2.assertOkStatus();
String tag3Ref = Constants.R_TAGS + "vLatest";
PushCommand pushCmd = testRepo.git().push();
pushCmd.setRefSpecs(new RefSpec(tag2.name + ":" + tag3Ref));
Iterable<PushResult> r = pushCmd.call();
assertThat(Iterables.getOnlyElement(r).getRemoteUpdate(tag3Ref).getStatus())
.isEqualTo(Status.OK);
List<TagInfo> result = getTags().get(); List<TagInfo> result = getTags().get();
assertThat(result).hasSize(2); assertThat(result).hasSize(3);
TagInfo t = result.get(0); TagInfo t = result.get(0);
assertThat(t.ref).isEqualTo("refs/tags/" + tag1.name); assertThat(t.ref).isEqualTo(Constants.R_TAGS + tag1.name);
assertThat(t.revision).isEqualTo(r1.getCommitId().getName()); assertThat(t.revision).isEqualTo(r1.getCommitId().getName());
t = result.get(1); t = result.get(1);
assertThat(t.ref).isEqualTo("refs/tags/" + tag2.name); assertThat(t.ref).isEqualTo(Constants.R_TAGS + tag2.name);
assertThat(t.object).isEqualTo(r2.getCommitId().getName());
assertThat(t.message).isEqualTo(tag2.message);
assertThat(t.tagger.name).isEqualTo(tag2.tagger.getName());
assertThat(t.tagger.email).isEqualTo(tag2.tagger.getEmailAddress());
t = result.get(2);
assertThat(t.ref).isEqualTo(tag3Ref);
assertThat(t.object).isEqualTo(r2.getCommitId().getName()); assertThat(t.object).isEqualTo(r2.getCommitId().getName());
assertThat(t.message).isEqualTo(tag2.message); assertThat(t.message).isEqualTo(tag2.message);
assertThat(t.tagger.name).isEqualTo(tag2.tagger.getName()); assertThat(t.tagger.name).isEqualTo(tag2.tagger.getName());

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.common.data.LabelType; import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.Permission; import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.LabelInfo; import com.google.gerrit.extensions.common.LabelInfo;
@@ -43,6 +44,10 @@ public class CustomLabelIT extends AbstractDaemonTest {
value(0, "No score"), value(0, "No score"),
value(-1, "Negative")); value(-1, "Negative"));
private final LabelType P = category("CustomLabel2",
value(1, "Positive"),
value(0, "No score"));
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
@@ -50,6 +55,8 @@ public class CustomLabelIT extends AbstractDaemonTest {
SystemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); SystemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers,
"refs/heads/*"); "refs/heads/*");
Util.allow(cfg, Permission.forLabel(P.getName()), 0, 1, anonymousUsers,
"refs/heads/*");
saveProjectConfig(project, cfg); saveProjectConfig(project, cfg);
} }
@@ -106,6 +113,26 @@ public class CustomLabelIT extends AbstractDaemonTest {
assertThat(q.blocking).isTrue(); assertThat(q.blocking).isTrue();
} }
@Test
public void customLabelAnyWithBlock_Addreviewer_ZeroVote() throws Exception {
P.setFunctionName("AnyWithBlock");
saveLabelConfig();
PushOneCommit.Result r = createChange();
AddReviewerInput in = new AddReviewerInput();
in.reviewer = user.email;
gApi.changes()
.id(r.getChangeId())
.addReviewer(in);
revision(r).review(new ReviewInput().label(P.getName(), 0));
ChangeInfo c = get(r.getChangeId());
LabelInfo q = c.labels.get(P.getName());
assertThat(q.all).hasSize(2);
assertThat(q.disliked).isNull();
assertThat(q.rejected).isNull();
assertThat(q.blocking).isNull();
}
@Test @Test
public void customLabelMaxWithBlock_NegativeVoteBlock() throws Exception { public void customLabelMaxWithBlock_NegativeVoteBlock() throws Exception {
saveLabelConfig(); saveLabelConfig();
@@ -122,6 +149,7 @@ public class CustomLabelIT extends AbstractDaemonTest {
private void saveLabelConfig() throws Exception { private void saveLabelConfig() throws Exception {
ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
cfg.getLabelSections().put(label.getName(), label); cfg.getLabelSections().put(label.getName(), label);
cfg.getLabelSections().put(P.getName(), P);
saveProjectConfig(project, cfg); saveProjectConfig(project, cfg);
} }
} }

View File

@@ -93,6 +93,7 @@ public class PatchListLoader implements Callable<PatchList> {
private final PatchListKey key; private final PatchListKey key;
private final Project.NameKey project; private final Project.NameKey project;
private final long timeoutMillis; private final long timeoutMillis;
private final Object lock;
@AssistedInject @AssistedInject
PatchListLoader(GitRepositoryManager mgr, PatchListLoader(GitRepositoryManager mgr,
@@ -107,6 +108,7 @@ public class PatchListLoader implements Callable<PatchList> {
diffExecutor = de; diffExecutor = de;
key = k; key = k;
project = p; project = p;
lock = new Object();
timeoutMillis = timeoutMillis =
ConfigUtil.getTimeUnit(cfg, "cache", PatchListCacheImpl.FILE_NAME, ConfigUtil.getTimeUnit(cfg, "cache", PatchListCacheImpl.FILE_NAME,
"timeout", TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS), "timeout", TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS),
@@ -210,7 +212,9 @@ public class PatchListLoader implements Callable<PatchList> {
Future<FileHeader> result = diffExecutor.submit(new Callable<FileHeader>() { Future<FileHeader> result = diffExecutor.submit(new Callable<FileHeader>() {
@Override @Override
public FileHeader call() throws IOException { public FileHeader call() throws IOException {
return diffFormatter.toFileHeader(diffEntry); synchronized (lock) {
return diffFormatter.toFileHeader(diffEntry);
}
} }
}); });
@@ -224,7 +228,9 @@ public class PatchListLoader implements Callable<PatchList> {
+ " comparing " + diffEntry.getOldId().name() + " comparing " + diffEntry.getOldId().name()
+ ".." + diffEntry.getNewId().name()); + ".." + diffEntry.getNewId().name());
result.cancel(true); result.cancel(true);
return toFileHeaderWithoutMyersDiff(diffFormatter, diffEntry); synchronized (lock) {
return toFileHeaderWithoutMyersDiff(diffFormatter, diffEntry);
}
} catch (ExecutionException e) { } catch (ExecutionException e) {
// If there was an error computing the result, carry it // If there was an error computing the result, carry it
// up to the caller so the cache knows this key is invalid. // up to the caller so the cache knows this key is invalid.

View File

@@ -37,9 +37,9 @@ import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.OutputFormat; import com.google.gerrit.server.OutputFormat;
import com.google.gerrit.server.StringUtil; import com.google.gerrit.server.StringUtil;
import com.google.gerrit.server.WebLinks; import com.google.gerrit.server.WebLinks;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.GroupControl; import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.group.GroupsCollection;
import com.google.gerrit.server.util.RegexListSearcher; import com.google.gerrit.server.util.RegexListSearcher;
import com.google.gerrit.server.util.TreeFormatter; import com.google.gerrit.server.util.TreeFormatter;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@@ -109,7 +109,7 @@ public class ListProjects implements RestReadView<TopLevelResource> {
private final CurrentUser currentUser; private final CurrentUser currentUser;
private final ProjectCache projectCache; private final ProjectCache projectCache;
private final GroupCache groupCache; private final GroupsCollection groupsCollection;
private final GroupControl.Factory groupControlFactory; private final GroupControl.Factory groupControlFactory;
private final GitRepositoryManager repoManager; private final GitRepositoryManager repoManager;
private final ProjectNode.Factory projectNodeFactory; private final ProjectNode.Factory projectNodeFactory;
@@ -191,13 +191,16 @@ public class ListProjects implements RestReadView<TopLevelResource> {
private AccountGroup.UUID groupUuid; private AccountGroup.UUID groupUuid;
@Inject @Inject
protected ListProjects(CurrentUser currentUser, ProjectCache projectCache, protected ListProjects(CurrentUser currentUser,
GroupCache groupCache, GroupControl.Factory groupControlFactory, ProjectCache projectCache,
GitRepositoryManager repoManager, ProjectNode.Factory projectNodeFactory, GroupsCollection groupsCollection,
GroupControl.Factory groupControlFactory,
GitRepositoryManager repoManager,
ProjectNode.Factory projectNodeFactory,
WebLinks webLinks) { WebLinks webLinks) {
this.currentUser = currentUser; this.currentUser = currentUser;
this.projectCache = projectCache; this.projectCache = projectCache;
this.groupCache = groupCache; this.groupsCollection = groupsCollection;
this.groupControlFactory = groupControlFactory; this.groupControlFactory = groupControlFactory;
this.repoManager = repoManager; this.repoManager = repoManager;
this.projectNodeFactory = projectNodeFactory; this.projectNodeFactory = projectNodeFactory;
@@ -280,7 +283,7 @@ public class ListProjects implements RestReadView<TopLevelResource> {
break; break;
} }
if (!pctl.getLocalGroups().contains( if (!pctl.getLocalGroups().contains(
GroupReference.forGroup(groupCache.get(groupUuid)))) { GroupReference.forGroup(groupsCollection.parseId(groupUuid.get())))) {
continue; continue;
} }
} }

View File

@@ -157,7 +157,7 @@ public class ListTags implements RestReadView<ProjectResource> {
RevTag tag = (RevTag)object; RevTag tag = (RevTag)object;
// Annotated or signed tag // Annotated or signed tag
return new TagInfo( return new TagInfo(
Constants.R_TAGS + tag.getTagName(), ref.getName(),
tag.getName(), tag.getName(),
tag.getObject().getName(), tag.getObject().getName(),
tag.getFullMessage().trim(), tag.getFullMessage().trim(),

View File

@@ -283,6 +283,7 @@ max_with_block(Label, Min, Max, need(Max)) :-
%% - The maximum is never used. %% - The maximum is never used.
%% %%
any_with_block(Label, Min, reject(Who)) :- any_with_block(Label, Min, reject(Who)) :-
Min < 0,
check_label_range_permission(Label, Min, ok(Who)), check_label_range_permission(Label, Min, ok(Who)),
! !
. .