Show View Diff button for merge change messages Upon submitting a change with unreviewed files(when approval is sticky), Gerrit sends a change message containing the latest approved patchset. Add a View Diff button to this change message which shows the diff between this approved patchset and the latest patchset. Change-Id: I8a86c8ebe54726100aa8ca97c2c11e29673a1df3
diff --git a/polygerrit-ui/app/constants/constants.ts b/polygerrit-ui/app/constants/constants.ts index b0f87d7..03d5000 100644 --- a/polygerrit-ui/app/constants/constants.ts +++ b/polygerrit-ui/app/constants/constants.ts
@@ -53,6 +53,7 @@ TAG_SET_WIP = 'autogenerated:gerrit:setWorkInProgress', TAG_SET_ASSIGNEE = 'autogenerated:gerrit:setAssignee', TAG_UNSET_ASSIGNEE = 'autogenerated:gerrit:deleteAssignee', + TAG_MERGED = 'autogenerated:gerrit:merged', } /**
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts index bc61dad..39cdf22 100644 --- a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts +++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
@@ -27,7 +27,7 @@ import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin'; import {PolymerElement} from '@polymer/polymer/polymer-element'; import {htmlTemplate} from './gr-message_html'; -import {SpecialFilePath} from '../../../constants/constants'; +import {MessageTag, SpecialFilePath} from '../../../constants/constants'; import {customElement, property, computed, observe} from '@polymer/decorators'; import { ChangeInfo, @@ -54,6 +54,8 @@ const PATCH_SET_PREFIX_PATTERN = /^(?:Uploaded\s*)?(?:P|p)atch (?:S|s)et \d+:\s*(.*)/; const LABEL_TITLE_SCORE_PATTERN = /^(-?)([A-Za-z0-9-]+?)([+-]\d+)?[.]?$/; +const UPLOADED_NEW_PATCHSET_PATTERN = /Uploaded patch set (\d+)./; +const MERGED_PATCHSET_PATTERN = /(\d+) is the latest approved patch-set/; declare global { interface HTMLElementTagNameMap { @@ -268,28 +270,49 @@ return this._patchsetCommentSummary(commentThreads); } + _showViewDiffButton(message?: ChangeMessage) { + return ( + this._isNewPatchsetTag(message?.tag) || this._isMergePatchset(message) + ); + } + + _isMergePatchset(message?: ChangeMessage) { + return ( + message?.tag === MessageTag.TAG_MERGED && + message?.message.match(MERGED_PATCHSET_PATTERN) + ); + } + _isNewPatchsetTag(tag?: ReviewInputTag) { - return tag?.endsWith(':newPatchSet') || tag?.endsWith(':newWipPatchSet'); + return ( + tag === MessageTag.TAG_NEW_PATCHSET || + tag === MessageTag.TAG_NEW_WIP_PATCHSET + ); } _handleViewPatchsetDiff(e: Event) { if (!this.message || !this.change) return; - const match = this.message.message.match(/Uploaded patch set (\d+)./); let patchNum: PatchSetNum; - // Message is of the form "Commit Message was updated" or "Patchset X - // was rebased" - if (!match || match.length < 1) { - patchNum = computeLatestPatchNum(computeAllPatchSets(this.change))!; - } else { + let basePatchNum: PatchSetNum; + if (this.message.message.match(UPLOADED_NEW_PATCHSET_PATTERN)) { + const match = this.message.message.match(UPLOADED_NEW_PATCHSET_PATTERN)!; if (isNaN(Number(match[1]))) throw new Error('invalid patchnum in message'); patchNum = Number(match[1]) as PatchSetNum; + basePatchNum = computePredecessor(patchNum)!; + } else if (this.message.message.match(MERGED_PATCHSET_PATTERN)) { + const match = this.message.message.match(MERGED_PATCHSET_PATTERN)!; + if (isNaN(Number(match[1]))) + throw new Error('invalid patchnum in message'); + basePatchNum = Number(match[1]) as PatchSetNum; + patchNum = computeLatestPatchNum(computeAllPatchSets(this.change))!; + } else { + // Message is of the form "Commit Message was updated" or "Patchset X + // was rebased" + patchNum = computeLatestPatchNum(computeAllPatchSets(this.change))!; + basePatchNum = computePredecessor(patchNum)!; } - GerritNav.navigateToChange( - this.change, - patchNum, - computePredecessor(patchNum) - ); + GerritNav.navigateToChange(this.change, patchNum, basePatchNum); // stop propagation to stop message expansion e.stopPropagation(); }
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts index 48e5e24..070aa2d 100644 --- a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts +++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
@@ -279,7 +279,7 @@ </div> </template> <span class="dateContainer"> - <template is="dom-if" if="[[_isNewPatchsetTag(message.tag)]]"> + <template is="dom-if" if="[[_showViewDiffButton(message)]]"> <gr-button class="patchsetDiffButton" on-click="_handleViewPatchsetDiff"
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js index e2c7e86..3f4e13a 100644 --- a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js +++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js
@@ -266,6 +266,14 @@ element._handleViewPatchsetDiff(new MouseEvent('click')); assert.isTrue(navStub.calledWithExactly(element.change, 4, 3)); }); + + test('Merged patchset change message', () => { + element.message = { + message: 'abcd↵3 is the latest approved patch-set.↵abc', + }; + element._handleViewPatchsetDiff(new MouseEvent('click')); + assert.isTrue(navStub.calledWithExactly(element.change, 4, 3)); + }); }); suite('compute messages', () => {