]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
Fix dependencies relative paths determination
[goredo.git] / run.go
diff --git a/run.go b/run.go
index 589889e3db6edbf62f51f626e5f9ed04394323fd..4724870e8a767218584ccb1ae0239034729f9407 100644 (file)
--- a/run.go
+++ b/run.go
@@ -1,6 +1,6 @@
 /*
 goredo -- redo implementation on pure Go
-Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+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
@@ -77,8 +77,6 @@ type RunErr struct {
        Err      error
 }
 
-func (e RunErr) Unwrap() error { return e.Err }
-
 func (e *RunErr) Name() string {
        var name string
        if e.DoFile == "" {
@@ -268,12 +266,14 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        }
 
        // Determine basename and DIRPREFIX
+       doFileRelPath := doFile
        ents := strings.Split(cwd, "/")
        ents = ents[len(ents)-upLevels:]
        dirPrefix := path.Join(ents...)
        cwdOrig := cwd
        for i := 0; i < upLevels; i++ {
                cwd = path.Join(cwd, "..")
+               doFileRelPath = path.Join("..", doFileRelPath)
        }
        cwd = path.Clean(cwd)
        doFilePath := path.Join(cwd, doFile)
@@ -281,10 +281,10 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        runErr := RunErr{Tgt: tgtOrig}
        if strings.HasPrefix(doFile, "default.") {
                basename = tgt[:len(tgt)-(len(doFile)-len("default.")-len(".do"))-1]
-               runErr.DoFile = doFile
+               runErr.DoFile = doFileRelPath
        }
 
-       if err = writeDep(fdDep, cwd, doFile); err != nil {
+       if err = writeDep(fdDep, cwdOrig, doFileRelPath); err != nil {
                cleanup()
                return TgtErr{tgtOrig, err}
        }
@@ -379,7 +379,10 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                }
                fdStderr.Truncate(0)
        }
-       shCtx := fmt.Sprintf("sh: %s: %s %s [%s]", tgtOrig, cmdName, args, cwd)
+       shCtx := fmt.Sprintf(
+               "sh: %s: %s %s cwd:%s dirprefix:%s",
+               tgtOrig, cmdName, args, cwd, dirPrefix,
+       )
        trace(CDebug, "%s", shCtx)
 
        Jobs.Add(1)
@@ -458,14 +461,16 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                }
 
                // Was $1 touched?
-               if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil {
-                       ts, err := fileCtime(fd)
-                       fd.Close()
-                       if err == nil && ts != tsPrev {
-                               runErr.Err = errors.New("$1 was explicitly touched")
-                               errs <- runErr
+               if tsPrev != "" {
+                       if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil {
+                               ts, err := fileCtime(fd)
                                fd.Close()
-                               return
+                               if err == nil && ts != tsPrev {
+                                       runErr.Err = errors.New("$1 was explicitly touched")
+                                       errs <- runErr
+                                       fd.Close()
+                                       return
+                               }
                        }
                }
 
@@ -505,6 +510,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
 
                // Do we need to ifcreate it, of ifchange with renaming?
                if fd == nil {
+                       os.Remove(path.Join(cwdOrig, tgt))
                        err = ifcreate(fdDep, tgt)
                        if err != nil {
                                goto Finish