Skip to content

Commit db67dbf

Browse files
committed
internal/fs: update TestCopyFileSymlink and rename copySymlink
This change updates TestCopyFileSymlink tests and renames copySymlink to cloneSymlink to clarify the intention. Fixes golang#773 Signed-off-by: Ibrahim AshShohail <[email protected]>
1 parent c79b048 commit db67dbf

File tree

5 files changed

+51
-68
lines changed

5 files changed

+51
-68
lines changed

internal/fs/fs.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,7 @@ func copyFile(src, dst string) (err error) {
272272
if sym, err := IsSymlink(src); err != nil {
273273
return err
274274
} else if sym {
275-
err := copySymlink(src, dst)
276-
return err
275+
return cloneSymlink(src, dst)
277276
}
278277

279278
in, err := os.Open(src)
@@ -314,17 +313,17 @@ func copyFile(src, dst string) (err error) {
314313
return
315314
}
316315

317-
// copySymlink will resolve the src symlink and create a new symlink in dst.
318-
// If src is a relative symlink, dst will also be a relative symlink.
319-
func copySymlink(src, dst string) error {
320-
resolved, err := os.Readlink(src)
316+
// cloneSymlink will create a new symlink that points to the resolved path of sl.
317+
// If sl is a relative symlink, dst will also be a relative symlink.
318+
func cloneSymlink(sl, dst string) error {
319+
resolved, err := os.Readlink(sl)
321320
if err != nil {
322321
return errors.Wrap(err, "failed to resolve symlink")
323322
}
324323

325324
err = os.Symlink(resolved, dst)
326325
if err != nil {
327-
return errors.Wrapf(err, "failed to create symlink %s to %s", src, resolved)
326+
return errors.Wrapf(err, "failed to create symlink %s to %s", dst, resolved)
328327
}
329328

330329
return nil

internal/fs/fs_test.go

Lines changed: 42 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -499,71 +499,48 @@ func TestCopyFile(t *testing.T) {
499499
}
500500

501501
func TestCopyFileSymlink(t *testing.T) {
502-
dir, err := ioutil.TempDir("", "dep")
503-
if err != nil {
504-
t.Fatal(err)
505-
}
506-
defer os.RemoveAll(dir)
507-
508-
srcPath := filepath.Join(dir, "src")
509-
symlinkPath := filepath.Join(dir, "symlink")
510-
dstPath := filepath.Join(dir, "dst")
511-
512-
srcf, err := os.Create(srcPath)
513-
if err != nil {
514-
t.Fatal(err)
515-
}
516-
srcf.Close()
517-
518-
if err = os.Symlink(srcPath, symlinkPath); err != nil {
519-
t.Fatalf("could not create symlink: %s", err)
520-
}
521-
522-
if err = copyFile(symlinkPath, dstPath); err != nil {
523-
t.Fatalf("failed to copy symlink: %s", err)
524-
}
525-
526-
resolvedPath, err := os.Readlink(dstPath)
527-
if err != nil {
528-
t.Fatalf("could not resolve symlink: %s", err)
529-
}
530-
531-
if resolvedPath != srcPath {
532-
t.Fatalf("resolved path is incorrect. expected %s, got %s", srcPath, resolvedPath)
533-
}
534-
}
502+
h := test.NewHelper(t)
503+
defer h.Cleanup()
504+
h.TempDir(".")
535505

536-
func TestCopyFileSymlinkToDirectory(t *testing.T) {
537-
dir, err := ioutil.TempDir("", "dep")
538-
if err != nil {
539-
t.Fatal(err)
506+
testcases := map[string]string{
507+
filepath.Join("./testdata/symlinks/file-symlink"): filepath.Join(h.Path("."), "dst-file"),
508+
filepath.Join("./testdata/symlinks/dir-symlink"): filepath.Join(h.Path("."), "dst-dir"),
509+
filepath.Join("./testdata/symlinks/invalid-symlink"): filepath.Join(h.Path("."), "invalid-symlink"),
540510
}
541-
defer os.RemoveAll(dir)
542511

543-
srcPath := filepath.Join(dir, "src")
544-
symlinkPath := filepath.Join(dir, "symlink")
545-
dstPath := filepath.Join(dir, "dst")
512+
for symlink, dst := range testcases {
513+
var err error
514+
if err = copyFile(symlink, dst); err != nil {
515+
t.Fatalf("failed to copy symlink: %s", err)
516+
}
546517

547-
err = os.MkdirAll(srcPath, 0777)
548-
if err != nil {
549-
t.Fatal(err)
550-
}
518+
var want, got string
551519

552-
if err = os.Symlink(srcPath, symlinkPath); err != nil {
553-
t.Fatalf("could not create symlink: %v", err)
554-
}
520+
if runtime.GOOS == "windows" {
521+
// Creating symlinks on Windows require an additional permission
522+
// regular users aren't granted usually. So we copy the file
523+
// content as a fall back instead of creating a real symlink.
524+
srcb, err := ioutil.ReadFile(symlink)
525+
h.Must(err)
526+
dstb, err := ioutil.ReadFile(dst)
527+
h.Must(err)
555528

556-
if err = copyFile(symlinkPath, dstPath); err != nil {
557-
t.Fatalf("failed to copy symlink: %s", err)
558-
}
529+
want = string(srcb)
530+
got = string(dstb)
531+
} else {
532+
want, err = os.Readlink(symlink)
533+
h.Must(err)
559534

560-
resolvedPath, err := os.Readlink(dstPath)
561-
if err != nil {
562-
t.Fatalf("could not resolve symlink: %s", err)
563-
}
535+
got, err = os.Readlink(dst)
536+
if err != nil {
537+
t.Fatalf("could not resolve symlink: %s", err)
538+
}
539+
}
564540

565-
if resolvedPath != srcPath {
566-
t.Fatalf("resolved path is incorrect. expected %s, got %s", srcPath, resolvedPath)
541+
if want != got {
542+
t.Fatalf("resolved path is incorrect. expected %s, got %s", want, got)
543+
}
567544
}
568545
}
569546

@@ -857,10 +834,7 @@ func TestIsSymlink(t *testing.T) {
857834
})
858835
defer cleanup()
859836

860-
tests := map[string]struct {
861-
expected bool
862-
err bool
863-
}{
837+
tests := map[string]struct{ expected, err bool }{
864838
dirPath: {false, false},
865839
filePath: {false, false},
866840
dirSymlink: {true, false},
@@ -869,6 +843,13 @@ func TestIsSymlink(t *testing.T) {
869843
inaccessibleSymlink: {false, true},
870844
}
871845

846+
if runtime.GOOS == "windows" {
847+
// XXX: settings permissions works differently in Windows. Skipping
848+
// these cases until a compatible implementation is provided.
849+
delete(tests, inaccessibleFile)
850+
delete(tests, inaccessibleSymlink)
851+
}
852+
872853
for path, want := range tests {
873854
got, err := IsSymlink(path)
874855
if err != nil {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../testdata
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../test.file
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/non/existing/file

0 commit comments

Comments
 (0)