Skip to content

Commit 17be9d4

Browse files
committed
Canonicalize now de-shorten paths on Windows
1 parent 08cf9b4 commit 17be9d4

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

paths.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,5 +561,8 @@ func (p *Path) Canonical() *Path {
561561
if absPath, err := canonical.Abs(); err == nil {
562562
canonical = absPath
563563
}
564+
if c, err := canonicalize(canonical.path); c != "" && err == nil {
565+
canonical.path = c
566+
}
564567
return canonical
565568
}

paths_others.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// This file is part of PathsHelper library.
3+
//
4+
// Copyright 2025 Arduino AG (http://www.arduino.cc/)
5+
//
6+
// PathsHelper library is free software; you can redistribute it and/or modify
7+
// it under the terms of the GNU General Public License as published by
8+
// the Free Software Foundation; either version 2 of the License, or
9+
// (at your option) any later version.
10+
//
11+
// This program is distributed in the hope that it will be useful,
12+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
// GNU General Public License for more details.
15+
//
16+
// You should have received a copy of the GNU General Public License
17+
// along with this program; if not, write to the Free Software
18+
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
//
20+
// As a special exception, you may use this file as part of a free software
21+
// library without restriction. Specifically, if other files instantiate
22+
// templates or use macros or inline functions from this file, or you compile
23+
// this file and link it with other files to produce an executable, this
24+
// file does not by itself cause the resulting executable to be covered by
25+
// the GNU General Public License. This exception does not however
26+
// invalidate any other reasons why the executable file might be covered by
27+
// the GNU General Public License.
28+
//
29+
30+
//go:build !windows
31+
32+
package paths
33+
34+
func canonicalize(string) (string, error) {
35+
// On non-Windows platforms, the path is already in a canonical form.
36+
return "", nil
37+
}

paths_windows.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//
2+
// This file is part of PathsHelper library.
3+
//
4+
// Copyright 2025 Arduino AG (http://www.arduino.cc/)
5+
//
6+
// PathsHelper library is free software; you can redistribute it and/or modify
7+
// it under the terms of the GNU General Public License as published by
8+
// the Free Software Foundation; either version 2 of the License, or
9+
// (at your option) any later version.
10+
//
11+
// This program is distributed in the hope that it will be useful,
12+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
// GNU General Public License for more details.
15+
//
16+
// You should have received a copy of the GNU General Public License
17+
// along with this program; if not, write to the Free Software
18+
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
//
20+
// As a special exception, you may use this file as part of a free software
21+
// library without restriction. Specifically, if other files instantiate
22+
// templates or use macros or inline functions from this file, or you compile
23+
// this file and link it with other files to produce an executable, this
24+
// file does not by itself cause the resulting executable to be covered by
25+
// the GNU General Public License. This exception does not however
26+
// invalidate any other reasons why the executable file might be covered by
27+
// the GNU General Public License.
28+
//
29+
30+
package paths
31+
32+
import (
33+
"fmt"
34+
35+
"golang.org/x/sys/windows"
36+
)
37+
38+
func canonicalize(inPath string) (string, error) {
39+
var buf [4096]uint16
40+
data := &buf[0]
41+
n, err := windows.GetLongPathName(windows.StringToUTF16Ptr(inPath), &buf[0], uint32(len(buf)))
42+
if n >= uint32(len(buf)) {
43+
buf2 := make([]uint16, n+1)
44+
data = &buf2[0]
45+
_, err = windows.GetLongPathName(windows.StringToUTF16Ptr(inPath), &buf2[0], uint32(len(buf2)))
46+
}
47+
if err != nil {
48+
return "", fmt.Errorf("getting long path name: %w", err)
49+
}
50+
return windows.UTF16PtrToString(data), err
51+
}

0 commit comments

Comments
 (0)