]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Up to date recfile
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 20072155f67c423ac294d82014af923f90f5280d..f7dcd3ca0d4fa2891efb5aff08781b05d5f0b599 100644 (file)
--- a/main.go
+++ b/main.go
@@ -18,6 +18,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package main
 
 import (
+       "bufio"
+       "bytes"
        "crypto/rand"
        "flag"
        "fmt"
@@ -27,9 +29,12 @@ import (
        "os"
        "path"
        "path/filepath"
+       "runtime"
+       "sort"
        "strconv"
 
        "go.cypherpunks.ru/recfile"
+       "golang.org/x/sys/unix"
 )
 
 var (
@@ -60,14 +65,14 @@ func main() {
        warranty := flag.Bool("warranty", false, "print warranty information")
        symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current directory")
 
-       flag.Usage = usage
+       flag.Usage = func() { usage(os.Args[0]) }
        flag.Parse()
        if *warranty {
                fmt.Println(Warranty)
                return
        }
        if *version {
-               fmt.Println(versionGet())
+               fmt.Println("goredo", Version, "built with", runtime.Version())
                return
        }
        if *symlinks {
@@ -80,7 +85,10 @@ func main() {
                        "redo-ifchange",
                        "redo-ifcreate",
                        "redo-log",
+                       "redo-ood",
+                       "redo-sources",
                        "redo-stamp",
+                       "redo-targets",
                        "redo-whichdo",
                } {
                        fmt.Println(os.Args[0], "<-", cmdName)
@@ -159,6 +167,46 @@ func main() {
        }
 
        // Those are internal envs
+       FdOODTgts, err = ioutil.TempFile("", "ood-tgts")
+       if err != nil {
+               panic(err)
+       }
+       if err = os.Remove(FdOODTgts.Name()); err != nil {
+               panic(err)
+       }
+       FdOODTgtsLock, err = ioutil.TempFile("", "ood-tgts.lock")
+       if err != nil {
+               panic(err)
+       }
+       if err = os.Remove(FdOODTgtsLock.Name()); err != nil {
+               panic(err)
+       }
+
+       if v := os.Getenv(EnvOODTgtsFd); v != "" {
+               fd := mustParseFd(v, EnvOODTgtsFd)
+               fdLock := mustParseFd(v, EnvOODTgtsLockFd)
+               if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil {
+                       panic(err)
+               }
+               if _, err = fd.Seek(0, os.SEEK_SET); err != nil {
+                       panic(err)
+               }
+               tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd))
+               if err != nil {
+                       panic(err)
+               }
+               unix.Flock(int(fdLock.Fd()), unix.LOCK_UN)
+               OODTgts = make(map[string]struct{})
+               for _, tgtRaw := range bytes.Split(tgtsRaw, []byte{0}) {
+                       t := string(tgtRaw)
+                       if t == "" {
+                               continue
+                       }
+                       OODTgts[t] = struct{}{}
+                       trace(CDebug, "ood: known to be: %s", t)
+               }
+       }
+
        StderrPrefix = os.Getenv(EnvStderrPrefix)
        if v := os.Getenv(EnvLevel); v != "" {
                Level, err = strconv.Atoi(v)
@@ -169,12 +217,14 @@ func main() {
                        panic("negative " + EnvLevel)
                }
        }
+
        var fdDep *os.File
        if v := os.Getenv(EnvDepFd); v != "" {
                fdDep = mustParseFd(v, EnvDepFd)
        }
-       BuildUUID = os.Getenv(EnvBuildUUID)
+
        tgts := flag.Args()
+       BuildUUID = os.Getenv(EnvBuildUUID)
        if BuildUUID == "" {
                raw := new([16]byte)
                if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil {
@@ -189,6 +239,7 @@ func main() {
                        tgts = []string{"all"}
                }
        }
+
        statusInit()
 
        for i, tgt := range tgts {
@@ -264,17 +315,19 @@ CmdSwitch:
                        log.Fatalln("single target expected")
                }
                var fdTmp *os.File
-               fdTmp, err = ioutil.TempFile("", "")
+               fdTmp, err = ioutil.TempFile("", "whichdo")
                if err != nil {
                        break
                }
-               os.Remove(fdTmp.Name())
+               if err = os.Remove(fdTmp.Name()); err != nil {
+                       break
+               }
                cwd, tgt := cwdAndTgt(tgts[0])
                doFile, upLevels, err := findDo(fdTmp, cwd, tgt)
                if err != nil {
                        break
                }
-               _, err = fdTmp.Seek(0, 0)
+               _, err = fdTmp.Seek(0, os.SEEK_SET)
                if err != nil {
                        break
                }
@@ -304,6 +357,31 @@ CmdSwitch:
                        }
                        fmt.Println(rel)
                }
+       case "redo-targets":
+               tgts, err = targetsWalker(Cwd)
+               sort.Strings(tgts)
+               for _, tgt := range tgts {
+                       fmt.Println(tgt)
+               }
+       case "redo-ood":
+               tgts, err = targetsWalker(Cwd)
+               sort.Strings(tgts)
+               var ood bool
+               for _, tgt := range tgts {
+                       ood, err = isOOD(Cwd, tgt, 0, nil)
+                       if err != nil {
+                               break
+                       }
+                       if ood {
+                               fmt.Println(tgt)
+                       }
+               }
+       case "redo-sources":
+               tgts, err = sourcesWalker()
+               sort.Strings(tgts)
+               for _, tgt := range tgts {
+                       fmt.Println(tgt)
+               }
        default:
                log.Fatalln("unknown command", cmdName)
        }