diff --git a/go.mod b/go.mod index d7f2731..536e447 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,8 @@ module github.com/kitproj/diff-server go 1.24.4 + +require ( + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + golang.org/x/sys v0.1.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7513caf --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go index e4ae3f6..54d23fa 100644 --- a/main.go +++ b/main.go @@ -3,13 +3,17 @@ package main import ( "flag" "fmt" + "net" "net/http" "os" + + "github.com/pkg/browser" ) func main() { port := flag.String("p", "3844", "Port to listen on") workspaceDir := flag.String("C", ".", "Directory to scan for git repositories") + noBrowser := flag.Bool("B", false, "Disable auto-opening browser") flag.Parse() if err := os.Chdir(*workspaceDir); err != nil { @@ -19,8 +23,22 @@ func main() { http.HandleFunc("/", diffsHandler) - fmt.Printf("Starting server on http://localhost:%s\n", *port) - if err := http.ListenAndServe(":"+*port, nil); err != nil { + listener, err := net.Listen("tcp", ":"+*port) + if err != nil { + fmt.Fprintf(os.Stderr, "Server failed: %v\n", err) + os.Exit(1) + } + + url := fmt.Sprintf("http://localhost:%s", *port) + fmt.Printf("Starting server on %s\n", url) + + if !*noBrowser { + if err := browser.OpenURL(url); err != nil { + fmt.Fprintf(os.Stderr, "Failed to open browser: %v\n", err) + } + } + + if err := http.Serve(listener, nil); err != nil { fmt.Fprintf(os.Stderr, "Server failed: %v\n", err) os.Exit(1) }