Merge changes Ia2549551,Ia82f8347,Ideee6730 * changes: Use CSS constant for assignee color Use CSS constants in gr-form-styles Replace more CSS vars with constants
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 9a37f25..ce7adc2 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt
@@ -1140,7 +1140,8 @@ [[change.allowBlame]]change.allowBlame:: + -Allow blame on side by side diff. If set to false, blame cannot be used. +Allow blame on side by side diff in the GWT UI. If set to false, blame cannot be +used. + Default is true. @@ -2974,13 +2975,13 @@ version 2.4.x. Support for other versions is not guaranteed. Open and closed changes are indexed in a single index, separated -into types 'open_changes' and 'closed_changes' respectively. +into types `open_changes` and `closed_changes` respectively. [[elasticsearch.prefix]]elasticsearch.prefix:: + This setting can be used to prefix index names to allow multiple Gerrit -instances in a single Elasticsearch cluster. Prefix 'gerrit1_' would result in a -change index named 'gerrit1_changes_0001'. +instances in a single Elasticsearch cluster. Prefix `gerrit1_` would result in a +change index named `gerrit1_changes_0001`. + Not set by default. @@ -3006,7 +3007,7 @@ + How long should Gerrit waits for connection. + -The value is in the usual time-unit format like "1 m", "5 m". +The value is in the usual time-unit format like `1 m`, `5 m`. + Defaults to `5 m` @@ -3014,31 +3015,31 @@ + How long connection can stay in idle. + -The value is in the usual time-unit format like "1 m", "5 m". +The value is in the usual time-unit format like `1 m`, `5 m`. + Defaults to `5 m` [[elasticsearch.maxTotalConnection]]elasticsearch.maxTotalConnection:: + -How many connections can be spawn simultaneously. +How many connections can be spawned simultaneously. + Defaults to `1` [[elasticsearch.maxReadTimeout]]elasticsearch.maxReadTimeout:: + -Timeout for the read operation. +Timeout for read operations. + -The value is in the usual time-unit format like "1 m", "5 m". +The value is in the usual time-unit format like `1 m`, `5 m`. + Defaults to `5 m` ==== Elasticsearch server(s) configuration -Each section correspond to one Elasticsearch server. +Each section corresponds to one Elasticsearch server. [[elasticsearch.name.protocol]]elasticsearch.name.protocol:: + -Elasticsearch server protocol [http|https]. +Elasticsearch server protocol. Can be `http` or `https`. + Defaults to `http`.
diff --git a/Documentation/metrics.txt b/Documentation/metrics.txt index 742c8c2..640178e 100644 --- a/Documentation/metrics.txt +++ b/Documentation/metrics.txt
@@ -68,6 +68,17 @@ * `query/query_latency`: Successful query latency, accumulated over the life of the process. +=== Queue + +The metrics below are per queue. + +* `queue/<queueName>/pool_size`: Current number of threads in the pool +* `queue/<queueName>/max_pool_size`: Maximum allowed number of threads in the pool +* `queue/<queueName>/active_threads`: Number of threads that are actively executing tasks +* `queue/<queueName>/scheduled_tasks`: Number of scheduled tasks in the queue +* `queue/<queueName>/total_scheduled_tasks_count`: Total number of tasks that have been scheduled +* `queue/<queueName>/total_completed_tasks_count`: Total number of tasks that have completed execution + === SSH sessions * `sshd/sessions/connected`: Number of currently connected SSH sessions.
diff --git a/contrib/populate-fixture-data.py b/contrib/populate-fixture-data.py index 99d9a49..93ac34f 100755 --- a/contrib/populate-fixture-data.py +++ b/contrib/populate-fixture-data.py
@@ -21,6 +21,7 @@ TODO(hiesel): Add comments """ +from __future__ import print_function import atexit import json import optparse @@ -280,7 +281,7 @@ (options, _) = p.parse_args() global BASE_URL BASE_URL = BASE_URL % options.port - print BASE_URL + print(BASE_URL) set_up() gerrit_users = get_random_users(options.user_count)
diff --git a/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java index 19172e2..5b60a36f 100644 --- a/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java +++ b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
@@ -423,10 +423,7 @@ } projectState.checkStatePermitsRead(); - permissionBackend - .user(anonymousUserProvider.get()) - .project(nameKey) - .check(ProjectPermission.READ); + permissionBackend.user(userProvider.get()).project(nameKey).check(ProjectPermission.READ); } catch (AuthException e) { sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_NOT_FOUND); return;
diff --git a/java/com/google/gerrit/server/api/GerritApiImpl.java b/java/com/google/gerrit/server/api/GerritApiImpl.java index 6a6415e..24fad34 100644 --- a/java/com/google/gerrit/server/api/GerritApiImpl.java +++ b/java/com/google/gerrit/server/api/GerritApiImpl.java
@@ -25,7 +25,7 @@ import com.google.inject.Singleton; @Singleton -class GerritApiImpl implements GerritApi { +public class GerritApiImpl implements GerritApi { private final Accounts accounts; private final Changes changes; private final Config config;
diff --git a/java/com/google/gerrit/server/git/WorkQueue.java b/java/com/google/gerrit/server/git/WorkQueue.java index 74f986e..29915ef5 100644 --- a/java/com/google/gerrit/server/git/WorkQueue.java +++ b/java/com/google/gerrit/server/git/WorkQueue.java
@@ -14,8 +14,12 @@ package com.google.gerrit.server.git; +import com.google.common.base.CaseFormat; +import com.google.common.base.Supplier; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.lifecycle.LifecycleModule; +import com.google.gerrit.metrics.Description; +import com.google.gerrit.metrics.MetricMaker; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.ScheduleConfig.Schedule; @@ -84,17 +88,19 @@ } }; + private final MetricMaker metrics; private final ScheduledExecutorService defaultQueue; private final IdGenerator idGenerator; private final CopyOnWriteArrayList<Executor> queues; @Inject - WorkQueue(IdGenerator idGenerator, @GerritServerConfig Config cfg) { - this(idGenerator, cfg.getInt("execution", "defaultThreadPoolSize", 1)); + WorkQueue(MetricMaker metrics, IdGenerator idGenerator, @GerritServerConfig Config cfg) { + this(metrics, idGenerator, cfg.getInt("execution", "defaultThreadPoolSize", 1)); } /** Constructor to allow binding the WorkQueue more explicitly in a vhost setup. */ - public WorkQueue(IdGenerator idGenerator, int defaultThreadPoolSize) { + public WorkQueue(MetricMaker metrics, IdGenerator idGenerator, int defaultThreadPoolSize) { + this.metrics = metrics; this.idGenerator = idGenerator; this.queues = new CopyOnWriteArrayList<>(); this.defaultQueue = createQueue(defaultThreadPoolSize, "WorkQueue"); @@ -224,6 +230,86 @@ corePoolSize + 4 // concurrency level ); queueName = prefix; + buildMetrics(queueName, metrics); + } + + private void buildMetrics(String queueName, MetricMaker metric) { + metric.newCallbackMetric( + getMetricName(queueName, "max_pool_size"), + Long.class, + new Description("Maximum allowed number of threads in the pool") + .setGauge() + .setUnit("threads"), + new Supplier<Long>() { + @Override + public Long get() { + return (long) getMaximumPoolSize(); + } + }); + metric.newCallbackMetric( + getMetricName(queueName, "pool_size"), + Long.class, + new Description("Current number of threads in the pool").setGauge().setUnit("threads"), + new Supplier<Long>() { + @Override + public Long get() { + return (long) getPoolSize(); + } + }); + metric.newCallbackMetric( + getMetricName(queueName, "active_threads"), + Long.class, + new Description("Number number of threads that are actively executing tasks") + .setGauge() + .setUnit("threads"), + new Supplier<Long>() { + @Override + public Long get() { + return (long) getActiveCount(); + } + }); + metric.newCallbackMetric( + getMetricName(queueName, "scheduled_tasks"), + Integer.class, + new Description("Number of scheduled tasks in the queue").setGauge().setUnit("tasks"), + new Supplier<Integer>() { + @Override + public Integer get() { + return getQueue().size(); + } + }); + metric.newCallbackMetric( + getMetricName(queueName, "total_scheduled_tasks_count"), + Long.class, + new Description("Total number of tasks that have been scheduled for execution") + .setCumulative() + .setUnit("tasks"), + new Supplier<Long>() { + @Override + public Long get() { + return (long) getTaskCount(); + } + }); + metric.newCallbackMetric( + getMetricName(queueName, "total_completed_tasks_count"), + Long.class, + new Description("Total number of tasks that have completed execution") + .setCumulative() + .setUnit("tasks"), + new Supplier<Long>() { + @Override + public Long get() { + return (long) getCompletedTaskCount(); + } + }); + } + + private String getMetricName(String queueName, String metricName) { + String name = + CaseFormat.UPPER_CAMEL.to( + CaseFormat.LOWER_UNDERSCORE, + queueName.replaceFirst("SSH", "Ssh").replaceAll("-", "")); + return String.format("queue/%s/%s", name, metricName); } @Override
diff --git a/java/com/google/gerrit/server/restapi/change/GetBlame.java b/java/com/google/gerrit/server/restapi/change/GetBlame.java index 6bba936..f5c8849 100644 --- a/java/com/google/gerrit/server/restapi/change/GetBlame.java +++ b/java/com/google/gerrit/server/restapi/change/GetBlame.java
@@ -18,7 +18,6 @@ import com.google.common.collect.MultimapBuilder; import com.google.gerrit.extensions.common.BlameInfo; import com.google.gerrit.extensions.common.RangeInfo; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.CacheControl; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; @@ -55,7 +54,6 @@ private final GitRepositoryManager repoManager; private final BlameCache blameCache; - private final boolean allowBlame; private final ThreeWayMergeStrategy mergeStrategy; private final AutoMerger autoMerger; @@ -78,16 +76,11 @@ this.blameCache = blameCache; this.mergeStrategy = MergeUtil.getMergeStrategy(cfg); this.autoMerger = autoMerger; - allowBlame = cfg.getBoolean("change", "allowBlame", true); } @Override public Response<List<BlameInfo>> apply(FileResource resource) throws RestApiException, OrmException, IOException, InvalidChangeOperationException { - if (!allowBlame) { - throw new BadRequestException("blame is disabled"); - } - Project.NameKey project = resource.getRevision().getChange().getProject(); try (Repository repository = repoManager.openRepository(project); ObjectInserter ins = repository.newObjectInserter();
diff --git a/java/com/google/gerrit/sshd/SshDaemon.java b/java/com/google/gerrit/sshd/SshDaemon.java index e61919a..ecd9476 100644 --- a/java/com/google/gerrit/sshd/SshDaemon.java +++ b/java/com/google/gerrit/sshd/SshDaemon.java
@@ -670,7 +670,7 @@ List<NamedFactory<UserAuth>> authFactories = new ArrayList<>(); if (kerberosKeytab != null) { authFactories.add(UserAuthGSSFactory.INSTANCE); - log.info("Enabling kerberos with keytab " + kerberosKeytab); + sshDaemonLog.info("Enabling kerberos with keytab " + kerberosKeytab); if (!new File(kerberosKeytab).canRead()) { sshDaemonLog.error( "Keytab "
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java index a98d103..c3a0dc9 100644 --- a/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java +++ b/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
@@ -128,6 +128,23 @@ } @Test + public void signAgreementAsOtherUser() throws Exception { + assume().that(isContributorAgreementsEnabled()).isTrue(); + assertThat(gApi.accounts().self().get().name).isNotEqualTo("admin"); + exception.expect(AuthException.class); + exception.expectMessage("not allowed to enter contributor agreement"); + gApi.accounts().id("admin").signAgreement(caAutoVerify.getName()); + } + + @Test + public void signAgreementAnonymous() throws Exception { + setApiUserAnonymous(); + exception.expect(AuthException.class); + exception.expectMessage("Authentication required"); + gApi.accounts().self().signAgreement(caAutoVerify.getName()); + } + + @Test public void agreementsDisabledSign() throws Exception { assume().that(isContributorAgreementsEnabled()).isFalse(); exception.expect(MethodNotAllowedException.class);
diff --git a/javatests/com/google/gerrit/server/cache/BUILD b/javatests/com/google/gerrit/server/cache/BUILD index 6eca172..eed4a87 100644 --- a/javatests/com/google/gerrit/server/cache/BUILD +++ b/javatests/com/google/gerrit/server/cache/BUILD
@@ -2,11 +2,13 @@ junit_tests( name = "tests", - srcs = ["PerThreadCacheTest.java"], + srcs = glob(["*.java"]), deps = [ "//java/com/google/gerrit/server", "//lib:guava", "//lib:junit", "//lib:truth", + "//lib/auto:auto-value", + "//lib/auto:auto-value-annotations", ], )
diff --git a/plugins/codemirror-editor b/plugins/codemirror-editor index fa9df30..c97e280 160000 --- a/plugins/codemirror-editor +++ b/plugins/codemirror-editor
@@ -1 +1 @@ -Subproject commit fa9df3035c306069758712bfe9ae3425b119bb0c +Subproject commit c97e2806532cff00fea6424cde0d440f9ea5016d
diff --git a/plugins/hooks b/plugins/hooks index aa42524..da73b23 160000 --- a/plugins/hooks +++ b/plugins/hooks
@@ -1 +1 @@ -Subproject commit aa4252417f54e28db3a7fa1f98d9a06d8ce49465 +Subproject commit da73b23cfb065fc28c9e7653860ccd34bd68f0f0
diff --git a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html index e803e54..40379e4 100644 --- a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html +++ b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html
@@ -32,6 +32,8 @@ getUserName(config, account, enableEmail) { if (account && account.name) { return account.name; + } else if (account && account.username) { + return account.username; } else if (enableEmail && account && account.email) { return account.email; } else if (config && config.user &&
diff --git a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html index 9f5c445..3ac94fe 100644 --- a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html +++ b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html
@@ -56,7 +56,14 @@ test('test for it to return name', () => { const account = { - name: 'test-user', + name: 'test-name', + }; + assert.deepEqual(element.getUserName(config, account, true), 'test-name'); + }); + + test('test for it to return username', () => { + const account = { + username: 'test-user', }; assert.deepEqual(element.getUserName(config, account, true), 'test-user'); });
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html index 48f4ecc..eb6a708 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html +++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
@@ -19,6 +19,7 @@ <link rel="import" href="../../../bower_components/polymer/polymer.html"> <link rel="import" href="../../../styles/gr-table-styles.html"> <link rel="import" href="../../../styles/shared-styles.html"> +<link rel="import" href="../../core/gr-navigation/gr-navigation.html"> <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html"> <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html"> @@ -47,11 +48,20 @@ </td> <td class="type">[[itemType(item.type)]]</td> <td class="member"> - <a href$="[[_computeGroupUrl(item.member.group_id)]]"> - [[_getNameForMember(item.member)]] - </a> + <template is="dom-if" if="[[_isGroupEvent(item.type)]]"> + <a href$="[[_computeGroupUrl(item.member)]]"> + [[_getNameForGroup(item.member)]] + </a> + </template> + <template is="dom-if" if="[[!_isGroupEvent(item.type)]]"> + <gr-account-link account="[[item.member]]"></gr-account-link> + [[_getIdForUser(item.member)]] + </template> </td> - <td class="by-user">[[_getNameForUser(item.user)]]</td> + <td class="by-user"> + <gr-account-link account="[[item.user]]"></gr-account-link> + [[_getIdForUser(item.user)]] + </td> </tr> </template> </table>
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js index b150d68..bc6a5d0 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js +++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js
@@ -17,12 +17,14 @@ (function() { 'use strict'; + const GROUP_EVENTS = ['ADD_GROUP', 'REMOVE_GROUP']; + Polymer({ is: 'gr-group-audit-log', properties: { - groupId: Object, - _auditLog: Object, + groupId: String, + _auditLog: Array, _loading: { type: Boolean, value: true, @@ -63,12 +65,6 @@ return item.disabled ? 'Disabled' : 'Enabled'; }, - _computeGroupUrl(id) { - if (!id) { return ''; } - - return this.getBaseUrl() + '/admin/groups/' + id; - }, - itemType(type) { let item; switch (type) { @@ -86,20 +82,31 @@ return item; }, - _getNameForUser(account) { - const accountId = account._account_id ? ' (' + - account._account_id + ')' : ''; - return this._getNameForMember(account) + accountId; + _isGroupEvent(type) { + return GROUP_EVENTS.indexOf(type) !== -1; }, - _getNameForMember(account) { - if (account && account.name) { - return account.name; - } else if (account && account.username) { - return account.username; - } else if (account && account.email) { - return account.email.split('@')[0]; + _computeGroupUrl(group) { + if (group && group.url && group.id) { + return Gerrit.Nav.getUrlForGroup(group.id); } + + return ''; + }, + + _getIdForUser(account) { + return account._account_id ? ' (' + account._account_id + ')' : ''; + }, + + _getNameForGroup(group) { + if (group && group.name) { + return group.name; + } else if (group && group.id) { + // The URL encoded id of the member + return decodeURIComponent(group.id); + } + + return ''; }, }); })();
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html index 86e8a25..59a665b 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html +++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html
@@ -47,81 +47,49 @@ }); suite('members', () => { - test('test getNameForMember', () => { - let account = { - member: { - username: 'test-user', - _account_id: 12, - }, - }; - assert.equal(element._getNameForMember(account.member, false), - 'test-user'); - - account = { + test('test _getNameForGroup', () => { + let group = { member: { name: 'test-name', - _account_id: 12, }, }; - assert.equal(element._getNameForMember(account.member), 'test-name'); + assert.equal(element._getNameForGroup(group.member), 'test-name'); - account = { - user: { - email: 'test-email@gmail.com', + group = { + member: { + id: 'test-id', }, }; - assert.equal(element._getNameForMember(account.user), 'test-email'); + assert.equal(element._getNameForGroup(group.member), 'test-id'); + }); + + test('test _isGroupEvent', () => { + assert.isTrue(element._isGroupEvent('ADD_GROUP')); + assert.isTrue(element._isGroupEvent('REMOVE_GROUP')); + + assert.isFalse(element._isGroupEvent('ADD_USER')); + assert.isFalse(element._isGroupEvent('REMOVE_USER')); }); }); suite('users', () => { - test('test _getName', () => { - let account = { + test('test _getIdForUser', () => { + const account = { user: { username: 'test-user', _account_id: 12, }, }; - assert.equal(element._getNameForUser(account.user), 'test-user (12)'); - - account = { - user: { - name: 'test-name', - _account_id: 12, - }, - }; - assert.equal(element._getNameForUser(account.user), 'test-name (12)'); - - account = { - user: { - email: 'test-email@gmail.com', - _account_id: 12, - }, - }; - assert.equal(element._getNameForUser(account.user), 'test-email (12)'); + assert.equal(element._getIdForUser(account.user), ' (12)'); }); test('test _account_id not present', () => { - let account = { + const account = { user: { username: 'test-user', }, }; - assert.equal(element._getNameForUser(account.user), 'test-user'); - - account = { - user: { - name: 'test-name', - }, - }; - assert.equal(element._getNameForUser(account.user), 'test-name'); - - account = { - user: { - email: 'test-email@gmail.com', - }, - }; - assert.equal(element._getNameForUser(account.user), 'test-email'); + assert.equal(element._getIdForUser(account.user), ''); }); });
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html index fa0fe52..fb8f6ec 100644 --- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html +++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
@@ -99,7 +99,7 @@ } gr-dropdown { --gr-dropdown-item: { - color: var(--header-text-color); + color: var(--primary-text-color); } } .browse {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html index 0013d14..edee1ae 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html +++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -276,7 +276,7 @@ </span> </div> <div class="rightControls"> - <span class$="blameLoader [[_computeBlameLoaderClass(_isImageDiff, _isBlameSupported)]]"> + <span class$="blameLoader [[_computeBlameLoaderClass(_isImageDiff)]]"> <gr-button link disabled="[[_isBlameLoading]]"
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js index 5df640e..9c27bae 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -148,10 +148,6 @@ type: Boolean, computed: '_computeEditMode(_patchRange.*)', }, - _isBlameSupported: { - type: Boolean, - value: false, - }, _isBlameLoaded: Boolean, _isBlameLoading: { type: Boolean, @@ -203,10 +199,6 @@ this._loggedIn = loggedIn; }); - this.$.restAPI.getConfig().then(config => { - this._isBlameSupported = config.change.allow_blame; - }); - this.$.cursor.push('diffs', this.$.diff); }, @@ -972,8 +964,8 @@ }); }, - _computeBlameLoaderClass(isImageDiff, supported) { - return !isImageDiff && supported ? 'show' : ''; + _computeBlameLoaderClass(isImageDiff) { + return !isImageDiff ? 'show' : ''; }, _getRevisionInfo(change) {
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html index f6749b1..4b447d1 100644 --- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html +++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html
@@ -15,8 +15,8 @@ limitations under the License. --> <link rel="import" href="../../../bower_components/polymer/polymer.html"> -<link rel="import" href="../../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"> <link rel="import" href="../../../bower_components/paper-input/paper-input.html"> +<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html"> <link rel="import" href="../../shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html"> <link rel="import" href="../../shared/gr-cursor-manager/gr-cursor-manager.html"> <link rel="import" href="../../shared/gr-icons/gr-icons.html">
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js index f39398f..634bc00 100644 --- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js +++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
@@ -165,6 +165,10 @@ _selected: Object, }, + behaviors: [ + Gerrit.KeyboardShortcutBehavior, + ], + observers: [ '_maybeOpenDropdown(_suggestions, _focused)', '_updateSuggestions(text, threshold, noDebounce)', @@ -305,6 +309,7 @@ } break; case 13: // Enter + if (this.modifierPressed(e)) { break; } e.preventDefault(); this._handleInputCommit(); break;
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html index 2b0a081..585b16f 100644 --- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html +++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
@@ -496,6 +496,18 @@ assert.isTrue(listener.called); }); + test('enter with modifier does not complete', () => { + const handleSpy = sandbox.spy(element, '_handleKeydown'); + const commitStub = sandbox.stub(element, '_handleInputCommit'); + MockInteractions.pressAndReleaseKeyOn( + element.$.input, 13, 'ctrl', 'enter'); + assert.isTrue(handleSpy.called); + assert.isFalse(commitStub.called); + MockInteractions.pressAndReleaseKeyOn( + element.$.input, 13, null, 'enter'); + assert.isTrue(commitStub.called); + }); + suite('warnUncommitted', () => { let inputClassList; setup(() => {
diff --git a/resources/com/google/gerrit/pgm/Startup.py b/resources/com/google/gerrit/pgm/Startup.py index cf6fac9..469d5df 100644 --- a/resources/com/google/gerrit/pgm/Startup.py +++ b/resources/com/google/gerrit/pgm/Startup.py
@@ -16,6 +16,7 @@ # Startup script for Gerrit Inspector - a Jython introspector # ----------------------------------------------------------------------- +from __future__ import print_function import sys def print_help(): @@ -23,9 +24,9 @@ if not n.startswith("__") and not n in ['help', 'reload'] \ and str(type(v)) != "<type 'javapackage'>" \ and not str(v).startswith("<module"): - print "\"%s\" is \"%s\"" % (n, v) - print - print "Welcome to the Gerrit Inspector" - print "Enter help() to see the above again, EOF to quit and stop Gerrit" + print("\"%s\" is \"%s\"" % (n, v)) + print() + print("Welcome to the Gerrit Inspector") + print("Enter help() to see the above again, EOF to quit and stop Gerrit") print_help()