Signed-off-by: yangshukui <yangshukui@huawei.com>
| ... | ... |
@@ -126,6 +126,59 @@ func TestTarWithHardLink(t *testing.T) {
|
| 126 | 126 |
} |
| 127 | 127 |
} |
| 128 | 128 |
|
| 129 |
+func TestTarWithHardLinkAndRebase(t *testing.T) {
|
|
| 130 |
+ tmpDir, err := ioutil.TempDir("", "docker-test-tar-hardlink-rebase")
|
|
| 131 |
+ if err != nil {
|
|
| 132 |
+ t.Fatal(err) |
|
| 133 |
+ } |
|
| 134 |
+ defer os.RemoveAll(tmpDir) |
|
| 135 |
+ |
|
| 136 |
+ origin := filepath.Join(tmpDir, "origin") |
|
| 137 |
+ if err := os.Mkdir(origin, 0700); err != nil {
|
|
| 138 |
+ t.Fatal(err) |
|
| 139 |
+ } |
|
| 140 |
+ if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil {
|
|
| 141 |
+ t.Fatal(err) |
|
| 142 |
+ } |
|
| 143 |
+ if err := os.Link(filepath.Join(origin, "1"), filepath.Join(origin, "2")); err != nil {
|
|
| 144 |
+ t.Fatal(err) |
|
| 145 |
+ } |
|
| 146 |
+ |
|
| 147 |
+ var i1, i2 uint64 |
|
| 148 |
+ if i1, err = getNlink(filepath.Join(origin, "1")); err != nil {
|
|
| 149 |
+ t.Fatal(err) |
|
| 150 |
+ } |
|
| 151 |
+ // sanity check that we can hardlink |
|
| 152 |
+ if i1 != 2 {
|
|
| 153 |
+ t.Skipf("skipping since hardlinks don't work here; expected 2 links, got %d", i1)
|
|
| 154 |
+ } |
|
| 155 |
+ |
|
| 156 |
+ dest := filepath.Join(tmpDir, "dest") |
|
| 157 |
+ |
|
| 158 |
+ bRdr, err := TarResourceRebase(origin, "origin") |
|
| 159 |
+ if err != nil {
|
|
| 160 |
+ t.Fatal(err) |
|
| 161 |
+ } |
|
| 162 |
+ dstDir, srcBase := SplitPathDirEntry(origin) |
|
| 163 |
+ _, dstBase := SplitPathDirEntry(dest) |
|
| 164 |
+ content := RebaseArchiveEntries(bRdr, srcBase, dstBase) |
|
| 165 |
+ err = Untar(content, dstDir, &TarOptions{Compression: Uncompressed, NoLchown: true, NoOverwriteDirNonDir: true})
|
|
| 166 |
+ if err != nil {
|
|
| 167 |
+ t.Fatal(err) |
|
| 168 |
+ } |
|
| 169 |
+ |
|
| 170 |
+ if i1, err = getInode(filepath.Join(dest, "1")); err != nil {
|
|
| 171 |
+ t.Fatal(err) |
|
| 172 |
+ } |
|
| 173 |
+ if i2, err = getInode(filepath.Join(dest, "2")); err != nil {
|
|
| 174 |
+ t.Fatal(err) |
|
| 175 |
+ } |
|
| 176 |
+ |
|
| 177 |
+ if i1 != i2 {
|
|
| 178 |
+ t.Errorf("expected matching inodes, but got %d and %d", i1, i2)
|
|
| 179 |
+ } |
|
| 180 |
+} |
|
| 181 |
+ |
|
| 129 | 182 |
func getNlink(path string) (uint64, error) {
|
| 130 | 183 |
stat, err := os.Stat(path) |
| 131 | 184 |
if err != nil {
|