-/*
-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/>.
package main
"bufio"
"bytes"
"encoding/hex"
+ "errors"
"flag"
"fmt"
"io"
+ "io/fs"
"log"
"os"
"os/signal"
var symlinks *bool
cmdName := CmdName()
- if cmdName == "goredo" {
+ if cmdName == CmdNameGoredo {
symlinks = flag.Bool("symlinks", false, "create necessary symlinks in current directory")
}
LogLock = os.Getenv(EnvLogLock) == "1"
LogJS = os.Getenv(EnvLogJS) == "1"
if Debug || os.Getenv(EnvLogPid) == "1" {
- MyPid = os.Getpid()
+ MyPID = os.Getpid()
}
var traced bool
if flagTraceAll != nil && *flagTraceAll {
var dos []string
dos, err = whichdo(tgts[0])
if err != nil {
- break
+ if errors.Is(err, fs.ErrNotExist) {
+ err = nil
+ ok = false
+ } else {
+ break
+ }
}
- sort.Strings(dos)
for _, do := range dos {
fmt.Println(do)
}
DepFixHashCache = make(map[string]Hash)
err = depFix(Cwd)
case CmdNameRedoInode:
- var inode Inode
+ var inode *Inode
for _, tgt := range tgts {
inode, err = inodeFromFileByPath(tgt.a)
if err != nil {
}
var typ byte
var chunk []byte
+ var inode Inode
for len(data) > 0 {
typ, chunk, data, _ = chunkRead(data)
switch typ {
}...)
case DepTypeIfchange:
name := string(chunk[InodeLen+HashLen:])
- meta := string(chunk[:InodeLen+HashLen])
+ meta := chunk[:InodeLen+HashLen]
fields := []recfile.Field{
{Name: "Type", Value: "ifchange"},
{Name: "Target", Value: name},
fields = append(fields, recfile.Field{
Name: "Hash", Value: Hash(meta[InodeLen:]).String(),
})
- fields = append(fields, Inode(meta[:InodeLen]).RecfileFields()...)
+ inode = Inode(meta[:][:InodeLen])
+ fields = append(fields, inode.RecfileFields()...)
err = recfileWrite(w, fields...)
case DepTypeIfchangeNonex:
err = recfileWrite(w, []recfile.Field{