Skip to content

Commit 930a767

Browse files
Merge pull request #310 from ibuildthecloud/main
bug: check for very specific #! on line 1
2 parents 52d6974 + 2b366a5 commit 930a767

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

pkg/parser/parser.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,30 @@ func Parse(input io.Reader, opts ...Options) (Document, error) {
339339
}, nil
340340
}
341341

342+
func isGPTScriptHashBang(line string) bool {
343+
if !strings.HasPrefix(line, "#!") {
344+
return false
345+
}
346+
347+
parts := strings.Fields(line)
348+
349+
// Very specific lines we are looking for
350+
// 1. #!gptscript
351+
// 2. #!/usr/bin/env gptscript
352+
// 3. #!/bin/env gptscript
353+
354+
if parts[0] == "#!gptscript" {
355+
return true
356+
}
357+
358+
if len(parts) > 1 && (parts[0] == "#!/usr/bin/env" || parts[0] == "#!/bin/env") &&
359+
parts[1] == "gptscript" {
360+
return true
361+
}
362+
363+
return false
364+
}
365+
342366
func parse(input io.Reader) ([]Node, error) {
343367
scan := bufio.NewScanner(input)
344368

@@ -373,7 +397,7 @@ func parse(input io.Reader) ([]Node, error) {
373397

374398
if !context.inBody {
375399
// If the very first line is #! just skip because this is a unix interpreter declaration
376-
if strings.HasPrefix(line, "#!") && lineNo == 1 {
400+
if lineNo == 1 && isGPTScriptHashBang(line) {
377401
continue
378402
}
379403

pkg/parser/parser_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12+
func TestHashBang(t *testing.T) {
13+
autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!/usr/bin/env gptscript"))
14+
autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!/bin/env gptscript"))
15+
autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!gptscript"))
16+
17+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("/usr/bin/env gptscript"))
18+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("/bin/env gptscript"))
19+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("gptscript"))
20+
21+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!/sr/bin/env gptscript"))
22+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!/bin/env gpscript"))
23+
autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!gptscrip"))
24+
}
25+
1226
func TestParseGlobals(t *testing.T) {
1327
var input = `
1428
global tools: foo, bar

0 commit comments

Comments
 (0)