diff options
| author | Teddy Wing | 2020-12-20 17:15:11 +0100 | 
|---|---|---|
| committer | Teddy Wing | 2020-12-20 17:18:40 +0100 | 
| commit | 85df0594be312307ea33086583f590283f828c09 (patch) | |
| tree | 2470ad8f5fde1abcba23eb4b321bcdba54c8f60e | |
| parent | 2b67d0904096d00fbfa4ca7e7ea82a4f51055b45 (diff) | |
| download | browserenv-85df0594be312307ea33086583f590283f828c09.tar.bz2 | |
Support multiple colon-separated commands in `BROWSER`
After reading the `urlview` man page, I learned that it supports
multiple commands in the `BROWSER` environment variable separated by
colons.
Read over the source to see what `urlview` does:
https://github.com/sigpipe/urlview/blob/08767aa863cd27d1755ba0aff65b8cc1a0c1446a/urlview.c#L617-L630
It tries each command from left to right until one of them exits with a
`0` exit code. Use the same logic here.
| -rw-r--r-- | browserenv.go | 20 | ||||
| -rw-r--r-- | browserenv_unix_test.go | 20 | 
2 files changed, 38 insertions, 2 deletions
| diff --git a/browserenv.go b/browserenv.go index f5a51ca..4edb032 100644 --- a/browserenv.go +++ b/browserenv.go @@ -17,6 +17,8 @@ var Stdout io.Writer = os.Stdout  var percentS = regexp.MustCompile("%s[[:^alpha:]]?") +const commandSeparator = ":" +  func OpenFile(path string) error {  	envCommand := envBrowserCommand()  	if envCommand != "" { @@ -67,8 +69,22 @@ func envBrowserCommand() string {  }  // TODO -func runBrowserCommand(command, url string) error { -	return browserCommand(command, url).Run() +func runBrowserCommand(commands, url string) error { +	commandList := strings.Split(commands, commandSeparator) + +	var err error +	for _, command := range commandList { +		cmd := browserCommand(command, url) + +		// Keep running commands from left to right until one of them exits +		// successfully. +		err = cmd.Run() +		if err == nil || cmd.ProcessState.ExitCode() == 0 { +			return err +		} +	} + +	return err  }  // TODO diff --git a/browserenv_unix_test.go b/browserenv_unix_test.go index f79d31d..971454e 100644 --- a/browserenv_unix_test.go +++ b/browserenv_unix_test.go @@ -96,3 +96,23 @@ func TestOpenURLStderr(t *testing.T) {  		t.Errorf("got stdout value %q want %q", got, url)  	}  } + +func TestOpenURLMultipleBrowserCommands(t *testing.T) { +	// The `test -z URL` command must fail, causing `printf URL` to run. +	err := os.Setenv("BROWSER", "test -z:printf") +	if err != nil { +		t.Fatal(err) +	} + +	var stdout strings.Builder +	Stdout = &stdout + +	url := "http://localhost:8000" + +	OpenURL(url) + +	got := stdout.String() +	if got != url { +		t.Errorf("got stdout value %q want %q", got, url) +	} +} | 
