Merge "Fix Delete vote button not checking removable_labels."
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 539008d..e73e17b 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -4605,9 +4605,7 @@
Defines how Gerrit authenticates with the server. When set to `GSSAPI`
Gerrit will use Kerberos. To use kerberos the
`java.security.auth.login.config` system property must point to a
-login to a JAAS configuration file and, if Java 6 is used, the system
-property `java.security.krb5.conf` must point to the appropriate
-krb5.ini file with references to the KDC.
+login to a JAAS configuration file.
Typical jaas.conf.
@@ -4621,8 +4619,6 @@
};
----
-See Java documentation on how to create the krb5.ini file.
-
Note the `renewTGT` property to make sure the TGT does not expire,
and `useTicketCache` to use the TGT supplied by the operating system. As
the whole point of using GSSAPI is to have passwordless authentication
diff --git a/java/com/google/gerrit/server/git/ChangesByProjectCacheImpl.java b/java/com/google/gerrit/server/git/ChangesByProjectCacheImpl.java
index 29da503..b64d872 100644
--- a/java/com/google/gerrit/server/git/ChangesByProjectCacheImpl.java
+++ b/java/com/google/gerrit/server/git/ChangesByProjectCacheImpl.java
@@ -170,7 +170,7 @@
@VisibleForTesting
public static class CachedProjectChanges {
- private record ChangeDataUpdateResult(Collection<ChangeData> cds, boolean anyUpdated) {}
+ public record ChangeDataUpdateResult(Collection<ChangeData> cds, boolean anyUpdated) {}
Map<String, Map<Change.Id, ObjectId>> metaObjectIdByNonPrivateChangeByBranch =
new ConcurrentHashMap<>(); // BranchNameKey "normalized" to a String to dedup project
@@ -208,6 +208,7 @@
anyUpdated = true;
// Do not let a bad change prevent other changes from being available.
logger.atFinest().withCause(ex).log("Can't load changeData for %s", id);
+ continue;
}
cds.add(cd);
}
diff --git a/javatests/com/google/gerrit/server/git/ChangesByProjectCacheTest.java b/javatests/com/google/gerrit/server/git/ChangesByProjectCacheTest.java
index ad5d4ce..9529db1 100644
--- a/javatests/com/google/gerrit/server/git/ChangesByProjectCacheTest.java
+++ b/javatests/com/google/gerrit/server/git/ChangesByProjectCacheTest.java
@@ -15,6 +15,8 @@
package com.google.gerrit.server.git;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableTable;
import com.google.gerrit.entities.Account;
@@ -26,6 +28,7 @@
import com.google.gerrit.server.notedb.AbstractChangeNotesTest;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.InvalidServerIdException;
import com.google.gerrit.server.notedb.ReviewerStateInternal;
import com.google.gerrit.server.query.change.ChangeData;
import java.time.Instant;
@@ -36,6 +39,15 @@
import org.junit.Test;
public final class ChangesByProjectCacheTest extends AbstractChangeNotesTest {
+
+ ChangeData.Factory cdFactory;
+
+ @Override
+ public void setUpTestEnvironment() throws Exception {
+ cdFactory = mock(ChangeData.Factory.class);
+ super.setUpTestEnvironment();
+ }
+
@Test
public void cachedProjectChangesSerializer() throws Exception {
ChangeData cd1 = createChange(false, true);
@@ -58,6 +70,34 @@
}
}
+ @Test
+ public void updateChangeDatasShouldSkipForeignServerIdChanges() throws Exception {
+ // Create change with the Gerrit's server-id
+ ChangeData validChange = createChange(false, false);
+ when(cdFactory.create(project, validChange.getId())).thenReturn(validChange);
+ // Create change with a foreign server-id
+ ChangeData invalidChange = createChange(false, false);
+ when(cdFactory.create(project, invalidChange.getId()))
+ .thenThrow(new InvalidServerIdException(LOCAL_SERVER_ID, "foreign-sever-id"));
+
+ CachedProjectChanges cachedProjectChanges =
+ new CachedProjectChanges(List.of(validChange, invalidChange));
+
+ CachedProjectChanges.ChangeDataUpdateResult result =
+ cachedProjectChanges.updateChangeDatas(
+ project,
+ cdFactory,
+ Map.of(
+ validChange.getId(),
+ validChange.metaRevisionOrThrow(),
+ invalidChange.getId(),
+ invalidChange.metaRevisionOrThrow()),
+ "Test");
+
+ assertThat(result.cds()).doesNotContain(null);
+ assertThat(result.cds()).containsExactly(validChange);
+ }
+
private ChangeData createChange(boolean isPrivate, boolean hasReviewers) throws Exception {
Change change = newChange();
if (isPrivate) {
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
index 7da1513..ed4c9c5 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.ts
@@ -1676,7 +1676,7 @@
assert.equal(confirmRevertDialog.message, expectedMsg);
const radioInputs = queryAll<HTMLInputElement>(
confirmRevertDialog,
- 'input[name="revertOptions"]'
+ 'md-radio[name="revertOptions"]'
);
radioInputs[0].click();
await element.updateComplete;
@@ -1728,7 +1728,7 @@
await element.updateComplete;
const radioInputs = queryAll<HTMLInputElement>(
confirmRevertDialog,
- 'input[name="revertOptions"]'
+ 'md-radio[name="revertOptions"]'
);
const revertSubmissionMsg =
'Revert submission 199 0' +
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.ts
index 3c95410..5124f58 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.ts
@@ -226,6 +226,15 @@
.cherryPickTopicLayout {
display: flex;
align-items: center;
+ margin-top: var(--spacing-l);
+ margin-bottom: var(--spacing-m);
+ }
+ .cherryPickSingleChange,
+ .cherryPickTopic {
+ margin-left: var(--spacing-m);
+ }
+ .cherry-pick-topic-message {
+ margin-bottom: var(--spacing-m);
}
label[for='messageInput'],
label[for='baseInput'] {
@@ -317,7 +326,6 @@
<md-radio
name="cherryPickOptions"
id="cherryPickSingleChange"
- touch-target="wrapper"
checked
@change=${this.handlecherryPickSingleChangeClicked}
>
@@ -330,7 +338,6 @@
<md-radio
name="cherryPickOptions"
id="cherryPickTopic"
- touch-target="wrapper"
@change=${this.handlecherryPickTopicClicked}
>
</md-radio>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
index 5ddc65e..fd44c59 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
import '../../shared/gr-account-chip/gr-account-chip';
-import {css, html, LitElement, PropertyValues} from 'lit';
+import {css, html, LitElement} from 'lit';
import {customElement, property, query, state} from 'lit/decorators.js';
import {when} from 'lit/directives/when.js';
import {
@@ -179,15 +179,6 @@
this.loadCommitterEmailDropdownItems();
}
- override willUpdate(changedProperties: PropertyValues): void {
- if (
- changedProperties.has('rebaseOnCurrent') ||
- changedProperties.has('hasParent')
- ) {
- this.updateSelectedOption();
- }
- }
-
static override get styles() {
return [
formStyles,
@@ -208,19 +199,23 @@
.message {
font-style: italic;
}
+ .parentRevisionContainer {
+ margin-top: var(--spacing-m);
+ }
.parentRevisionContainer label,
.parentRevisionContainer input[type='text'] {
display: block;
width: 100%;
}
- .rebaseCheckbox {
+ div.rebaseOption,
+ div.checkbox-container {
display: flex;
align-items: center;
- margin-top: 0.5em;
+ gap: var(--spacing-m);
+ margin-top: var(--spacing-xl);
}
- .rebaseOption {
- display: flex;
- align-items: center;
+ .rebaseCheckbox {
+ margin-top: var(--spacing-xl);
}
.rebaseOnBehalfMsg {
margin-top: var(--spacing-m);
@@ -228,12 +223,14 @@
.rebaseWithCommitterEmail {
margin-top: var(--spacing-m);
}
- md-checkbox {
- flex-shrink: 0;
+ .main {
+ margin-top: var(--spacing-xl);
+ margin-bottom: var(--spacing-xl);
}
- gr-validation-options {
- display: flex;
- align-items: center;
+ @media screen and (max-width: 50em) {
+ #confirmDialog {
+ height: 90vh;
+ }
}
`,
];
@@ -250,8 +247,11 @@
>
<div class="header" slot="header">Confirm rebase</div>
<div class="main" slot="main">
- ${when(this.loading, () => html`<div>Loading...</div>`)}
- ${this.renderRebaseDialog()}
+ ${when(
+ this.loading,
+ () => html`<div>Loading...</div>`,
+ () => this.renderRebaseDialog()
+ )}
</div>
</gr-dialog>
`;
@@ -266,7 +266,7 @@
<md-radio
id="rebaseOnParentInput"
name="rebaseOptions"
- touch-target="wrapper"
+ ?checked=${this.displayParentOption()}
>
</md-radio>
<label id="rebaseOnParentLabel" for="rebaseOnParentInput">
@@ -291,7 +291,7 @@
<md-radio
id="rebaseOnTipInput"
name="rebaseOptions"
- touch-target="wrapper"
+ ?checked=${!this.displayParentOption() && this.displayTipOption()}
?disabled=${!this.displayTipOption()}
>
</md-radio>
@@ -314,7 +314,7 @@
<md-radio
id="rebaseOnOtherInput"
name="rebaseOptions"
- touch-target="wrapper"
+ ?checked=${!this.displayParentOption() && !this.displayTipOption()}
@click=${this.handleRebaseOnOther}
>
</md-radio>
@@ -336,42 +336,44 @@
</gr-change-autocomplete>
</div>
<div class="rebaseCheckbox">
- <md-checkbox
- id="rebaseAllowConflicts"
- touch-target="wrapper"
- @change=${() => {
- this.allowConflicts = !!this.rebaseAllowConflicts?.checked;
- this.loadCommitterEmailDropdownItems();
- }}
- ></md-checkbox>
- <label for="rebaseAllowConflicts">Allow rebase with conflicts</label>
+ <div class="checkbox-container">
+ <md-checkbox
+ id="rebaseAllowConflicts"
+ @change=${() => {
+ this.allowConflicts = !!this.rebaseAllowConflicts?.checked;
+ this.loadCommitterEmailDropdownItems();
+ }}
+ ></md-checkbox>
+ <label for="rebaseAllowConflicts">Allow rebase with conflicts</label>
+ </div>
+ ${when(
+ !this.isCurrentUserEqualToLatestUploader() && this.allowConflicts,
+ () =>
+ html`<span class="message"
+ >Rebase cannot be done on behalf of the uploader when allowing
+ conflicts.</span
+ >`
+ )}
<gr-validation-options
.validationOptions=${this.validationOptions}
></gr-validation-options>
</div>
${when(
- !this.isCurrentUserEqualToLatestUploader() && this.allowConflicts,
- () =>
- html`<span class="message"
- >Rebase cannot be done on behalf of the uploader when allowing
- conflicts.</span
- >`
- )}
- ${when(
this.hasParent,
() =>
html`<div class="rebaseCheckbox">
- <md-checkbox
- id="rebaseChain"
- touch-target="wrapper"
- @change=${() => {
- this.shouldRebaseChain = !!this.rebaseChain?.checked;
- if (this.shouldRebaseChain) {
- this.selectedEmailForRebase = undefined;
- }
- }}
- ></md-checkbox>
- <label for="rebaseChain">Rebase all ancestors</label>
+ <div class="checkbox-container">
+ <md-checkbox
+ id="rebaseChain"
+ @change=${() => {
+ this.shouldRebaseChain = !!this.rebaseChain?.checked;
+ if (this.shouldRebaseChain) {
+ this.selectedEmailForRebase = undefined;
+ }
+ }}
+ ></md-checkbox>
+ <label for="rebaseChain">Rebase all ancestors</label>
+ </div>
</div>`
)}
${when(
@@ -569,25 +571,6 @@
private handleEnterChangeNumberClick() {
if (this.rebaseOnOtherInput) this.rebaseOnOtherInput.checked = true;
}
-
- /**
- * Sets the default radio button based on the state of the app and
- * the corresponding value to be submitted.
- */
- private updateSelectedOption() {
- const {rebaseOnCurrent, hasParent} = this;
- if (rebaseOnCurrent === undefined || hasParent === undefined) {
- return;
- }
-
- if (this.displayParentOption()) {
- if (this.rebaseOnParentInput) this.rebaseOnParentInput.checked = true;
- } else if (this.displayTipOption()) {
- if (this.rebaseOnTipInput) this.rebaseOnTipInput.checked = true;
- } else {
- if (this.rebaseOnOtherInput) this.rebaseOnOtherInput.checked = true;
- }
- }
}
declare global {
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
index 9884241..30cf475 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
@@ -63,8 +63,7 @@
<md-radio
id="rebaseOnParentInput"
name="rebaseOptions"
- tabindex="0"
- touch-target="wrapper"
+ tabindex="-1"
>
</md-radio>
<label for="rebaseOnParentInput" id="rebaseOnParentLabel">
@@ -82,8 +81,7 @@
disabled=""
id="rebaseOnTipInput"
name="rebaseOptions"
- tabindex="0"
- touch-target="wrapper"
+ tabindex="-1"
>
</md-radio>
<label for="rebaseOnTipInput" id="rebaseOnTipLabel">
@@ -96,10 +94,10 @@
</div>
<div class="rebaseOption" id="rebaseOnOther">
<md-radio
+ checked=""
id="rebaseOnOtherInput"
name="rebaseOptions"
tabindex="0"
- touch-target="wrapper"
>
</md-radio>
<label for="rebaseOnOtherInput" id="rebaseOnOtherLabel">
@@ -111,11 +109,12 @@
<gr-change-autocomplete> </gr-change-autocomplete>
</div>
<div class="rebaseCheckbox">
- <md-checkbox id="rebaseAllowConflicts" touch-target="wrapper">
- </md-checkbox>
- <label for="rebaseAllowConflicts">
- Allow rebase with conflicts
- </label>
+ <div class="checkbox-container">
+ <md-checkbox id="rebaseAllowConflicts"> </md-checkbox>
+ <label for="rebaseAllowConflicts">
+ Allow rebase with conflicts
+ </label>
+ </div>
<gr-validation-options> </gr-validation-options>
</div>
</div>
@@ -434,7 +433,7 @@
);
assert.deepEqual((fireStub.lastCall.args[0] as CustomEvent).detail, {
allowConflicts: false,
- base: '123',
+ base: '',
rebaseChain: true,
onBehalfOfUploader: true,
committerEmail: null,
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.ts
index fd9204c..52ae1c2 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.ts
@@ -24,6 +24,8 @@
import {formStyles} from '../../../styles/form-styles';
import {GrValidationOptions} from '../gr-validation-options/gr-validation-options';
import {GrAutogrowTextarea} from '../../shared/gr-autogrow-textarea/gr-autogrow-textarea';
+import '@material/web/radio/radio';
+import {materialStyles} from '../../../styles/gr-material-styles';
const ERR_COMMIT_NOT_FOUND = 'Unable to find the commit hash of this change.';
const SPECIFY_REASON_STRING = '<MUST SPECIFY REASON HERE>';
@@ -85,6 +87,7 @@
return [
formStyles,
sharedStyles,
+ materialStyles,
css`
:host {
display: block;
@@ -101,6 +104,8 @@
.revertSubmissionLayout {
display: flex;
align-items: center;
+ margin-top: var(--spacing-l);
+ margin-bottom: var(--spacing-m);
}
.label {
margin-left: var(--spacing-m);
@@ -121,6 +126,9 @@
label[for='messageInput'] {
margin-top: var(--spacing-m);
}
+ gr-validation-options {
+ margin-bottom: var(--spacing-m);
+ }
`,
];
}
@@ -140,13 +148,13 @@
${this.showRevertSubmission
? html`
<div class="revertSubmissionLayout">
- <input
- name="revertOptions"
- type="radio"
+ <md-radio
id="revertSingleChange"
- @change=${() => this.handleRevertSingleChangeClicked()}
+ name="revertOptions"
?checked=${this.computeIfSingleRevert()}
- />
+ @change=${() => this.handleRevertSingleChangeClicked()}
+ >
+ </md-radio>
<label
for="revertSingleChange"
class="label revertSingleChange"
@@ -155,13 +163,13 @@
</label>
</div>
<div class="revertSubmissionLayout">
- <input
- name="revertOptions"
- type="radio"
+ <md-radio
id="revertSubmission"
+ name="revertOptions"
+ ?checked=${this.computeIfRevertSubmission()}
@change=${() => this.handleRevertSubmissionClicked()}
- .checked=${this.computeIfRevertSubmission()}
- />
+ >
+ </md-radio>
<label for="revertSubmission" class="label revertSubmission">
Revert entire submission (${this.changesCount} Changes)
</label>
diff --git a/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options.ts b/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options.ts
index 35c991e..de37852 100644
--- a/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options.ts
+++ b/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options.ts
@@ -28,11 +28,11 @@
:host {
display: block;
}
- .selectionLabel {
- margin-left: -4px;
- }
- md-checkbox {
- flex-shrink: 0;
+ div.checkbox-container {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-m);
+ margin-top: var(--spacing-l);
}
label {
cursor: pointer;
@@ -62,16 +62,17 @@
private renderValidationOption(option: ValidationOptionInfo) {
return html`
- <md-checkbox
- class="selectionLabel"
- id=${option.name}
- touch-target="wrapper"
- ?checked=${!!this.isOptionSelected.get(option.name)}
- @click=${() => this.toggleCheckbox(option)}
- ></md-checkbox>
- <label for=${option.name}
- >${capitalizeFirstLetter(option.description)}</label
- >
+ <div class="checkbox-container">
+ <md-checkbox
+ class="selectionLabel"
+ id=${option.name}
+ ?checked=${!!this.isOptionSelected.get(option.name)}
+ @click=${() => this.toggleCheckbox(option)}
+ ></md-checkbox>
+ <label for=${option.name}
+ >${capitalizeFirstLetter(option.description)}</label
+ >
+ </div>
`;
}
diff --git a/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options_test.ts b/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options_test.ts
index 7bbdf85..1a1fb0c 100644
--- a/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-validation-options/gr-validation-options_test.ts
@@ -32,12 +32,14 @@
assert.shadowDom.equal(
element,
/* HTML */ `
- <md-checkbox class="selectionLabel" id="o1" touch-target="wrapper">
- </md-checkbox>
- <label for="o1"> Option 1 </label>
- <md-checkbox class="selectionLabel" id="o2" touch-target="wrapper">
- </md-checkbox>
- <label for="o2"> Option 2 </label>
+ <div class="checkbox-container">
+ <md-checkbox class="selectionLabel" id="o1"> </md-checkbox>
+ <label for="o1"> Option 1 </label>
+ </div>
+ <div class="checkbox-container">
+ <md-checkbox class="selectionLabel" id="o2"> </md-checkbox>
+ <label for="o2"> Option 2 </label>
+ </div>
`
);
});
diff --git a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.ts b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.ts
index 777f185..58614e7 100644
--- a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.ts
+++ b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.ts
@@ -85,11 +85,10 @@
display: flex;
flex-direction: column;
max-height: 90vh;
- padding: var(--spacing-xl);
}
header {
flex-shrink: 0;
- padding-bottom: var(--spacing-xl);
+ padding: var(--spacing-xl);
}
main {
display: flex;
@@ -102,11 +101,12 @@
main .overflow-container {
flex: 1;
overflow: auto;
+ padding: 0 var(--spacing-xl);
}
footer {
display: flex;
flex-shrink: 0;
- padding-top: var(--spacing-xl);
+ padding: var(--spacing-xl);
align-items: center;
}
.flex-space {
diff --git a/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts b/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
index 3633ce6..8c63209 100644
--- a/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
+++ b/polygerrit-ui/app/embed/diff/gr-diff-image-viewer/gr-image-viewer.ts
@@ -525,7 +525,6 @@
<label class="highlight-changes">
<md-checkbox
id="highlight-changes"
- touch-target="wrapper"
?checked=${this.showHighlight}
@change=${this.showHighlightChanged}
>
@@ -576,7 +575,6 @@
const followMouse = html`
<label class="follow-mouse">
<md-checkbox
- touch-target="wrapper"
id="follow-mouse"
?checked=${this.followMouse}
@change=${this.followMouseChanged}
diff --git a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
index ccba1ab..0650a50 100644
--- a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
+++ b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api-impl.ts
@@ -3502,10 +3502,15 @@
)
) as Promise<ChangeInfo | undefined>;
} else {
+ const params: FetchParams = {q: `change:${changeNum}`};
+ if (optionsHex) {
+ params['O'] = optionsHex;
+ }
return this._restApiHelper
.fetchJSON(
{
url: `/changes/?q=change:${changeNum}`,
+ params,
errFn,
anonymizedUrl: '/changes/?q=change:*',
},