]> Cypherpunks repositories - gostls13.git/commitdiff
don't update sync time if no files have changed
authorRobert Griesemer <gri@golang.org>
Sun, 1 Nov 2009 18:33:16 +0000 (10:33 -0800)
committerRobert Griesemer <gri@golang.org>
Sun, 1 Nov 2009 18:33:16 +0000 (10:33 -0800)
(and thus avoid re-indexing after every sync attempt)

R=rsc
http://go/go-review/1016010

src/cmd/godoc/main.go

index b30b589987efb383f82ce45f7df389456d1ab8a7..1d4617a465c00bb20c8f531fe76e9c4ca4037989 100644 (file)
@@ -50,11 +50,11 @@ var (
 )
 
 
-func exec(c *http.Conn, args []string) bool {
+func exec(c *http.Conn, args []string) (status int) {
        r, w, err := os.Pipe();
        if err != nil {
                log.Stderrf("os.Pipe(): %v\n", err);
-               return false;
+               return 2;
        }
 
        bin := args[0];
@@ -67,7 +67,7 @@ func exec(c *http.Conn, args []string) bool {
        w.Close();
        if err != nil {
                log.Stderrf("os.ForkExec(%q): %v\n", bin, err);
-               return false;
+               return 2;
        }
 
        var buf bytes.Buffer;
@@ -76,12 +76,13 @@ func exec(c *http.Conn, args []string) bool {
        if err != nil {
                os.Stderr.Write(buf.Bytes());
                log.Stderrf("os.Wait(%d, 0): %v\n", pid, err);
-               return false;
+               return 2;
        }
-       if !wait.Exited() || wait.ExitStatus() != 0 {
+       status = wait.ExitStatus();
+       if !wait.Exited() || status > 1  {
                os.Stderr.Write(buf.Bytes());
-               log.Stderrf("executing %v failed (exit status = %d)", args, wait.ExitStatus());
-               return false;
+               log.Stderrf("executing %v failed (exit status = %d)", args, status);
+               return;
        }
 
        if *verbose {
@@ -92,18 +93,23 @@ func exec(c *http.Conn, args []string) bool {
                c.Write(buf.Bytes());
        }
 
-       return true;
+       return;
 }
 
 
 func dosync(c *http.Conn, r *http.Request) {
        args := []string{"/bin/sh", "-c", *syncCmd};
-       if exec(c, args) {
-               // sync succeeded
+       switch exec(c, args) {
+       case 0:
+               // sync succeeded and some files have changed
                syncTime.set(nil);
+               fallthrough;
+       case 1:
+               // sync failed because no files changed
+               // don't change the sync time
                syncDelay.set(*syncMin);        //  revert to regular sync schedule
-       } else {
-               // sync failed - back off exponentially, but try at least once a day
+       default:
+               // sync failed because of an error - back off exponentially, but try at least once a day
                syncDelay.backoff(24*60);
        }
 }