Skip to content

Commit

Permalink
Fix bug with disableUnpack (#190)
Browse files Browse the repository at this point in the history
vendir was moving the folder when it should only move the file when
unpack is not needed

Signed-off-by: Joao Pereira <joaod@vmware.com>

Signed-off-by: Joao Pereira <joaod@vmware.com>
  • Loading branch information
joaopapereira committed Oct 10, 2022
1 parent bce1f6a commit 2454f01
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 11 deletions.
4 changes: 2 additions & 2 deletions examples/http/vendir.lock.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ directories:
- contents:
- http: {}
path: k8s-simple-app-plain
- http: {}
path: k8s-simple-app-digested
- http: {}
path: k8s-simple-app-archived
- http: {}
path: k8s-simple-app-digested
path: vendor
kind: LockConfig
9 changes: 5 additions & 4 deletions examples/http/vendir.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ directories:
http:
url: https://dk-shared-assets.s3.amazonaws.com/k8s-simple-app-example-master.zip

- path: k8s-simple-app-digested
- path: k8s-simple-app-archived
http:
url: https://dk-shared-assets.s3.amazonaws.com/k8s-simple-app-example-master.zip
sha256: "82685cca45be6b93deb929debe1513cc73110af2f1d4a00b9d0f18f20a104a98"
disableUnpack: true

- path: k8s-simple-app-archived
- path: k8s-simple-app-digested
http:
url: https://dk-shared-assets.s3.amazonaws.com/k8s-simple-app-example-master.zip
disableUnpack: true
sha256: "82685cca45be6b93deb929debe1513cc73110af2f1d4a00b9d0f18f20a104a98"

9 changes: 4 additions & 5 deletions pkg/vendir/fetch/http/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,13 @@ func (t *Sync) Sync(dstPath string, tempArea ctlfetch.TempArea) (ctlconf.LockDir
if err != nil {
return lockConf, fmt.Errorf("Unpacking archive: %s", err)
}
}

err = ctlfetch.MoveDir(incomingTmpPath, dstPath)
if err != nil {
return lockConf, err
err = ctlfetch.MoveDir(incomingTmpPath, dstPath)
} else {
err = ctlfetch.MoveFile(archivePath, dstPath)
}

return lockConf, nil
return lockConf, err
}

func (t *Sync) downloadFile(dst io.Writer) error {
Expand Down
26 changes: 26 additions & 0 deletions pkg/vendir/fetch/move.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package fetch

import (
"errors"
"fmt"
"os"
"path/filepath"
Expand All @@ -24,6 +25,31 @@ func MoveDir(path, dstPath string) error {
return nil
}

// MoveFile moves a file to the destination, before that it removes all the contents of the destination folder
// If folder already existed it will keep the permissions if not it will use 0700
func MoveFile(path, dstPath string) error {
folderPermission := os.FileMode(0700)
_, err := os.Stat(dstPath)
if !errors.Is(err, &os.PathError{}) {
err := os.RemoveAll(dstPath)
if err != nil {
return fmt.Errorf("Deleting dir %s: %s", dstPath, err)
}
}

err = os.Mkdir(dstPath, folderPermission)
if err != nil {
return fmt.Errorf("Creating dir %s: %s", dstPath, err)
}

err = os.Rename(path, filepath.Join(dstPath, filepath.Base(path)))
if err != nil {
return fmt.Errorf("Moving file '%s' to staging dir: %s", path, err)
}

return nil
}

func ScopedPath(path, subPath string) (string, error) {
path, err := filepath.Abs(path)
if err != nil {
Expand Down
65 changes: 65 additions & 0 deletions pkg/vendir/fetch/move_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// Copyright 2022 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0

package fetch_test

import (
"os"
"path/filepath"
"testing"

"github.com/stretchr/testify/require"
ctlfetch "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/fetch"
)

func TestMoveFile(t *testing.T) {
t.Run("Move file to folder that does not exist, creates folder with 0700 permission", func(t *testing.T) {
testFolder, err := os.MkdirTemp("", "vendir-folder-does-not-exist")
require.NoError(t, err)
defer os.RemoveAll(testFolder)

f, err := os.CreateTemp(testFolder, "some-file")
require.NoError(t, err)
_, err = f.Write([]byte("something"))
require.NoError(t, err)
require.NoError(t, f.Close())

dstFolder := filepath.Join(testFolder, "destination-folder")
require.NoError(t, ctlfetch.MoveFile(f.Name(), dstFolder))

require.FileExists(t, filepath.Join(dstFolder, filepath.Base(f.Name())))
info, err := os.Stat(dstFolder)
require.NoError(t, err)

require.Equal(t, os.FileMode(0700), info.Mode().Perm())
})

t.Run("Move file to folder that does exist, removes folder before moving file", func(t *testing.T) {
testFolder, err := os.MkdirTemp("", "vendir-folder-does-not-exist")
require.NoError(t, err)
defer os.RemoveAll(testFolder)

f, err := os.CreateTemp(testFolder, "some-file")
require.NoError(t, err)
_, err = f.Write([]byte("something"))
require.NoError(t, err)
require.NoError(t, f.Close())

dstFolder := filepath.Join(testFolder, "destination-folder")
require.NoError(t, os.Mkdir(dstFolder, 0777))
dstFile, err := os.CreateTemp(testFolder, "some-other-file")
require.NoError(t, err)
_, err = dstFile.Write([]byte("something else in a file on the destination folder"))
require.NoError(t, err)
require.NoError(t, dstFile.Close())

require.NoError(t, ctlfetch.MoveFile(f.Name(), dstFolder))

require.FileExists(t, filepath.Join(dstFolder, filepath.Base(f.Name())))
require.NoFileExists(t, filepath.Join(dstFolder, "some-other-file"))
info, err := os.Stat(dstFolder)
require.NoError(t, err)

require.Equal(t, os.FileMode(0700), info.Mode().Perm())
})
}

0 comments on commit 2454f01

Please sign in to comment.