From 2b366a50944c343ad105b72d41691ef7492eabfd Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Thu, 2 May 2024 14:32:15 -0700 Subject: [PATCH] bug: check for very specific #! on line 1 1. #!gptscript 2. #!/usr/bin/env gptscript 3. #!/bin/env gptscript --- pkg/parser/parser.go | 26 +++++++++++++++++++++++++- pkg/parser/parser_test.go | 14 ++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 84226fba..99bc9e16 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -339,6 +339,30 @@ func Parse(input io.Reader, opts ...Options) (Document, error) { }, nil } +func isGPTScriptHashBang(line string) bool { + if !strings.HasPrefix(line, "#!") { + return false + } + + parts := strings.Fields(line) + + // Very specific lines we are looking for + // 1. #!gptscript + // 2. #!/usr/bin/env gptscript + // 3. #!/bin/env gptscript + + if parts[0] == "#!gptscript" { + return true + } + + if len(parts) > 1 && (parts[0] == "#!/usr/bin/env" || parts[0] == "#!/bin/env") && + parts[1] == "gptscript" { + return true + } + + return false +} + func parse(input io.Reader) ([]Node, error) { scan := bufio.NewScanner(input) @@ -373,7 +397,7 @@ func parse(input io.Reader) ([]Node, error) { if !context.inBody { // If the very first line is #! just skip because this is a unix interpreter declaration - if strings.HasPrefix(line, "#!") && lineNo == 1 { + if lineNo == 1 && isGPTScriptHashBang(line) { continue } diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go index 2f150aee..88fee31a 100644 --- a/pkg/parser/parser_test.go +++ b/pkg/parser/parser_test.go @@ -9,6 +9,20 @@ import ( "github.com/stretchr/testify/require" ) +func TestHashBang(t *testing.T) { + autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!/usr/bin/env gptscript")) + autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!/bin/env gptscript")) + autogold.Expect(true).Equal(t, isGPTScriptHashBang("#!gptscript")) + + autogold.Expect(false).Equal(t, isGPTScriptHashBang("/usr/bin/env gptscript")) + autogold.Expect(false).Equal(t, isGPTScriptHashBang("/bin/env gptscript")) + autogold.Expect(false).Equal(t, isGPTScriptHashBang("gptscript")) + + autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!/sr/bin/env gptscript")) + autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!/bin/env gpscript")) + autogold.Expect(false).Equal(t, isGPTScriptHashBang("#!gptscrip")) +} + func TestParseGlobals(t *testing.T) { var input = ` global tools: foo, bar