github.com/goreleaser/goreleaser@v1.25.1/internal/client/git_test.go (about) 1 package client 2 3 import ( 4 "os" 5 "strings" 6 "testing" 7 8 "github.com/charmbracelet/keygen" 9 "github.com/goreleaser/goreleaser/internal/testctx" 10 "github.com/goreleaser/goreleaser/internal/testlib" 11 "github.com/goreleaser/goreleaser/pkg/config" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestGitClient(t *testing.T) { 16 author := config.CommitAuthor{ 17 Name: "Foo", 18 Email: "foo@bar.com", 19 } 20 21 t.Run("full", func(t *testing.T) { 22 url := testlib.GitMakeBareRepository(t) 23 ctx := testctx.NewWithCfg(config.Project{ 24 Dist: t.TempDir(), 25 }) 26 repo := Repo{ 27 GitURL: url, 28 PrivateKey: testlib.MakeNewSSHKey(t, ""), 29 Name: "test1", 30 } 31 cli := NewGitUploadClient(repo.Branch) 32 require.NoError(t, cli.CreateFiles( 33 ctx, 34 author, 35 repo, 36 "hey test", 37 []RepoFile{ 38 { 39 Content: []byte("fake content"), 40 Path: "fake.txt", 41 }, 42 { 43 Content: []byte("fake2 content"), 44 Path: "fake2.txt", 45 }, 46 { 47 Content: []byte("fake content updated"), 48 Path: "fake.txt", 49 }, 50 }, 51 )) 52 require.Equal(t, "fake content updated", string(testlib.CatFileFromBareRepository(t, url, "fake.txt"))) 53 require.Equal(t, "fake2 content", string(testlib.CatFileFromBareRepository(t, url, "fake2.txt"))) 54 }) 55 56 t.Run("with new branch", func(t *testing.T) { 57 url := testlib.GitMakeBareRepository(t) 58 ctx := testctx.NewWithCfg(config.Project{ 59 Dist: t.TempDir(), 60 }) 61 repo := Repo{ 62 GitURL: url, 63 PrivateKey: testlib.MakeNewSSHKey(t, ""), 64 Name: "test1", 65 Branch: "new-branch", 66 } 67 cli := NewGitUploadClient(repo.Branch) 68 require.NoError(t, cli.CreateFiles( 69 ctx, 70 author, 71 repo, 72 "hey test", 73 []RepoFile{ 74 { 75 Content: []byte("fake content"), 76 Path: "fake.txt", 77 }, 78 { 79 Content: []byte("fake2 content"), 80 Path: "fake2.txt", 81 }, 82 { 83 Content: []byte("fake content updated"), 84 Path: "fake.txt", 85 }, 86 }, 87 )) 88 for path, content := range map[string]string{ 89 "fake.txt": "fake content updated", 90 "fake2.txt": "fake2 content", 91 } { 92 require.Equal( 93 t, content, 94 string(testlib.CatFileFromBareRepositoryOnBranch( 95 t, url, 96 repo.Branch, 97 path, 98 )), 99 ) 100 } 101 }) 102 103 t.Run("no repo name", func(t *testing.T) { 104 url := testlib.GitMakeBareRepository(t) 105 ctx := testctx.NewWithCfg(config.Project{ 106 Dist: t.TempDir(), 107 }) 108 repo := Repo{ 109 GitURL: url, 110 PrivateKey: testlib.MakeNewSSHKey(t, ""), 111 } 112 cli := NewGitUploadClient(repo.Branch) 113 require.NoError(t, cli.CreateFile( 114 ctx, 115 author, 116 repo, 117 []byte("fake content"), 118 "fake.txt", 119 "hey test", 120 )) 121 require.NoError(t, cli.CreateFile( 122 ctx, 123 author, 124 repo, 125 []byte("fake content 2"), 126 "fake.txt", 127 "hey test 2", 128 )) 129 require.Equal(t, "fake content 2", string(testlib.CatFileFromBareRepository(t, url, "fake.txt"))) 130 }) 131 t.Run("bad url", func(t *testing.T) { 132 ctx := testctx.NewWithCfg(config.Project{ 133 Dist: t.TempDir(), 134 }) 135 repo := Repo{ 136 GitURL: "{{ .Nope }}", 137 } 138 cli := NewGitUploadClient(repo.Branch) 139 testlib.RequireTemplateError(t, cli.CreateFile( 140 ctx, 141 author, 142 repo, 143 []byte{}, 144 "filename", 145 "msg", 146 )) 147 }) 148 t.Run("clone fail", func(t *testing.T) { 149 ctx := testctx.NewWithCfg(config.Project{ 150 Dist: t.TempDir(), 151 }) 152 repo := Repo{ 153 GitURL: "git@github.com:nope/nopenopenopenope", 154 PrivateKey: testlib.MakeNewSSHKey(t, ""), 155 } 156 cli := NewGitUploadClient(repo.Branch) 157 err := cli.CreateFile( 158 ctx, 159 author, 160 repo, 161 []byte{}, 162 "filename", 163 "msg", 164 ) 165 require.ErrorContains(t, err, "failed to clone") 166 }) 167 t.Run("bad ssh cmd", func(t *testing.T) { 168 ctx := testctx.NewWithCfg(config.Project{ 169 Dist: t.TempDir(), 170 }) 171 repo := Repo{ 172 GitURL: testlib.GitMakeBareRepository(t), 173 PrivateKey: testlib.MakeNewSSHKey(t, ""), 174 GitSSHCommand: "{{.Foo}}", 175 } 176 cli := NewGitUploadClient(repo.Branch) 177 testlib.RequireTemplateError(t, cli.CreateFile( 178 ctx, 179 author, 180 repo, 181 []byte{}, 182 "filename", 183 "msg", 184 )) 185 }) 186 t.Run("empty url", func(t *testing.T) { 187 ctx := testctx.NewWithCfg(config.Project{ 188 Dist: t.TempDir(), 189 }) 190 repo := Repo{} 191 cli := NewGitUploadClient(repo.Branch) 192 require.EqualError(t, cli.CreateFile( 193 ctx, 194 author, 195 repo, 196 []byte{}, 197 "filename", 198 "msg", 199 ), "url is empty") 200 }) 201 t.Run("bad ssh cmd", func(t *testing.T) { 202 ctx := testctx.NewWithCfg(config.Project{ 203 Dist: t.TempDir(), 204 }) 205 repo := Repo{ 206 GitURL: testlib.GitMakeBareRepository(t), 207 PrivateKey: "{{.Foo}}", 208 } 209 cli := NewGitUploadClient(repo.Branch) 210 testlib.RequireTemplateError(t, cli.CreateFile( 211 ctx, 212 author, 213 repo, 214 []byte{}, 215 "filename", 216 "msg", 217 )) 218 }) 219 t.Run("bad key path", func(t *testing.T) { 220 ctx := testctx.NewWithCfg(config.Project{ 221 Dist: t.TempDir(), 222 }) 223 repo := Repo{ 224 GitURL: testlib.GitMakeBareRepository(t), 225 PrivateKey: "./nope", 226 } 227 cli := NewGitUploadClient(repo.Branch) 228 require.Error(t, cli.CreateFile( 229 ctx, 230 author, 231 repo, 232 []byte{}, 233 "filename", 234 "msg", 235 )) 236 }) 237 } 238 239 func TestKeyPath(t *testing.T) { 240 t.Run("with valid path", func(t *testing.T) { 241 path := testlib.MakeNewSSHKey(t, "") 242 result, err := keyPath(path) 243 require.NoError(t, err) 244 require.Equal(t, path, result) 245 }) 246 t.Run("with invalid path", func(t *testing.T) { 247 result, err := keyPath("testdata/nope") 248 require.ErrorIs(t, err, os.ErrNotExist) 249 require.Equal(t, "", result) 250 }) 251 252 t.Run("with password protected key path", func(t *testing.T) { 253 path := testlib.MakeNewSSHKey(t, "pwd") 254 bts, err := os.ReadFile(path) 255 require.NoError(t, err) 256 257 result, err := keyPath(string(bts)) 258 require.EqualError(t, err, "git: key is password-protected") 259 require.Empty(t, result) 260 }) 261 262 t.Run("with key", func(t *testing.T) { 263 for _, algo := range []keygen.KeyType{keygen.Ed25519, keygen.RSA} { 264 t.Run(string(algo), func(t *testing.T) { 265 path := testlib.MakeNewSSHKeyType(t, "", algo) 266 bts, err := os.ReadFile(path) 267 require.NoError(t, err) 268 269 result, err := keyPath(string(bts)) 270 require.NoError(t, err) 271 272 resultbts, err := os.ReadFile(result) 273 require.NoError(t, err) 274 require.Equal(t, string(bts), string(resultbts)) 275 }) 276 } 277 }) 278 t.Run("empty", func(t *testing.T) { 279 result, err := keyPath("") 280 require.EqualError(t, err, `private_key is empty`) 281 require.Equal(t, "", result) 282 }) 283 t.Run("with invalid EOF", func(t *testing.T) { 284 path := testlib.MakeNewSSHKey(t, "") 285 bts, err := os.ReadFile(path) 286 require.NoError(t, err) 287 288 result, err := keyPath(strings.TrimSpace(string(bts))) 289 require.NoError(t, err) 290 291 resultbts, err := os.ReadFile(result) 292 require.NoError(t, err) 293 require.Equal(t, string(bts), string(resultbts)) 294 }) 295 } 296 297 func TestRepoFromURL(t *testing.T) { 298 for k, v := range map[string]string{ 299 "goreleaser": "git@github.com:goreleaser/goreleaser.git", 300 "nfpm": "https://github.com/goreleaser/nfpm", 301 "test": "https://myserver.git/foo/test.git", 302 } { 303 t.Run(k, func(t *testing.T) { 304 require.Equal(t, k, nameFromURL(v)) 305 }) 306 } 307 }