]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Lock file must stay opened till the very end of the program
[goredo.git] / main.go
diff --git a/main.go b/main.go
index f6304aca8dd3b92c4d2a05bb77cc714ebd96842b..80cdc9a8ed996917ef02be668f825fb915587b3c 100644 (file)
--- a/main.go
+++ b/main.go
@@ -148,10 +148,7 @@ func main() {
        if TopDir == "" {
                TopDir = "/"
        } else {
-               TopDir, err = filepath.Abs(TopDir)
-               if err != nil {
-                       panic(err)
-               }
+               TopDir = mustAbs(TopDir)
        }
        DirPrefix = os.Getenv(EnvDirPrefix)
        DepCwd = os.Getenv(EnvDepCwd)
@@ -231,9 +228,11 @@ func main() {
                log.Fatal(err)
        }
 
+       var fdLock *os.File
        if v := os.Getenv(EnvOODTgtsFd); v != "" {
                fd := mustParseFd(v, EnvOODTgtsFd)
-               fdLock := mustParseFd(v, EnvOODTgtsLockFd)
+               fdLock = mustParseFd(v, EnvOODTgtsLockFd)
+               defer fdLock.Close()
                flock := unix.Flock_t{
                        Type:   unix.F_WRLCK,
                        Whence: io.SeekStart,
@@ -432,10 +431,7 @@ CmdSwitch:
                                p = append(p, "..")
                        }
                        p = append(p, doFile)
-                       rel, err := filepath.Rel(Cwd, path.Join(p...))
-                       if err != nil {
-                               panic(err)
-                       }
+                       rel := mustRel(Cwd, path.Join(p...))
                        fmt.Println(rel)
                }
        case CmdNameRedoTargets:
@@ -505,11 +501,23 @@ CmdSwitch:
                        }
                }
                sort.Strings(tgts)
-               var srcs []string
-               srcs, err = sourcesWalker(tgts)
-               err = ErrLine(err)
-               sort.Strings(srcs)
-               for _, src := range srcs {
+               seen := make(map[string]struct{})
+               seenDeps := make(map[string]struct{})
+               srcs := make(map[string]struct{})
+               err = ErrLine(sourcesWalker(tgts, seen, seenDeps, srcs))
+               seen = nil
+               seenDeps = nil
+               if err != nil {
+                       break
+               }
+               seenDeps = nil
+               res := make([]string, 0, len(srcs))
+               for p := range srcs {
+                       res = append(res, p)
+               }
+               srcs = nil
+               sort.Strings(res)
+               for _, src := range res {
                        fmt.Println(src)
                }
        case CmdNameRedoDepFix: