You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

commit_test.go 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package git
  4. import (
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestCommitsCount(t *testing.T) {
  11. bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
  12. commitsCount, err := CommitsCount(DefaultContext,
  13. CommitsCountOptions{
  14. RepoPath: bareRepo1Path,
  15. Revision: []string{"8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"},
  16. })
  17. assert.NoError(t, err)
  18. assert.Equal(t, int64(3), commitsCount)
  19. }
  20. func TestCommitsCountWithoutBase(t *testing.T) {
  21. bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
  22. commitsCount, err := CommitsCount(DefaultContext,
  23. CommitsCountOptions{
  24. RepoPath: bareRepo1Path,
  25. Not: "master",
  26. Revision: []string{"branch1"},
  27. })
  28. assert.NoError(t, err)
  29. assert.Equal(t, int64(2), commitsCount)
  30. }
  31. func TestGetFullCommitID(t *testing.T) {
  32. bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
  33. id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "8006ff9a")
  34. assert.NoError(t, err)
  35. assert.Equal(t, "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", id)
  36. }
  37. func TestGetFullCommitIDError(t *testing.T) {
  38. bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
  39. id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "unknown")
  40. assert.Empty(t, id)
  41. if assert.Error(t, err) {
  42. assert.EqualError(t, err, "object does not exist [id: unknown, rel_path: ]")
  43. }
  44. }
  45. func TestCommitFromReader(t *testing.T) {
  46. commitString := `feaf4ba6bc635fec442f46ddd4512416ec43c2c2 commit 1074
  47. tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
  48. parent 37991dec2c8e592043f47155ce4808d4580f9123
  49. author silverwind <me@silverwind.io> 1563741793 +0200
  50. committer silverwind <me@silverwind.io> 1563741793 +0200
  51. gpgsig -----BEGIN PGP SIGNATURE-----
  52. ` + " " + `
  53. iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
  54. lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK
  55. xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld
  56. vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
  57. R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6
  58. FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ
  59. /maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
  60. S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
  61. sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm
  62. 1LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
  63. mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i
  64. 1pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs=
  65. =FRsO
  66. -----END PGP SIGNATURE-----
  67. empty commit`
  68. sha := &Sha1Hash{0xfe, 0xaf, 0x4b, 0xa6, 0xbc, 0x63, 0x5f, 0xec, 0x44, 0x2f, 0x46, 0xdd, 0xd4, 0x51, 0x24, 0x16, 0xec, 0x43, 0xc2, 0xc2}
  69. gitRepo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare"))
  70. assert.NoError(t, err)
  71. assert.NotNil(t, gitRepo)
  72. defer gitRepo.Close()
  73. commitFromReader, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString))
  74. assert.NoError(t, err)
  75. if !assert.NotNil(t, commitFromReader) {
  76. return
  77. }
  78. assert.EqualValues(t, sha, commitFromReader.ID)
  79. assert.EqualValues(t, `-----BEGIN PGP SIGNATURE-----
  80. iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
  81. lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK
  82. xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld
  83. vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
  84. R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6
  85. FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ
  86. /maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
  87. S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
  88. sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm
  89. 1LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
  90. mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i
  91. 1pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs=
  92. =FRsO
  93. -----END PGP SIGNATURE-----
  94. `, commitFromReader.Signature.Signature)
  95. assert.EqualValues(t, `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
  96. parent 37991dec2c8e592043f47155ce4808d4580f9123
  97. author silverwind <me@silverwind.io> 1563741793 +0200
  98. committer silverwind <me@silverwind.io> 1563741793 +0200
  99. empty commit`, commitFromReader.Signature.Payload)
  100. assert.EqualValues(t, "silverwind <me@silverwind.io>", commitFromReader.Author.String())
  101. commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n"))
  102. assert.NoError(t, err)
  103. commitFromReader.CommitMessage += "\n\n"
  104. commitFromReader.Signature.Payload += "\n\n"
  105. assert.EqualValues(t, commitFromReader, commitFromReader2)
  106. }
  107. func TestHasPreviousCommit(t *testing.T) {
  108. bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
  109. repo, err := openRepositoryWithDefaultContext(bareRepo1Path)
  110. assert.NoError(t, err)
  111. defer repo.Close()
  112. commit, err := repo.GetCommit("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0")
  113. assert.NoError(t, err)
  114. parentSHA := MustIDFromString("8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2")
  115. notParentSHA := MustIDFromString("2839944139e0de9737a044f78b0e4b40d989a9e3")
  116. haz, err := commit.HasPreviousCommit(parentSHA)
  117. assert.NoError(t, err)
  118. assert.True(t, haz)
  119. hazNot, err := commit.HasPreviousCommit(notParentSHA)
  120. assert.NoError(t, err)
  121. assert.False(t, hazNot)
  122. selfNot, err := commit.HasPreviousCommit(commit.ID)
  123. assert.NoError(t, err)
  124. assert.False(t, selfNot)
  125. }
  126. func TestParseCommitFileStatus(t *testing.T) {
  127. type testcase struct {
  128. output string
  129. added []string
  130. removed []string
  131. modified []string
  132. }
  133. kases := []testcase{
  134. {
  135. // Merge commit
  136. output: "MM\x00options/locale/locale_en-US.ini\x00",
  137. modified: []string{
  138. "options/locale/locale_en-US.ini",
  139. },
  140. added: []string{},
  141. removed: []string{},
  142. },
  143. {
  144. // Spaces commit
  145. 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",
  146. removed: []string{
  147. "b",
  148. "b b/b",
  149. },
  150. modified: []string{},
  151. added: []string{
  152. "b b/b b/b b/b",
  153. "b b/b b/b b/b b/b",
  154. },
  155. },
  156. {
  157. // larger commit
  158. 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",
  159. modified: []string{
  160. "go.mod",
  161. "go.sum",
  162. "modules/ssh/ssh.go",
  163. "vendor/github.com/gliderlabs/ssh/circle.yml",
  164. "vendor/github.com/gliderlabs/ssh/context.go",
  165. "vendor/github.com/gliderlabs/ssh/server.go",
  166. "vendor/github.com/gliderlabs/ssh/session.go",
  167. "vendor/github.com/gliderlabs/ssh/ssh.go",
  168. "vendor/golang.org/x/sys/unix/mkerrors.sh",
  169. "vendor/golang.org/x/sys/unix/syscall_darwin.go",
  170. "vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go",
  171. "vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go",
  172. "vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go",
  173. "vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go",
  174. "vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go",
  175. "vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go",
  176. "vendor/golang.org/x/sys/unix/zerrors_linux.go",
  177. "vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go",
  178. "vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go",
  179. "vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go",
  180. "vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go",
  181. "vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go",
  182. "vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go",
  183. "vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go",
  184. "vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go",
  185. "vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go",
  186. "vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go",
  187. "vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go",
  188. "vendor/modules.txt",
  189. },
  190. added: []string{
  191. "vendor/github.com/gliderlabs/ssh/go.mod",
  192. "vendor/github.com/gliderlabs/ssh/go.sum",
  193. },
  194. removed: []string{},
  195. },
  196. {
  197. // git 1.7.2 adds an unnecessary \x00 on merge commit
  198. output: "\x00MM\x00options/locale/locale_en-US.ini\x00",
  199. modified: []string{
  200. "options/locale/locale_en-US.ini",
  201. },
  202. added: []string{},
  203. removed: []string{},
  204. },
  205. {
  206. // git 1.7.2 adds an unnecessary \n on normal commit
  207. 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",
  208. removed: []string{
  209. "b",
  210. "b b/b",
  211. },
  212. modified: []string{},
  213. added: []string{
  214. "b b/b b/b b/b",
  215. "b b/b b/b b/b b/b",
  216. },
  217. },
  218. }
  219. for _, kase := range kases {
  220. fileStatus := NewCommitFileStatus()
  221. parseCommitFileStatus(fileStatus, strings.NewReader(kase.output))
  222. assert.Equal(t, kase.added, fileStatus.Added)
  223. assert.Equal(t, kase.removed, fileStatus.Removed)
  224. assert.Equal(t, kase.modified, fileStatus.Modified)
  225. }
  226. }
  227. func TestGetCommitFileStatusMerges(t *testing.T) {
  228. bareRepo1Path := filepath.Join(testReposDir, "repo6_merge")
  229. commitFileStatus, err := GetCommitFileStatus(DefaultContext, bareRepo1Path, "022f4ce6214973e018f02bf363bf8a2e3691f699")
  230. assert.NoError(t, err)
  231. expected := CommitFileStatus{
  232. []string{
  233. "add_file.txt",
  234. },
  235. []string{
  236. "to_remove.txt",
  237. },
  238. []string{
  239. "to_modify.txt",
  240. },
  241. }
  242. assert.Equal(t, commitFileStatus.Added, expected.Added)
  243. assert.Equal(t, commitFileStatus.Removed, expected.Removed)
  244. assert.Equal(t, commitFileStatus.Modified, expected.Modified)
  245. }