/*
goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
+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
"bufio"
"bytes"
"encoding/hex"
+ "errors"
"flag"
"fmt"
"io"
+ "io/fs"
"log"
"os"
"os/signal"
}
flag.Usage = func() { usage(os.Args[0]) }
- flag.Parse()
+
+ BuildUUIDStr := os.Getenv(EnvBuildUUID)
+ IsTopRedo = BuildUUIDStr == ""
+
+ var args []string
+ if IsTopRedo {
+ flag.Parse()
+ args = flag.Args()
+ } else {
+ args = os.Args[1:]
+ }
+
if *warranty {
fmt.Println(Warranty)
return
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 {
fdDep = mustParseFd(v, EnvDepFd)
}
- tgts := make([]*Tgt, 0, len(flag.Args()))
- for _, arg := range flag.Args() {
+ tgts := make([]*Tgt, 0, len(args))
+ for _, arg := range args {
tgts = append(tgts, NewTgt(arg))
}
tgtsWasEmpty := len(tgts) == 0
- if BuildUUIDStr := os.Getenv(EnvBuildUUID); BuildUUIDStr == "" {
- IsTopRedo = true
+ if BuildUUIDStr == "" {
BuildUUID = uuid.New()
if tgtsWasEmpty {
tgts = append(tgts, NewTgt("all"))
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 DepTypeIfchangeDummy:
+ case DepTypeIfchangeNonex:
err = recfileWrite(w, []recfile.Field{
{Name: "Type", Value: "ifchange"},
{Name: "Target", Value: string(chunk)},