فهرست منبع

Revert "allow overwrite in untar"

This reverts commit 5a3d774e5651da772a065282a1fb1a31e19e911c.

Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@docker.com> (github: crosbymichael)
Michael Crosby 11 سال پیش
والد
کامیت
10d066c9cb
2فایلهای تغییر یافته به همراه6 افزوده شده و 12 حذف شده
  1. 6 9
      archive/archive.go
  2. 0 3
      archive/archive_test.go

+ 6 - 9
archive/archive.go

@@ -383,8 +383,7 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error)
 //  identity (uncompressed), gzip, bzip2, xz.
 //  identity (uncompressed), gzip, bzip2, xz.
 // If `dest` does not exist, it is created unless there are multiple entries in `archive`.
 // If `dest` does not exist, it is created unless there are multiple entries in `archive`.
 // In the latter case, an error is returned.
 // In the latter case, an error is returned.
-// If `dest` is an existing file, it gets overwritten.
-// If `dest` is an existing directory, its files get merged (with overwrite for conflicting files).
+// An other error is returned if `dest` exists but is not a directory, to prevent overwriting.
 func Untar(archive io.Reader, dest string, options *TarOptions) error {
 func Untar(archive io.Reader, dest string, options *TarOptions) error {
 	if archive == nil {
 	if archive == nil {
 		return fmt.Errorf("Empty archive")
 		return fmt.Errorf("Empty archive")
@@ -400,7 +399,7 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
 
 
 	var (
 	var (
 		dirs            []*tar.Header
 		dirs            []*tar.Header
-		create          bool
+		destNotExist    bool
 		multipleEntries bool
 		multipleEntries bool
 	)
 	)
 
 
@@ -409,10 +408,9 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
 			return err
 			return err
 		}
 		}
 		// destination does not exist, so it is assumed it has to be created.
 		// destination does not exist, so it is assumed it has to be created.
-		create = true
+		destNotExist = true
 	} else if !fi.IsDir() {
 	} else if !fi.IsDir() {
-		// destination exists and is not a directory, so it will be overwritten.
-		create = true
+		return fmt.Errorf("Trying to untar to `%s`: exists but not a directory", dest)
 	}
 	}
 
 
 	// Iterate through the files in the archive.
 	// Iterate through the files in the archive.
@@ -427,7 +425,7 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
 		}
 		}
 
 
 		// Return an error if destination needs to be created and there is more than 1 entry in the tar stream.
 		// Return an error if destination needs to be created and there is more than 1 entry in the tar stream.
-		if create && multipleEntries {
+		if destNotExist && multipleEntries {
 			return fmt.Errorf("Trying to untar an archive with multiple entries to an inexistant target `%s`: did you mean `%s` instead?", dest, filepath.Dir(dest))
 			return fmt.Errorf("Trying to untar an archive with multiple entries to an inexistant target `%s`: did you mean `%s` instead?", dest, filepath.Dir(dest))
 		}
 		}
 
 
@@ -447,7 +445,7 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
 		}
 		}
 
 
 		var path string
 		var path string
-		if create {
+		if destNotExist {
 			path = dest // we are renaming hdr.Name to dest
 			path = dest // we are renaming hdr.Name to dest
 		} else {
 		} else {
 			path = filepath.Join(dest, hdr.Name)
 			path = filepath.Join(dest, hdr.Name)
@@ -467,7 +465,6 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
 				}
 				}
 			}
 			}
 		}
 		}
-
 		if err := createTarFile(path, dest, hdr, tr, options == nil || !options.NoLchown); err != nil {
 		if err := createTarFile(path, dest, hdr, tr, options == nil || !options.NoLchown); err != nil {
 			return err
 			return err
 		}
 		}

+ 0 - 3
archive/archive_test.go

@@ -176,9 +176,6 @@ func TestTarUntarFile(t *testing.T) {
 	if err := ioutil.WriteFile(path.Join(origin, "before", "file"), []byte("hello world"), 0700); err != nil {
 	if err := ioutil.WriteFile(path.Join(origin, "before", "file"), []byte("hello world"), 0700); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
-	if err := ioutil.WriteFile(path.Join(origin, "after", "file2"), []byte("please overwrite me"), 0700); err != nil {
-		t.Fatal(err)
-	}
 
 
 	tar, err := TarWithOptions(path.Join(origin, "before"), &TarOptions{Compression: Uncompressed, Includes: []string{"file"}})
 	tar, err := TarWithOptions(path.Join(origin, "before"), &TarOptions{Compression: Uncompressed, Includes: []string{"file"}})
 	if err != nil {
 	if err != nil {