doc/news.texi | 7 +++++++ ifchange.go | 6 +++--- main.go | 2 +- run.go | 15 ++++++++++++++- usage.go | 2 +- diff --git a/doc/news.texi b/doc/news.texi index 61a5a57872432d68767a60976042365999d4ed98b9f622529c746b06b5514074..cf930c77524f7311264f6ffd89badae78f713dd0a130731b30613017c4df01e8 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -2,6 +2,13 @@ @node News @cindex news @unnumbered News +@anchor{Release 1_31_0} +@section Release 1.31.0 +@itemize +@item + Fixed possible race when target can be built more than once. +@end itemize + @anchor{Release 1_30_0} @section Release 1.30.0 @itemize diff --git a/ifchange.go b/ifchange.go index 4a1abe1ee2d8a8f47ca34ddbd70505b7a02ec2caf184dc4ebee2981a4fd56f00..0f516875c49fee833db2894c258ac9a91b4573705251f46c4a47677070649ac9 100644 --- a/ifchange.go +++ b/ifchange.go @@ -109,7 +109,7 @@ Level = 1 tracef(CDebug, "building %d alwayses: %v", len(seen), seen) errs := make(chan error, len(seen)) for tgt := range seen { - if err := runScript(tgt, errs, false); err != nil { + if err := runScript(tgt, errs, false, false); err != nil { tracef(CErr, "always run error: %s, skipping dependants", err) return nil } @@ -155,7 +155,7 @@ } if !ood { continue } - if err := runScript(tgt, errs, false); err != nil { + if err := runScript(tgt, errs, false, false); err != nil { tracef(CErr, "dependant error: %s, skipping dependants", err) return nil } @@ -225,7 +225,7 @@ if isSrc(Cwd, tgt) { tracef(CDebug, "%s is source, not redoing", tgt) continue } - if err = runScript(tgt, errs, traced); err != nil { + if err = runScript(tgt, errs, forced, traced); err != nil { return false, err } jobs++ diff --git a/main.go b/main.go index 82bf113a31dc4333eeba70c9de02a2ea8993bceb61515f5c5194a1d9c0d3eae5..54181dc456ee922a5ff7abda28ad1e387f307f73a921f0bfee17a78937c6dbf6 100644 --- a/main.go +++ b/main.go @@ -298,7 +298,7 @@ tgts = []string{"all"} } } - if cmdName == CmdNameRedo || cmdName == CmdNameRedoIfchange { + if cmdName == CmdNameRedo { statusInit() } diff --git a/run.go b/run.go index 2b720c464a3904f9a174874f06ad9b13e79f4d591c2a9cf7ce54d84eb783023f..fa5e7020725569c1230624730e02f7fa02ebaaa0c59a27d641e51dee6aeeafc5 100644 --- a/run.go +++ b/run.go @@ -184,7 +184,7 @@ fd.Close() return err } -func runScript(tgtOrig string, errs chan error, traced bool) error { +func runScript(tgtOrig string, errs chan error, forced, traced bool) error { cwd, tgt := cwdAndTgt(tgtOrig) redoDir := path.Join(cwd, RedoDir) if err := mkdirs(redoDir); err != nil { @@ -279,6 +279,19 @@ } errs <- err }() return nil + } + + // Check if it was already built in parallel + if !forced { + if fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix)); err == nil { + depInfo, err := depRead(fdDep) + fdDep.Close() + if err == nil && depInfo.build == BuildUUID { + lockRelease() + errs <- nil + return nil + } + } } // Check if target is not modified externally diff --git a/usage.go b/usage.go index de6208e5d7c35402ae73eef9a54ec081e12b1f4bfafd3c4cbab6b91186e4d8ea..bbf4aaad2bbaa8063e60a5dcad937e510e0fa89171edf1963fb35404e88d59e9 100644 --- a/usage.go +++ b/usage.go @@ -24,7 +24,7 @@ "os" ) const ( - Version = "1.30.0" + Version = "1.31.0" Warranty = `Copyright (C) 2020-2023 Sergey Matveev This program is free software: you can redistribute it and/or modify