This repository has no description
1// Copyright 2021 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package gitea
5
6import (
7 "context"
8 "os"
9 "os/exec"
10 "path/filepath"
11 "strings"
12 "testing"
13
14 "github.com/go-git/go-git/v5/plumbing"
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17 "tangled.org/core/types"
18)
19
20func TestGetCommitDereferencesAnnotatedTag(t *testing.T) {
21 repo := t.TempDir()
22 runGit := func(args ...string) []byte {
23 t.Helper()
24 cmd := exec.Command("git", args...)
25 cmd.Dir = repo
26 out, err := cmd.CombinedOutput()
27 require.NoError(t, err, string(out))
28 return out
29 }
30
31 runGit("init")
32 runGit("config", "user.name", "test")
33 runGit("config", "user.email", "test@example.com")
34 require.NoError(t, os.WriteFile(filepath.Join(repo, "file.txt"), []byte("hello\n"), 0o644))
35 runGit("add", "file.txt")
36 runGit("commit", "-m", "initial")
37 runGit("tag", "-a", "v0.1.0", "-m", "release")
38
39 want := strings.TrimSpace(string(runGit("rev-parse", "v0.1.0^{commit}")))
40 commit, err := GetCommit(context.Background(), repo, "v0.1.0")
41 require.NoError(t, err)
42 assert.Equal(t, want, commit.Hash.String())
43}
44
45func TestCommitFromReader(t *testing.T) {
46 commitString := `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
47parent 37991dec2c8e592043f47155ce4808d4580f9123
48author silverwind <me@silverwind.io> 1563741793 +0200
49committer silverwind <me@silverwind.io> 1563741793 +0200
50gpgsig -----BEGIN PGP SIGNATURE-----
51` + " " + `
52 iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
53 lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK
54 xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld
55 vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
56 R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6
57 FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ
58 /maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
59 S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
60 sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm
61 1LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
62 mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i
63 1pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs=
64 =FRsO
65 -----END PGP SIGNATURE-----
66
67empty commit`
68
69 sha := plumbing.NewHash("feaf4ba6bc635fec442f46ddd4512416ec43c2c2")
70
71 commitFromReader, err := ReadCommit(sha, strings.NewReader(commitString))
72 assert.NoError(t, err)
73 require.NotNil(t, commitFromReader)
74
75 tcommit := types.Commit{}
76 tcommit.FromGoGitCommit(commitFromReader)
77 assert.EqualValues(t, sha, tcommit.Hash)
78
79 assert.Equal(t, `-----BEGIN PGP SIGNATURE-----
80
81iQIzBAABCAAdFiEEWPb2jX6FS2mqyJRQLmK0HJOGlEMFAl00zmEACgkQLmK0HJOG
82lEMDFBAAhQKKqLD1VICygJMEB8t1gBmNLgvziOLfpX4KPWdPtBk3v/QJ7OrfMrVK
83xlC4ZZyx6yMm1Q7GzmuWykmZQJ9HMaHJ49KAbh5MMjjV/+OoQw9coIdo8nagRUld
84vX8QHzNZ6Agx77xHuDJZgdHKpQK3TrMDsxzoYYMvlqoLJIDXE1Sp7KYNy12nhdRg
85R6NXNmW8oMZuxglkmUwayMiPS+N4zNYqv0CXYzlEqCOgq9MJUcAMHt+KpiST+sm6
86FWkJ9D+biNPyQ9QKf1AE4BdZia4lHfPYU/C/DEL/a5xQuuop/zMQZoGaIA4p2zGQ
87/maqYxEIM/yRBQpT1jlODKPJrMEgx7SgY2hRU47YZ4fj6350fb6fNBtiiMAfJbjL
88S3Gh85E9fm3hJaNSPKAaJFYL1Ya2svuWfgHj677C56UcmYis7fhiiy1aJuYdHnSm
89sD53z/f0J+We4VZjY+pidvA9BGZPFVdR3wd3xGs8/oH6UWaLJAMGkLG6dDb3qDLm
901LFZwsX8sdD32i1SiWanYQYSYMyFWr0awi4xdoMtYCL7uKBYtwtPyvq3cj4IrJlb
91mfeFhT57UbE4qukTDIQ0Y0WM40UYRTakRaDY7ubhXgLgx09Cnp9XTVMsHgT6j9/i
921pxsB104XLWjQHTjr1JtiaBQEwFh9r2OKTcpvaLcbNtYpo7CzOs=
93=FRsO
94-----END PGP SIGNATURE-----`, commitFromReader.PGPSignature)
95 assert.Equal(t, `tree f1a6cb52b2d16773290cefe49ad0684b50a4f930
96parent 37991dec2c8e592043f47155ce4808d4580f9123
97author silverwind <me@silverwind.io> 1563741793 +0200
98committer silverwind <me@silverwind.io> 1563741793 +0200
99
100empty commit`, tcommit.Payload())
101 assert.Equal(t, "silverwind <me@silverwind.io>", commitFromReader.Author.String())
102}
103
104func TestCommitFromReaderMergeTag(t *testing.T) {
105 // Built with explicit "\n" concatenation, not a backtick literal: the blank
106 // mergetag continuation lines are " \n" (space + newline) and gofmt/editors
107 // strip trailing whitespace from raw literals, which would corrupt the input.
108 commitString := "tree 635dfb8e1e9d4d75855cc23eb28d35533f55b42f\n" +
109 "parent c1fa0bb633e4a6b11e83ffc57fa5abe8ebb87891\n" +
110 "parent 8f80b5b227ef9ea422080487715c841856339aed\n" +
111 "author Linus Torvalds <torvalds@linux-foundation.org> 1778539129 -0700\n" +
112 "committer Linus Torvalds <torvalds@linux-foundation.org> 1778539129 -0700\n" +
113 "mergetag object 8f80b5b227ef9ea422080487715c841856339aed\n" +
114 " type commit\n" +
115 " tag linux_kselftest-kunit-fixes-7.1-rc4\n" +
116 " tagger Shuah Khan <skhan@linuxfoundation.org> 1778535878 -0600\n" +
117 " \n" + // blank continuation line inside the mergetag: the bug trigger
118 " linux_kselftest-kunit-fixes-7.1-rc4\n" +
119 " \n" +
120 " Fix to decouple KUNIT_DEBUGFS and KUNIT_ALL_TESTS options.\n" +
121 " -----BEGIN PGP SIGNATURE-----\n" +
122 " \n" +
123 " iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAmoCUf0ACgkQCwJExA0N\n" +
124 " =QdSk\n" +
125 " -----END PGP SIGNATURE-----\n" +
126 "\n" + // real header/message separator: truly empty line
127 "Merge tag 'linux_kselftest-kunit-fixes-7.1-rc4' of git://example\n" +
128 "\n" +
129 "Pull kunit fixes from Shuah Khan"
130
131 sha := plumbing.NewHash("50897c955902c93ae71c38698abb910525ebdc89")
132
133 c, err := ReadCommit(sha, strings.NewReader(commitString))
134 require.NoError(t, err)
135 require.NotNil(t, c)
136
137 // Message must be only the merge message, not polluted with the tag body/signature.
138 assert.Equal(t, "Merge tag 'linux_kselftest-kunit-fixes-7.1-rc4' of git://example\n\nPull kunit fixes from Shuah Khan", c.Message)
139
140 // mergetag is captured, and this commit itself is not gpg-signed.
141 assert.Contains(t, c.MergeTag, "type commit\n")
142 assert.Contains(t, c.MergeTag, "-----END PGP SIGNATURE-----")
143 assert.Empty(t, c.PGPSignature)
144
145 // The broken parser dumped stray continuation lines into ExtraHeaders[""].
146 assert.NotContains(t, c.ExtraHeaders, "")
147
148 assert.Equal(t, "Linus Torvalds <torvalds@linux-foundation.org>", c.Author.String())
149}