From: Robert Griesemer Date: Mon, 18 May 2009 23:26:34 +0000 (-0700) Subject: - make godoc restart feature work properly X-Git-Tag: weekly.2009-11-06~1610 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7ff2536633fd7ccbaec4cbf071ddc308ce7937e3;p=gostls13.git - make godoc restart feature work properly R=rsc DELTA=11 (10 added, 0 deleted, 1 changed) OCL=29007 CL=29009 --- diff --git a/usr/gri/pretty/godoc.go b/usr/gri/pretty/godoc.go index dcf3aa1028..9590d6a42d 100644 --- a/usr/gri/pretty/godoc.go +++ b/usr/gri/pretty/godoc.go @@ -58,6 +58,7 @@ var ( verbose = flag.Bool("v", false, "verbose mode"); // file system roots + launchdir string; // directory from which godoc was launched goroot string; pkgroot = flag.String("pkgroot", "src/lib", "root package source directory (if unrooted, relative to goroot)"); tmplroot = flag.String("tmplroot", "usr/gri/pretty", "root template directory (if unrooted, relative to goroot)"); @@ -585,7 +586,10 @@ func loggingHandler(h http.Handler) http.Handler { func restartGodoc(c *http.Conn, r *http.Request) { - binary := os.Args[0]; // TODO currently requires absolute paths because of chdir in the beginning + binary := os.Args[0]; + if len(binary) > 0 || binary[0] != '/' { + binary = pathutil.Join(launchdir, binary); + } pid, err := os.ForkExec(binary, os.Args, os.Environ(), "", []*os.File{os.Stdin, os.Stdout, os.Stderr}); if err != nil { log.Stderrf("os.ForkExec(%s): %v", binary, err); @@ -621,6 +625,12 @@ func main() { } } + var err os.Error; + if launchdir, err = os.Getwd(); err != nil { + log.Stderrf("unable to determine current working directory - restart may fail"); + launchdir = ""; + } + if err := os.Chdir(goroot); err != nil { log.Exitf("chdir %s: %v", goroot, err); }