X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=main.go;h=c3b1be78677b731291db45ca8af4cfab7b74a5d3;hb=4274dce3366cee45bfaccbe5ca340ce6efe68e00;hp=0bb9357e9bf021dcc3c46a085cba5c1a4bd529ea;hpb=2e85fe511f4f0410e4b8a1dcdb127396b7f3f7c0;p=goredo.git diff --git a/main.go b/main.go index 0bb9357..c3b1be7 100644 --- a/main.go +++ b/main.go @@ -27,11 +27,13 @@ import ( "io/ioutil" "log" "os" + "os/signal" "path" "path/filepath" "runtime" "sort" "strconv" + "syscall" "go.cypherpunks.ru/recfile" "golang.org/x/sys/unix" @@ -127,7 +129,7 @@ func main() { } os.Exit(rc) } - log.SetFlags(0) + log.SetFlags(log.Lshortfile) var err error Cwd, err = os.Getwd() @@ -199,31 +201,31 @@ func main() { // Those are internal envs FdOODTgts, err = ioutil.TempFile("", "ood-tgts") if err != nil { - panic(err) + log.Fatalln(err) } if err = os.Remove(FdOODTgts.Name()); err != nil { - panic(err) + log.Fatalln(err) } FdOODTgtsLock, err = ioutil.TempFile("", "ood-tgts.lock") if err != nil { - panic(err) + log.Fatalln(err) } if err = os.Remove(FdOODTgtsLock.Name()); err != nil { - panic(err) + log.Fatalln(err) } if v := os.Getenv(EnvOODTgtsFd); v != "" { fd := mustParseFd(v, EnvOODTgtsFd) fdLock := mustParseFd(v, EnvOODTgtsLockFd) if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil { - panic(err) + log.Fatalln(err) } if _, err = fd.Seek(0, io.SeekStart); err != nil { - panic(err) + log.Fatalln(err) } tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd)) if err != nil { - panic(err) + log.Fatalln(err) } unix.Flock(int(fdLock.Fd()), unix.LOCK_UN) OODTgts = map[string]struct{}{} @@ -282,6 +284,20 @@ func main() { } } + killed := make(chan os.Signal, 0) + signal.Notify(killed, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + go func() { + <-killed + trace(CDebug, "[%s] killed", BuildUUID) + jsReleaseAll() + RunningProcsM.Lock() + for pid, proc := range RunningProcs { + trace(CDebug, "[%s] killing child %d", BuildUUID, pid) + proc.Signal(syscall.SIGTERM) + } + os.Exit(1) + }() + ok := true err = nil trace( @@ -308,7 +324,14 @@ CmdSwitch: log.Fatalln("no", EnvDepFd) } for _, tgt := range tgts { - err = ifcreate(fdDep, tgt) + tgtRel, err := filepath.Rel( + filepath.Join(Cwd, DirPrefix), + filepath.Join(Cwd, tgt), + ) + if err != nil { + break + } + err = ifcreate(fdDep, tgtRel) if err != nil { break } @@ -337,12 +360,7 @@ CmdSwitch: log.Fatalln("single target expected") } d, t := cwdAndTgt(tgts[0]) - var fd *os.File - fd, err = os.Open(path.Join(d, RedoDir, t+LogSuffix)) - if err != nil { - break - } - _, err = io.Copy(os.Stdout, fd) + err = showBuildLog(d, t, nil, 0) case CmdNameRedoWhichdo: if len(tgts) != 1 { log.Fatalln("single target expected")