1
1
package git_commands
2
2
3
3
import (
4
+ "errors"
4
5
"path/filepath"
5
6
"strings"
6
7
"testing"
@@ -21,25 +22,26 @@ d8084cd558925eb7c9c38afeed5725c21653ab90|1640821426|Jesse Duffield|jessedduffiel
21
22
3d4470a6c072208722e5ae9a54bcb9634959a1c5|1640748818|Jesse Duffield|[email protected] ||053a66a7be3da43aacdc|WIP
22
23
053a66a7be3da43aacdc7aa78e1fe757b82c4dd2|1640739815|Jesse Duffield|[email protected] ||985fe482e806b172aea4|refactoring the config struct` ,
"|" ,
"\x00 " ,
- 1 )
23
24
25
+ var singleCommitOutput = strings .
Replace (
`0eea75e8c631fba6b58135697835d58ba4c18dbc|1640826609|Jesse Duffield|[email protected] | (HEAD -> better-tests)|b21997d6b4cbdf84b149|better typing for rebase mode` ,
"|" ,
"\x00 " ,
- 1 )
26
+
24
27
func TestGetCommits (t * testing.T ) {
25
28
type scenario struct {
26
- testName string
27
- runner * oscommands.FakeCmdObjRunner
28
- expectedCommits []* models.Commit
29
- expectedError error
30
- logOrder string
31
- rebaseMode enums.RebaseMode
32
- currentBranchName string
33
- opts GetCommitsOptions
29
+ testName string
30
+ runner * oscommands.FakeCmdObjRunner
31
+ expectedCommits []* models.Commit
32
+ expectedError error
33
+ logOrder string
34
+ rebaseMode enums.RebaseMode
35
+ opts GetCommitsOptions
36
+ mainBranches [] string
34
37
}
35
38
36
39
scenarios := []scenario {
37
40
{
38
- testName : "should return no commits if there are none" ,
39
- logOrder : "topo-order" ,
40
- rebaseMode : enums .REBASE_MODE_NONE ,
41
- currentBranchName : "master" ,
42
- opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
41
+ testName : "should return no commits if there are none" ,
42
+ logOrder : "topo-order" ,
43
+ rebaseMode : enums .REBASE_MODE_NONE ,
44
+ opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
43
45
runner : oscommands .NewFakeRunner (t ).
44
46
Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
45
47
Expect (`git log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , "" , nil ),
@@ -48,11 +50,10 @@ func TestGetCommits(t *testing.T) {
48
50
expectedError : nil ,
49
51
},
50
52
{
51
- testName : "should use proper upstream name for branch" ,
52
- logOrder : "topo-order" ,
53
- rebaseMode : enums .REBASE_MODE_NONE ,
54
- currentBranchName : "mybranch" ,
55
- opts : GetCommitsOptions {RefName : "refs/heads/mybranch" , IncludeRebaseCommits : false },
53
+ testName : "should use proper upstream name for branch" ,
54
+ logOrder : "topo-order" ,
55
+ rebaseMode : enums .REBASE_MODE_NONE ,
56
+ opts : GetCommitsOptions {RefName : "refs/heads/mybranch" , IncludeRebaseCommits : false },
56
57
runner : oscommands .NewFakeRunner (t ).
57
58
Expect (`git merge-base "refs/heads/mybranch" "mybranch"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
58
59
Expect (`git log "refs/heads/mybranch" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , "" , nil ),
@@ -61,18 +62,21 @@ func TestGetCommits(t *testing.T) {
61
62
expectedError : nil ,
62
63
},
63
64
{
64
- testName : "should return commits if they are present" ,
65
- logOrder : "topo-order" ,
66
- rebaseMode : enums .REBASE_MODE_NONE ,
67
- currentBranchName : "master" ,
68
- opts : GetCommitsOptions { RefName : "HEAD " , IncludeRebaseCommits : false },
65
+ testName : "should return commits if they are present" ,
66
+ logOrder : "topo-order" ,
67
+ rebaseMode : enums .REBASE_MODE_NONE ,
68
+ opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
69
+ mainBranches : [] string { "master " , "main" },
69
70
runner : oscommands .NewFakeRunner (t ).
70
71
// here it's seeing which commits are yet to be pushed
71
72
Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
72
73
// here it's actually getting all the commits in a formatted form, one per line
73
74
Expect (`git log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , commitsOutput , nil ).
75
+ // here it's testing which of the configured main branches exist
76
+ Expect (`git rev-parse --verify --quiet "refs/heads/master"` , "" , nil ). // this one does
77
+ Expect (`git rev-parse --verify --quiet "refs/heads/main"` , "" , errors .New ("error" )). // this one doesn't
74
78
// here it's seeing where our branch diverged from the master branch so that we can mark that commit and parent commits as 'merged'
75
- Expect (`git merge-base "HEAD" "master"` , "26c07b1ab33860a1a7591a0638f9925ccf497ffa" , nil ),
79
+ Expect (`git merge-base "HEAD" "refs/heads/ master"` , "26c07b1ab33860a1a7591a0638f9925ccf497ffa" , nil ),
76
80
77
81
expectedCommits : []* models.Commit {
78
82
{
@@ -191,11 +195,80 @@ func TestGetCommits(t *testing.T) {
191
195
expectedError : nil ,
192
196
},
193
197
{
194
- testName : "should not specify order if `log.order` is `default`" ,
195
- logOrder : "default" ,
196
- rebaseMode : enums .REBASE_MODE_NONE ,
197
- currentBranchName : "master" ,
198
- opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
198
+ testName : "should not call merge-base for mainBranches if none exist" ,
199
+ logOrder : "topo-order" ,
200
+ rebaseMode : enums .REBASE_MODE_NONE ,
201
+ opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
202
+ mainBranches : []string {"master" , "main" },
203
+ runner : oscommands .NewFakeRunner (t ).
204
+ // here it's seeing which commits are yet to be pushed
205
+ Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
206
+ // here it's actually getting all the commits in a formatted form, one per line
207
+ Expect (`git log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , singleCommitOutput , nil ).
208
+ // here it's testing which of the configured main branches exist; neither does
209
+ Expect (`git rev-parse --verify --quiet "refs/heads/master"` , "" , errors .New ("error" )).
210
+ Expect (`git rev-parse --verify --quiet "refs/heads/main"` , "" , errors .New ("error" )),
211
+
212
+ expectedCommits : []* models.Commit {
213
+ {
214
+ Sha : "0eea75e8c631fba6b58135697835d58ba4c18dbc" ,
215
+ Name : "better typing for rebase mode" ,
216
+ Status : models .StatusUnpushed ,
217
+ Action : models .ActionNone ,
218
+ Tags : []string {},
219
+ ExtraInfo : "(HEAD -> better-tests)" ,
220
+ AuthorName : "Jesse Duffield" ,
221
+
222
+ UnixTimestamp : 1640826609 ,
223
+ Parents : []string {
224
+ "b21997d6b4cbdf84b149" ,
225
+ },
226
+ },
227
+ },
228
+ expectedError : nil ,
229
+ },
230
+ {
231
+ testName : "should call merge-base for all main branches that exist" ,
232
+ logOrder : "topo-order" ,
233
+ rebaseMode : enums .REBASE_MODE_NONE ,
234
+ opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
235
+ mainBranches : []string {"master" , "main" , "develop" , "1.0-hotfixes" },
236
+ runner : oscommands .NewFakeRunner (t ).
237
+ // here it's seeing which commits are yet to be pushed
238
+ Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
239
+ // here it's actually getting all the commits in a formatted form, one per line
240
+ Expect (`git log "HEAD" --topo-order --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , singleCommitOutput , nil ).
241
+ // here it's testing which of the configured main branches exist
242
+ Expect (`git rev-parse --verify --quiet "refs/heads/master"` , "" , nil ).
243
+ Expect (`git rev-parse --verify --quiet "refs/heads/main"` , "" , errors .New ("error" )).
244
+ Expect (`git rev-parse --verify --quiet "refs/heads/develop"` , "" , nil ).
245
+ Expect (`git rev-parse --verify --quiet "refs/heads/1.0-hotfixes"` , "" , nil ).
246
+ // here it's seeing where our branch diverged from the master branch so that we can mark that commit and parent commits as 'merged'
247
+ Expect (`git merge-base "HEAD" "refs/heads/master" "refs/heads/develop" "refs/heads/1.0-hotfixes"` , "26c07b1ab33860a1a7591a0638f9925ccf497ffa" , nil ),
248
+
249
+ expectedCommits : []* models.Commit {
250
+ {
251
+ Sha : "0eea75e8c631fba6b58135697835d58ba4c18dbc" ,
252
+ Name : "better typing for rebase mode" ,
253
+ Status : models .StatusUnpushed ,
254
+ Action : models .ActionNone ,
255
+ Tags : []string {},
256
+ ExtraInfo : "(HEAD -> better-tests)" ,
257
+ AuthorName : "Jesse Duffield" ,
258
+
259
+ UnixTimestamp : 1640826609 ,
260
+ Parents : []string {
261
+ "b21997d6b4cbdf84b149" ,
262
+ },
263
+ },
264
+ },
265
+ expectedError : nil ,
266
+ },
267
+ {
268
+ testName : "should not specify order if `log.order` is `default`" ,
269
+ logOrder : "default" ,
270
+ rebaseMode : enums .REBASE_MODE_NONE ,
271
+ opts : GetCommitsOptions {RefName : "HEAD" , IncludeRebaseCommits : false },
199
272
runner : oscommands .NewFakeRunner (t ).
200
273
Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
201
274
Expect (`git log "HEAD" --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --no-show-signature --` , "" , nil ),
@@ -204,11 +277,10 @@ func TestGetCommits(t *testing.T) {
204
277
expectedError : nil ,
205
278
},
206
279
{
207
- testName : "should set filter path" ,
208
- logOrder : "default" ,
209
- rebaseMode : enums .REBASE_MODE_NONE ,
210
- currentBranchName : "master" ,
211
- opts : GetCommitsOptions {RefName : "HEAD" , FilterPath : "src" },
280
+ testName : "should set filter path" ,
281
+ logOrder : "default" ,
282
+ rebaseMode : enums .REBASE_MODE_NONE ,
283
+ opts : GetCommitsOptions {RefName : "HEAD" , FilterPath : "src" },
212
284
runner : oscommands .NewFakeRunner (t ).
213
285
Expect (`git merge-base "HEAD" "HEAD"@{u}` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ).
214
286
Expect (`git log "HEAD" --oneline --pretty=format:"%H%x00%at%x00%aN%x00%ae%x00%d%x00%p%x00%s" --abbrev=40 --follow --no-show-signature -- "src"` , "" , nil ),
@@ -225,11 +297,8 @@ func TestGetCommits(t *testing.T) {
225
297
common .UserConfig .Git .Log .Order = scenario .logOrder
226
298
227
299
builder := & CommitLoader {
228
- Common : common ,
229
- cmd : oscommands .NewDummyCmdObjBuilder (scenario .runner ),
230
- getCurrentBranchInfo : func () (BranchInfo , error ) {
231
- return BranchInfo {RefName : scenario .currentBranchName , DisplayName : scenario .currentBranchName , DetachedHead : false }, nil
232
- },
300
+ Common : common ,
301
+ cmd : oscommands .NewDummyCmdObjBuilder (scenario .runner ),
233
302
getRebaseMode : func () (enums.RebaseMode , error ) { return scenario .rebaseMode , nil },
234
303
dotGitDir : ".git" ,
235
304
readFile : func (filename string ) ([]byte , error ) {
@@ -240,6 +309,7 @@ func TestGetCommits(t *testing.T) {
240
309
},
241
310
}
242
311
312
+ common .UserConfig .Git .MainBranches = scenario .mainBranches
243
313
commits , err := builder .GetCommits (scenario .opts )
244
314
245
315
assert .Equal (t , scenario .expectedCommits , commits )
0 commit comments