Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: evaluate archive files in another package
would be used in #2911 Signed-off-by: Carlos A Becker <caarlos0@users.noreply.github.com>
- Loading branch information
Showing
4 changed files
with
209 additions
and
187 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// Package archivefiles can evaluate a list of config.Files into their final form. | ||
package archivefiles | ||
|
||
import ( | ||
"fmt" | ||
"path/filepath" | ||
"sort" | ||
|
||
"github.com/apex/log" | ||
"github.com/goreleaser/fileglob" | ||
"github.com/goreleaser/goreleaser/internal/tmpl" | ||
"github.com/goreleaser/goreleaser/pkg/config" | ||
) | ||
|
||
// Eval evaluates the given list of files to their final form. | ||
func Eval(template *tmpl.Template, files []config.File) ([]config.File, error) { | ||
var result []config.File | ||
for _, f := range files { | ||
replaced, err := template.Apply(f.Source) | ||
if err != nil { | ||
return result, fmt.Errorf("failed to apply template %s: %w", f.Source, err) | ||
} | ||
|
||
files, err := fileglob.Glob(replaced) | ||
if err != nil { | ||
return result, fmt.Errorf("globbing failed for pattern %s: %w", f.Source, err) | ||
} | ||
|
||
for _, file := range files { | ||
result = append(result, config.File{ | ||
Source: file, | ||
Destination: destinationFor(f, file), | ||
Info: f.Info, | ||
}) | ||
} | ||
} | ||
|
||
sort.Slice(result, func(i, j int) bool { | ||
return result[i].Destination < result[j].Destination | ||
}) | ||
|
||
return unique(result), nil | ||
} | ||
|
||
// remove duplicates | ||
func unique(in []config.File) []config.File { | ||
var result []config.File | ||
exist := map[string]string{} | ||
for _, f := range in { | ||
if current := exist[f.Destination]; current != "" { | ||
log.Warnf( | ||
"file '%s' already exists in archive as '%s' - '%s' will be ignored", | ||
f.Destination, | ||
current, | ||
f.Source, | ||
) | ||
continue | ||
} | ||
exist[f.Destination] = f.Source | ||
result = append(result, f) | ||
} | ||
|
||
return result | ||
} | ||
|
||
func destinationFor(f config.File, path string) string { | ||
if f.Destination == "" { | ||
return path | ||
} | ||
if f.StripParent { | ||
return filepath.Join(f.Destination, filepath.Base(path)) | ||
} | ||
return filepath.Join(f.Destination, path) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
package archivefiles | ||
|
||
import ( | ||
"testing" | ||
"time" | ||
|
||
"github.com/goreleaser/goreleaser/internal/tmpl" | ||
"github.com/goreleaser/goreleaser/pkg/config" | ||
"github.com/goreleaser/goreleaser/pkg/context" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestEval(t *testing.T) { | ||
now := time.Now().Truncate(time.Second) | ||
tmpl := tmpl.New(context.New(config.Project{})) | ||
|
||
t.Run("single file", func(t *testing.T) { | ||
result, err := Eval(tmpl, []config.File{ | ||
{ | ||
Source: "./testdata/**/d.txt", | ||
Destination: "var/foobar/d.txt", | ||
}, | ||
}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, []config.File{ | ||
{ | ||
Source: "testdata/a/b/c/d.txt", | ||
Destination: "var/foobar/d.txt/testdata/a/b/c/d.txt", | ||
}, | ||
}, result) | ||
}) | ||
|
||
t.Run("match multiple files within tree without destination", func(t *testing.T) { | ||
result, err := Eval(tmpl, []config.File{{Source: "./testdata/a"}}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, []config.File{ | ||
{Source: "testdata/a/a.txt", Destination: "testdata/a/a.txt"}, | ||
{Source: "testdata/a/b/a.txt", Destination: "testdata/a/b/a.txt"}, | ||
{Source: "testdata/a/b/c/d.txt", Destination: "testdata/a/b/c/d.txt"}, | ||
}, result) | ||
}) | ||
|
||
t.Run("match multiple files within tree specific destination", func(t *testing.T) { | ||
result, err := Eval(tmpl, []config.File{ | ||
{ | ||
Source: "./testdata/a", | ||
Destination: "usr/local/test", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, []config.File{ | ||
{ | ||
Source: "testdata/a/a.txt", | ||
Destination: "usr/local/test/testdata/a/a.txt", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
{ | ||
Source: "testdata/a/b/a.txt", | ||
Destination: "usr/local/test/testdata/a/b/a.txt", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
{ | ||
Source: "testdata/a/b/c/d.txt", | ||
Destination: "usr/local/test/testdata/a/b/c/d.txt", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
}, result) | ||
}) | ||
|
||
t.Run("match multiple files within tree specific destination stripping parents", func(t *testing.T) { | ||
result, err := Eval(tmpl, []config.File{ | ||
{ | ||
Source: "./testdata/a", | ||
Destination: "usr/local/test", | ||
StripParent: true, | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
}) | ||
|
||
require.NoError(t, err) | ||
require.Equal(t, []config.File{ | ||
{ | ||
Source: "testdata/a/a.txt", | ||
Destination: "usr/local/test/a.txt", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
{ | ||
Source: "testdata/a/b/c/d.txt", | ||
Destination: "usr/local/test/d.txt", | ||
Info: config.FileInfo{ | ||
Owner: "carlos", | ||
Group: "users", | ||
Mode: 0o755, | ||
MTime: now, | ||
}, | ||
}, | ||
}, result) | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.