Merge "Conditionally add change-id under commit message"

This commit is contained in:
Wyatt Allen
2017-01-18 21:04:17 +00:00
committed by Gerrit Code Review
3 changed files with 135 additions and 0 deletions

View File

@@ -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"

View File

@@ -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;
},

View File

@@ -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() {