Merge "Conditionally add change-id under commit message"
This commit is contained in:
@@ -88,6 +88,11 @@ limitations under the License.
|
|||||||
display: flex;
|
display: flex;
|
||||||
padding: 0 var(--default-horizontal-margin);
|
padding: 0 var(--default-horizontal-margin);
|
||||||
}
|
}
|
||||||
|
.changeId {
|
||||||
|
color: #666;
|
||||||
|
font-family: var(--font-family);
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
.changeInfo-column:not(:last-of-type) {
|
.changeInfo-column:not(:last-of-type) {
|
||||||
margin-right: 1em;
|
margin-right: 1em;
|
||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
@@ -171,6 +176,9 @@ limitations under the License.
|
|||||||
.mobile {
|
.mobile {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.warning {
|
||||||
|
color: #d14836;
|
||||||
|
}
|
||||||
hr {
|
hr {
|
||||||
border: 0;
|
border: 0;
|
||||||
border-top: 1px solid #ddd;
|
border-top: 1px solid #ddd;
|
||||||
@@ -296,6 +304,15 @@ limitations under the License.
|
|||||||
class="editCommitMessage"
|
class="editCommitMessage"
|
||||||
on-tap="_handleEditCommitMessage"
|
on-tap="_handleEditCommitMessage"
|
||||||
hidden$="[[_hideEditCommitMessage]]">Edit</gr-button>
|
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>
|
||||||
<div class="relatedChanges">
|
<div class="relatedChanges">
|
||||||
<gr-related-changes-list id="relatedChanges"
|
<gr-related-changes-list id="relatedChanges"
|
||||||
|
|||||||
@@ -14,6 +14,11 @@
|
|||||||
(function() {
|
(function() {
|
||||||
'use strict';
|
'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.
|
// Maximum length for patch set descriptions.
|
||||||
var PATCH_DESC_MAX_LENGTH = 500;
|
var PATCH_DESC_MAX_LENGTH = 500;
|
||||||
var REVIEWERS_REGEX = /^R=/gm;
|
var REVIEWERS_REGEX = /^R=/gm;
|
||||||
@@ -82,6 +87,11 @@
|
|||||||
type: String,
|
type: String,
|
||||||
value: '',
|
value: '',
|
||||||
},
|
},
|
||||||
|
_changeIdCommitMessageError: {
|
||||||
|
type: String,
|
||||||
|
computed:
|
||||||
|
'_computeChangeIdCommitMessageError(_latestCommitMessage, _change)',
|
||||||
|
},
|
||||||
_patchRange: {
|
_patchRange: {
|
||||||
type: Object,
|
type: Object,
|
||||||
observer: '_updateSelected',
|
observer: '_updateSelected',
|
||||||
@@ -549,6 +559,43 @@
|
|||||||
return statusString ? ' (' + statusString + ')' : '';
|
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) {
|
_computeLatestPatchNum: function(allPatchSets) {
|
||||||
return allPatchSets[allPatchSets.length - 1].num;
|
return allPatchSets[allPatchSets.length - 1].num;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -658,6 +658,77 @@ limitations under the License.
|
|||||||
_change));
|
_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) {
|
test('topic is coalesced to null', function(done) {
|
||||||
sandbox.stub(element, '_changeChanged');
|
sandbox.stub(element, '_changeChanged');
|
||||||
sandbox.stub(element.$.restAPI, 'getChangeDetail', function() {
|
sandbox.stub(element.$.restAPI, 'getChangeDetail', function() {
|
||||||
|
|||||||
Reference in New Issue
Block a user