pkg/archive/file.go (68 lines of code) (raw):
package archive
import (
"path/filepath"
"dagger.io/dagger"
)
type File struct {
Source string
Dest string
IsDir bool
Compress bool
}
func (f *File) MoveStaticFile(c *dagger.Container, rootdir string) *dagger.Container {
dest := filepath.Join(rootdir, f.Dest)
if f.IsDir && f.Source == "" {
return c.WithExec([]string{"mkdir", "-p", dest})
}
destDir := filepath.Dir(dest)
// Sometimes required for manpages nested within directories
// this may not be necessary
if f.Compress && f.IsDir {
return c.
WithEnvVariable("SOURCE", f.Source).
WithEnvVariable("DEST", dest).
WithExec([]string{"bash", "-exuc", `
: ${SOURCE}
: ${DEST}
if [ -L "$SOURCE" ]; then
SOURCE="$(readlink "$SOURCE")"
fi
mkdir -p "$DEST"
export SOURCE DEST
find "$SOURCE" -type f -printf "%P\0" | xargs -0I{} bash -c '
[ -z "{}" ] && exit 0
prefix="$(dirname "{}")"
mkdir -p "$DEST/$prefix"
gzip -c "$SOURCE/{}" > "$DEST/{}.gz"
'
`,
})
}
if f.Compress {
return c.
WithEnvVariable("SOURCE", f.Source).
WithEnvVariable("DEST_DIR", destDir).
WithEnvVariable("DEST", dest).
WithExec([]string{"bash", "-exuc", `
: ${SOURCE}
: ${DEST_DIR}
: ${DEST}
if [ -L "$SOURCE" ]; then
SOURCE="$(readlink "$SOURCE")"
fi
install -d "$DEST_DIR"
gzip -c "$SOURCE" > "$DEST"
`,
})
}
return c.
WithEnvVariable("SOURCE", f.Source).
WithEnvVariable("DEST_DIR", destDir).
WithEnvVariable("DEST", dest).
WithExec([]string{"bash", "-exuc", `
: ${SOURCE}
: ${DEST_DIR}
: ${DEST}
install -d "$DEST_DIR"
cp -Lr "$SOURCE" "$DEST"
`,
})
}