Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package spicetify-cli for openSUSE:Factory 
checked in at 2025-05-12 16:56:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/spicetify-cli (Old)
 and      /work/SRC/openSUSE:Factory/.spicetify-cli.new.30101 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "spicetify-cli"

Mon May 12 16:56:02 2025 rev:13 rq:1276837 version:2.40.7

Changes:
--------
--- /work/SRC/openSUSE:Factory/spicetify-cli/spicetify-cli.changes      
2025-04-28 16:16:44.230165109 +0200
+++ /work/SRC/openSUSE:Factory/.spicetify-cli.new.30101/spicetify-cli.changes   
2025-05-12 16:56:07.742906550 +0200
@@ -1,0 +2,12 @@
+Mon May 12 06:53:41 UTC 2025 - Jan Kužílek <[email protected]>
+
+- Update to version 2.40.7:
+  * feat(lyrics-plus/translator): inject internals when using netease
+  * feat(lyrics-plus/netease): implement below-mode for netease (#3404)
+  * chore: `error` -> `warning`
+  * chore: change message in preprocess
+  * chore(deps): bump golang.org/x/net from 0.39.0 to 0.40.0 (#3399)
+  * feat(preprocess): expose graphql defs from every js file
+  * fix: correct minor typo when version is invalid (#3393)
+
+-------------------------------------------------------------------

Old:
----
  cli-2.40.5.obscpio

New:
----
  cli-2.40.7.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ spicetify-cli.spec ++++++
--- /var/tmp/diff_new_pack.jcuW9J/_old  2025-05-12 16:56:08.834952361 +0200
+++ /var/tmp/diff_new_pack.jcuW9J/_new  2025-05-12 16:56:08.834952361 +0200
@@ -19,7 +19,7 @@
 %define sname cli
 %define binname spicetify
 Name:           spicetify-cli
-Version:        2.40.5
+Version:        2.40.7
 Release:        0
 Summary:        Command-line tool to customize Spotify client
 License:        LGPL-2.1-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.jcuW9J/_old  2025-05-12 16:56:08.866953704 +0200
+++ /var/tmp/diff_new_pack.jcuW9J/_new  2025-05-12 16:56:08.870953872 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/spicetify/cli</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v2.40.5</param>
+    <param name="revision">v2.40.7</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.jcuW9J/_old  2025-05-12 16:56:08.894954878 +0200
+++ /var/tmp/diff_new_pack.jcuW9J/_new  2025-05-12 16:56:08.898955046 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/spicetify/cli</param>
-              <param 
name="changesrevision">8860f1b8d8a6a62056456b1f43d1cca71fdd2813</param></service></servicedata>
+              <param 
name="changesrevision">68f41d51303ed690e2fb0cf077350ffc512080d8</param></service></servicedata>
 (No newline at EOF)
 

++++++ cli-2.40.5.obscpio -> cli-2.40.7.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/CustomApps/lyrics-plus/Providers.js 
new/cli-2.40.7/CustomApps/lyrics-plus/Providers.js
--- old/cli-2.40.5/CustomApps/lyrics-plus/Providers.js  2025-04-26 
17:39:36.000000000 +0200
+++ new/cli-2.40.7/CustomApps/lyrics-plus/Providers.js  2025-05-10 
18:05:39.000000000 +0200
@@ -125,8 +125,13 @@
                        result.unsynced = unsynced;
                }
                const translation = ProviderNetease.getTranslation(list);
-               if (translation) {
-                       result.neteaseTranslation = translation;
+               if ((synced || unsynced) && Array.isArray(translation)) {
+                       const baseLyrics = synced ?? unsynced;
+                       result.neteaseTranslation = baseLyrics.map((line) => ({
+                               ...line,
+                               text: translation.find((t) => t.startTime === 
line.startTime)?.text ?? line.text,
+                               originalText: line.text,
+                       }));
                }
 
                return result;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/CustomApps/lyrics-plus/Translator.js 
new/cli-2.40.7/CustomApps/lyrics-plus/Translator.js
--- old/cli-2.40.5/CustomApps/lyrics-plus/Translator.js 2025-04-26 
17:39:36.000000000 +0200
+++ new/cli-2.40.7/CustomApps/lyrics-plus/Translator.js 2025-05-10 
18:05:39.000000000 +0200
@@ -6,12 +6,13 @@
 const dictPath = "https:/cdn.jsdelivr.net/npm/[email protected]/dict";
 
 class Translator {
-       constructor(lang) {
+       constructor(lang, isUsingNetease = false) {
                this.finished = {
                        ja: false,
                        ko: false,
                        zh: false,
                };
+               this.isUsingNetease = isUsingNetease;
 
                this.applyKuromojiFix();
                this.injectExternals(lang);
@@ -19,7 +20,7 @@
        }
 
        includeExternal(url) {
-               if (CONFIG.visual.translate && 
!document.querySelector(`script[src="${url}"]`)) {
+               if ((CONFIG.visual.translate || this.isUsingNetease) && 
!document.querySelector(`script[src="${url}"]`)) {
                        const script = document.createElement("script");
                        script.setAttribute("type", "text/javascript");
                        script.setAttribute("src", url);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/CustomApps/lyrics-plus/Utils.js 
new/cli-2.40.7/CustomApps/lyrics-plus/Utils.js
--- old/cli-2.40.5/CustomApps/lyrics-plus/Utils.js      2025-04-26 
17:39:36.000000000 +0200
+++ new/cli-2.40.7/CustomApps/lyrics-plus/Utils.js      2025-05-10 
18:05:39.000000000 +0200
@@ -70,7 +70,7 @@
         */
        async toSimplifiedChinese(s) {
                // create a singleton Translator instance
-               if (!this._translatorInstance) this.translator = new 
Translator("zh");
+               if (!this._translatorInstance) this.translator = new 
Translator("zh", true);
 
                // translate to Simplified Chinese
                // as Traditional Chinese differs between HK and TW, forcing to 
use OpenCC standard
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/go.mod new/cli-2.40.7/go.mod
--- old/cli-2.40.5/go.mod       2025-04-26 17:39:36.000000000 +0200
+++ new/cli-2.40.7/go.mod       2025-05-10 18:05:39.000000000 +0200
@@ -6,8 +6,8 @@
        github.com/go-ini/ini v1.67.0
        github.com/mattn/go-colorable v0.1.14
        github.com/pterm/pterm v0.12.80
-       golang.org/x/net v0.39.0
-       golang.org/x/sys v0.32.0
+       golang.org/x/net v0.40.0
+       golang.org/x/sys v0.33.0
 )
 
 require (
@@ -22,6 +22,6 @@
        github.com/rivo/uniseg v0.4.7 // indirect
        github.com/stretchr/testify v1.9.0 // indirect
        github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
-       golang.org/x/term v0.31.0 // indirect
-       golang.org/x/text v0.24.0 // indirect
+       golang.org/x/term v0.32.0 // indirect
+       golang.org/x/text v0.25.0 // indirect
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/go.sum new/cli-2.40.7/go.sum
--- old/cli-2.40.5/go.sum       2025-04-26 17:39:36.000000000 +0200
+++ new/cli-2.40.7/go.sum       2025-05-10 18:05:39.000000000 +0200
@@ -80,8 +80,8 @@
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -96,22 +96,22 @@
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod 
h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
+golang.org/x/term v0.32.0/go.mod 
h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod 
h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod 
h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/install.ps1 new/cli-2.40.7/install.ps1
--- old/cli-2.40.5/install.ps1  2025-04-26 17:39:36.000000000 +0200
+++ new/cli-2.40.7/install.ps1  2025-05-10 18:05:39.000000000 +0200
@@ -78,7 +78,7 @@
         $targetVersion = $v
       }
       else {
-        Write-Warning -Message "You have spicefied an invalid spicetify 
version: $v `nThe version must be in the following format: 1.2.3"
+        Write-Warning -Message "You have specified an invalid spicetify 
version: $v `nThe version must be in the following format: 1.2.3"
         Pause
         exit
       }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.40.5/src/preprocess/preprocess.go 
new/cli-2.40.7/src/preprocess/preprocess.go
--- old/cli-2.40.5/src/preprocess/preprocess.go 2025-04-26 17:39:36.000000000 
+0200
+++ new/cli-2.40.7/src/preprocess/preprocess.go 2025-05-10 18:05:39.000000000 
+0200
@@ -145,7 +145,7 @@
                                        embeddedString, _, _, err := 
utils.ReadStringFromUTF16Binary(binFilePath, startMarker, endMarker)
                                        if err != nil {
                                                
utils.PrintWarning(fmt.Sprintf("Could not process %s: %v", binFilePath, err))
-                                               utils.PrintInfo("You can ignore 
this warning if you're on a Spotify version that didn't yet add xpui modules to 
the V8 snapshot")
+                                               utils.PrintInfo("If above 
warning says 'could not find start marker', you can safely ignore that error. 
It's for the future spotify release that might add xpui to the snapshot.")
                                                continue
                                        }
 
@@ -214,6 +214,8 @@
                                        case "vendor~xpui.js":
                                                content = 
exposeAPIs_vendor(content, printPatch)
                                        }
+
+                                       content = exposeGraphQL(content, 
printPatch)
                                }
                                printPatch("CSS (JS): Patching our mappings 
into file")
                                for k, v := range cssTranslationMap {
@@ -796,6 +798,27 @@
        return applyPatches(input, rtlPatches)
 }
 
+func exposeGraphQL(input string, report logPatch) string {
+       graphQLPatches := []Patch{
+               {
+                       Name:  "GraphQL definitions (<=1.2.30)",
+                       Regex: `((?:\w+ 
?)?[\w$]+=)(\{kind:"Document",definitions:\[\{(?:\w+:[\w"]+,)+name:\{(?:\w+:[\w"]+,?)+value:("\w+"))`,
+                       Replacement: func(submatches ...string) string {
+                               return 
fmt.Sprintf("%sSpicetify.GraphQL.Definitions[%s]=%s", submatches[1], 
submatches[3], submatches[2])
+                       },
+               },
+               {
+                       Name:  "GraphQL definitons (>=1.2.31)",
+                       Regex: `(=new 
[\w_\$][\w_\$\d]*\.[\w_\$][\w_\$\d]*\("(\w+)","(query|mutation)","[\w\d]{64}",null\))`,
+                       Replacement: func(submatches ...string) string {
+                               return 
fmt.Sprintf(`=Spicetify.GraphQL.Definitions["%s"]%s`, submatches[2], 
submatches[1])
+                       },
+               },
+       }
+
+       return applyPatches(input, graphQLPatches, report)
+}
+
 func exposeAPIs_main(input string, report logPatch) string {
        inputContextMenu := utils.FindFirstMatch(input, `.*value:"contextmenu"`)
        if len(inputContextMenu) > 0 {
@@ -881,20 +904,6 @@
                        },
                },
                {
-                       Name:  "GraphQL definitions (<=1.2.30)",
-                       Regex: `((?:\w+ 
?)?[\w$]+=)(\{kind:"Document",definitions:\[\{(?:\w+:[\w"]+,)+name:\{(?:\w+:[\w"]+,?)+value:("\w+"))`,
-                       Replacement: func(submatches ...string) string {
-                               return 
fmt.Sprintf("%sSpicetify.GraphQL.Definitions[%s]=%s", submatches[1], 
submatches[3], submatches[2])
-                       },
-               },
-               {
-                       Name:  "GraphQL definitons (>=1.2.31)",
-                       Regex: `(=new 
[\w_\$][\w_\$\d]*\.[\w_\$][\w_\$\d]*\("(\w+)","(query|mutation)","[\w\d]{64}",null\))`,
-                       Replacement: func(submatches ...string) string {
-                               return 
fmt.Sprintf(`=Spicetify.GraphQL.Definitions["%s"]%s`, submatches[2], 
submatches[1])
-                       },
-               },
-               {
                        Name:  "Spotify Custom Snackbar Interfaces (<=1.2.37)",
                        Regex: 
`\b\w\s*\(\)\s*[^;,]*enqueueCustomSnackbar:\s*(\w)\s*[^;]*;`,
                        Replacement: func(submatches ...string) string {

++++++ cli.obsinfo ++++++
--- /var/tmp/diff_new_pack.jcuW9J/_old  2025-05-12 16:56:09.058961758 +0200
+++ /var/tmp/diff_new_pack.jcuW9J/_new  2025-05-12 16:56:09.062961926 +0200
@@ -1,5 +1,5 @@
 name: cli
-version: 2.40.5
-mtime: 1745681976
-commit: 8860f1b8d8a6a62056456b1f43d1cca71fdd2813
+version: 2.40.7
+mtime: 1746893139
+commit: 68f41d51303ed690e2fb0cf077350ffc512080d8
 

++++++ vendor.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/security_windows.go 
new/vendor/golang.org/x/sys/windows/security_windows.go
--- old/vendor/golang.org/x/sys/windows/security_windows.go     2025-04-26 
17:39:36.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/security_windows.go     2025-05-10 
18:05:39.000000000 +0200
@@ -1303,7 +1303,10 @@
                return nil, err
        }
        if absoluteSDSize > 0 {
-               absoluteSD = 
(*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0]))
+               absoluteSD = new(SECURITY_DESCRIPTOR)
+               if unsafe.Sizeof(*absoluteSD) < uintptr(absoluteSDSize) {
+                       panic("sizeof(SECURITY_DESCRIPTOR) too small")
+               }
        }
        var (
                dacl  *ACL
@@ -1312,19 +1315,55 @@
                group *SID
        )
        if daclSize > 0 {
-               dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0]))
+               dacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, 
daclSize))))
        }
        if saclSize > 0 {
-               sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0]))
+               sacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, 
saclSize))))
        }
        if ownerSize > 0 {
-               owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0]))
+               owner = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, 
ownerSize))))
        }
        if groupSize > 0 {
-               group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0]))
+               group = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, 
groupSize))))
        }
+       // We call into Windows via makeAbsoluteSD, which sets up
+       // pointers within absoluteSD that point to other chunks of memory
+       // we pass into makeAbsoluteSD, and that happens outside the view of 
the GC.
+       // We therefore take some care here to then verify the pointers are as 
we expect
+       // and set them explicitly in view of the GC. See 
https://go.dev/issue/73199.
+       // TODO: consider weak pointers once Go 1.24 is appropriate. See 
suggestion in https://go.dev/cl/663575.
        err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize,
                dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, 
&groupSize)
+       if err != nil {
+               // Don't return absoluteSD, which might be partially 
initialized.
+               return nil, err
+       }
+       // Before using any fields, verify absoluteSD is in the format we 
expect according to Windows.
+       // See 
https://learn.microsoft.com/en-us/windows/win32/secauthz/absolute-and-self-relative-security-descriptors
+       absControl, _, err := absoluteSD.Control()
+       if err != nil {
+               panic("absoluteSD: " + err.Error())
+       }
+       if absControl&SE_SELF_RELATIVE != 0 {
+               panic("absoluteSD not in absolute format")
+       }
+       if absoluteSD.dacl != dacl {
+               panic("dacl pointer mismatch")
+       }
+       if absoluteSD.sacl != sacl {
+               panic("sacl pointer mismatch")
+       }
+       if absoluteSD.owner != owner {
+               panic("owner pointer mismatch")
+       }
+       if absoluteSD.group != group {
+               panic("group pointer mismatch")
+       }
+       absoluteSD.dacl = dacl
+       absoluteSD.sacl = sacl
+       absoluteSD.owner = owner
+       absoluteSD.group = group
+
        return
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/syscall_windows.go 
new/vendor/golang.org/x/sys/windows/syscall_windows.go
--- old/vendor/golang.org/x/sys/windows/syscall_windows.go      2025-04-26 
17:39:36.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/syscall_windows.go      2025-05-10 
18:05:39.000000000 +0200
@@ -870,6 +870,7 @@
 //sys  WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags 
*uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, 
croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
 //sys  WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags 
uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine 
*byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
 //sys  WSASocket(af int32, typ int32, protocol int32, protoInfo 
*WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) 
[failretval==InvalidHandle] = ws2_32.WSASocketW
+//sys  WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) 
(err error) [failretval!=0] = ws2_32.WSADuplicateSocketW
 //sys  GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = 
ws2_32.gethostbyname
 //sys  GetServByName(name string, proto string) (s *Servent, err error) 
[failretval==nil] = ws2_32.getservbyname
 //sys  Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
@@ -1698,8 +1699,9 @@
 
 // Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
 func (s *NTUnicodeString) Slice() []uint16 {
-       slice := unsafe.Slice(s.Buffer, s.MaximumLength)
-       return slice[:s.Length]
+       // Note: this rounds the length down, if it happens
+       // to (incorrectly) be odd. Probably safer than rounding up.
+       return unsafe.Slice(s.Buffer, s.MaximumLength/2)[:s.Length/2]
 }
 
 func (s *NTUnicodeString) String() string {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/types_windows.go 
new/vendor/golang.org/x/sys/windows/types_windows.go
--- old/vendor/golang.org/x/sys/windows/types_windows.go        2025-04-26 
17:39:36.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/types_windows.go        2025-05-10 
18:05:39.000000000 +0200
@@ -2700,6 +2700,8 @@
 
 // NTUnicodeString is a UTF-16 string for NT native APIs, corresponding to 
UNICODE_STRING.
 type NTUnicodeString struct {
+       // Note: Length and MaximumLength are in *bytes*, not uint16s.
+       // They should always be even.
        Length        uint16
        MaximumLength uint16
        Buffer        *uint16
@@ -3628,3 +3630,213 @@
        KLF_NOTELLSHELL   = 0x00000080
        KLF_SETFORPROCESS = 0x00000100
 )
+
+// Virtual Key codes
+// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
+const (
+       VK_LBUTTON             = 0x01
+       VK_RBUTTON             = 0x02
+       VK_CANCEL              = 0x03
+       VK_MBUTTON             = 0x04
+       VK_XBUTTON1            = 0x05
+       VK_XBUTTON2            = 0x06
+       VK_BACK                = 0x08
+       VK_TAB                 = 0x09
+       VK_CLEAR               = 0x0C
+       VK_RETURN              = 0x0D
+       VK_SHIFT               = 0x10
+       VK_CONTROL             = 0x11
+       VK_MENU                = 0x12
+       VK_PAUSE               = 0x13
+       VK_CAPITAL             = 0x14
+       VK_KANA                = 0x15
+       VK_HANGEUL             = 0x15
+       VK_HANGUL              = 0x15
+       VK_IME_ON              = 0x16
+       VK_JUNJA               = 0x17
+       VK_FINAL               = 0x18
+       VK_HANJA               = 0x19
+       VK_KANJI               = 0x19
+       VK_IME_OFF             = 0x1A
+       VK_ESCAPE              = 0x1B
+       VK_CONVERT             = 0x1C
+       VK_NONCONVERT          = 0x1D
+       VK_ACCEPT              = 0x1E
+       VK_MODECHANGE          = 0x1F
+       VK_SPACE               = 0x20
+       VK_PRIOR               = 0x21
+       VK_NEXT                = 0x22
+       VK_END                 = 0x23
+       VK_HOME                = 0x24
+       VK_LEFT                = 0x25
+       VK_UP                  = 0x26
+       VK_RIGHT               = 0x27
+       VK_DOWN                = 0x28
+       VK_SELECT              = 0x29
+       VK_PRINT               = 0x2A
+       VK_EXECUTE             = 0x2B
+       VK_SNAPSHOT            = 0x2C
+       VK_INSERT              = 0x2D
+       VK_DELETE              = 0x2E
+       VK_HELP                = 0x2F
+       VK_LWIN                = 0x5B
+       VK_RWIN                = 0x5C
+       VK_APPS                = 0x5D
+       VK_SLEEP               = 0x5F
+       VK_NUMPAD0             = 0x60
+       VK_NUMPAD1             = 0x61
+       VK_NUMPAD2             = 0x62
+       VK_NUMPAD3             = 0x63
+       VK_NUMPAD4             = 0x64
+       VK_NUMPAD5             = 0x65
+       VK_NUMPAD6             = 0x66
+       VK_NUMPAD7             = 0x67
+       VK_NUMPAD8             = 0x68
+       VK_NUMPAD9             = 0x69
+       VK_MULTIPLY            = 0x6A
+       VK_ADD                 = 0x6B
+       VK_SEPARATOR           = 0x6C
+       VK_SUBTRACT            = 0x6D
+       VK_DECIMAL             = 0x6E
+       VK_DIVIDE              = 0x6F
+       VK_F1                  = 0x70
+       VK_F2                  = 0x71
+       VK_F3                  = 0x72
+       VK_F4                  = 0x73
+       VK_F5                  = 0x74
+       VK_F6                  = 0x75
+       VK_F7                  = 0x76
+       VK_F8                  = 0x77
+       VK_F9                  = 0x78
+       VK_F10                 = 0x79
+       VK_F11                 = 0x7A
+       VK_F12                 = 0x7B
+       VK_F13                 = 0x7C
+       VK_F14                 = 0x7D
+       VK_F15                 = 0x7E
+       VK_F16                 = 0x7F
+       VK_F17                 = 0x80
+       VK_F18                 = 0x81
+       VK_F19                 = 0x82
+       VK_F20                 = 0x83
+       VK_F21                 = 0x84
+       VK_F22                 = 0x85
+       VK_F23                 = 0x86
+       VK_F24                 = 0x87
+       VK_NUMLOCK             = 0x90
+       VK_SCROLL              = 0x91
+       VK_OEM_NEC_EQUAL       = 0x92
+       VK_OEM_FJ_JISHO        = 0x92
+       VK_OEM_FJ_MASSHOU      = 0x93
+       VK_OEM_FJ_TOUROKU      = 0x94
+       VK_OEM_FJ_LOYA         = 0x95
+       VK_OEM_FJ_ROYA         = 0x96
+       VK_LSHIFT              = 0xA0
+       VK_RSHIFT              = 0xA1
+       VK_LCONTROL            = 0xA2
+       VK_RCONTROL            = 0xA3
+       VK_LMENU               = 0xA4
+       VK_RMENU               = 0xA5
+       VK_BROWSER_BACK        = 0xA6
+       VK_BROWSER_FORWARD     = 0xA7
+       VK_BROWSER_REFRESH     = 0xA8
+       VK_BROWSER_STOP        = 0xA9
+       VK_BROWSER_SEARCH      = 0xAA
+       VK_BROWSER_FAVORITES   = 0xAB
+       VK_BROWSER_HOME        = 0xAC
+       VK_VOLUME_MUTE         = 0xAD
+       VK_VOLUME_DOWN         = 0xAE
+       VK_VOLUME_UP           = 0xAF
+       VK_MEDIA_NEXT_TRACK    = 0xB0
+       VK_MEDIA_PREV_TRACK    = 0xB1
+       VK_MEDIA_STOP          = 0xB2
+       VK_MEDIA_PLAY_PAUSE    = 0xB3
+       VK_LAUNCH_MAIL         = 0xB4
+       VK_LAUNCH_MEDIA_SELECT = 0xB5
+       VK_LAUNCH_APP1         = 0xB6
+       VK_LAUNCH_APP2         = 0xB7
+       VK_OEM_1               = 0xBA
+       VK_OEM_PLUS            = 0xBB
+       VK_OEM_COMMA           = 0xBC
+       VK_OEM_MINUS           = 0xBD
+       VK_OEM_PERIOD          = 0xBE
+       VK_OEM_2               = 0xBF
+       VK_OEM_3               = 0xC0
+       VK_OEM_4               = 0xDB
+       VK_OEM_5               = 0xDC
+       VK_OEM_6               = 0xDD
+       VK_OEM_7               = 0xDE
+       VK_OEM_8               = 0xDF
+       VK_OEM_AX              = 0xE1
+       VK_OEM_102             = 0xE2
+       VK_ICO_HELP            = 0xE3
+       VK_ICO_00              = 0xE4
+       VK_PROCESSKEY          = 0xE5
+       VK_ICO_CLEAR           = 0xE6
+       VK_OEM_RESET           = 0xE9
+       VK_OEM_JUMP            = 0xEA
+       VK_OEM_PA1             = 0xEB
+       VK_OEM_PA2             = 0xEC
+       VK_OEM_PA3             = 0xED
+       VK_OEM_WSCTRL          = 0xEE
+       VK_OEM_CUSEL           = 0xEF
+       VK_OEM_ATTN            = 0xF0
+       VK_OEM_FINISH          = 0xF1
+       VK_OEM_COPY            = 0xF2
+       VK_OEM_AUTO            = 0xF3
+       VK_OEM_ENLW            = 0xF4
+       VK_OEM_BACKTAB         = 0xF5
+       VK_ATTN                = 0xF6
+       VK_CRSEL               = 0xF7
+       VK_EXSEL               = 0xF8
+       VK_EREOF               = 0xF9
+       VK_PLAY                = 0xFA
+       VK_ZOOM                = 0xFB
+       VK_NONAME              = 0xFC
+       VK_PA1                 = 0xFD
+       VK_OEM_CLEAR           = 0xFE
+)
+
+// Mouse button constants.
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+       FROM_LEFT_1ST_BUTTON_PRESSED = 0x0001
+       RIGHTMOST_BUTTON_PRESSED     = 0x0002
+       FROM_LEFT_2ND_BUTTON_PRESSED = 0x0004
+       FROM_LEFT_3RD_BUTTON_PRESSED = 0x0008
+       FROM_LEFT_4TH_BUTTON_PRESSED = 0x0010
+)
+
+// Control key state constaints.
+// https://docs.microsoft.com/en-us/windows/console/key-event-record-str
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+       CAPSLOCK_ON        = 0x0080
+       ENHANCED_KEY       = 0x0100
+       LEFT_ALT_PRESSED   = 0x0002
+       LEFT_CTRL_PRESSED  = 0x0008
+       NUMLOCK_ON         = 0x0020
+       RIGHT_ALT_PRESSED  = 0x0001
+       RIGHT_CTRL_PRESSED = 0x0004
+       SCROLLLOCK_ON      = 0x0040
+       SHIFT_PRESSED      = 0x0010
+)
+
+// Mouse event record event flags.
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+       MOUSE_MOVED    = 0x0001
+       DOUBLE_CLICK   = 0x0002
+       MOUSE_WHEELED  = 0x0004
+       MOUSE_HWHEELED = 0x0008
+)
+
+// Input Record Event Types
+// https://learn.microsoft.com/en-us/windows/console/input-record-str
+const (
+       FOCUS_EVENT              = 0x0010
+       KEY_EVENT                = 0x0001
+       MENU_EVENT               = 0x0008
+       MOUSE_EVENT              = 0x0002
+       WINDOW_BUFFER_SIZE_EVENT = 0x0004
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/zsyscall_windows.go 
new/vendor/golang.org/x/sys/windows/zsyscall_windows.go
--- old/vendor/golang.org/x/sys/windows/zsyscall_windows.go     2025-04-26 
17:39:36.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/zsyscall_windows.go     2025-05-10 
18:05:39.000000000 +0200
@@ -511,6 +511,7 @@
        procFreeAddrInfoW                                        = 
modws2_32.NewProc("FreeAddrInfoW")
        procGetAddrInfoW                                         = 
modws2_32.NewProc("GetAddrInfoW")
        procWSACleanup                                           = 
modws2_32.NewProc("WSACleanup")
+       procWSADuplicateSocketW                                  = 
modws2_32.NewProc("WSADuplicateSocketW")
        procWSAEnumProtocolsW                                    = 
modws2_32.NewProc("WSAEnumProtocolsW")
        procWSAGetOverlappedResult                               = 
modws2_32.NewProc("WSAGetOverlappedResult")
        procWSAIoctl                                             = 
modws2_32.NewProc("WSAIoctl")
@@ -4389,6 +4390,14 @@
                err = errnoErr(e1)
        }
        return
+}
+
+func WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) 
(err error) {
+       r1, _, e1 := syscall.Syscall(procWSADuplicateSocketW.Addr(), 3, 
uintptr(s), uintptr(processID), uintptr(unsafe.Pointer(info)))
+       if r1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
 }
 
 func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, 
bufferLength *uint32) (n int32, err error) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/term/terminal.go 
new/vendor/golang.org/x/term/terminal.go
--- old/vendor/golang.org/x/term/terminal.go    2025-04-26 17:39:36.000000000 
+0200
+++ new/vendor/golang.org/x/term/terminal.go    2025-05-10 18:05:39.000000000 
+0200
@@ -6,6 +6,7 @@
 
 import (
        "bytes"
+       "fmt"
        "io"
        "runtime"
        "strconv"
@@ -36,6 +37,26 @@
        Reset: []byte{keyEscape, '[', '0', 'm'},
 }
 
+// A History provides a (possibly bounded) queue of input lines read by 
[Terminal.ReadLine].
+type History interface {
+       // Add will be called by [Terminal.ReadLine] to add
+       // a new, most recent entry to the history.
+       // It is allowed to drop any entry, including
+       // the entry being added (e.g., if it's deemed an invalid entry),
+       // the least-recent entry (e.g., to keep the history bounded),
+       // or any other entry.
+       Add(entry string)
+
+       // Len returns the number of entries in the history.
+       Len() int
+
+       // At returns an entry from the history.
+       // Index 0 is the most-recently added entry and
+       // index Len()-1 is the least-recently added entry.
+       // If index is < 0 or >= Len(), it panics.
+       At(idx int) string
+}
+
 // Terminal contains the state for running a VT100 terminal that is capable of
 // reading lines of input.
 type Terminal struct {
@@ -86,9 +107,14 @@
        remainder []byte
        inBuf     [256]byte
 
-       // history contains previously entered commands so that they can be
-       // accessed with the up and down keys.
-       history stRingBuffer
+       // History records and retrieves lines of input read by [ReadLine] which
+       // a user can retrieve and navigate using the up and down arrow keys.
+       //
+       // It is not safe to call ReadLine concurrently with any methods on 
History.
+       //
+       // [NewTerminal] sets this to a default implementation that records the
+       // last 100 lines of input.
+       History History
        // historyIndex stores the currently accessed history entry, where zero
        // means the immediately previous entry.
        historyIndex int
@@ -111,6 +137,7 @@
                termHeight:   24,
                echo:         true,
                historyIndex: -1,
+               History:      &stRingBuffer{},
        }
 }
 
@@ -450,6 +477,23 @@
        return length
 }
 
+// histroryAt unlocks the terminal and relocks it while calling History.At.
+func (t *Terminal) historyAt(idx int) (string, bool) {
+       t.lock.Unlock()     // Unlock to avoid deadlock if History methods use 
the output writer.
+       defer t.lock.Lock() // panic in At (or Len) protection.
+       if idx < 0 || idx >= t.History.Len() {
+               return "", false
+       }
+       return t.History.At(idx), true
+}
+
+// historyAdd unlocks the terminal and relocks it while calling History.Add.
+func (t *Terminal) historyAdd(entry string) {
+       t.lock.Unlock()     // Unlock to avoid deadlock if History methods use 
the output writer.
+       defer t.lock.Lock() // panic in Add protection.
+       t.History.Add(entry)
+}
+
 // handleKey processes the given key and, optionally, returns a line of text
 // that the user has entered.
 func (t *Terminal) handleKey(key rune) (line string, ok bool) {
@@ -497,7 +541,7 @@
                t.pos = len(t.line)
                t.moveCursorToPos(t.pos)
        case keyUp:
-               entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
+               entry, ok := t.historyAt(t.historyIndex + 1)
                if !ok {
                        return "", false
                }
@@ -516,7 +560,7 @@
                        t.setLine(runes, len(runes))
                        t.historyIndex--
                default:
-                       entry, ok := t.history.NthPreviousEntry(t.historyIndex 
- 1)
+                       entry, ok := t.historyAt(t.historyIndex - 1)
                        if ok {
                                t.historyIndex--
                                runes := []rune(entry)
@@ -781,7 +825,7 @@
                if lineOk {
                        if t.echo {
                                t.historyIndex = -1
-                               t.history.Add(line)
+                               t.historyAdd(line)
                        }
                        if lineIsPasted {
                                err = ErrPasteIndicator
@@ -938,19 +982,23 @@
        }
 }
 
-// NthPreviousEntry returns the value passed to the nth previous call to Add.
+func (s *stRingBuffer) Len() int {
+       return s.size
+}
+
+// At returns the value passed to the nth previous call to Add.
 // If n is zero then the immediately prior value is returned, if one, then the
 // next most recent, and so on. If such an element doesn't exist then ok is
 // false.
-func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
+func (s *stRingBuffer) At(n int) string {
        if n < 0 || n >= s.size {
-               return "", false
+               panic(fmt.Sprintf("term: history index [%d] out of range 
[0,%d)", n, s.size))
        }
        index := s.head - n
        if index < 0 {
                index += s.max
        }
-       return s.entries[index], true
+       return s.entries[index]
 }
 
 // readPasswordLine reads from reader until it finds \n or io.EOF.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt
--- old/vendor/modules.txt      2025-04-26 17:39:36.000000000 +0200
+++ new/vendor/modules.txt      2025-05-10 18:05:39.000000000 +0200
@@ -42,18 +42,18 @@
 # github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e
 ## explicit; go 1.19
 github.com/xo/terminfo
-# golang.org/x/net v0.39.0
+# golang.org/x/net v0.40.0
 ## explicit; go 1.23.0
 golang.org/x/net/websocket
-# golang.org/x/sys v0.32.0
+# golang.org/x/sys v0.33.0
 ## explicit; go 1.23.0
 golang.org/x/sys/plan9
 golang.org/x/sys/unix
 golang.org/x/sys/windows
-# golang.org/x/term v0.31.0
+# golang.org/x/term v0.32.0
 ## explicit; go 1.23.0
 golang.org/x/term
-# golang.org/x/text v0.24.0
+# golang.org/x/text v0.25.0
 ## explicit; go 1.23.0
 golang.org/x/text/cases
 golang.org/x/text/internal

Reply via email to