summaryrefslogtreecommitdiff
path: root/vendor/github.com
diff options
context:
space:
mode:
authorAditya Rajan <flouthoc.git@gmail.com>2021-09-15 14:58:44 +0530
committerAditya Rajan <flouthoc.git@gmail.com>2021-09-15 14:58:48 +0530
commitd0c605cd3da07175478b5c3947056856558be9f7 (patch)
tree8428f3f4211c5e8f9c3f0fab838d3f507eed04f3 /vendor/github.com
parent222b62e7b0b8b8e5ac69b776d7024c63d620b29b (diff)
downloadpodman-d0c605cd3da07175478b5c3947056856558be9f7.tar.gz
podman-d0c605cd3da07175478b5c3947056856558be9f7.tar.bz2
podman-d0c605cd3da07175478b5c3947056856558be9f7.zip
build: mirror --authfile to filesystem if pointing to FD instead of file
Following commit makes sure that podman mirrors --authfile to a temporary file in filesystem if arg is pointing to an FD instead of actual file as FD can be only consumed once. Reference: * https://github.com/containers/buildah/pull/3498 * https://github.com/containers/buildah/issues/3070 [NO TESTS NEEDED] Signed-off-by: Aditya Rajan <arajan@redhat.com>
Diffstat (limited to 'vendor/github.com')
-rw-r--r--vendor/github.com/containers/buildah/pkg/util/util.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/vendor/github.com/containers/buildah/pkg/util/util.go b/vendor/github.com/containers/buildah/pkg/util/util.go
new file mode 100644
index 000000000..209ad9544
--- /dev/null
+++ b/vendor/github.com/containers/buildah/pkg/util/util.go
@@ -0,0 +1,81 @@
+package util
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+// Mirrors path to a tmpfile if path points to a
+// file descriptor instead of actual file on filesystem
+// reason: operations with file descriptors are can lead
+// to edge cases where content on FD is not in a consumable
+// state after first consumption.
+// returns path as string and bool to confirm if temp file
+// was created and needs to be cleaned up.
+func MirrorToTempFileIfPathIsDescriptor(file string) (string, bool) {
+ // one use-case is discussed here
+ // https://github.com/containers/buildah/issues/3070
+ if !strings.HasPrefix(file, "/dev/fd") {
+ return file, false
+ }
+ b, err := ioutil.ReadFile(file)
+ if err != nil {
+ // if anything goes wrong return original path
+ return file, false
+ }
+ tmpfile, err := ioutil.TempFile(os.TempDir(), "buildah-temp-file")
+ if err != nil {
+ return file, false
+ }
+ if _, err := tmpfile.Write(b); err != nil {
+ // if anything goes wrong return original path
+ return file, false
+ }
+
+ return tmpfile.Name(), true
+}
+
+// DiscoverContainerfile tries to find a Containerfile or a Dockerfile within the provided `path`.
+func DiscoverContainerfile(path string) (foundCtrFile string, err error) {
+ // Test for existence of the file
+ target, err := os.Stat(path)
+ if err != nil {
+ return "", errors.Wrap(err, "discovering Containerfile")
+ }
+
+ switch mode := target.Mode(); {
+ case mode.IsDir():
+ // If the path is a real directory, we assume a Containerfile or a Dockerfile within it
+ ctrfile := filepath.Join(path, "Containerfile")
+
+ // Test for existence of the Containerfile file
+ file, err := os.Stat(ctrfile)
+ if err != nil {
+ // See if we have a Dockerfile within it
+ ctrfile = filepath.Join(path, "Dockerfile")
+
+ // Test for existence of the Dockerfile file
+ file, err = os.Stat(ctrfile)
+ if err != nil {
+ return "", errors.Wrap(err, "cannot find Containerfile or Dockerfile in context directory")
+ }
+ }
+
+ // The file exists, now verify the correct mode
+ if mode := file.Mode(); mode.IsRegular() {
+ foundCtrFile = ctrfile
+ } else {
+ return "", errors.Errorf("assumed Containerfile %q is not a file", ctrfile)
+ }
+
+ case mode.IsRegular():
+ // If the context dir is a file, we assume this as Containerfile
+ foundCtrFile = path
+ }
+
+ return foundCtrFile, nil
+}