-/*
-goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, version 3 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
+// goredo -- djb's redo implementation on pure Go
+// Copyright (C) 2020-2024 Sergey Matveev <stargrave@stargrave.org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Targets runner
}
func isModified(dep *Dep, tgt *Tgt) (
- modified bool, ourInode Inode, hshPrev Hash, err error,
+ modified bool, ourInode *Inode, hshPrev Hash, err error,
) {
if dep == nil {
return
if StopIfMod {
return fmt.Errorf("%s externally modified", tgt)
}
+ Jobs.Add(1)
tracef(CWarn, "%s externally modified: not redoing", tgt)
go func() {
errs <- nil
+ Jobs.Done()
}()
return nil
}
var cmdName string
var args []string
if err = unix.Access(doFile.rel, unix.X_OK); err == nil {
- cmdName = doFileT
+ cmdName = doFile.a
args = make([]string, 0, 3)
} else {
cmdName = "/bin/sh"
}
w := bufio.NewWriter(fdStderr)
- {
+ if !fdDepExists {
var ifchanges []string
ifchanges, err = depReadOnlyIfchanges(tgt.dep)
if err != nil {
line = scanner.Text()
if strings.HasPrefix(line, childStderrPrefix) {
line = line[len(childStderrPrefix):]
- os.Stderr.WriteString(StderrPrefix + line + "\n")
+ if StderrPrefix == "" {
+ withPrependedTgt(line)
+ } else {
+ stderrWrite(StderrPrefix + line + "\n")
+ }
continue
}
if fdStderr != nil {
ts.FromTime(time.Now())
- LogMutex.Lock()
fmt.Fprintln(fdStderr, tai64n.Encode(ts[:]), line)
- LogMutex.Unlock()
}
if StderrSilent {
continue
}
- if MyPid == 0 {
- tracef(CNone, "%s", line)
+ if MyPID != 0 {
+ line = pid + " " + line
+ }
+ if StderrPrefix == "" {
+ withPrependedTgt("[" + tgt.rel + "]" + line)
} else {
- tracef(CNone, "%s %s", pid, line)
+ stderrWrite(StderrPrefix + "[" + tgt.rel + "]" + line + "\n")
}
}
close(stderrTerm)
// Was $1 touched?
if inode, err := inodeFromFileByPath(tgt.a); err == nil {
- if inodePrev == "" {
+ if inodePrev == nil {
runErr.Err = Err1WasTouched
errs <- runErr
return
err = ErrLine(err)
goto Finish
}
+ defer fd.Close()
if fi, rerr := fd.Stat(); rerr == nil {
chmod = fi.Mode()
} else {
- err = rerr
+ err = ErrLine(rerr)
+ goto Finish
}
- defer fd.Close()
} else if fiStdout.Size() > 0 {
fd = fdStdout
}