Merge "Merge branch 'stable-2.13'"
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt
index 1f9dd33..5a82d5a 100644
--- a/Documentation/config-labels.txt
+++ b/Documentation/config-labels.txt
@@ -230,6 +230,19 @@
Allowed range of values are 0 (Patch Set Unlocked) to 1 (Patch Set
Locked).
+[[label_allowPostSubmit]]
+=== `label.Label-Name.allowPostSubmit`
+
+If true, the label may be voted on for changes that have already been
+submitted. If false, the label will not appear in the UI and will not
+be accepted when reviewing a closed change.
+
+In either case, voting on a label after submission is only permitted if
+the new vote is at least as high as the old vote by that user. This
+avoids creating the false impression that a post-submit vote can change
+the past and affect submission somehow.
+
+Defaults to true.
[[label_copyMinScore]]
=== `label.Label-Name.copyMinScore`
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
index 6f4cc45..a4fc8fe 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
@@ -18,6 +18,7 @@
import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
import static com.google.gerrit.server.project.Util.category;
import static com.google.gerrit.server.project.Util.value;
+import static java.util.stream.Collectors.toList;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
@@ -26,11 +27,13 @@
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.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.LabelInfo;
import com.google.gerrit.extensions.events.CommentAddedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.group.SystemGroupBackend;
@@ -41,6 +44,9 @@
import org.junit.Before;
import org.junit.Test;
+import java.util.Arrays;
+import java.util.Collection;
+
@NoHttpd
public class CustomLabelIT extends AbstractDaemonTest {
@@ -175,6 +181,49 @@
assertThat(q.blocking).isTrue();
}
+ @Test
+ public void customLabel_DisallowPostSubmit() throws Exception {
+ label.setFunctionName("NoOp");
+ label.setAllowPostSubmit(false);
+ P.setFunctionName("NoOp");
+ saveLabelConfig();
+
+ PushOneCommit.Result r = createChange();
+ revision(r).review(ReviewInput.approve());
+ revision(r).submit();
+
+ ChangeInfo info = get(r.getChangeId(), ListChangesOption.DETAILED_LABELS);
+ // TODO(dborowitz): Don't claim reducing vote is allowed.
+ assertPermitted(info, "Code-Review", -2, -1, 0, 1, 2);
+ assertPermitted(info, P.getName(), 0, 1);
+ assertPermitted(info, label.getName());
+
+ ReviewInput in = new ReviewInput();
+ in.label(P.getName(), P.getMax().getValue());
+ revision(r).review(in);
+
+ in = new ReviewInput();
+ in.label(label.getName(), label.getMax().getValue());
+ exception.expect(ResourceConflictException.class);
+ exception.expectMessage(
+ "Voting on labels disallowed after submit: " + label.getName());
+ revision(r).review(in);
+ }
+
+ private void assertPermitted(ChangeInfo info, String label,
+ Integer... expected) {
+ assertThat(info.permittedLabels).isNotNull();
+ Collection<String> strs = info.permittedLabels.get(label);
+ if (expected.length == 0) {
+ assertThat(strs).isNull();
+ } else {
+ assertThat(
+ strs.stream().map(s -> Integer.valueOf(s.trim()))
+ .collect(toList()))
+ .containsExactlyElementsIn(Arrays.asList(expected));
+ }
+ }
+
private void saveLabelConfig() throws Exception {
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
cfg.getLabelSections().put(label.getName(), label);
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
index b1e1243..8135c91 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
@@ -25,6 +25,7 @@
import java.util.Map;
public class LabelType {
+ public static final boolean DEF_ALLOW_POST_SUBMIT = true;
public static final boolean DEF_CAN_OVERRIDE = true;
public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CHANGE = true;
public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = false;
@@ -104,6 +105,7 @@
protected boolean copyAllScoresOnTrivialRebase;
protected boolean copyAllScoresIfNoCodeChange;
protected boolean copyAllScoresIfNoChange;
+ protected boolean allowPostSubmit;
protected short defaultValue;
protected List<LabelValue> values;
@@ -144,6 +146,7 @@
DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
setCopyMaxScore(DEF_COPY_MAX_SCORE);
setCopyMinScore(DEF_COPY_MIN_SCORE);
+ setAllowPostSubmit(DEF_ALLOW_POST_SUBMIT);
}
public String getName() {
@@ -174,6 +177,14 @@
this.canOverride = canOverride;
}
+ public boolean allowPostSubmit() {
+ return allowPostSubmit;
+ }
+
+ public void setAllowPostSubmit(boolean allowPostSubmit) {
+ this.allowPostSubmit = allowPostSubmit;
+ }
+
public void setRefPatterns(List<String> refPatterns) {
this.refPatterns = refPatterns;
}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java
index 78590a1..9a6755f 100644
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java
+++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java
@@ -27,12 +27,14 @@
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
import com.google.gerrit.testutil.InMemoryModule;
+import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.Guice;
import com.google.inject.Injector;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
import org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest;
import org.elasticsearch.common.settings.Settings;
@@ -41,6 +43,7 @@
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Test;
import java.io.File;
import java.nio.file.Path;
@@ -179,4 +182,13 @@
return httpAddress.substring(httpAddress.indexOf(':') + 1,
httpAddress.length());
}
+
+ @Test
+ public void byOwnerInvalidQuery() throws Exception {
+ TestRepository<Repo> repo = createProject("repo");
+ insert(repo, newChange(repo), userId);
+ String nameEmail = user.asIdentifiedUser().getNameEmail();
+ assertQuery("owner: \"" + nameEmail + "\"\\");
+ }
+
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
index 15d39b5..4a09e9e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
@@ -906,6 +906,10 @@
if (type == null) {
continue;
}
+ if (ctl.getChange().getStatus() == Change.Status.MERGED
+ && !type.allowPostSubmit()) {
+ continue;
+ }
PermissionRange range = ctl.getRange(Permission.forLabel(r.label));
for (LabelValue v : type.getValues()) {
if (range.contains(v.getValue())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
index e711181..6418269 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
@@ -900,10 +900,15 @@
// make it possible to take a merged change and make it no longer
// submittable.
List<PatchSetApproval> reduced = new ArrayList<>(ups.size() + del.size());
+ List<String> disallowed =
+ new ArrayList<>(labelTypes.getLabelTypes().size());
reduced.addAll(del);
for (PatchSetApproval psa : ups) {
LabelType lt = checkNotNull(labelTypes.byLabel(psa.getLabel()));
String normName = lt.getName();
+ if (!lt.allowPostSubmit()) {
+ disallowed.add(normName);
+ }
Short prev = previous.get(normName);
if (prev == null) {
continue;
@@ -918,6 +923,12 @@
}
}
+ if (!disallowed.isEmpty()) {
+ throw new ResourceConflictException(
+ "Voting on labels disallowed after submit: "
+ + disallowed.stream().distinct().sorted()
+ .collect(joining(", ")));
+ }
if (!reduced.isEmpty()) {
throw new ResourceConflictException(
"Cannot reduce vote on labels for closed change: "
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
index 5421421..f3ed9f2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
@@ -144,6 +144,7 @@
private static final String KEY_FUNCTION = "function";
private static final String KEY_DEFAULT_VALUE = "defaultValue";
private static final String KEY_COPY_MIN_SCORE = "copyMinScore";
+ private static final String KEY_ALLOW_POST_SUBMIT = "allowPostSubmit";
private static final String KEY_COPY_MAX_SCORE = "copyMaxScore";
private static final String KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE = "copyAllScoresOnMergeFirstParentUpdate";
private static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = "copyAllScoresOnTrivialRebase";
@@ -802,6 +803,9 @@
KEY_DEFAULT_VALUE, dv, name)));
}
}
+ label.setAllowPostSubmit(
+ rc.getBoolean(LABEL, name, KEY_ALLOW_POST_SUBMIT,
+ LabelType.DEF_ALLOW_POST_SUBMIT));
label.setCopyMinScore(
rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE,
LabelType.DEF_COPY_MIN_SCORE));
@@ -1197,6 +1201,8 @@
rc.setString(LABEL, name, KEY_FUNCTION, label.getFunctionName());
rc.setInt(LABEL, name, KEY_DEFAULT_VALUE, label.getDefaultValue());
+ setBooleanConfigKey(rc, name, KEY_ALLOW_POST_SUBMIT, label.allowPostSubmit(),
+ LabelType.DEF_ALLOW_POST_SUBMIT);
setBooleanConfigKey(rc, name, KEY_COPY_MIN_SCORE, label.isCopyMinScore(),
LabelType.DEF_COPY_MIN_SCORE);
setBooleanConfigKey(rc, name, KEY_COPY_MAX_SCORE, label.isCopyMaxScore(),
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
index 3e3ec13..a1a5fbc 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -374,6 +374,9 @@
assertQuery("owner:" + userId.get(), change1);
assertQuery("owner:" + user2, change2);
+
+ String nameEmail = user.asIdentifiedUser().getNameEmail();
+ assertQuery("owner: \"" + nameEmail + "\"", change1);
}
@Test
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
index 038abda..70493e8 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.query.change;
+import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.testutil.InMemoryModule;
import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo;
@@ -52,4 +53,15 @@
assertQuery("message:one.two", change2);
assertQuery("message:one two", change2);
}
+
+ @Test
+ public void byOwnerInvalidQuery() throws Exception {
+ TestRepository<Repo> repo = createProject("repo");
+ Change change1 = insert(repo, newChange(repo), userId);
+ String nameEmail = user.asIdentifiedUser().getNameEmail();
+
+ exception.expect(BadRequestException.class);
+ exception.expectMessage("Cannot create full-text query with value: \\");
+ assertQuery("owner: \"" + nameEmail + "\"\\", change1);
+ }
}
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
index 30e9e86..9c591db 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
@@ -76,7 +76,7 @@
on-tap="_handleActionTap"></gr-button>
</template>
</section>
- <section hidden$="[[!_actionCount(_revisionActions.*, _additionalActions.*)]]">
+ <section hidden$="[[!_actionCount(revisionActions.*, _additionalActions.*)]]">
<template is="dom-repeat" items="[[_revisionActionValues]]" as="action">
<gr-button title$="[[action.title]]"
hidden$="[[_computeActionHidden(action.__key, _hiddenRevisionActions.*)]]"
@@ -98,7 +98,9 @@
hidden></gr-confirm-rebase-dialog>
<gr-confirm-cherrypick-dialog id="confirmCherrypick"
class="confirmDialog"
- message="[[commitMessage]]"
+ change-status="[[changeStatus]]"
+ commit-message="[[commitMessage]]"
+ commit-num="[[commitNum]]"
on-confirm="_handleCherrypickConfirm"
on-cancel="_handleConfirmDialogCancel"
hidden></gr-confirm-cherrypick-dialog>
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index ef2a3b4..2d5c0a7 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -74,23 +74,25 @@
},
},
changeNum: String,
+ changeStatus: String,
+ commitNum: String,
patchNum: String,
commitMessage: {
type: String,
value: '',
},
+ revisionActions: {
+ type: Object,
+ value: function() { return {}; },
+ },
_loading: {
type: Boolean,
value: true,
},
- _revisionActions: {
- type: Object,
- value: function() { return {}; },
- },
_revisionActionValues: {
type: Array,
- computed: '_computeRevisionActionValues(_revisionActions.*, ' +
+ computed: '_computeRevisionActionValues(revisionActions.*, ' +
'primaryActionKeys.*, _additionalActions.*)',
},
_changeActionValues: {
@@ -121,7 +123,7 @@
],
observers: [
- '_actionsChanged(actions.*, _revisionActions.*, _additionalActions.*)',
+ '_actionsChanged(actions.*, revisionActions.*, _additionalActions.*)',
],
ready: function() {
@@ -137,7 +139,7 @@
return this._getRevisionActions().then(function(revisionActions) {
if (!revisionActions) { return; }
- this._revisionActions = revisionActions;
+ this.revisionActions = revisionActions;
this._loading = false;
}.bind(this)).catch(function(err) {
alert('Couldn’t load revision actions. Check the console ' +
@@ -363,7 +365,7 @@
/* falls through */ // required by JSHint
default:
this._fireAction(this._prependSlash(key),
- this._revisionActions[key], true);
+ this.revisionActions[key], true);
}
},
@@ -400,7 +402,7 @@
}
this.$.overlay.close();
el.hidden = true;
- this._fireAction('/rebase', this._revisionActions.rebase, true, payload);
+ this._fireAction('/rebase', this.revisionActions.rebase, true, payload);
},
_handleCherrypickConfirm: function() {
@@ -418,7 +420,7 @@
el.hidden = true;
this._fireAction(
'/cherrypick',
- this._revisionActions.cherrypick,
+ this.revisionActions.cherrypick,
true,
{
destination: el.branch,
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index 00ebd49..ccbf5a9 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -248,7 +248,10 @@
<gr-change-actions id="actions"
change="[[_change]]"
actions="[[_change.actions]]"
+ revision-actions="[[_currentRevisionActions]]"
change-num="[[_changeNum]]"
+ change-status="[[_change.status]]"
+ commit-num="[[_commitInfo.commit]]"
patch-num="[[_computeLatestPatchNum(_allPatchSets)]]"
commit-message="[[_latestCommitMessage]]"
on-reload-change="_handleReloadChange"></gr-change-actions>
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index bbd4d2d..a41e30d 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -55,6 +55,7 @@
observer: '_changeChanged',
},
_commitInfo: Object,
+ _files: Object,
_changeNum: String,
_diffDrafts: {
type: Object,
@@ -77,6 +78,7 @@
type: Object,
observer: '_updateSelected',
},
+ _currentRevisionActions: Object,
_allPatchSets: {
type: Array,
computed: '_computeAllPatchSets(_change)',
@@ -681,7 +683,16 @@
if (!change.reviewer_updates) {
change.reviewer_updates = null;
}
+ var currentRevision = change.revisions &&
+ change.revisions[change.current_revision];
+ this._latestCommitMessage = currentRevision.commit.message;
this._change = change;
+ if (!this._patchRange || !this._patchRange.patchNum ||
+ this._patchRange.patchNum === currentRevision._number) {
+ this._commitInfo = currentRevision.commit;
+ this._currentRevisionActions = currentRevision.actions;
+ // TODO: Fetch and process files.
+ }
}.bind(this));
},
@@ -728,41 +739,26 @@
var detailCompletes = this._getChangeDetail().then(function() {
this._loading = false;
+ this._getProjectConfig();
}.bind(this));
this._getComments();
if (this._patchRange.patchNum) {
- return this._reloadPatchNumDependentResources().then(function() {
- return detailCompletes;
- }).then(function() {
- return this._reloadDetailDependentResources();
+ return Promise.all([
+ this._reloadPatchNumDependentResources(),
+ detailCompletes,
+ ]).then(function() {
+ return this.$.actions.reload();
}.bind(this));
} else {
// The patch number is reliant on the change detail request.
return detailCompletes.then(function() {
- return this._reloadPatchNumDependentResources();
- }.bind(this)).then(function() {
- return this._reloadDetailDependentResources();
+ this.$.fileList.reload();
}.bind(this));
}
},
/**
- * Kicks off requests for resources that rely on the change detail
- * (`this._change`) being loaded.
- */
- _reloadDetailDependentResources: function() {
- if (!this._change) { return Promise.resolve(); }
-
- return this._getProjectConfig().then(function() {
- return Promise.all([
- this._getLatestCommitMessage(),
- this.$.actions.reload(),
- ]);
- }.bind(this));
- },
-
- /**
* Kicks off requests for resources that rely on the patch range
* (`this._patchRange`) being defined.
*/
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index 7c8a329..51b4453 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -102,7 +102,7 @@
return Promise.resolve({
change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
revisions: {
- rev1: {_number: 1},
+ rev1: {_number: 1, commit: {}},
rev13: {_number: 13},
},
current_revision: 'rev1',
@@ -468,7 +468,12 @@
test('topic is coalesced to null', function(done) {
sandbox.stub(element, '_changeChanged');
sandbox.stub(element.$.restAPI, 'getChangeDetail', function() {
- return Promise.resolve({id: '123456789', labels: {}});
+ return Promise.resolve({
+ id: '123456789',
+ labels: {},
+ current_revision: 'foo',
+ revisions: {foo: {commit: {}}},
+ });
});
element._getChangeDetail().then(function() {
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
index ebc6533..5d2a9ac 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
@@ -74,7 +74,7 @@
autocomplete="on"
rows="4"
max-rows="15"
- bind-value="{{message}}"></iron-autogrow-textarea>
+ bind-value="{{_message}}"></iron-autogrow-textarea>
</div>
</gr-confirm-dialog>
</template>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
index f27e4e2..f87af1c 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
@@ -31,7 +31,22 @@
properties: {
branch: String,
- message: String,
+ changeStatus: String,
+ commitMessage: String,
+ commitNum: String,
+ _message: {
+ type: String,
+ computed: '_computeMessage(changeStatus, commitNum, commitMessage)',
+ },
+ },
+
+ _computeMessage: function(changeStatus, commitNum, commitMessage) {
+ var newMessage = commitMessage;
+
+ if (changeStatus === 'MERGED') {
+ newMessage += '(cherry picked from commit ' + commitNum + ')';
+ }
+ return newMessage;
},
_handleConfirmTap: function(e) {
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html
new file mode 100644
index 0000000..edf7d7a
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<!--
+Copyright (C) 2016 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-confirm-cherrypick-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+
+<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
+<link rel="import" href="gr-confirm-cherrypick-dialog.html">
+
+<test-fixture id="basic">
+ <template>
+ <gr-confirm-cherrypick-dialog></gr-confirm-cherrypick-dialog>
+ </template>
+</test-fixture>
+
+<script>
+ suite('gr-confirm-cherrypick-dialog tests', function() {
+ var element;
+
+ setup(function() {
+ element = fixture('basic');
+ });
+
+ test('with merged change', function() {
+ element.changeStatus = 'MERGED';
+ element.commitMessage = 'message\n';
+ element.commitNum = '123';
+ element.branch = 'master';
+ flushAsynchronousOperations();
+ var expectedMessage = 'message\n(cherry picked from commit 123)';
+ assert.equal(element._message, expectedMessage);
+ });
+
+ test('with unmerged change', function() {
+ element.changeStatus = 'OPEN';
+ element.commitMessage = 'message\n';
+ element.commitNum = '123';
+ element.branch = 'master';
+ flushAsynchronousOperations();
+ var expectedMessage = 'message\n';
+ assert.equal(element._message, expectedMessage);
+ });
+ });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
index f34ffcf..b5c9f0c 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
@@ -22,4 +22,3 @@
<dom-module id="gr-rest-api-interface">
<script src="gr-rest-api-interface.js"></script>
</dom-module>
-
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
index 96a8bca..07ccf2b 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
@@ -388,11 +388,13 @@
var options = this._listChangesOptionsToHex(
ListChangesOption.ALL_REVISIONS,
ListChangesOption.CHANGE_ACTIONS,
+ ListChangesOption.CURRENT_ACTIONS,
+ ListChangesOption.CURRENT_COMMIT,
ListChangesOption.DOWNLOAD_COMMANDS,
ListChangesOption.SUBMITTABLE
);
- return this._getChangeDetail(changeNum, options, opt_errFn,
- opt_cancelCondition);
+ return this._getChangeDetail(
+ changeNum, options, opt_errFn, opt_cancelCondition);
},
getDiffChangeDetail: function(changeNum, opt_errFn, opt_cancelCondition) {