]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Download link for 1.2.0 release
[goredo.git] / main.go
diff --git a/main.go b/main.go
index afed8e0cc356215ed332afea8ffbcdd49f0a873c..20072155f67c423ac294d82014af923f90f5280d 100644 (file)
--- a/main.go
+++ b/main.go
@@ -1,6 +1,6 @@
 /*
-goredo -- redo implementation on pure Go
-Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+goredo -- djb's redo implementation on pure Go
+Copyright (C) 2020-2021 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
@@ -28,10 +28,8 @@ import (
        "path"
        "path/filepath"
        "strconv"
-       "strings"
 
        "go.cypherpunks.ru/recfile"
-       "golang.org/x/sys/unix"
 )
 
 var (
@@ -60,7 +58,7 @@ func mustParseFd(v, name string) *os.File {
 func main() {
        version := flag.Bool("version", false, "print version")
        warranty := flag.Bool("warranty", false, "print warranty information")
-       symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current direcotyr")
+       symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current directory")
 
        flag.Usage = usage
        flag.Parse()
@@ -96,13 +94,14 @@ func main() {
        log.SetFlags(0)
 
        var err error
-       Cwd, err = unix.Getwd()
+       Cwd, err = os.Getwd()
        if err != nil {
-               panic(err)
+               log.Fatalln(err)
        }
 
        NoColor = os.Getenv(EnvNoColor) != ""
        NoSync = os.Getenv(EnvNoSync) == "1"
+       InodeTrust = os.Getenv(EnvInodeNoTrust) == ""
 
        TopDir = os.Getenv(EnvTopDir)
        if TopDir == "" {
@@ -113,6 +112,7 @@ func main() {
                        panic(err)
                }
        }
+       DirPrefix = os.Getenv(EnvDirPrefix)
 
        if *flagStderrKeep {
                mustSetenv(EnvStderrKeep, "1")
@@ -120,6 +120,9 @@ func main() {
        if *flagStderrSilent {
                mustSetenv(EnvStderrSilent, "1")
        }
+       if *flagNoProgress {
+               mustSetenv(EnvNoProgress, "1")
+       }
        if *flagDebug {
                mustSetenv(EnvDebug, "1")
        }
@@ -137,6 +140,7 @@ func main() {
        }
        StderrKeep = os.Getenv(EnvStderrKeep) == "1"
        StderrSilent = os.Getenv(EnvStderrSilent) == "1"
+       NoProgress = os.Getenv(EnvNoProgress) == "1"
        Debug = os.Getenv(EnvDebug) == "1"
        LogWait = os.Getenv(EnvLogWait) == "1"
        LogLock = os.Getenv(EnvLogLock) == "1"
@@ -145,6 +149,9 @@ func main() {
                MyPid = os.Getpid()
        }
        var traced bool
+       if *flagTraceAll {
+               mustSetenv(EnvTrace, "1")
+       }
        if *flagTrace {
                traced = true
        } else {
@@ -167,27 +174,36 @@ 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 {
-                       panic(err)
+                       log.Fatalln(err)
                }
                raw[6] = (raw[6] & 0x0F) | uint8(4<<4) // version 4
                BuildUUID = fmt.Sprintf(
                        "%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])
-       trace(CDebug, "[%s] run: %s %s [%s]", BuildUUID, cmdName, tgts, Cwd)
+       trace(
+               CDebug, "[%s] run: %s %s cwd:%s dirprefix:%s",
+               BuildUUID, cmdName, tgts, Cwd, DirPrefix,
+       )
 
 CmdSwitch:
        switch cmdName {
@@ -200,7 +216,9 @@ CmdSwitch:
                }
        case "redo-ifchange":
                ok, err = ifchange(tgts, false, traced)
-               writeDeps(fdDep, tgts)
+               if err == nil {
+                       err = writeDeps(fdDep, tgts)
+               }
        case "redo-ifcreate":
                if fdDep == nil {
                        log.Fatalln("no", EnvDepFd)
@@ -274,7 +292,17 @@ CmdSwitch:
                if doFile == "" {
                        ok = false
                } else {
-                       fmt.Println(path.Join(strings.Repeat("..", upLevels), doFile))
+                       p := make([]string, 0, upLevels+2)
+                       p = append(p, cwd)
+                       for i := 0; i < upLevels; i++ {
+                               p = append(p, "..")
+                       }
+                       p = append(p, doFile)
+                       rel, err := filepath.Rel(Cwd, path.Join(p...))
+                       if err != nil {
+                               panic(err)
+                       }
+                       fmt.Println(rel)
                }
        default:
                log.Fatalln("unknown command", cmdName)