github.com/goreleaser/goreleaser@v1.25.1/internal/archivefiles/archivefiles_test.go (about) 1 package archivefiles 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/goreleaser/goreleaser/internal/testctx" 8 "github.com/goreleaser/goreleaser/internal/testlib" 9 "github.com/goreleaser/goreleaser/internal/tmpl" 10 "github.com/goreleaser/goreleaser/pkg/config" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestEval(t *testing.T) { 15 now := time.Now().Truncate(time.Second) 16 ctx := testctx.NewWithCfg(config.Project{ 17 Env: []string{"OWNER=carlos", "FOLDER=d"}, 18 }) 19 ctx.Git.CommitDate = now 20 tmpl := tmpl.New(ctx) 21 22 t.Run("invalid glob", func(t *testing.T) { 23 _, err := Eval(tmpl, []config.File{ 24 { 25 Source: "../testdata/**/nope.txt", 26 Destination: "var/foobar/d.txt", 27 }, 28 }) 29 require.Error(t, err) 30 }) 31 32 t.Run("templated src", func(t *testing.T) { 33 result, err := Eval(tmpl, []config.File{ 34 { 35 Source: "./testdata/**/{{ .Env.FOLDER }}.txt", 36 Destination: "var/foobar/", 37 }, 38 }) 39 require.NoError(t, err) 40 require.Equal(t, []config.File{ 41 { 42 Source: "testdata/a/b/c/d.txt", 43 Destination: "var/foobar/d.txt", 44 }, 45 }, result) 46 }) 47 48 t.Run("templated src error", func(t *testing.T) { 49 _, err := Eval(tmpl, []config.File{ 50 { 51 Source: "./testdata/**/{{ .Env.NOPE }}.txt", 52 Destination: "var/foobar/d.txt", 53 }, 54 }) 55 testlib.RequireTemplateError(t, err) 56 }) 57 58 t.Run("templated info", func(t *testing.T) { 59 result, err := Eval(tmpl, []config.File{ 60 { 61 Source: "./testdata/**/d.txt", 62 Destination: "var/foobar/", 63 Info: config.FileInfo{ 64 MTime: "{{.CommitDate}}", 65 Owner: "{{ .Env.OWNER }}", 66 Group: "{{ .Env.OWNER }}", 67 }, 68 }, 69 }) 70 71 require.NoError(t, err) 72 require.Equal(t, []config.File{ 73 { 74 Source: "testdata/a/b/c/d.txt", 75 Destination: "var/foobar/d.txt", 76 Info: config.FileInfo{ 77 MTime: now.UTC().Format(time.RFC3339), 78 ParsedMTime: now.UTC(), 79 Owner: "carlos", 80 Group: "carlos", 81 }, 82 }, 83 }, result) 84 }) 85 86 t.Run("template info errors", func(t *testing.T) { 87 t.Run("owner", func(t *testing.T) { 88 _, err := Eval(tmpl, []config.File{{ 89 Source: "./testdata/**/d.txt", 90 Destination: "var/foobar", 91 Info: config.FileInfo{ 92 Owner: "{{ .Env.NOPE }}", 93 }, 94 }}) 95 testlib.RequireTemplateError(t, err) 96 }) 97 t.Run("group", func(t *testing.T) { 98 _, err := Eval(tmpl, []config.File{{ 99 Source: "./testdata/**/d.txt", 100 Destination: "var/foobar", 101 Info: config.FileInfo{ 102 Group: "{{ .Env.NOPE }}", 103 }, 104 }}) 105 testlib.RequireTemplateError(t, err) 106 }) 107 t.Run("mtime", func(t *testing.T) { 108 _, err := Eval(tmpl, []config.File{{ 109 Source: "./testdata/**/d.txt", 110 Destination: "var/foobar", 111 Info: config.FileInfo{ 112 MTime: "{{ .Env.NOPE }}", 113 }, 114 }}) 115 testlib.RequireTemplateError(t, err) 116 }) 117 t.Run("mtime format", func(t *testing.T) { 118 _, err := Eval(tmpl, []config.File{{ 119 Source: "./testdata/**/d.txt", 120 Destination: "var/foobar", 121 Info: config.FileInfo{ 122 MTime: "2005-123-123", 123 }, 124 }}) 125 require.Error(t, err) 126 }) 127 }) 128 129 t.Run("single file", func(t *testing.T) { 130 result, err := Eval(tmpl, []config.File{ 131 { 132 Source: "./testdata/**/d.txt", 133 Destination: "var/foobar", 134 }, 135 }) 136 137 require.NoError(t, err) 138 require.Equal(t, []config.File{ 139 { 140 Source: "testdata/a/b/c/d.txt", 141 Destination: "var/foobar/d.txt", 142 }, 143 }, result) 144 }) 145 146 t.Run("rlcp", func(t *testing.T) { 147 result, err := Eval(tmpl, []config.File{{ 148 Source: "./testdata/a/**/*", 149 Destination: "foo/bar", 150 }}) 151 152 require.NoError(t, err) 153 require.Equal(t, []config.File{ 154 {Source: "testdata/a/b/a.txt", Destination: "foo/bar/a.txt"}, 155 {Source: "testdata/a/b/c/d.txt", Destination: "foo/bar/c/d.txt"}, 156 }, result) 157 }) 158 159 t.Run("rlcp empty destination", func(t *testing.T) { 160 result, err := Eval(tmpl, []config.File{{ 161 Source: "./testdata/a/**/*", 162 }}) 163 164 require.NoError(t, err) 165 require.Equal(t, []config.File{ 166 {Source: "testdata/a/b/a.txt", Destination: "testdata/a/b/a.txt"}, 167 {Source: "testdata/a/b/c/d.txt", Destination: "testdata/a/b/c/d.txt"}, 168 }, result) 169 }) 170 171 t.Run("rlcp no results", func(t *testing.T) { 172 result, err := Eval(tmpl, []config.File{{ 173 Source: "./testdata/abc/**/*", 174 Destination: "foo/bar", 175 }}) 176 177 require.NoError(t, err) 178 require.Empty(t, result) 179 }) 180 181 t.Run("strip parent plays nicely with destination omitted", func(t *testing.T) { 182 result, err := Eval(tmpl, []config.File{{Source: "./testdata/a/b", StripParent: true}}) 183 184 require.NoError(t, err) 185 require.Equal(t, []config.File{ 186 {Source: "testdata/a/b/a.txt", Destination: "a.txt"}, 187 {Source: "testdata/a/b/c/d.txt", Destination: "d.txt"}, 188 }, result) 189 }) 190 191 t.Run("strip parent plays nicely with destination as an empty string", func(t *testing.T) { 192 result, err := Eval(tmpl, []config.File{{Source: "./testdata/a/b", Destination: "", StripParent: true}}) 193 194 require.NoError(t, err) 195 require.Equal(t, []config.File{ 196 {Source: "testdata/a/b/a.txt", Destination: "a.txt"}, 197 {Source: "testdata/a/b/c/d.txt", Destination: "d.txt"}, 198 }, result) 199 }) 200 201 t.Run("match multiple files within tree without destination", func(t *testing.T) { 202 result, err := Eval(tmpl, []config.File{{Source: "./testdata/a"}}) 203 204 require.NoError(t, err) 205 require.Equal(t, []config.File{ 206 {Source: "testdata/a/a.txt", Destination: "testdata/a/a.txt"}, 207 {Source: "testdata/a/b/a.txt", Destination: "testdata/a/b/a.txt"}, 208 {Source: "testdata/a/b/c/d.txt", Destination: "testdata/a/b/c/d.txt"}, 209 }, result) 210 }) 211 212 t.Run("match multiple files within tree specific destination", func(t *testing.T) { 213 result, err := Eval(tmpl, []config.File{ 214 { 215 Source: "./testdata/a", 216 Destination: "usr/local/test", 217 Info: config.FileInfo{ 218 Owner: "carlos", 219 Group: "users", 220 Mode: 0o755, 221 ParsedMTime: now, 222 }, 223 }, 224 }) 225 226 require.NoError(t, err) 227 require.Equal(t, []config.File{ 228 { 229 Source: "testdata/a/a.txt", 230 Destination: "usr/local/test/a.txt", 231 Info: config.FileInfo{ 232 Owner: "carlos", 233 Group: "users", 234 Mode: 0o755, 235 ParsedMTime: now, 236 }, 237 }, 238 { 239 Source: "testdata/a/b/a.txt", 240 Destination: "usr/local/test/b/a.txt", 241 Info: config.FileInfo{ 242 Owner: "carlos", 243 Group: "users", 244 Mode: 0o755, 245 ParsedMTime: now, 246 }, 247 }, 248 { 249 Source: "testdata/a/b/c/d.txt", 250 Destination: "usr/local/test/b/c/d.txt", 251 Info: config.FileInfo{ 252 Owner: "carlos", 253 Group: "users", 254 Mode: 0o755, 255 ParsedMTime: now, 256 }, 257 }, 258 }, result) 259 }) 260 261 t.Run("match multiple files within tree specific destination stripping parents", func(t *testing.T) { 262 result, err := Eval(tmpl, []config.File{ 263 { 264 Source: "./testdata/a", 265 Destination: "usr/local/test", 266 StripParent: true, 267 Info: config.FileInfo{ 268 Owner: "carlos", 269 Group: "users", 270 Mode: 0o755, 271 ParsedMTime: now, 272 }, 273 }, 274 }) 275 276 require.NoError(t, err) 277 require.Equal(t, []config.File{ 278 { 279 Source: "testdata/a/a.txt", 280 Destination: "usr/local/test/a.txt", 281 Info: config.FileInfo{ 282 Owner: "carlos", 283 Group: "users", 284 Mode: 0o755, 285 ParsedMTime: now, 286 }, 287 }, 288 { 289 Source: "testdata/a/b/c/d.txt", 290 Destination: "usr/local/test/d.txt", 291 Info: config.FileInfo{ 292 Owner: "carlos", 293 Group: "users", 294 Mode: 0o755, 295 ParsedMTime: now, 296 }, 297 }, 298 }, result) 299 }) 300 } 301 302 func TestStrlcp(t *testing.T) { 303 for k, v := range map[string][2]string{ 304 "/var/": {"/var/lib/foo", "/var/share/aaa"}, 305 "/var/lib/": {"/var/lib/foo", "/var/lib/share/aaa"}, 306 "/usr/share/": {"/usr/share/lib", "/usr/share/bin"}, 307 "/usr/": {"/usr/share/lib", "/usr/bin"}, 308 } { 309 t.Run(k, func(t *testing.T) { 310 require.Equal(t, k, strlcp(v[0], v[1])) 311 }) 312 } 313 }