From: Sergey Matveev Date: Sun, 1 Oct 2023 06:57:57 +0000 (+0300) Subject: Less unnecessary Close()s X-Git-Tag: v2.0.0~28 X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=commitdiff_plain;h=425dcfb13f3a9c9d4d189284e2991edf557f80db Less unnecessary Close()s --- diff --git a/run.go b/run.go index 89640cb..a3e0fd6 100644 --- a/run.go +++ b/run.go @@ -243,25 +243,25 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { } } build, err := depReadBuild(path.Join(redoDir, tgt+DepSuffix)) - if err != nil { + if err == nil { + if build != BuildUUID { + err = errors.New("was not built: build differs") + } + } else { if errors.Is(err, fs.ErrNotExist) { err = errors.New("was not built: no .rec") } - goto Finish } - if build != BuildUUID { - err = errors.New("was not built: build differs") - } - Finish: if err != nil { err = TgtError{tgtOrig, err} - fdLock.Close() } errs <- err }() return nil } + // It scans the whole .rec file while searching for the single target, + // but that one is always located at the very end depInfo, err := depRead(path.Join(redoDir, tgt+DepSuffix)) if err != nil { if errors.Is(err, fs.ErrNotExist) { @@ -304,10 +304,13 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { lockRelease() return TgtError{tgtOrig, ErrLine(err)} } + fdDepOpened := true fdDepPath := fdDep.Name() cleanup := func() { lockRelease() - fdDep.Close() + if fdDepOpened { + fdDep.Close() + } os.Remove(fdDep.Name()) } if _, err = recfile.NewWriter(fdDep).WriteFields( @@ -352,6 +355,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { return TgtError{tgtOrig, ErrLine(err)} } fdDep.Close() + fdDepOpened = false tracef(CWait, "%s", runErr.Name()) // Prepare command line @@ -488,13 +492,16 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { errs <- runErr return } + fdDepOpened = true cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) fdNum++ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd)) defer func() { - fdDep.Close() + if fdDepOpened { + fdDep.Close() + } fdStdout.Close() if fdStderr != nil { fdStderr.Close() @@ -793,6 +800,7 @@ func runScript(tgtOrig string, errs chan error, forced, traced bool) error { } } fdDep.Close() + fdDepOpened = false // Post-commit .rec sanitizing if depInfo, err := depRead(fdDepPath); err == nil {