]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Fix targets with absolute paths workability
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 42d83beb0fddb14f15a3f5addb8181b5c362c7f1..ed87a54efa8b84e3706e1436b5f5e59e2c613d62 100644 (file)
--- a/main.go
+++ b/main.go
@@ -28,6 +28,7 @@ import (
        "path"
        "path/filepath"
        "strconv"
+       "strings"
 
        "go.cypherpunks.ru/recfile"
        "golang.org/x/sys/unix"
@@ -77,12 +78,14 @@ func main() {
                        "redo",
                        "redo-always",
                        "redo-cleanup",
+                       "redo-dot",
                        "redo-ifchange",
                        "redo-ifcreate",
                        "redo-log",
                        "redo-stamp",
                        "redo-whichdo",
                } {
+                       fmt.Println(os.Args[0], "<-", cmdName)
                        if err := os.Symlink(os.Args[0], cmdName); err != nil {
                                rc = 1
                                log.Println(err)
@@ -99,11 +102,12 @@ func main() {
        }
 
        NoColor = os.Getenv(EnvNoColor) != ""
-       NoHash = os.Getenv(EnvNoHash) == "1"
        NoSync = os.Getenv(EnvNoSync) == "1"
 
        TopDir = os.Getenv(EnvTopDir)
-       if TopDir != "" {
+       if TopDir == "" {
+               TopDir = "/"
+       } else {
                TopDir, err = filepath.Abs(TopDir)
                if err != nil {
                        panic(err)
@@ -140,10 +144,14 @@ func main() {
        if Debug || os.Getenv(EnvLogPid) == "1" {
                MyPid = os.Getpid()
        }
+       var traced bool
+       if *flagTraceAll {
+               mustSetenv(EnvTrace, "1")
+       }
        if *flagTrace {
-               Trace = true
+               traced = true
        } else {
-               Trace = os.Getenv(EnvTrace) == "1"
+               traced = os.Getenv(EnvTrace) == "1"
        }
 
        // Those are internal envs
@@ -162,6 +170,7 @@ func main() {
                fdDep = mustParseFd(v, EnvDepFd)
        }
        BuildUUID = os.Getenv(EnvBuildUUID)
+       tgts := flag.Args()
        if BuildUUID == "" {
                raw := new([16]byte)
                if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil {
@@ -172,12 +181,18 @@ func main() {
                        "%x-%x-%x-%x-%x",
                        raw[0:4], raw[4:6], raw[6:8], raw[8:10], raw[10:],
                )
+               if len(tgts) == 0 {
+                       tgts = []string{"all"}
+               }
        }
+       statusInit()
 
-       tgts := flag.Args()
-       if len(tgts) == 0 {
-               tgts = []string{"all"}
+       for i, tgt := range tgts {
+               if path.IsAbs(tgt) {
+                       tgts[i] = cwdMustRel(tgt)
+               }
        }
+
        ok := true
        err = nil
        cmdName := path.Base(os.Args[0])
@@ -186,10 +201,14 @@ func main() {
 CmdSwitch:
        switch cmdName {
        case "redo":
-               Force = true
-               ok, err = ifchange(tgts)
+               for _, tgt := range tgts {
+                       ok, err = ifchange([]string{tgt}, true, traced)
+                       if err != nil || !ok {
+                               break
+                       }
+               }
        case "redo-ifchange":
-               ok, err = ifchange(tgts)
+               ok, err = ifchange(tgts, false, traced)
                writeDeps(fdDep, tgts)
        case "redo-ifcreate":
                if fdDep == nil {
@@ -213,6 +232,8 @@ CmdSwitch:
                                break
                        }
                }
+       case "redo-dot":
+               err = dotPrint(tgts)
        case "redo-stamp":
                if fdDep == nil {
                        log.Fatalln("no", EnvDepFd)
@@ -239,13 +260,15 @@ CmdSwitch:
                        break
                }
                os.Remove(fdTmp.Name())
-               var doFile string
                cwd, tgt := cwdAndTgt(tgts[0])
-               doFile, _, err = findDo(fdTmp, cwd, tgt)
+               doFile, upLevels, err := findDo(fdTmp, cwd, tgt)
+               if err != nil {
+                       break
+               }
+               _, err = fdTmp.Seek(0, 0)
                if err != nil {
                        break
                }
-               fdTmp.Seek(0, 0)
                r := recfile.NewReader(fdTmp)
                for {
                        m, err := r.NextMap()
@@ -255,13 +278,13 @@ CmdSwitch:
                                }
                                break CmdSwitch
                        }
-                       rel, err := filepath.Rel(Cwd, path.Join(cwd, m["Target"]))
-                       if err != nil {
-                               panic(err)
-                       }
-                       fmt.Println(rel)
+                       fmt.Println(cwdMustRel(cwd, m["Target"]))
+               }
+               if doFile == "" {
+                       ok = false
+               } else {
+                       fmt.Println(path.Join(strings.Repeat("..", upLevels), doFile))
                }
-               ok = doFile != ""
        default:
                log.Fatalln("unknown command", cmdName)
        }