2019-03-27 12:33:00 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-03-27 12:33:00 +03:00
package git
import (
"path/filepath"
2020-12-21 20:27:23 +03:00
"strings"
2019-03-27 12:33:00 +03:00
"testing"
"github.com/stretchr/testify/assert"
)
func TestCommitsCount ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo1_bare" )
2023-05-08 10:10:53 +03:00
commitsCount , err := CommitsCount ( DefaultContext ,
CommitsCountOptions {
RepoPath : bareRepo1Path ,
Revision : [ ] string { "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" } ,
} )
2019-03-27 12:33:00 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 3 ) , commitsCount )
}
2023-05-08 10:10:53 +03:00
func TestCommitsCountWithoutBase ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo1_bare" )
commitsCount , err := CommitsCount ( DefaultContext ,
CommitsCountOptions {
RepoPath : bareRepo1Path ,
Not : "master" ,
Revision : [ ] string { "branch1" } ,
} )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 2 ) , commitsCount )
}
2019-03-27 12:33:00 +03:00
func TestGetFullCommitID ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo1_bare" )
2022-01-20 02:26:57 +03:00
id , err := GetFullCommitID ( DefaultContext , bareRepo1Path , "8006ff9a" )
2019-03-27 12:33:00 +03:00
assert . NoError ( t , err )
assert . Equal ( t , "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" , id )
}
func TestGetFullCommitIDError ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo1_bare" )
2022-01-20 02:26:57 +03:00
id , err := GetFullCommitID ( DefaultContext , bareRepo1Path , "unknown" )
2019-03-27 12:33:00 +03:00
assert . Empty ( t , id )
if assert . Error ( t , err ) {
assert . EqualError ( t , err , "object does not exist [id: unknown, rel_path: ]" )
}
}
2020-12-21 20:27:23 +03:00
func TestCommitFromReader ( t * testing . T ) {
commitString := ` feaf4ba6bc635fec442f46ddd4512416ec43c2c2 commit 1074
tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
parent 37991 dec2c8e592043f47155ce4808d4580f9123
author silverwind < me @ silverwind . io > 1563741793 + 0200
committer silverwind < me @ silverwind . io > 1563741793 + 0200
gpgsig -- -- - BEGIN PGP SIGNATURE -- -- -
` + " " + `
iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v / QJ7OrfMrVK
xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV / + OoQw9coIdo8nagRUld
vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
R6NXNmW8oMZuxglkmUwayMiPS + N4zNYqv0CXYzlEqCOgq9MJUcAMHt + KpiST + sm6
FWkJ9D + biNPyQ9QKf1AE4BdZia4lHfPYU / C / DEL / a5xQuuop / zMQZoGaIA4p2zGQ
/ maqYxEIM / yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
sD53z / f0J + We4VZjY + pidvA9BGZPFVdR3wd3xGs8 / oH6UWaLJAMGkLG6dDb3qDLm
1 LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9 / i
1 pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs =
= FRsO
-- -- - END PGP SIGNATURE -- -- -
empty commit `
2023-12-14 00:02:00 +03:00
sha := & Sha1Hash { 0xfe , 0xaf , 0x4b , 0xa6 , 0xbc , 0x63 , 0x5f , 0xec , 0x44 , 0x2f , 0x46 , 0xdd , 0xd4 , 0x51 , 0x24 , 0x16 , 0xec , 0x43 , 0xc2 , 0xc2 }
2022-03-29 22:13:41 +03:00
gitRepo , err := openRepositoryWithDefaultContext ( filepath . Join ( testReposDir , "repo1_bare" ) )
2020-12-21 20:27:23 +03:00
assert . NoError ( t , err )
assert . NotNil ( t , gitRepo )
2022-05-03 22:46:28 +03:00
defer gitRepo . Close ( )
2020-12-21 20:27:23 +03:00
commitFromReader , err := CommitFromReader ( gitRepo , sha , strings . NewReader ( commitString ) )
assert . NoError ( t , err )
if ! assert . NotNil ( t , commitFromReader ) {
return
}
assert . EqualValues ( t , sha , commitFromReader . ID )
assert . EqualValues ( t , ` -- -- - BEGIN PGP SIGNATURE -- -- -
iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v / QJ7OrfMrVK
xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV / + OoQw9coIdo8nagRUld
vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
R6NXNmW8oMZuxglkmUwayMiPS + N4zNYqv0CXYzlEqCOgq9MJUcAMHt + KpiST + sm6
FWkJ9D + biNPyQ9QKf1AE4BdZia4lHfPYU / C / DEL / a5xQuuop / zMQZoGaIA4p2zGQ
/ maqYxEIM / yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
sD53z / f0J + We4VZjY + pidvA9BGZPFVdR3wd3xGs8 / oH6UWaLJAMGkLG6dDb3qDLm
1 LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9 / i
1 pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs =
= FRsO
-- -- - END PGP SIGNATURE -- -- -
` , commitFromReader . Signature . Signature )
assert . EqualValues ( t , ` tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
parent 37991 dec2c8e592043f47155ce4808d4580f9123
author silverwind < me @ silverwind . io > 1563741793 + 0200
committer silverwind < me @ silverwind . io > 1563741793 + 0200
empty commit ` , commitFromReader . Signature . Payload )
assert . EqualValues ( t , "silverwind <me@silverwind.io>" , commitFromReader . Author . String ( ) )
commitFromReader2 , err := CommitFromReader ( gitRepo , sha , strings . NewReader ( commitString + "\n\n" ) )
assert . NoError ( t , err )
commitFromReader . CommitMessage += "\n\n"
commitFromReader . Signature . Payload += "\n\n"
assert . EqualValues ( t , commitFromReader , commitFromReader2 )
}
2021-02-10 10:00:57 +03:00
func TestHasPreviousCommit ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo1_bare" )
2022-03-29 22:13:41 +03:00
repo , err := openRepositoryWithDefaultContext ( bareRepo1Path )
2021-02-10 10:00:57 +03:00
assert . NoError ( t , err )
2022-05-03 22:46:28 +03:00
defer repo . Close ( )
2021-02-10 10:00:57 +03:00
commit , err := repo . GetCommit ( "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" )
assert . NoError ( t , err )
2023-12-19 10:20:47 +03:00
parentSHA := MustIDFromString ( "8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2" )
notParentSHA := MustIDFromString ( "2839944139e0de9737a044f78b0e4b40d989a9e3" )
2021-02-10 10:00:57 +03:00
haz , err := commit . HasPreviousCommit ( parentSHA )
assert . NoError ( t , err )
assert . True ( t , haz )
hazNot , err := commit . HasPreviousCommit ( notParentSHA )
assert . NoError ( t , err )
assert . False ( t , hazNot )
selfNot , err := commit . HasPreviousCommit ( commit . ID )
assert . NoError ( t , err )
assert . False ( t , selfNot )
}
2021-07-02 22:23:37 +03:00
func TestParseCommitFileStatus ( t * testing . T ) {
type testcase struct {
output string
added [ ] string
removed [ ] string
modified [ ] string
}
kases := [ ] testcase {
{
// Merge commit
output : "MM\x00options/locale/locale_en-US.ini\x00" ,
modified : [ ] string {
"options/locale/locale_en-US.ini" ,
} ,
added : [ ] string { } ,
removed : [ ] string { } ,
} ,
{
// Spaces commit
output : "D\x00b\x00D\x00b b/b\x00A\x00b b/b b/b b/b\x00A\x00b b/b b/b b/b b/b\x00" ,
removed : [ ] string {
"b" ,
"b b/b" ,
} ,
modified : [ ] string { } ,
added : [ ] string {
"b b/b b/b b/b" ,
"b b/b b/b b/b b/b" ,
} ,
} ,
{
// larger commit
output : "M\x00go.mod\x00M\x00go.sum\x00M\x00modules/ssh/ssh.go\x00M\x00vendor/github.com/gliderlabs/ssh/circle.yml\x00M\x00vendor/github.com/gliderlabs/ssh/context.go\x00A\x00vendor/github.com/gliderlabs/ssh/go.mod\x00A\x00vendor/github.com/gliderlabs/ssh/go.sum\x00M\x00vendor/github.com/gliderlabs/ssh/server.go\x00M\x00vendor/github.com/gliderlabs/ssh/session.go\x00M\x00vendor/github.com/gliderlabs/ssh/ssh.go\x00M\x00vendor/golang.org/x/sys/unix/mkerrors.sh\x00M\x00vendor/golang.org/x/sys/unix/syscall_darwin.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go\x00M\x00vendor/golang.org/x/sys/unix/zerrors_linux.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go\x00M\x00vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go\x00M\x00vendor/modules.txt\x00" ,
modified : [ ] string {
"go.mod" ,
"go.sum" ,
"modules/ssh/ssh.go" ,
"vendor/github.com/gliderlabs/ssh/circle.yml" ,
"vendor/github.com/gliderlabs/ssh/context.go" ,
"vendor/github.com/gliderlabs/ssh/server.go" ,
"vendor/github.com/gliderlabs/ssh/session.go" ,
"vendor/github.com/gliderlabs/ssh/ssh.go" ,
"vendor/golang.org/x/sys/unix/mkerrors.sh" ,
"vendor/golang.org/x/sys/unix/syscall_darwin.go" ,
"vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go" ,
"vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go" ,
"vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go" ,
"vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go" ,
"vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go" ,
"vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go" ,
"vendor/golang.org/x/sys/unix/zerrors_linux.go" ,
"vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go" ,
"vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go" ,
"vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go" ,
"vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go" ,
"vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go" ,
"vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go" ,
"vendor/modules.txt" ,
} ,
added : [ ] string {
"vendor/github.com/gliderlabs/ssh/go.mod" ,
"vendor/github.com/gliderlabs/ssh/go.sum" ,
} ,
removed : [ ] string { } ,
} ,
{
// git 1.7.2 adds an unnecessary \x00 on merge commit
output : "\x00MM\x00options/locale/locale_en-US.ini\x00" ,
modified : [ ] string {
"options/locale/locale_en-US.ini" ,
} ,
added : [ ] string { } ,
removed : [ ] string { } ,
} ,
{
// git 1.7.2 adds an unnecessary \n on normal commit
output : "\nD\x00b\x00D\x00b b/b\x00A\x00b b/b b/b b/b\x00A\x00b b/b b/b b/b b/b\x00" ,
removed : [ ] string {
"b" ,
"b b/b" ,
} ,
modified : [ ] string { } ,
added : [ ] string {
"b b/b b/b b/b" ,
"b b/b b/b b/b b/b" ,
} ,
} ,
}
for _ , kase := range kases {
fileStatus := NewCommitFileStatus ( )
parseCommitFileStatus ( fileStatus , strings . NewReader ( kase . output ) )
assert . Equal ( t , kase . added , fileStatus . Added )
assert . Equal ( t , kase . removed , fileStatus . Removed )
assert . Equal ( t , kase . modified , fileStatus . Modified )
}
}
2023-08-24 13:03:49 +03:00
func TestGetCommitFileStatusMerges ( t * testing . T ) {
bareRepo1Path := filepath . Join ( testReposDir , "repo6_merge" )
commitFileStatus , err := GetCommitFileStatus ( DefaultContext , bareRepo1Path , "022f4ce6214973e018f02bf363bf8a2e3691f699" )
assert . NoError ( t , err )
expected := CommitFileStatus {
[ ] string {
"add_file.txt" ,
} ,
[ ] string {
"to_remove.txt" ,
} ,
[ ] string {
"to_modify.txt" ,
} ,
}
assert . Equal ( t , commitFileStatus . Added , expected . Added )
assert . Equal ( t , commitFileStatus . Removed , expected . Removed )
assert . Equal ( t , commitFileStatus . Modified , expected . Modified )
}
2023-09-14 22:53:57 +03:00
func TestParseCommitRenames ( t * testing . T ) {
testcases := [ ] struct {
output string
renames [ ] [ 2 ] string
} {
{
output : "R090\x00renamed.txt\x00history.txt\x00" ,
renames : [ ] [ 2 ] string { { "renamed.txt" , "history.txt" } } ,
} ,
{
output : "R090\x00renamed.txt\x00history.txt\x00R000\x00corruptedstdouthere" ,
renames : [ ] [ 2 ] string { { "renamed.txt" , "history.txt" } } ,
} ,
{
output : "R100\x00renamed.txt\x00history.txt\x00R001\x00readme.md\x00README.md\x00" ,
renames : [ ] [ 2 ] string { { "renamed.txt" , "history.txt" } , { "readme.md" , "README.md" } } ,
} ,
}
for _ , testcase := range testcases {
renames := [ ] [ 2 ] string { }
parseCommitRenames ( & renames , strings . NewReader ( testcase . output ) )
assert . Equal ( t , testcase . renames , renames )
}
}