Skip to content

Commit b7ff2ad

Browse files
authored
Merge pull request #12 from implausible/feature/proper-merge-message-handling
Give access to merge messages before they're utilized
2 parents 65b2cf1 + 2a85947 commit b7ff2ad

5 files changed

Lines changed: 34 additions & 25 deletions

File tree

src/Feature.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class Feature {
7070
* @return {Commit} The commit created by finishing the feature
7171
*/
7272
static finishFeature(repo, featureName, options = {}) {
73-
const {keepBranch, isRebase} = options;
73+
const {keepBranch, isRebase, processMergeMessageCallback} = options;
7474

7575
if (!repo) {
7676
return Promise.reject(new Error('Repo is required'));
@@ -113,7 +113,7 @@ class Feature {
113113
cancelDevelopMerge = isSameCommit || isRebase;
114114

115115
if (!cancelDevelopMerge) {
116-
return utils.Repo.merge(developBranch, featureBranch, repo);
116+
return utils.Repo.merge(developBranch, featureBranch, repo, processMergeMessageCallback);
117117
} else if (isRebase && !isSameCommit) {
118118
return utils.Repo.rebase(developBranch, featureBranch, repo);
119119
}

src/Hotfix.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class Hotfix {
6363
* @return {Commit} The commit created by finishing the hotfix
6464
*/
6565
static finishHotfix(repo, hotfixVersion, options = {}) {
66-
const {keepBranch, message} = options;
66+
const {keepBranch, message, processMergeMessageCallback} = options;
6767

6868
if (!repo) {
6969
return Promise.reject(new Error('Repo is required'));
@@ -116,7 +116,7 @@ class Hotfix {
116116

117117
// Merge hotfix into develop
118118
if (!cancelDevelopMerge) {
119-
return utils.Repo.merge(developBranch, hotfixBranch, repo);
119+
return utils.Repo.merge(developBranch, hotfixBranch, repo, processMergeMessageCallback);
120120
}
121121
return Promise.resolve();
122122
})
@@ -126,7 +126,7 @@ class Hotfix {
126126
const tagName = versionPrefix + hotfixVersion;
127127
// Merge the hotfix branch into master
128128
if (!cancelMasterMerge) {
129-
return utils.Repo.merge(masterBranch, hotfixBranch, repo)
129+
return utils.Repo.merge(masterBranch, hotfixBranch, repo, processMergeMessageCallback)
130130
.then((oid) => utils.Tag.create(oid, tagName, message, repo));
131131
}
132132

src/Release.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class Release {
7070
* @return {Commit} The commit created by finishing the release
7171
*/
7272
static finishRelease(repo, releaseVersion, options = {}) {
73-
const {keepBranch, message} = options;
73+
const {keepBranch, message, processMergeMessageCallback} = options;
7474

7575
if (!repo) {
7676
return Promise.reject(new Error('Repo is required'));
@@ -123,7 +123,7 @@ class Release {
123123

124124
// Merge release into develop
125125
if (!cancelDevelopMerge) {
126-
return utils.Repo.merge(developBranch, releaseBranch, repo);
126+
return utils.Repo.merge(developBranch, releaseBranch, repo, processMergeMessageCallback);
127127
}
128128
return Promise.resolve();
129129
})
@@ -133,7 +133,7 @@ class Release {
133133
const tagName = versionPrefix + releaseVersion;
134134
// Merge the release branch into master
135135
if (!cancelMasterMerge) {
136-
return utils.Repo.merge(masterBranch, releaseBranch, repo)
136+
return utils.Repo.merge(masterBranch, releaseBranch, repo, processMergeMessageCallback)
137137
.then((oid) => utils.Tag.create(oid, tagName, message, repo));
138138
}
139139

src/utils/MergeUtils.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
const MergeUtils = {
22
getMergeMessage(toBranch, fromBranch) {
3-
return `Merged ${fromBranch.shorthand()} into ${toBranch.shorthand()}`;
3+
let mergeDecorator;
4+
if (fromBranch.isTag()) {
5+
mergeDecorator = 'tag';
6+
} else if (fromBranch.isRemote()) {
7+
mergeDecorator = 'remote-tracking branch';
8+
} else {
9+
mergeDecorator = 'branch';
10+
}
11+
12+
const message = `Merge ${mergeDecorator} '${fromBranch.shorthand()}'`;
13+
14+
// https://github.com/git/git/blob/master/builtin/fmt-merge-msg.c#L456-L459
15+
return toBranch.shorthand() !== 'master'
16+
? `${message} into ${toBranch.shorthand()}`
17+
: message;
418
}
519
};
620

src/utils/RepoUtils.js

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ const NodeGit = require('nodegit');
33
const MergeUtils = require('./MergeUtils');
44

55
const RepoUtils = {
6-
merge(toBranch, fromBranch, repo) {
7-
let treeOid;
6+
merge(toBranch, fromBranch, repo, processMergeMessageCallback = a => a) {
87
return Promise.resolve()
98
.then(() => {
109
if (!toBranch.isHead()) {
@@ -27,20 +26,16 @@ const RepoUtils = {
2726

2827
return index.writeTree();
2928
})
30-
.then((oid) => {
31-
treeOid = oid;
32-
33-
return Promise.all([
34-
repo.getHeadCommit(),
35-
repo.getBranchCommit('MERGE_HEAD')
36-
]);
37-
})
38-
.then((commits) => {
39-
const signature = repo.defaultSignature();
40-
const message = MergeUtils.getMergeMessage(toBranch, fromBranch);
41-
42-
return repo.createCommit('HEAD', signature, signature, message, treeOid, commits);
43-
})
29+
.then((treeOid) => Promise.all([
30+
treeOid,
31+
processMergeMessageCallback(MergeUtils.getMergeMessage(toBranch, fromBranch)),
32+
repo.defaultSignature(),
33+
repo.getHeadCommit(),
34+
repo.getBranchCommit('MERGE_HEAD')
35+
]))
36+
.then(([treeOid, message, signature, ...commits]) =>
37+
repo.createCommit('HEAD', signature, signature, message, treeOid, commits)
38+
)
4439
.then((commitId) => {
4540
repo.stateCleanup();
4641

0 commit comments

Comments
 (0)