| 82 | } |
| 83 | |
| 84 | func untarNext(tarReader *tar.Reader, options *UpstreamOptions) (bool, error) { |
| 85 | header, err := tarReader.Next() |
| 86 | if err != nil { |
| 87 | if err != io.EOF { |
| 88 | return false, errors.Wrap(err, "tar reader next") |
| 89 | } |
| 90 | |
| 91 | return false, nil |
| 92 | } |
| 93 | |
| 94 | relativePath := getRelativeFromFullPath("/"+header.Name, "") |
| 95 | outFileName := path.Join(options.UploadPath, relativePath) |
| 96 | baseName := path.Dir(outFileName) |
| 97 | |
| 98 | // Check if newer file is there and then don't override? |
| 99 | stat, _ := os.Stat(outFileName) |
| 100 | |
| 101 | if err := createAllFolders(baseName, 0755, options); err != nil { |
| 102 | return false, err |
| 103 | } |
| 104 | |
| 105 | if header.FileInfo().IsDir() { |
| 106 | if err := createAllFolders(outFileName, 0755, options); err != nil { |
| 107 | return false, err |
| 108 | } |
| 109 | |
| 110 | return true, nil |
| 111 | } |
| 112 | |
| 113 | // Create / Override file |
| 114 | outFile, err := os.Create(outFileName) |
| 115 | if err != nil { |
| 116 | // Try again after 5 seconds |
| 117 | time.Sleep(time.Second * 5) |
| 118 | outFile, err = os.Create(outFileName) |
| 119 | if err != nil { |
| 120 | return false, errors.Wrapf(err, "create %s", outFileName) |
| 121 | } |
| 122 | } |
| 123 | |
| 124 | defer outFile.Close() |
| 125 | |
| 126 | if _, err := io.Copy(outFile, tarReader); err != nil { |
| 127 | return false, errors.Wrapf(err, "io copy tar reader %s", outFileName) |
| 128 | } |
| 129 | if err := outFile.Close(); err != nil { |
| 130 | return false, errors.Wrapf(err, "out file close %s", outFileName) |
| 131 | } |
| 132 | |
| 133 | // Set old permissions and owner and group |
| 134 | if stat != nil { |
| 135 | if options.OverridePermission { |
| 136 | // Set permissions |
| 137 | _ = os.Chmod(outFileName, header.FileInfo().Mode()) |
| 138 | } else { |
| 139 | // Set old permissions correctly |
| 140 | _ = os.Chmod(outFileName, stat.Mode()) |
| 141 | } |