Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion mkctr.go
Original file line number Diff line number Diff line change
Expand Up @@ -570,9 +570,14 @@ func layerFromFiles(logf logf, files map[string]string, layerMediaType types.Med
}
for src, dst := range files {
err := filepath.WalkDir(src, func(srcWalk string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
path := strings.TrimPrefix(srcWalk, src)
dstWalk := filepath.Join(dst, path)
writeDir(filepath.Dir(dstWalk))
if err := writeDir(filepath.Dir(dstWalk)); err != nil {
return err
}
if d.IsDir() {
return writeDir(dstWalk)
}
Expand Down
64 changes: 64 additions & 0 deletions mkctr_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
"archive/tar"
"io"
"os"
"path/filepath"
"slices"
"strings"
"testing"

"github.com/google/go-containerregistry/pkg/v1/types"
)

func TestLayerFromFilesMissingSource(t *testing.T) {
missing := filepath.Join(t.TempDir(), "does-not-exist")
files := map[string]string{missing: "/app/file"}
logf := func(string, ...any) {}

_, err := layerFromFiles(logf, files, types.OCILayer)
if err == nil {
t.Fatal("layerFromFiles succeeded for a source path that does not exist")
}
if !strings.Contains(err.Error(), "does-not-exist") {
t.Errorf("error = %q; want it to name the missing path", err)
}
}

func TestLayerFromFilesCopiesFiles(t *testing.T) {
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "a.txt"), []byte("hello"), 0o644); err != nil {
t.Fatal(err)
}
logf := func(string, ...any) {}

layer, err := layerFromFiles(logf, map[string]string{dir: "/app"}, types.OCILayer)
if err != nil {
t.Fatal(err)
}
rc, err := layer.Uncompressed()
if err != nil {
t.Fatal(err)
}
defer rc.Close()
var got []string
tr := tar.NewReader(rc)
for {
h, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
t.Fatal(err)
}
got = append(got, h.Name)
}
if !slices.Contains(got, "/app/a.txt") {
t.Errorf("layer entries = %q; want /app/a.txt", got)
}
}