Skip to content

Commit c378de2

Browse files
authored
Merge pull request #692 from drpebcak/win-bash
2 parents b77cd13 + 806fdc3 commit c378de2

35 files changed

+863
-65
lines changed

go.mod

+6-6
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ require (
3333
github.com/xeipuuv/gojsonschema v1.2.0
3434
golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc
3535
golang.org/x/sync v0.7.0
36-
golang.org/x/term v0.20.0
36+
golang.org/x/term v0.22.0
3737
gopkg.in/yaml.v3 v3.0.1
3838
gotest.tools/v3 v3.5.1
3939
sigs.k8s.io/yaml v1.4.0
@@ -108,10 +108,10 @@ require (
108108
github.com/yuin/goldmark v1.5.4 // indirect
109109
github.com/yuin/goldmark-emoji v1.0.2 // indirect
110110
go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
111-
golang.org/x/mod v0.17.0 // indirect
112-
golang.org/x/net v0.24.0 // indirect
113-
golang.org/x/sys v0.20.0 // indirect
114-
golang.org/x/text v0.15.0 // indirect
115-
golang.org/x/tools v0.20.0 // indirect
111+
golang.org/x/mod v0.19.0 // indirect
112+
golang.org/x/net v0.27.0 // indirect
113+
golang.org/x/sys v0.22.0 // indirect
114+
golang.org/x/text v0.16.0 // indirect
115+
golang.org/x/tools v0.23.0 // indirect
116116
mvdan.cc/gofumpt v0.6.0 // indirect
117117
)

go.sum

+12-12
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
396396
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
397397
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
398398
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
399-
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
400-
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
399+
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
400+
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
401401
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
402402
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
403403
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -419,8 +419,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
419419
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
420420
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
421421
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
422-
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
423-
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
422+
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
423+
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
424424
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
425425
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
426426
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -474,8 +474,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
474474
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
475475
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
476476
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
477-
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
478-
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
477+
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
478+
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
479479
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
480480
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
481481
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -485,8 +485,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
485485
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
486486
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
487487
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
488-
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
489-
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
488+
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
489+
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
490490
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
491491
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
492492
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -498,8 +498,8 @@ golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
498498
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
499499
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
500500
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
501-
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
502-
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
501+
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
502+
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
503503
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
504504
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
505505
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -531,8 +531,8 @@ golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
531531
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
532532
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
533533
golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
534-
golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
535-
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
534+
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
535+
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
536536
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
537537
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
538538
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

integration/scripts/cred_scopes.gpt

+2-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ name: getcred
149149
import os
150150
import json
151151

152-
var = os.getenv('var')
153-
val = os.getenv('val')
152+
var = os.getenv('VAR')
153+
val = os.getenv('VAL')
154154

155155
output = {
156156
"env": {

pkg/engine/cmd.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"io"
1111
"os"
1212
"os/exec"
13+
"path"
1314
"path/filepath"
1415
"runtime"
1516
"sort"
@@ -203,10 +204,8 @@ var ignoreENV = map[string]struct{}{
203204
}
204205

205206
func appendEnv(envs []string, k, v string) []string {
206-
for _, k := range []string{k, env.ToEnvLike(k)} {
207-
if _, ignore := ignoreENV[k]; !ignore {
208-
envs = append(envs, k+"="+v)
209-
}
207+
if _, ignore := ignoreENV[k]; !ignore {
208+
envs = append(envs, strings.ToUpper(env.ToEnvLike(k))+"="+v)
210209
}
211210
return envs
212211
}
@@ -269,6 +268,10 @@ func (e *Engine) newCommand(ctx context.Context, extraEnv []string, tool types.T
269268
})
270269
}
271270

271+
if runtime.GOOS == "windows" && (args[0] == "/bin/bash" || args[0] == "/bin/sh") {
272+
args[0] = path.Base(args[0])
273+
}
274+
272275
if runtime.GOOS == "windows" && (args[0] == "/usr/bin/env" || args[0] == "/bin/env") {
273276
args = args[1:]
274277
}
@@ -279,7 +282,7 @@ func (e *Engine) newCommand(ctx context.Context, extraEnv []string, tool types.T
279282
)
280283

281284
if strings.TrimSpace(rest) != "" {
282-
f, err := os.CreateTemp("", version.ProgramName+requiredFileExtensions[args[0]])
285+
f, err := os.CreateTemp(env.Getenv("GPTSCRIPT_TMPDIR", envvars), version.ProgramName+requiredFileExtensions[args[0]])
283286
if err != nil {
284287
return nil, nil, err
285288
}

pkg/env/env.go

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ func ToEnvLike(v string) string {
2626
return strings.ToUpper(v)
2727
}
2828

29+
func Getenv(key string, envs []string) string {
30+
for i := len(envs) - 1; i >= 0; i-- {
31+
if k, v, ok := strings.Cut(envs[i], "="); ok && k == key {
32+
return v
33+
}
34+
}
35+
return ""
36+
}
37+
2938
func Matches(cmd []string, bin string) bool {
3039
switch len(cmd) {
3140
case 0:

pkg/parser/parser.go

+39-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
var (
1717
sepRegex = regexp.MustCompile(`^\s*---+\s*$`)
1818
strictSepRegex = regexp.MustCompile(`^---\n$`)
19-
skipRegex = regexp.MustCompile(`^![-\w]+\s*$`)
19+
skipRegex = regexp.MustCompile(`^![-.:\w]+\s*$`)
2020
)
2121

2222
func normalize(key string) string {
@@ -308,6 +308,8 @@ func Parse(input io.Reader, opts ...Options) (Document, error) {
308308
}
309309
}
310310

311+
nodes = assignMetadata(nodes)
312+
311313
if !opt.AssignGlobals {
312314
return Document{
313315
Nodes: nodes,
@@ -359,6 +361,42 @@ func Parse(input io.Reader, opts ...Options) (Document, error) {
359361
}, nil
360362
}
361363

364+
func assignMetadata(nodes []Node) (result []Node) {
365+
metadata := map[string]map[string]string{}
366+
result = make([]Node, 0, len(nodes))
367+
for _, node := range nodes {
368+
if node.TextNode != nil {
369+
body, ok := strings.CutPrefix(node.TextNode.Text, "!metadata:")
370+
if ok {
371+
line, rest, ok := strings.Cut(body, "\n")
372+
if ok {
373+
toolName, metaKey, ok := strings.Cut(strings.TrimSpace(line), ":")
374+
if ok {
375+
d, ok := metadata[toolName]
376+
if !ok {
377+
d = map[string]string{}
378+
metadata[toolName] = d
379+
}
380+
d[metaKey] = strings.TrimSpace(rest)
381+
}
382+
}
383+
}
384+
}
385+
}
386+
if len(metadata) == 0 {
387+
return nodes
388+
}
389+
390+
for _, node := range nodes {
391+
if node.ToolNode != nil {
392+
node.ToolNode.Tool.MetaData = metadata[node.ToolNode.Tool.Name]
393+
}
394+
result = append(result, node)
395+
}
396+
397+
return
398+
}
399+
362400
func isGPTScriptHashBang(line string) bool {
363401
if !strings.HasPrefix(line, "#!") {
364402
return false

pkg/parser/parser_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/gptscript-ai/gptscript/pkg/types"
88
"github.com/hexops/autogold/v2"
9+
"github.com/stretchr/testify/assert"
910
"github.com/stretchr/testify/require"
1011
)
1112

@@ -239,3 +240,31 @@ share output filters: shared
239240
}},
240241
}}).Equal(t, out)
241242
}
243+
244+
func TestParseMetaData(t *testing.T) {
245+
input := `
246+
name: first
247+
248+
body
249+
---
250+
!metadata:first:package.json
251+
foo=base
252+
f
253+
254+
---
255+
!metadata:first2:requirements.txt
256+
asdf2
257+
258+
---
259+
!metadata:first:requirements.txt
260+
asdf
261+
`
262+
tools, err := ParseTools(strings.NewReader(input))
263+
require.NoError(t, err)
264+
265+
assert.Len(t, tools, 1)
266+
autogold.Expect(map[string]string{
267+
"package.json": "foo=base\nf",
268+
"requirements.txt": "asdf",
269+
}).Equal(t, tools[0].MetaData)
270+
}

pkg/repos/download/extract.go

+14
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
99
"net/http"
1010
"net/url"
1111
"os"
12+
"path"
1213
"path/filepath"
14+
"strings"
1315
"time"
1416

1517
"github.com/mholt/archiver/v4"
@@ -60,6 +62,18 @@ func Extract(ctx context.Context, downloadURL, digest, targetDir string) error {
6062
return err
6163
}
6264

65+
bin := path.Base(parsedURL.Path)
66+
if strings.HasSuffix(bin, ".exe") {
67+
dst, err := os.Create(filepath.Join(targetDir, bin))
68+
if err != nil {
69+
return err
70+
}
71+
defer dst.Close()
72+
73+
_, err = io.Copy(dst, tmpFile)
74+
return err
75+
}
76+
6377
format, input, err := archiver.Identify(filepath.Base(parsedURL.Path), tmpFile)
6478
if err != nil {
6579
return err

pkg/repos/get.go

+30-13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/BurntSushi/locker"
1616
"github.com/gptscript-ai/gptscript/pkg/config"
1717
"github.com/gptscript-ai/gptscript/pkg/credentials"
18+
"github.com/gptscript-ai/gptscript/pkg/hash"
1819
"github.com/gptscript-ai/gptscript/pkg/loader/github"
1920
"github.com/gptscript-ai/gptscript/pkg/repos/git"
2021
"github.com/gptscript-ai/gptscript/pkg/repos/runtimes/golang"
@@ -25,8 +26,8 @@ const credentialHelpersRepo = "github.com/gptscript-ai/gptscript-credential-help
2526

2627
type Runtime interface {
2728
ID() string
28-
Supports(cmd []string) bool
29-
Setup(ctx context.Context, dataRoot, toolSource string, env []string) ([]string, error)
29+
Supports(tool types.Tool, cmd []string) bool
30+
Setup(ctx context.Context, tool types.Tool, dataRoot, toolSource string, env []string) ([]string, error)
3031
}
3132

3233
type noopRuntime struct {
@@ -36,11 +37,11 @@ func (n noopRuntime) ID() string {
3637
return "none"
3738
}
3839

39-
func (n noopRuntime) Supports(_ []string) bool {
40+
func (n noopRuntime) Supports(_ types.Tool, _ []string) bool {
4041
return false
4142
}
4243

43-
func (n noopRuntime) Setup(_ context.Context, _, _ string, _ []string) ([]string, error) {
44+
func (n noopRuntime) Setup(_ context.Context, _ types.Tool, _, _ string, _ []string) ([]string, error) {
4445
return nil, nil
4546
}
4647

@@ -200,11 +201,17 @@ func (m *Manager) setup(ctx context.Context, runtime Runtime, tool types.Tool, e
200201
_ = os.RemoveAll(doneFile)
201202
_ = os.RemoveAll(target)
202203

203-
if err := git.Checkout(ctx, m.gitDir, tool.Source.Repo.Root, tool.Source.Repo.Revision, target); err != nil {
204-
return "", nil, err
204+
if tool.Source.Repo.VCS == "git" {
205+
if err := git.Checkout(ctx, m.gitDir, tool.Source.Repo.Root, tool.Source.Repo.Revision, target); err != nil {
206+
return "", nil, err
207+
}
208+
} else {
209+
if err := os.MkdirAll(target, 0755); err != nil {
210+
return "", nil, err
211+
}
205212
}
206213

207-
newEnv, err := runtime.Setup(ctx, m.runtimeDir, targetFinal, env)
214+
newEnv, err := runtime.Setup(ctx, tool, m.runtimeDir, targetFinal, env)
208215
if err != nil {
209216
return "", nil, err
210217
}
@@ -227,20 +234,30 @@ func (m *Manager) setup(ctx context.Context, runtime Runtime, tool types.Tool, e
227234
}
228235

229236
func (m *Manager) GetContext(ctx context.Context, tool types.Tool, cmd, env []string) (string, []string, error) {
237+
var isLocal bool
230238
if tool.Source.Repo == nil {
231-
return tool.WorkingDir, env, nil
232-
}
233-
234-
if tool.Source.Repo.VCS != "git" {
235-
return "", nil, fmt.Errorf("only git is supported, found VCS %s for %s", tool.Source.Repo.VCS, tool.ID)
239+
isLocal = true
240+
d, _ := json.Marshal(tool)
241+
id := hash.Digest(d)[:12]
242+
tool.Source.Repo = &types.Repo{
243+
VCS: "<local>",
244+
Root: id,
245+
Path: "/",
246+
Name: id,
247+
Revision: id,
248+
}
236249
}
237250

238251
for _, runtime := range m.runtimes {
239-
if runtime.Supports(cmd) {
252+
if runtime.Supports(tool, cmd) {
240253
log.Debugf("Runtime %s supports %v", runtime.ID(), cmd)
241254
return m.setup(ctx, runtime, tool, env)
242255
}
243256
}
244257

258+
if isLocal {
259+
return tool.WorkingDir, env, nil
260+
}
261+
245262
return m.setup(ctx, &noopRuntime{}, tool, env)
246263
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6d2dfd1c1412c3550a89071a1b36a6f6073844320e687343d1dfc72719ecb8d9 FRP-5301-gda71f7c57/busybox-w64-FRP-5301-gda71f7c57.exe

0 commit comments

Comments
 (0)