misc: remove use of relative directories in overlayDir functions

It turns out that the relative-path support never worked in the first
place.

It had been masked by the fact that we ~never invoke overlayDir with
an absolute path, which caused filepath.Rel to always return an error,
and overlayDir to always fall back to absolute paths.

Since the absolute paths seem to be working fine (and are simpler),
let's stick with those. As far as I can recall, the relative paths
were only a space optimization anyway.

Updates #28387
Updates #30316

Change-Id: Ie8cd28f3c41ca6497ace2799f4193d7f5dde7a37
Reviewed-on: https://go-review.googlesource.com/c/go/+/208481
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
diff --git a/misc/cgo/life/overlaydir_test.go b/misc/cgo/life/overlaydir_test.go
index a25b125..034c836 100644
--- a/misc/cgo/life/overlaydir_test.go
+++ b/misc/cgo/life/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/stdio/overlaydir_test.go b/misc/cgo/stdio/overlaydir_test.go
index 5d6858f..027ebf1 100644
--- a/misc/cgo/stdio/overlaydir_test.go
+++ b/misc/cgo/stdio/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/test/overlaydir_test.go b/misc/cgo/test/overlaydir_test.go
index cad9577..f651979 100644
--- a/misc/cgo/test/overlaydir_test.go
+++ b/misc/cgo/test/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testcarchive/overlaydir_test.go b/misc/cgo/testcarchive/overlaydir_test.go
index ee35dd5..67974c5 100644
--- a/misc/cgo/testcarchive/overlaydir_test.go
+++ b/misc/cgo/testcarchive/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testcshared/overlaydir_test.go b/misc/cgo/testcshared/overlaydir_test.go
index 0c23ec0..85d6b44 100644
--- a/misc/cgo/testcshared/overlaydir_test.go
+++ b/misc/cgo/testcshared/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testplugin/overlaydir_test.go b/misc/cgo/testplugin/overlaydir_test.go
index ffb107c..e2c32d8 100644
--- a/misc/cgo/testplugin/overlaydir_test.go
+++ b/misc/cgo/testplugin/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testshared/overlaydir_test.go b/misc/cgo/testshared/overlaydir_test.go
index 3a7c9b0..eb587a2 100644
--- a/misc/cgo/testshared/overlaydir_test.go
+++ b/misc/cgo/testshared/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testso/overlaydir_test.go b/misc/cgo/testso/overlaydir_test.go
index 91732d1..09a1d51 100644
--- a/misc/cgo/testso/overlaydir_test.go
+++ b/misc/cgo/testso/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/cgo/testsovar/overlaydir_test.go b/misc/cgo/testsovar/overlaydir_test.go
index 91732d1..09a1d51 100644
--- a/misc/cgo/testsovar/overlaydir_test.go
+++ b/misc/cgo/testsovar/overlaydir_test.go
@@ -21,12 +21,9 @@
 		return err
 	}
 
-	symBase, err := filepath.Rel(srcRoot, dstRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
-		symBase, err = filepath.Abs(srcRoot)
-		if err != nil {
-			return err
-		}
+		return err
 	}
 
 	return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
@@ -52,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}
 
diff --git a/misc/reboot/overlaydir_test.go b/misc/reboot/overlaydir_test.go
index 6e77b2e..c446d08 100644
--- a/misc/reboot/overlaydir_test.go
+++ b/misc/reboot/overlaydir_test.go
@@ -21,9 +21,7 @@
 		return err
 	}
 
-	// If we don't use the absolute path here, exec'ing make.bash fails with
-	// “too many levels of symbolic links”.
-	symBase, err := filepath.Abs(srcRoot)
+	srcRoot, err := filepath.Abs(srcRoot)
 	if err != nil {
 		return err
 	}
@@ -51,11 +49,11 @@
 		// Always copy directories (don't symlink them).
 		// If we add a file in the overlay, we don't want to add it in the original.
 		if info.IsDir() {
-			return os.Mkdir(dstPath, perm|0200)
+			return os.MkdirAll(dstPath, perm|0200)
 		}
 
 		// If the OS supports symlinks, use them instead of copying bytes.
-		if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+		if err := os.Symlink(srcPath, dstPath); err == nil {
 			return nil
 		}