1
0
mirror of https://github.com/golang/go synced 2024-11-26 01:07:57 -07:00

os: drop unnecessary trailing . from symlink targets

Adjust splitPathInRoot to match its documented behavior
of dropping . path components except at the end of the path.
This function takes a prefix, path, and suffix; previously
it would preserve a trailing . at the end of the path
even when joining to a suffix.

The practical effect of this change is that we we'll skip
a pointless open of . when following a symlink under some
circumstances:

  - open "a/target"
  - "a" is a symlink to "b/."
  - previously: we rewrite our path to "b/./target"
  - now: we rewrite our path to "b/target"

This is a fairly unimportant edge case, and our observable
behavior isn't changing. The main motivation for this change is
that the overall behavior is more comprehensible if splitPathInRoot
follows its documentation.

Change-Id: I96c6a5e3f489cdac991ba1bd702180d69625bc64
Reviewed-on: https://go-review.googlesource.com/c/go/+/630615
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Damien Neil 2024-11-21 09:20:46 -08:00
parent a925402b62
commit 83e6781cb7
2 changed files with 12 additions and 0 deletions

View File

@ -230,6 +230,10 @@ func splitPathInRoot(s string, prefix, suffix []string) (_ []string, err error)
}
i = j
}
if len(suffix) > 0 && len(parts) > 0 && parts[len(parts)-1] == "." {
// Remove a trailing "." component if we're joining to a suffix.
parts = parts[:len(parts)-1]
}
parts = append(parts, suffix...)
return parts, nil
}

View File

@ -242,6 +242,14 @@ var rootTestCases = []rootTest{{
},
open: "b/../a/target",
target: "b/c/target",
}, {
name: "symlink ends in dot",
fs: []string{
"a => b/.",
"b/",
},
open: "a/target",
target: "b/target",
}, {
name: "directory does not exist",
fs: []string{},