2022-11-11 04:19:29 +02:00
package git_commands
2019-03-02 04:08:09 +02:00
import (
2023-05-09 21:41:25 +02:00
"errors"
2021-12-30 02:22:29 +02:00
"path/filepath"
2022-03-26 14:55:44 +02:00
"strings"
2019-03-02 04:08:09 +02:00
"testing"
2021-12-30 04:11:58 +02:00
"github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
2021-12-30 04:35:10 +02:00
"github.com/jesseduffield/lazygit/pkg/commands/types/enums"
2020-09-29 11:10:57 +02:00
"github.com/jesseduffield/lazygit/pkg/utils"
2019-03-02 04:08:09 +02:00
"github.com/stretchr/testify/assert"
)
2022-05-08 06:23:29 +02:00
var commitsOutput = strings . Replace ( ` 0 eea75e8c631fba6b58135697835d58ba4c18dbc | 1640826609 | Jesse Duffield | jessedduffield @ gmail . com | ( HEAD - > better - tests ) | b21997d6b4cbdf84b149 | better typing for rebase mode
b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164 | 1640824515 | Jesse Duffield | jessedduffield @ gmail . com | ( origin / better - tests ) | e94e8fc5b6fab4cb755f | fix logging
e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c | 1640823749 | Jesse Duffield | jessedduffield @ gmail . com || d8084cd558925eb7c9c3 | refactor
d8084cd558925eb7c9c38afeed5725c21653ab90 | 1640821426 | Jesse Duffield | jessedduffield @ gmail . com || 65 f910ebd85283b5cce9 | WIP
65 f910ebd85283b5cce9bf67d03d3f1a9ea3813a | 1640821275 | Jesse Duffield | jessedduffield @ gmail . com || 26 c07b1ab33860a1a759 | WIP
26 c07b1ab33860a1a7591a0638f9925ccf497ffa | 1640750752 | Jesse Duffield | jessedduffield @ gmail . com || 3 d4470a6c072208722e5 | WIP
3 d4470a6c072208722e5ae9a54bcb9634959a1c5 | 1640748818 | Jesse Duffield | jessedduffield @ gmail . com || 053 a66a7be3da43aacdc | WIP
053 a66a7be3da43aacdc7aa78e1fe757b82c4dd2 | 1640739815 | Jesse Duffield | jessedduffield @ gmail . com || 985 fe482e806b172aea4 | refactoring the config struct ` , "|" , "\x00" , - 1 )
2021-12-30 04:11:58 +02:00
2023-05-09 21:41:25 +02:00
var singleCommitOutput = strings . Replace ( ` 0eea75e8c631fba6b58135697835d58ba4c18dbc|1640826609|Jesse Duffield|jessedduffield@gmail.com| (HEAD -> better-tests)|b21997d6b4cbdf84b149|better typing for rebase mode ` , "|" , "\x00" , - 1 )
2021-12-30 04:11:58 +02:00
func TestGetCommits ( t * testing . T ) {
2019-03-02 04:08:09 +02:00
type scenario struct {
2023-05-09 21:41:25 +02:00
testName string
runner * oscommands . FakeCmdObjRunner
expectedCommits [ ] * models . Commit
expectedError error
logOrder string
rebaseMode enums . RebaseMode
opts GetCommitsOptions
mainBranches [ ] string
2019-03-02 04:08:09 +02:00
}
scenarios := [ ] scenario {
{
2023-05-09 21:41:25 +02:00
testName : "should return no commits if there are none" ,
logOrder : "topo-order" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
2021-12-30 04:11:58 +02:00
runner : oscommands . NewFakeRunner ( t ) .
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
2023-03-13 18:11:47 +02:00
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 ) ,
2019-03-02 04:08:09 +02:00
2021-12-30 04:11:58 +02:00
expectedCommits : [ ] * models . Commit { } ,
expectedError : nil ,
2019-03-02 04:08:09 +02:00
} ,
2023-02-19 01:13:46 +02:00
{
2023-05-09 21:41:25 +02:00
testName : "should use proper upstream name for branch" ,
logOrder : "topo-order" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "refs/heads/mybranch" , IncludeRebaseCommits : false } ,
2023-02-19 01:13:46 +02:00
runner : oscommands . NewFakeRunner ( t ) .
Expect ( ` git merge-base "refs/heads/mybranch" "mybranch"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
2023-03-13 18:11:47 +02:00
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 ) ,
2023-02-19 01:13:46 +02:00
expectedCommits : [ ] * models . Commit { } ,
expectedError : nil ,
} ,
2019-03-02 04:08:09 +02:00
{
2023-05-09 21:41:25 +02:00
testName : "should return commits if they are present" ,
logOrder : "topo-order" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
mainBranches : [ ] string { "master" , "main" } ,
2021-12-30 04:11:58 +02:00
runner : oscommands . NewFakeRunner ( t ) .
// here it's seeing which commits are yet to be pushed
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
// here it's actually getting all the commits in a formatted form, one per line
2023-03-13 18:11:47 +02:00
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 ) .
2023-05-09 21:41:25 +02:00
// here it's testing which of the configured main branches exist
Expect ( ` git rev-parse --verify --quiet "refs/heads/master" ` , "" , nil ) . // this one does
Expect ( ` git rev-parse --verify --quiet "refs/heads/main" ` , "" , errors . New ( "error" ) ) . // this one doesn't
2021-12-30 04:11:58 +02:00
// here it's seeing where our branch diverged from the master branch so that we can mark that commit and parent commits as 'merged'
2023-05-09 21:41:25 +02:00
Expect ( ` git merge-base "HEAD" "refs/heads/master" ` , "26c07b1ab33860a1a7591a0638f9925ccf497ffa" , nil ) ,
2019-03-02 04:08:09 +02:00
2021-12-30 04:11:58 +02:00
expectedCommits : [ ] * models . Commit {
{
Sha : "0eea75e8c631fba6b58135697835d58ba4c18dbc" ,
Name : "better typing for rebase mode" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusUnpushed ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "(HEAD -> better-tests)" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640826609 ,
Parents : [ ] string {
"b21997d6b4cbdf84b149" ,
} ,
} ,
{
Sha : "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" ,
Name : "fix logging" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusPushed ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "(origin/better-tests)" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640824515 ,
Parents : [ ] string {
"e94e8fc5b6fab4cb755f" ,
} ,
} ,
{
Sha : "e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c" ,
Name : "refactor" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusPushed ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640823749 ,
Parents : [ ] string {
"d8084cd558925eb7c9c3" ,
} ,
} ,
{
Sha : "d8084cd558925eb7c9c38afeed5725c21653ab90" ,
Name : "WIP" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusPushed ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640821426 ,
Parents : [ ] string {
"65f910ebd85283b5cce9" ,
} ,
} ,
{
Sha : "65f910ebd85283b5cce9bf67d03d3f1a9ea3813a" ,
Name : "WIP" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusPushed ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640821275 ,
Parents : [ ] string {
"26c07b1ab33860a1a759" ,
} ,
} ,
{
Sha : "26c07b1ab33860a1a7591a0638f9925ccf497ffa" ,
Name : "WIP" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusMerged ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640750752 ,
Parents : [ ] string {
"3d4470a6c072208722e5" ,
} ,
} ,
{
Sha : "3d4470a6c072208722e5ae9a54bcb9634959a1c5" ,
Name : "WIP" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusMerged ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640748818 ,
Parents : [ ] string {
"053a66a7be3da43aacdc" ,
} ,
} ,
{
Sha : "053a66a7be3da43aacdc7aa78e1fe757b82c4dd2" ,
Name : "refactoring the config struct" ,
2023-04-03 12:40:29 +02:00
Status : models . StatusMerged ,
2023-04-03 12:42:29 +02:00
Action : models . ActionNone ,
2021-12-30 04:11:58 +02:00
Tags : [ ] string { } ,
ExtraInfo : "" ,
2022-05-08 06:23:29 +02:00
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
2021-12-30 04:11:58 +02:00
UnixTimestamp : 1640739815 ,
Parents : [ ] string {
"985fe482e806b172aea4" ,
} ,
} ,
2019-03-02 04:08:09 +02:00
} ,
2021-12-30 04:11:58 +02:00
expectedError : nil ,
2019-03-02 04:08:09 +02:00
} ,
2023-01-28 14:10:57 +02:00
{
2023-05-09 21:41:25 +02:00
testName : "should not call merge-base for mainBranches if none exist" ,
logOrder : "topo-order" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
mainBranches : [ ] string { "master" , "main" } ,
runner : oscommands . NewFakeRunner ( t ) .
// here it's seeing which commits are yet to be pushed
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
// here it's actually getting all the commits in a formatted form, one per line
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 ) .
// here it's testing which of the configured main branches exist; neither does
Expect ( ` git rev-parse --verify --quiet "refs/heads/master" ` , "" , errors . New ( "error" ) ) .
Expect ( ` git rev-parse --verify --quiet "refs/heads/main" ` , "" , errors . New ( "error" ) ) ,
expectedCommits : [ ] * models . Commit {
{
Sha : "0eea75e8c631fba6b58135697835d58ba4c18dbc" ,
Name : "better typing for rebase mode" ,
Status : models . StatusUnpushed ,
Action : models . ActionNone ,
Tags : [ ] string { } ,
ExtraInfo : "(HEAD -> better-tests)" ,
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
UnixTimestamp : 1640826609 ,
Parents : [ ] string {
"b21997d6b4cbdf84b149" ,
} ,
} ,
} ,
expectedError : nil ,
} ,
{
testName : "should call merge-base for all main branches that exist" ,
logOrder : "topo-order" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
mainBranches : [ ] string { "master" , "main" , "develop" , "1.0-hotfixes" } ,
runner : oscommands . NewFakeRunner ( t ) .
// here it's seeing which commits are yet to be pushed
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
// here it's actually getting all the commits in a formatted form, one per line
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 ) .
// here it's testing which of the configured main branches exist
Expect ( ` git rev-parse --verify --quiet "refs/heads/master" ` , "" , nil ) .
Expect ( ` git rev-parse --verify --quiet "refs/heads/main" ` , "" , errors . New ( "error" ) ) .
Expect ( ` git rev-parse --verify --quiet "refs/heads/develop" ` , "" , nil ) .
Expect ( ` git rev-parse --verify --quiet "refs/heads/1.0-hotfixes" ` , "" , nil ) .
// here it's seeing where our branch diverged from the master branch so that we can mark that commit and parent commits as 'merged'
Expect ( ` git merge-base "HEAD" "refs/heads/master" "refs/heads/develop" "refs/heads/1.0-hotfixes" ` , "26c07b1ab33860a1a7591a0638f9925ccf497ffa" , nil ) ,
expectedCommits : [ ] * models . Commit {
{
Sha : "0eea75e8c631fba6b58135697835d58ba4c18dbc" ,
Name : "better typing for rebase mode" ,
Status : models . StatusUnpushed ,
Action : models . ActionNone ,
Tags : [ ] string { } ,
ExtraInfo : "(HEAD -> better-tests)" ,
AuthorName : "Jesse Duffield" ,
AuthorEmail : "jessedduffield@gmail.com" ,
UnixTimestamp : 1640826609 ,
Parents : [ ] string {
"b21997d6b4cbdf84b149" ,
} ,
} ,
} ,
expectedError : nil ,
} ,
{
testName : "should not specify order if `log.order` is `default`" ,
logOrder : "default" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , IncludeRebaseCommits : false } ,
2023-01-28 14:10:57 +02:00
runner : oscommands . NewFakeRunner ( t ) .
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
2023-03-13 18:11:47 +02:00
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 ) ,
expectedCommits : [ ] * models . Commit { } ,
expectedError : nil ,
} ,
{
2023-05-09 21:41:25 +02:00
testName : "should set filter path" ,
logOrder : "default" ,
rebaseMode : enums . REBASE_MODE_NONE ,
opts : GetCommitsOptions { RefName : "HEAD" , FilterPath : "src" } ,
2023-03-13 18:11:47 +02:00
runner : oscommands . NewFakeRunner ( t ) .
Expect ( ` git merge-base "HEAD" "HEAD"@ { u} ` , "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164" , nil ) .
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 ) ,
2023-01-28 14:10:57 +02:00
expectedCommits : [ ] * models . Commit { } ,
expectedError : nil ,
} ,
2019-03-02 04:08:09 +02:00
}
2021-12-30 04:11:58 +02:00
for _ , scenario := range scenarios {
2022-01-08 06:46:35 +02:00
scenario := scenario
2021-12-30 04:11:58 +02:00
t . Run ( scenario . testName , func ( t * testing . T ) {
2023-01-28 14:10:57 +02:00
common := utils . NewDummyCommon ( )
common . UserConfig . Git . Log . Order = scenario . logOrder
2021-12-30 04:35:10 +02:00
builder := & CommitLoader {
2023-05-09 21:41:25 +02:00
Common : common ,
cmd : oscommands . NewDummyCmdObjBuilder ( scenario . runner ) ,
2021-12-30 04:35:10 +02:00
getRebaseMode : func ( ) ( enums . RebaseMode , error ) { return scenario . rebaseMode , nil } ,
2021-12-30 04:11:58 +02:00
dotGitDir : ".git" ,
readFile : func ( filename string ) ( [ ] byte , error ) {
return [ ] byte ( "" ) , nil
} ,
walkFiles : func ( root string , fn filepath . WalkFunc ) error {
return nil
} ,
}
2023-05-09 21:41:25 +02:00
common . UserConfig . Git . MainBranches = scenario . mainBranches
2021-12-30 04:11:58 +02:00
commits , err := builder . GetCommits ( scenario . opts )
assert . Equal ( t , scenario . expectedCommits , commits )
assert . Equal ( t , scenario . expectedError , err )
2022-01-26 01:34:56 +02:00
scenario . runner . CheckForMissingCalls ( )
2019-03-02 04:08:09 +02:00
} )
}
}