Skip to content

Commit

Permalink
fix: handle archive with multiple dirs in root (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
femnad authored Jun 16, 2024
1 parent e8dbba2 commit 5eb135e
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 76 deletions.
26 changes: 13 additions & 13 deletions entity/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@ type ExecuteAfterSpec struct {
}

type Release struct {
Cleanup bool `yaml:"cleanup"`
DontLink bool `yaml:"dont_link"`
DontUpdate bool `yaml:"dont_update"`
ExecuteAfter ExecuteAfterSpec `yaml:"execute_after"`
NamedLink []NamedLink `yaml:"named_link"`
Ref string `yaml:"name"`
Symlink []string `yaml:"link"`
Target string `yaml:"target"`
Unless unless.Unless `yaml:"unless"`
Url string `yaml:"url"`
Version string `yaml:"version"`
VersionLookup VersionLookupSpec `yaml:"version_lookup"`
When string `yaml:"when"`
Cleanup bool `yaml:"cleanup,omitempty"`
DontLink bool `yaml:"dont_link,omitempty"`
DontUpdate bool `yaml:"dont_update,omitempty"`
ExecuteAfter ExecuteAfterSpec `yaml:"execute_after,omitempty"`
NamedLink []NamedLink `yaml:"named_link,omitempty"`
Ref string `yaml:"name,omitempty"`
Symlink []string `yaml:"link,omitempty"`
Target string `yaml:"target,omitempty"`
Unless unless.Unless `yaml:"unless,omitempty"`
Url string `yaml:"url,omitempty"`
Version string `yaml:"version,omitempty"`
VersionLookup VersionLookupSpec `yaml:"version_lookup,omitempty"`
When string `yaml:"when,omitempty"`
}

func (r Release) GetVersion() string {
Expand Down
7 changes: 6 additions & 1 deletion provision/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,12 @@ func getReleaseInfo(archive entity.Release, entries []archiveEntry) (info Releas

var execs []archiveEntry
for _, entry := range entries {
rootDir := strings.Split(entry.name, "/")
name := strings.TrimPrefix(entry.name, "./")
if name == "" {
continue
}

rootDir := strings.Split(name, "/")
roots.Add(rootDir[0])
if common.IsExecutableFile(entry.info) {
execs = append(execs, entry)
Expand Down
22 changes: 11 additions & 11 deletions settings/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@ const (
type FactMap map[string]map[string]string

type Settings struct {
BinDir string `yaml:"bin_dir"`
CloneDir string `yaml:"clone_dir"`
CloneEnv map[string]string `yaml:"clone_env"`
EnsureEnv map[string]string `yaml:"ensure_env"`
EnsurePaths []string `yaml:"ensure_paths"`
HostFacts FactMap `yaml:"host_facts"`
ReleaseDir string `yaml:"release_dir"`
SSHCloneDir string `yaml:"ssh_clone_dir"`
TemplateDir string `yaml:"template_dir"`
Versions map[string]string `yaml:"versions"`
VirtualEnvDir string `yaml:"virtualenv_dir"`
BinDir string `yaml:"bin_dir,omitempty"`
CloneDir string `yaml:"clone_dir,omitempty"`
CloneEnv map[string]string `yaml:"clone_env,omitempty"`
EnsureEnv map[string]string `yaml:"ensure_env,omitempty"`
EnsurePaths []string `yaml:"ensure_paths,omitempty"`
HostFacts FactMap `yaml:"host_facts,omitempty"`
ReleaseDir string `yaml:"release_dir,omitempty"`
SSHCloneDir string `yaml:"ssh_clone_dir,omitempty"`
TemplateDir string `yaml:"template_dir,omitempty"`
Versions map[string]string `yaml:"versions,omitempty"`
VirtualEnvDir string `yaml:"virtualenv_dir,omitempty"`
}

func (s Settings) GetBinPath() string {
Expand Down
142 changes: 91 additions & 51 deletions tests/integration/release_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func TestReleases(t *testing.T) {
tests := []struct {
name string
release entity.Release
symlink symlink
symlinks []symlink
absolute bool
}{
{
Expand All @@ -75,21 +75,21 @@ func TestReleases(t *testing.T) {
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-no-root-dir.tar",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo/foo",
},
}},
},
{
name: "tar_archive_root_dir_different_than_exec",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-different-than-exec.tar",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo-1.2.3-amd64/foo",
},
}},
},
{
name: "tar_archive_root_dir_different_than_exec_override_target",
Expand All @@ -98,21 +98,21 @@ func TestReleases(t *testing.T) {
Target: "fred",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-different-than-exec.tar",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/fred/foo",
},
}},
},
{
name: "tar_archive_root_dir_same_as_exec",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-same-as-exec.tar",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo/foo",
},
}},
},
{
name: "tar_archive_root_dir_same_as_exec_override_target",
Expand All @@ -121,32 +121,32 @@ func TestReleases(t *testing.T) {
Target: "qux",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-same-as-exec.tar",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/qux/foo",
},
}},
},
{
name: "zip_archive_no_root_dir",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-no-root-dir.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo/foo",
},
}},
},
{
name: "zip_archive_root_dir_different_than_exec",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-different-than-exec.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo-1.2.3-amd64/foo",
},
}},
},
{
name: "zip_archive_root_dir_different_than_exec_override_target",
Expand All @@ -155,21 +155,21 @@ func TestReleases(t *testing.T) {
Target: "baz",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-different-than-exec.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/baz/foo",
},
}},
},
{
name: "zip_archive_root_dir_same_as_exec",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-same-as-exec.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/foo/foo",
},
}},
},
{
name: "zip_archive_root_dir_same_as_exec_override_target",
Expand All @@ -178,21 +178,21 @@ func TestReleases(t *testing.T) {
Target: "bar",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-same-as-exec.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "bin/foo",
target: "ext/bar/foo",
},
}},
},
{
name: "zip_archive_root_dir_same_as_exec_abs_dirs",
release: entity.Release{
Ref: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-root-dir-same-as-exec.zip",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "~/out/bin/foo",
target: "~/out/ext/foo/foo",
},
}},
absolute: true,
},
{
Expand All @@ -202,10 +202,10 @@ func TestReleases(t *testing.T) {
Target: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-binary",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "~/out/bin/baz",
target: "~/out/ext/foo/baz",
},
}},
absolute: true,
},
{
Expand All @@ -214,10 +214,10 @@ func TestReleases(t *testing.T) {
Target: "foo",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-binary",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "~/out/bin/release-binary",
target: "~/out/ext/foo/release-binary",
},
}},
absolute: true,
},
{
Expand All @@ -226,9 +226,47 @@ func TestReleases(t *testing.T) {
Ref: "",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-binary",
},
symlink: symlink{
symlinks: []symlink{{
linkName: "~/out/bin/release-binary",
target: "~/out/ext/release-binary/release-binary",
}},
absolute: true,
},
{
name: "tar-only-dirs-in-root",
release: entity.Release{
Ref: "xyz",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-only-dirs-in-root.tar",
Symlink: []string{"foo/baz", "bar/qux"},
},
symlinks: []symlink{
{
linkName: "~/out/bin/baz",
target: "~/out/ext/xyz/foo/baz",
},
{
linkName: "~/out/bin/qux",
target: "~/out/ext/xyz/bar/qux",
},
},
absolute: true,
},
{
name: "zip-only-dirs-in-root",
release: entity.Release{
Ref: "xyz",
Url: "https://github.com/femnad/fup/releases/download/test-payload/release-only-dirs-in-root.zip",
Symlink: []string{"foo/baz", "bar/qux"},
},
symlinks: []symlink{
{
linkName: "~/out/bin/baz",
target: "~/out/ext/xyz/foo/baz",
},
{
linkName: "~/out/bin/qux",
target: "~/out/ext/xyz/bar/qux",
},
},
absolute: true,
},
Expand Down Expand Up @@ -258,36 +296,38 @@ func TestReleases(t *testing.T) {
return
}

linkName := internal.ExpandUser(tt.symlink.linkName)
linkName, err = ensureAbs(linkName, artifactsDir)
if err != nil {
t.Fatalf("Error ensuring %s is absolute: %v", linkName, err)
return
}

target := internal.ExpandUser(tt.symlink.target)
target, err = ensureAbs(target, artifactsDir)
if err != nil {
t.Fatalf("Error ensuring %s is absolute: %v", target, err)
return
}

err = runFup("release", configFile)
if err != nil {
t.Errorf("error running fup: %v", err)
return
}

var targetLink string
targetLink, err = os.Readlink(linkName)
if err != nil {
t.Errorf("Error resolving symlink %s: %v", target, err)
return
}
for _, link := range tt.symlinks {
linkName := internal.ExpandUser(link.linkName)
linkName, err = ensureAbs(linkName, artifactsDir)
if err != nil {
t.Fatalf("Error ensuring %s is absolute: %v", linkName, err)
return
}

if targetLink != target {
t.Fatalf("Link %s expected to point to %s but points to %s", linkName, target, targetLink)
return
target := internal.ExpandUser(link.target)
target, err = ensureAbs(target, artifactsDir)
if err != nil {
t.Fatalf("Error ensuring %s is absolute: %v", target, err)
return
}

var targetLink string
targetLink, err = os.Readlink(linkName)
if err != nil {
t.Errorf("Error resolving symlink %s: %v", target, err)
return
}

if targetLink != target {
t.Fatalf("Link %s expected to point to %s but points to %s", linkName, target, targetLink)
return
}
}

err = cleanupReleasesTest(configFile, absoluteArtifactsDir, relativeArtifactsDir)
Expand Down

0 comments on commit 5eb135e

Please sign in to comment.