Skip to content

Commit eb60bb6

Browse files
Robert FührichtRobert Führicht
authored andcommitted
introduces writeSignoffCommit and requireScore features
1 parent 2f74123 commit eb60bb6

File tree

10 files changed

+88
-4
lines changed

10 files changed

+88
-4
lines changed

src/main/distrib/data/defaults.properties

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,13 @@ tickets.acceptNewPatchsets = true
582582
# SINCE 1.4.0
583583
tickets.requireApproval = false
584584

585+
# Set to a value >= 0 to require at least that cumulated score on a patchset to merge
586+
# via the WebUI. Requires requireApproval set to true on a repository.
587+
# Set to negative values to disable.
588+
#
589+
# SINCE 1.9.0
590+
tickets.requireScore = -1
591+
585592
# Default setting to control how patchsets are merged to the integration branch.
586593
# Valid values:
587594
# MERGE_ALWAYS - Always merge with a merge commit. Every ticket will show up as a branch,
@@ -631,6 +638,15 @@ tickets.redis.url =
631638
# SINCE 1.4.0
632639
tickets.perPage = 25
633640

641+
# Appends the reviewers on a ticket in
642+
# 'Signed-off-by: author <author@example.com>'
643+
# lines in the merge commit message when the WebUI merge
644+
# button is clicked.
645+
# Set to true to enable.
646+
#
647+
# SINCE 1.9.0
648+
tickets.writeSignoffCommit = false
649+
634650
# The folder where plugins are loaded from.
635651
#
636652
# SINCE 1.5.0

src/main/java/com/gitblit/client/EditRepositoryDialog.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ public class EditRepositoryDialog extends JDialog {
9696

9797
private JCheckBox requireApproval;
9898

99+
private JComboBox requireScore;
100+
101+
private JCheckBox writeSignoffCommit;
102+
99103
private JComboBox mergeToField;
100104

101105
private JCheckBox useIncrementalPushTags;
@@ -221,6 +225,12 @@ private void initialize(int protocolVersion, RepositoryModel anRepository) {
221225
anRepository.acceptNewPatchsets);
222226
requireApproval = new JCheckBox(Translation.get("gb.requireApprovalDescription"),
223227
anRepository.requireApproval);
228+
Integer [] scores = { 0, 2, 4, 5, 6, 8 };
229+
requireScore = new JComboBox(scores);
230+
requireScore.setSelectedItem(anRepository.requireScore);
231+
232+
writeSignoffCommit = new JCheckBox(Translation.get("gb.writeSignoffDescription"),
233+
anRepository.writeSignoffCommit);
224234

225235
if (ArrayUtils.isEmpty(anRepository.availableRefs)) {
226236
mergeToField = new JComboBox();
@@ -330,6 +340,10 @@ public void itemStateChanged(ItemEvent e) {
330340
acceptNewPatchsets));
331341
fieldsPanel.add(newFieldPanel(Translation.get("gb.requireApproval"),
332342
requireApproval));
343+
fieldsPanel.add(newFieldPanel(Translation.get("gb.requireScore"),
344+
requireScore));
345+
fieldsPanel.add(newFieldPanel(Translation.get("gb.writeSignoffCommit"),
346+
writeSignoffCommit));
333347
fieldsPanel.add(newFieldPanel(Translation.get("gb.mergeTo"), mergeToField));
334348
fieldsPanel
335349
.add(newFieldPanel(Translation.get("gb.enableIncrementalPushTags"), useIncrementalPushTags));
@@ -588,6 +602,8 @@ private boolean validateFields() {
588602
repository.acceptNewPatchsets = acceptNewPatchsets.isSelected();
589603
repository.acceptNewTickets = acceptNewTickets.isSelected();
590604
repository.requireApproval = requireApproval.isSelected();
605+
repository.requireScore = (Integer) requireScore.getSelectedItem();
606+
repository.writeSignoffCommit = writeSignoffCommit.isSelected();
591607
repository.mergeTo = mergeToField.getSelectedItem() == null ? null
592608
: Repository.shortenRefName(mergeToField.getSelectedItem().toString());
593609
repository.useIncrementalPushTags = useIncrementalPushTags.isSelected();

src/main/java/com/gitblit/git/PatchsetReceivePack.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,28 @@ private void updateReflog(RefUpdate ru) {
12681268
public MergeStatus merge(TicketModel ticket) {
12691269
PersonIdent committer = new PersonIdent(user.getDisplayName(), StringUtils.isEmpty(user.emailAddress) ? (user.username + "@gitblit") : user.emailAddress);
12701270
Patchset patchset = ticket.getCurrentPatchset();
1271-
String message = MessageFormat.format("Merged #{0,number,0} \"{1}\"", ticket.number, ticket.title);
1271+
StringBuilder messageBuilder = new StringBuilder();
1272+
messageBuilder.append(MessageFormat.format("Merged #{0,number,0} \"{1}\"", ticket.number, ticket.title));
1273+
1274+
// Add Signed-off-by tags to commit message footer if there are reviewers on this patchset
1275+
// and the setting is enabled on this repo.
1276+
if (repository.writeSignoffCommit) {
1277+
messageBuilder.append("\n\n");
1278+
for (Change change : ticket.getReviews(patchset)) {
1279+
UserModel ruser = gitblit.getUserModel(change.author);
1280+
messageBuilder.append(MessageFormat.format(
1281+
"Signed-off-by: {0} <{1}>\n",
1282+
ruser.getDisplayName(),
1283+
StringUtils.isEmpty(ruser.emailAddress) ? (ruser.username + "@gitblit") : ruser.emailAddress
1284+
)
1285+
);
1286+
}
1287+
// Delete extra the line break at the end of the message
1288+
messageBuilder.deleteCharAt(messageBuilder.length()-1);
1289+
}
1290+
1291+
// Convert the constructed message to String and continue
1292+
String message = messageBuilder.toString();
12721293
Ref oldRef = null;
12731294
try {
12741295
oldRef = getRepository().getRef(ticket.mergeTo);

src/main/java/com/gitblit/manager/RepositoryManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,8 @@ private RepositoryModel loadRepositoryModel(String repositoryName) {
899899
model.acceptNewPatchsets = getConfig(config, "acceptNewPatchsets", true);
900900
model.acceptNewTickets = getConfig(config, "acceptNewTickets", true);
901901
model.requireApproval = getConfig(config, "requireApproval", settings.getBoolean(Keys.tickets.requireApproval, false));
902+
model.requireScore = getConfig(config, "requireScore", settings.getInteger(Keys.tickets.requireScore, -1));
903+
model.writeSignoffCommit = getConfig(config, "writeSignoffCommit", settings.getBoolean(Keys.tickets.writeSignoffCommit, false));
902904
model.mergeTo = getConfig(config, "mergeTo", null);
903905
model.mergeType = MergeType.fromName(getConfig(config, "mergeType", settings.getString(Keys.tickets.mergeType, null)));
904906
model.useIncrementalPushTags = getConfig(config, "useIncrementalPushTags", false);

src/main/java/com/gitblit/models/RepositoryModel.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ public class RepositoryModel implements Serializable, Comparable<RepositoryModel
8888
public CommitMessageRenderer commitMessageRenderer;
8989
public boolean acceptNewPatchsets;
9090
public boolean acceptNewTickets;
91-
public boolean requireApproval;
91+
public boolean requireApproval;
92+
public int requireScore;
93+
public boolean writeSignoffCommit;
9294
public String mergeTo;
9395
public MergeType mergeType;
9496

src/main/java/com/gitblit/models/TicketModel.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,6 @@ public List<Change> getReviews(Patchset patchset) {
491491
return new ArrayList<Change>(reviews.values());
492492
}
493493

494-
495494
public boolean isApproved(Patchset patchset) {
496495
if (patchset == null) {
497496
return false;
@@ -512,6 +511,15 @@ public boolean isApproved(Patchset patchset) {
512511
return approved && !vetoed;
513512
}
514513

514+
public int getScore(Patchset patchset) {
515+
int score = 0;
516+
517+
for (Change change : getReviews(patchset)) {
518+
score += change.review.score.getValue();
519+
}
520+
return score;
521+
}
522+
515523
public boolean isVetoed(Patchset patchset) {
516524
if (patchset == null) {
517525
return false;

src/main/java/com/gitblit/wicket/GitBlitWebApp.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,10 @@ gb.acceptNewTickets = allow new tickets
556556
gb.acceptNewTicketsDescription = allow creation of bug, enhancement, task ,etc tickets
557557
gb.requireApproval = require approvals
558558
gb.requireApprovalDescription = patchsets must be approved before merge button is enabled
559+
gb.requireScore = require score
560+
gb.requireScoreDescription = patchsets must be rated this high before merge button is enabled
561+
gb.writeSignoffCommit = write signoff commit
562+
gb.writeSignoffCommitDescription = reviewed patchsets will have 'Signed-off-by: reviewer <reviewer@example.com>' commit lines appended on merge
559563
gb.topic = topic
560564
gb.proposalTickets = proposed changes
561565
gb.bugTickets = bugs

src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ <h4><wicket:message key="gb.ticketSettings"></wicket:message></h4>
122122
<div wicket:id="acceptNewPatchsets"></div>
123123
<div wicket:id="acceptNewTickets"></div>
124124
<div wicket:id="requireApproval"></div>
125+
<div wicket:id="requireScore"></div>
126+
<div wicket:id="writeSignoffCommit"></div>
125127
<div wicket:id="mergeTo"></div>
126128
<div wicket:id="mergeType"></div>
127129

src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,17 @@ protected void onSubmit() {
453453
getString("gb.requireApproval"),
454454
getString("gb.requireApprovalDescription"),
455455
new PropertyModel<Boolean>(repositoryModel, "requireApproval")));
456-
456+
List<Integer> scores = Arrays.asList(-1, 0, 2, 4, 5, 6, 8);
457+
form.add(new ChoiceOption<Integer>("requireScore",
458+
getString("gb.requireScore"),
459+
getString("gb.requireScoreDescription"),
460+
new DropDownChoice<Integer>("choice",
461+
new PropertyModel<Integer>(repositoryModel, "requireScore"),
462+
scores)));
463+
form.add(new BooleanOption("writeSignoffCommit",
464+
getString("gb.writeSignoffCommit"),
465+
getString("gb.writeSignoffCommitDescription"),
466+
new PropertyModel<Boolean>(repositoryModel, "writeSignoffCommit")));
457467
form.add(new ChoiceOption<String>("mergeTo",
458468
getString("gb.mergeTo"),
459469
getString("gb.mergeToDescription"),

src/main/java/com/gitblit/wicket/pages/TicketPage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,9 @@ protected Component createMergePanel(UserModel user, RepositoryModel repository)
14071407
if (repository.requireApproval) {
14081408
// repository requires approval
14091409
allowMerge = ticket.isOpen() && ticket.isApproved(patchset);
1410+
if (repository.requireScore > -1) {
1411+
allowMerge &= ticket.getScore(patchset) >= repository.requireScore;
1412+
}
14101413
} else {
14111414
// vetoes are binding
14121415
allowMerge = ticket.isOpen() && !ticket.isVetoed(patchset);

0 commit comments

Comments
 (0)