diff --git a/.github/patch/go1.25.patch b/.github/patch/go1.25.patch index 626779db..a7f724ff 100644 --- a/.github/patch/go1.25.patch +++ b/.github/patch/go1.25.patch @@ -1,4 +1,5 @@ -Subject: [PATCH] Revert "runtime: always use LoadLibraryEx to load system libraries" +Subject: [PATCH] Fix os.RemoveAll not working on Windows7 +Revert "runtime: always use LoadLibraryEx to load system libraries" Revert "syscall: remove Windows 7 console handle workaround" Revert "net: remove sysSocket fallback for Windows 7" Revert "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng" @@ -655,3 +656,188 @@ diff --git a/src/syscall/dll_windows.go b/src/syscall/dll_windows.go } else { h, e = loadlibrary(namep) } +Index: src/os/removeall_at.go +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go +--- a/src/os/removeall_at.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c) ++++ b/src/os/removeall_at.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed) +@@ -2,7 +2,7 @@ + // Use of this source code is governed by a BSD-style + // license that can be found in the LICENSE file. + +-//go:build unix || wasip1 || windows ++//go:build unix || wasip1 + + package os + +@@ -175,3 +175,25 @@ + } + return newDirFile(fd, name) + } ++ ++func rootRemoveAll(r *Root, name string) error { ++ // Consistency with os.RemoveAll: Strip trailing /s from the name, ++ // so RemoveAll("not_a_directory/") succeeds. ++ for len(name) > 0 && IsPathSeparator(name[len(name)-1]) { ++ name = name[:len(name)-1] ++ } ++ if endsWithDot(name) { ++ // Consistency with os.RemoveAll: Return EINVAL when trying to remove . ++ return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL} ++ } ++ _, err := doInRoot(r, name, nil, func(parent sysfdType, name string) (struct{}, error) { ++ return struct{}{}, removeAllFrom(parent, name) ++ }) ++ if IsNotExist(err) { ++ return nil ++ } ++ if err != nil { ++ return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)} ++ } ++ return err ++} +Index: src/os/removeall_noat.go +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go +--- a/src/os/removeall_noat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c) ++++ b/src/os/removeall_noat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed) +@@ -2,7 +2,7 @@ + // Use of this source code is governed by a BSD-style + // license that can be found in the LICENSE file. + +-//go:build (js && wasm) || plan9 ++//go:build (js && wasm) || plan9 || windows + + package os + +@@ -140,3 +140,22 @@ + } + return err + } ++ ++func rootRemoveAll(r *Root, name string) error { ++ if endsWithDot(name) { ++ // Consistency with os.RemoveAll: Return EINVAL when trying to remove . ++ return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL} ++ } ++ if err := checkPathEscapesLstat(r, name); err != nil { ++ if err == syscall.ENOTDIR { ++ // Some intermediate path component is not a directory. ++ // RemoveAll treats this as success (since the target doesn't exist). ++ return nil ++ } ++ return &PathError{Op: "RemoveAll", Path: name, Err: err} ++ } ++ if err := RemoveAll(joinPath(r.root.name, name)); err != nil { ++ return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)} ++ } ++ return nil ++} +Index: src/os/root_noopenat.go +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/os/root_noopenat.go b/src/os/root_noopenat.go +--- a/src/os/root_noopenat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c) ++++ b/src/os/root_noopenat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed) +@@ -11,7 +11,6 @@ + "internal/filepathlite" + "internal/stringslite" + "sync/atomic" +- "syscall" + "time" + ) + +@@ -185,25 +184,6 @@ + } + return nil + } +- +-func rootRemoveAll(r *Root, name string) error { +- if endsWithDot(name) { +- // Consistency with os.RemoveAll: Return EINVAL when trying to remove . +- return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL} +- } +- if err := checkPathEscapesLstat(r, name); err != nil { +- if err == syscall.ENOTDIR { +- // Some intermediate path component is not a directory. +- // RemoveAll treats this as success (since the target doesn't exist). +- return nil +- } +- return &PathError{Op: "RemoveAll", Path: name, Err: err} +- } +- if err := RemoveAll(joinPath(r.root.name, name)); err != nil { +- return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)} +- } +- return nil +-} + + func rootReadlink(r *Root, name string) (string, error) { + if err := checkPathEscapesLstat(r, name); err != nil { +Index: src/os/root_openat.go +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/os/root_openat.go b/src/os/root_openat.go +--- a/src/os/root_openat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c) ++++ b/src/os/root_openat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed) +@@ -194,28 +194,6 @@ + return nil + } + +-func rootRemoveAll(r *Root, name string) error { +- // Consistency with os.RemoveAll: Strip trailing /s from the name, +- // so RemoveAll("not_a_directory/") succeeds. +- for len(name) > 0 && IsPathSeparator(name[len(name)-1]) { +- name = name[:len(name)-1] +- } +- if endsWithDot(name) { +- // Consistency with os.RemoveAll: Return EINVAL when trying to remove . +- return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL} +- } +- _, err := doInRoot(r, name, nil, func(parent sysfdType, name string) (struct{}, error) { +- return struct{}{}, removeAllFrom(parent, name) +- }) +- if IsNotExist(err) { +- return nil +- } +- if err != nil { +- return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)} +- } +- return err +-} +- + func rootRename(r *Root, oldname, newname string) error { + _, err := doInRoot(r, oldname, nil, func(oldparent sysfdType, oldname string) (struct{}, error) { + _, err := doInRoot(r, newname, nil, func(newparent sysfdType, newname string) (struct{}, error) { +Index: src/os/root_windows.go +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/os/root_windows.go b/src/os/root_windows.go +--- a/src/os/root_windows.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c) ++++ b/src/os/root_windows.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed) +@@ -402,3 +402,14 @@ + } + return fi.Mode(), nil + } ++ ++func checkPathEscapes(r *Root, name string) error { ++ if !filepathlite.IsLocal(name) { ++ return errPathEscapes ++ } ++ return nil ++} ++ ++func checkPathEscapesLstat(r *Root, name string) error { ++ return checkPathEscapes(r, name) ++} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ba36ed8..3fe99a6b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,6 +59,8 @@ jobs: - { goos: linux, goarch: s390x, output: s390x, debian: s390x, rpm: s390x } - { goos: linux, goarch: ppc64le, output: ppc64le, debian: ppc64el, rpm: ppc64le } + # Go 1.25 with special patch can work on Windows 7 + # https://github.com/MetaCubeX/go/commits/release-branch.go1.25/ - { goos: windows, goarch: '386', output: '386' } - { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released - { goos: windows, goarch: amd64, goamd64: v3, output: amd64 } @@ -176,6 +178,8 @@ jobs: # 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7" # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" + # sepical fix: + # - os.RemoveAll not working on Windows7 - name: Revert Golang1.25 commit for Windows7/8 if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }} run: |