1// Copyright 2023 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package git
5
6import (
7 "path/filepath"
8 "strings"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func TestCommitsCountSha256(t *testing.T) {
16 skipIfSHA256NotSupported(t)
17
18 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
19
20 commitsCount, err := CommitsCount(DefaultContext,
21 CommitsCountOptions{
22 RepoPath: bareRepo1Path,
23 Revision: []string{"f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc"},
24 })
25
26 require.NoError(t, err)
27 assert.Equal(t, int64(3), commitsCount)
28}
29
30func TestCommitsCountWithoutBaseSha256(t *testing.T) {
31 skipIfSHA256NotSupported(t)
32
33 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
34
35 commitsCount, err := CommitsCount(DefaultContext,
36 CommitsCountOptions{
37 RepoPath: bareRepo1Path,
38 Not: "main",
39 Revision: []string{"branch1"},
40 })
41
42 require.NoError(t, err)
43 assert.Equal(t, int64(2), commitsCount)
44}
45
46func TestGetFullCommitIDSha256(t *testing.T) {
47 skipIfSHA256NotSupported(t)
48
49 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
50
51 id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "f004f4")
52 require.NoError(t, err)
53 assert.Equal(t, "f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc", id)
54}
55
56func TestGetFullCommitIDErrorSha256(t *testing.T) {
57 skipIfSHA256NotSupported(t)
58
59 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
60
61 id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "unknown")
62 assert.Empty(t, id)
63 if assert.Error(t, err) {
64 assert.EqualError(t, err, "object does not exist [id: unknown, rel_path: ]")
65 }
66}
67
68func TestCommitFromReaderSha256(t *testing.T) {
69 skipIfSHA256NotSupported(t)
70
71 commitString := `9433b2a62b964c17a4485ae180f45f595d3e69d31b786087775e28c6b6399df0 commit 1114
72tree e7f9e96dd79c09b078cac8b303a7d3b9d65ff9b734e86060a4d20409fd379f9e
73parent 26e9ccc29fad747e9c5d9f4c9ddeb7eff61cc45ef6a8dc258cbeb181afc055e8
74author Adam Majer <amajer@suse.de> 1698676906 +0100
75committer Adam Majer <amajer@suse.de> 1698676906 +0100
76gpgsig-sha256 -----BEGIN PGP SIGNATURE-----
77` + " " + `
78 iQIrBAABCgAtFiEES+fB08xlgTrzSdQvhkUIsBsmec8FAmU/wKoPHGFtYWplckBz
79 dXNlLmRlAAoJEIZFCLAbJnnP4s4PQIJATa++WPzR6/H4etT7bsOGoMyguEJYyWOd
80 aTybplzT7QAL7h2to0QszGabtzMJPIA39xSFZNYNN30voK5YyyYibXluPKgjemfK
81 WNXwF+gkwgZI38gSvKf+vlqI+EYyIFe19wOhiju0m8SIlB5NEPiWHa17q2mqmqqx
82 1FWa2JdqLPYjAtSLFXeSZegrY5V1FxdemyMUONkg8YO9OSIMZiE0GsnnOXQ3xcT4
83 JTCnmlUxIKw689UiEY80JopUIq+Wl7+qq9507IYYSUCyB6JazL42AKMzVCbD+qBP
84 oOzh/hafYgk9H9qCQXaLbmvs17zXRpicig1bAzqgAy1FDelvpERyRTydEajSLIG6
85 U1cRCkgXCZ0NfsYNPPmBa8b3+rnstypXYTbyMwTln7FfUAaGo6o9JYiPMkzxlmsy
86 zfp/tcaY8+LlBL9aOJjtv+a0p+HrpCGd6CCa4ARfphTLq8QRSSh8uzlB9N+6HnRI
87 VAEUo6ecdDxSpyt2naeg9pKus/BRi7P6g4B1hkk/zZstUX/QP4IQuAJbXjkvsC+X
88 HKRr3NlRM/DygzTyj0gN74uoa0goCIbyAQhiT42nm0cuhM7uN/W0ayrlZjGF1cbR
89 8NCJUL2Nwj0ywKIavC99Ipkb8AsFwpVT6U6effs6
90 =xybZ
91 -----END PGP SIGNATURE-----
92
93signed commit`
94
95 sha := &Sha256Hash{
96 0x94, 0x33, 0xb2, 0xa6, 0x2b, 0x96, 0x4c, 0x17, 0xa4, 0x48, 0x5a, 0xe1, 0x80, 0xf4, 0x5f, 0x59,
97 0x5d, 0x3e, 0x69, 0xd3, 0x1b, 0x78, 0x60, 0x87, 0x77, 0x5e, 0x28, 0xc6, 0xb6, 0x39, 0x9d, 0xf0,
98 }
99 gitRepo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare_sha256"))
100 require.NoError(t, err)
101 assert.NotNil(t, gitRepo)
102 defer gitRepo.Close()
103
104 commitFromReader, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString))
105 require.NoError(t, err)
106 if !assert.NotNil(t, commitFromReader) {
107 return
108 }
109 assert.EqualValues(t, sha, commitFromReader.ID)
110 assert.Equal(t, `-----BEGIN PGP SIGNATURE-----
111
112iQIrBAABCgAtFiEES+fB08xlgTrzSdQvhkUIsBsmec8FAmU/wKoPHGFtYWplckBz
113dXNlLmRlAAoJEIZFCLAbJnnP4s4PQIJATa++WPzR6/H4etT7bsOGoMyguEJYyWOd
114aTybplzT7QAL7h2to0QszGabtzMJPIA39xSFZNYNN30voK5YyyYibXluPKgjemfK
115WNXwF+gkwgZI38gSvKf+vlqI+EYyIFe19wOhiju0m8SIlB5NEPiWHa17q2mqmqqx
1161FWa2JdqLPYjAtSLFXeSZegrY5V1FxdemyMUONkg8YO9OSIMZiE0GsnnOXQ3xcT4
117JTCnmlUxIKw689UiEY80JopUIq+Wl7+qq9507IYYSUCyB6JazL42AKMzVCbD+qBP
118oOzh/hafYgk9H9qCQXaLbmvs17zXRpicig1bAzqgAy1FDelvpERyRTydEajSLIG6
119U1cRCkgXCZ0NfsYNPPmBa8b3+rnstypXYTbyMwTln7FfUAaGo6o9JYiPMkzxlmsy
120zfp/tcaY8+LlBL9aOJjtv+a0p+HrpCGd6CCa4ARfphTLq8QRSSh8uzlB9N+6HnRI
121VAEUo6ecdDxSpyt2naeg9pKus/BRi7P6g4B1hkk/zZstUX/QP4IQuAJbXjkvsC+X
122HKRr3NlRM/DygzTyj0gN74uoa0goCIbyAQhiT42nm0cuhM7uN/W0ayrlZjGF1cbR
1238NCJUL2Nwj0ywKIavC99Ipkb8AsFwpVT6U6effs6
124=xybZ
125-----END PGP SIGNATURE-----
126`, commitFromReader.Signature.Signature)
127 assert.Equal(t, `tree e7f9e96dd79c09b078cac8b303a7d3b9d65ff9b734e86060a4d20409fd379f9e
128parent 26e9ccc29fad747e9c5d9f4c9ddeb7eff61cc45ef6a8dc258cbeb181afc055e8
129author Adam Majer <amajer@suse.de> 1698676906 +0100
130committer Adam Majer <amajer@suse.de> 1698676906 +0100
131
132signed commit`, commitFromReader.Signature.Payload)
133 assert.Equal(t, "Adam Majer <amajer@suse.de>", commitFromReader.Author.String())
134
135 commitFromReader2, err := CommitFromReader(gitRepo, sha, strings.NewReader(commitString+"\n\n"))
136 require.NoError(t, err)
137 commitFromReader.CommitMessage += "\n\n"
138 commitFromReader.Signature.Payload += "\n\n"
139 assert.Equal(t, commitFromReader, commitFromReader2)
140}
141
142func TestHasPreviousCommitSha256(t *testing.T) {
143 skipIfSHA256NotSupported(t)
144
145 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
146
147 repo, err := openRepositoryWithDefaultContext(bareRepo1Path)
148 require.NoError(t, err)
149 defer repo.Close()
150
151 commit, err := repo.GetCommit("f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc")
152 require.NoError(t, err)
153
154 objectFormat, err := repo.GetObjectFormat()
155 require.NoError(t, err)
156
157 parentSHA := MustIDFromString("b0ec7af4547047f12d5093e37ef8f1b3b5415ed8ee17894d43a34d7d34212e9c")
158 notParentSHA := MustIDFromString("42e334efd04cd36eea6da0599913333c26116e1a537ca76e5b6e4af4dda00236")
159 assert.Equal(t, parentSHA.Type(), objectFormat)
160 assert.Equal(t, "sha256", objectFormat.Name())
161
162 haz, err := commit.HasPreviousCommit(parentSHA)
163 require.NoError(t, err)
164 assert.True(t, haz)
165
166 hazNot, err := commit.HasPreviousCommit(notParentSHA)
167 require.NoError(t, err)
168 assert.False(t, hazNot)
169
170 selfNot, err := commit.HasPreviousCommit(commit.ID)
171 require.NoError(t, err)
172 assert.False(t, selfNot)
173}
174
175func TestGetCommitFileStatusMergesSha256(t *testing.T) {
176 skipIfSHA256NotSupported(t)
177
178 bareRepo1Path := filepath.Join(testReposDir, "repo6_merge_sha256")
179
180 commitFileStatus, err := GetCommitFileStatus(DefaultContext, bareRepo1Path, "d2e5609f630dd8db500f5298d05d16def282412e3e66ed68cc7d0833b29129a1")
181 require.NoError(t, err)
182
183 expected := CommitFileStatus{
184 []string{
185 "add_file.txt",
186 },
187 []string{},
188 []string{
189 "to_modify.txt",
190 },
191 }
192
193 assert.Equal(t, expected.Added, commitFileStatus.Added)
194 assert.Equal(t, expected.Removed, commitFileStatus.Removed)
195 assert.Equal(t, expected.Modified, commitFileStatus.Modified)
196
197 expected = CommitFileStatus{
198 []string{},
199 []string{
200 "to_remove.txt",
201 },
202 []string{},
203 }
204
205 commitFileStatus, err = GetCommitFileStatus(DefaultContext, bareRepo1Path, "da1ded40dc8e5b7c564171f4bf2fc8370487decfb1cb6a99ef28f3ed73d09172")
206 require.NoError(t, err)
207
208 assert.Equal(t, expected.Added, commitFileStatus.Added)
209 assert.Equal(t, expected.Removed, commitFileStatus.Removed)
210 assert.Equal(t, expected.Modified, commitFileStatus.Modified)
211}