Merge "Conditionally add change-id under commit message"
This commit is contained in:
@@ -88,6 +88,11 @@ limitations under the License.
|
||||
display: flex;
|
||||
padding: 0 var(--default-horizontal-margin);
|
||||
}
|
||||
.changeId {
|
||||
color: #666;
|
||||
font-family: var(--font-family);
|
||||
margin-top: 1em;
|
||||
}
|
||||
.changeInfo-column:not(:last-of-type) {
|
||||
margin-right: 1em;
|
||||
padding-right: 1em;
|
||||
@@ -171,6 +176,9 @@ limitations under the License.
|
||||
.mobile {
|
||||
display: none;
|
||||
}
|
||||
.warning {
|
||||
color: #d14836;
|
||||
}
|
||||
hr {
|
||||
border: 0;
|
||||
border-top: 1px solid #ddd;
|
||||
@@ -296,6 +304,15 @@ limitations under the License.
|
||||
class="editCommitMessage"
|
||||
on-tap="_handleEditCommitMessage"
|
||||
hidden$="[[_hideEditCommitMessage]]">Edit</gr-button>
|
||||
<div class="changeId" hidden$="[[!_changeIdCommitMessageError]]">
|
||||
<hr>
|
||||
Change-Id:
|
||||
<span
|
||||
class$="[[_computeChangeIdClass(_changeIdCommitMessageError)]]"
|
||||
title$="[[_computeTitleAttributeWarning(_changeIdCommitMessageError)]]">
|
||||
[[_change.change_id]]
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relatedChanges">
|
||||
<gr-related-changes-list id="relatedChanges"
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
var CHANGE_ID_ERROR = {
|
||||
MISMATCH: 'mismatch',
|
||||
MISSING: 'missing',
|
||||
};
|
||||
var CHANGE_ID_REGEX_PATTERN = /^Change-Id\:\s(I[0-9a-f]{8,40})/gm;
|
||||
// Maximum length for patch set descriptions.
|
||||
var PATCH_DESC_MAX_LENGTH = 500;
|
||||
var REVIEWERS_REGEX = /^R=/gm;
|
||||
@@ -82,6 +87,11 @@
|
||||
type: String,
|
||||
value: '',
|
||||
},
|
||||
_changeIdCommitMessageError: {
|
||||
type: String,
|
||||
computed:
|
||||
'_computeChangeIdCommitMessageError(_latestCommitMessage, _change)',
|
||||
},
|
||||
_patchRange: {
|
||||
type: Object,
|
||||
observer: '_updateSelected',
|
||||
@@ -549,6 +559,43 @@
|
||||
return statusString ? ' (' + statusString + ')' : '';
|
||||
},
|
||||
|
||||
_computeChangeIdClass: function(displayChangeId) {
|
||||
return displayChangeId === CHANGE_ID_ERROR.MISMATCH ? 'warning' : '';
|
||||
},
|
||||
|
||||
_computeTitleAttributeWarning: function(displayChangeId) {
|
||||
if (displayChangeId === CHANGE_ID_ERROR.MISMATCH) {
|
||||
return 'Change-Id mismatch';
|
||||
} else if (displayChangeId === CHANGE_ID_ERROR.MISSING) {
|
||||
return 'No Change-Id in commit message';
|
||||
}
|
||||
},
|
||||
|
||||
_computeChangeIdCommitMessageError: function(commitMessage, change) {
|
||||
if (!commitMessage) { return CHANGE_ID_ERROR.MISSING; }
|
||||
|
||||
// Find the last match in the commit message:
|
||||
var changeId;
|
||||
var changeIdArr;
|
||||
|
||||
while (changeIdArr = CHANGE_ID_REGEX_PATTERN.exec(commitMessage)) {
|
||||
changeId = changeIdArr[1];
|
||||
}
|
||||
|
||||
if (changeId) {
|
||||
// A change-id is detected in the commit message.
|
||||
|
||||
if (changeId === change.change_id) {
|
||||
// The change-id found matches the real change-id.
|
||||
return null;
|
||||
}
|
||||
// The change-id found does not match the change-id.
|
||||
return CHANGE_ID_ERROR.MISMATCH;
|
||||
}
|
||||
// There is no change-id in the commit message.
|
||||
return CHANGE_ID_ERROR.MISSING;
|
||||
},
|
||||
|
||||
_computeLatestPatchNum: function(allPatchSets) {
|
||||
return allPatchSets[allPatchSets.length - 1].num;
|
||||
},
|
||||
|
||||
@@ -658,6 +658,77 @@ limitations under the License.
|
||||
_change));
|
||||
});
|
||||
|
||||
test('_computeChangeIdCommitMessageError', function() {
|
||||
var commitMessage =
|
||||
'Change-Id: I4ce18b2395bca69d7a9aa48bf4554faa56282483';
|
||||
var change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282483'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
null);
|
||||
|
||||
change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282484'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
'mismatch');
|
||||
|
||||
commitMessage = 'This is the greatest change.';
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
'missing');
|
||||
});
|
||||
|
||||
test('multiple change Ids in commit message picks last', function() {
|
||||
var commitMessage = [
|
||||
'Change-Id: I4ce18b2395bca69d7a9aa48bf4554faa56282484',
|
||||
'Change-Id: I4ce18b2395bca69d7a9aa48bf4554faa56282483',
|
||||
].join('\n');
|
||||
var change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282483'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
null);
|
||||
change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282484'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
'mismatch');
|
||||
});
|
||||
|
||||
test('does not count change Id that starts mid line', function() {
|
||||
var commitMessage = [
|
||||
'Change-Id: I4ce18b2395bca69d7a9aa48bf4554faa56282484',
|
||||
'Change-Id: I4ce18b2395bca69d7a9aa48bf4554faa56282483',
|
||||
].join(' and ');
|
||||
var change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282484'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
null);
|
||||
change = {change_id: 'I4ce18b2395bca69d7a9aa48bf4554faa56282483'};
|
||||
assert.equal(
|
||||
element._computeChangeIdCommitMessageError(commitMessage, change),
|
||||
'mismatch');
|
||||
});
|
||||
|
||||
test('_computeTitleAttributeWarning', function() {
|
||||
var changeIdCommitMessageError = 'missing';
|
||||
assert.equal(
|
||||
element._computeTitleAttributeWarning(changeIdCommitMessageError),
|
||||
'No Change-Id in commit message');
|
||||
|
||||
var changeIdCommitMessageError = 'mismatch';
|
||||
assert.equal(
|
||||
element._computeTitleAttributeWarning(changeIdCommitMessageError),
|
||||
'Change-Id mismatch');
|
||||
});
|
||||
|
||||
test('_computeChangeIdClass', function() {
|
||||
var changeIdCommitMessageError = 'missing';
|
||||
assert.equal(
|
||||
element._computeChangeIdClass(changeIdCommitMessageError), '');
|
||||
|
||||
var changeIdCommitMessageError = 'mismatch';
|
||||
assert.equal(
|
||||
element._computeChangeIdClass(changeIdCommitMessageError), 'warning');
|
||||
});
|
||||
|
||||
test('topic is coalesced to null', function(done) {
|
||||
sandbox.stub(element, '_changeChanged');
|
||||
sandbox.stub(element.$.restAPI, 'getChangeDetail', function() {
|
||||
|
||||
Reference in New Issue
Block a user