$ git clone git://git.cypherpunks.ru/goredo.git
$ cd goredo
- $ git tag -v v0.8.0
+ $ git tag -v v0.9.0
$ git clone git://git.cypherpunks.ru/gorecfile.git
$ ( cd gorecfile ; git tag -v v0.4.0 )
$ echo "replace go.cypherpunks.ru/recfile => `pwd`/gorecfile" >> go.mod
"io"
"os"
"path"
- "strings"
+ "path/filepath"
"go.cypherpunks.ru/recfile"
"golang.org/x/crypto/blake2b"
"golang.org/x/sys/unix"
)
+var DirPrefix string
+
func recfileWrite(fdDep *os.File, fields ...recfile.Field) error {
w := recfile.NewWriter(fdDep)
if _, err := w.RecordStart(); err != nil {
trace(CDebug, "no opened fdDep: %s", tgts)
return nil
}
- ups := []string{}
- upLevels := strings.Count(os.Getenv(EnvDirPrefix), "/")
- for i := 0; i < upLevels; i++ {
- ups = append(ups, "..")
- }
- up := path.Join(ups...)
for _, tgt := range tgts {
if _, err := os.Stat(tgt); err == nil {
- if err = writeDep(fdDep, Cwd, path.Join(up, tgt)); err != nil {
+ tgtAbs, err := filepath.Abs(tgt)
+ if err != nil {
+ panic(err)
+ }
+ tgtDir := path.Join(Cwd, DirPrefix)
+ tgtRel, err := filepath.Rel(tgtDir, tgtAbs)
+ if err != nil {
+ panic(err)
+ }
+ if err = writeDep(fdDep, tgtDir, tgtRel); err != nil {
return err
}
+ } else {
+ trace(CDebug, "skipping dep record, can not stat: %s", tgt)
}
}
return nil
panic(err)
}
}
+ DirPrefix = os.Getenv(EnvDirPrefix)
if *flagStderrKeep {
mustSetenv(EnvStderrKeep, "1")
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 {
}
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)
}
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)
--- /dev/null
+#!/bin/sh
+
+testname=`basename "$0"`
+test_description="Check that the following use-case won't rebuild everytime and has correct dependencies"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+
+tmp=`mktemp -d`
+trap "rm -fr $tmp" HUP PIPE INT QUIT TERM EXIT
+cd $tmp
+mkdir -p sub
+cat > default.html.do <<EOF
+redo-ifchange \$2.pre
+echo HTML
+cat \$2.pre
+EOF
+cat > default.pre.do <<EOF
+redo-ifchange *.inc \$2.html.in
+echo PRE
+cat \$2.html.in
+EOF
+echo FOOTER > footer.inc
+echo "<html>" > sub/index.html.in
+
+test_expect_success Build "redo sub/index.html"
+stat1=`stat sub/index.html`
+test_expect_success Rebuild "redo-ifchange sub/index.html"
+stat2=`stat sub/index.html`
+test_expect_success "Was not rebuild" '[ "$stat1" = "$stat2" ]'
+
+tgts=`sed -n "s/^Target: //p" sub/.redo/index.html.dep | sort`
+tgts=`echo $tgts`
+tgts_expected="../default.html.do" # .do itself
+tgts_expected="$tgts_expected default.do" # ifcreate
+tgts_expected="$tgts_expected default.html.do" # ifcreate
+tgts_expected="$tgts_expected index.html" # check for user-modification
+tgts_expected="$tgts_expected index.html.do" # ifcreate
+tgts_expected="$tgts_expected index.pre" # source
+test_expect_success "Correct dependencies" '[ "$tgts" = "$tgts_expected" ]'
+
+test_done
)
const (
- Version = "0.8.0"
+ Version = "0.9.0"
Warranty = `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
the Free Software Foundation, version 3 of the License.