mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
;shake setversion --commit: also commit the updated files
This commit is contained in:
parent
0578c50bf8
commit
d6b1a18178
226
Shake.hs
226
Shake.hs
@ -67,7 +67,7 @@ usage =
|
||||
,"./Shake.hs [CMD [ARGS]] run CMD, compiling this script first if needed"
|
||||
,"./Shake [CMD [ARGS]] run CMD, using the compiled version of this script"
|
||||
,"./Shake [help] show this help"
|
||||
,"./Shake setversion [VER] [PKGS]"
|
||||
,"./Shake setversion [VER] [PKGS] [--commit]"
|
||||
," update version strings from */.version (or VER)"
|
||||
,"./Shake commandtxts update hledger CLI commands' usage texts"
|
||||
,"./Shake manuals update txt/man/info/web manuals for all packages"
|
||||
@ -132,6 +132,8 @@ main = do
|
||||
,"--dry-run", "--dry", "-n"
|
||||
]
|
||||
(ruleopts, shakeopts) = partition (`elem` ruleoptnames) opts
|
||||
commit = any (`elem` ruleopts) ["--commit", "-c"]
|
||||
dryrun = any (`elem` ruleopts) ["--dry-run", "--dry", "-n"]
|
||||
(shakearg, ruleargs) = splitAt 1 args
|
||||
shakeargs = shakeopts ++ shakearg
|
||||
-- print (opts,args,shakeopts,shakearg,shakeargs,ruleopts,ruleargs)
|
||||
@ -147,7 +149,7 @@ main = do
|
||||
|
||||
phony "help" $ liftIO $ putStr usage
|
||||
|
||||
-- NAMES, FILES, URIS..
|
||||
-- NAMES, FILES, URIS, HELPERS
|
||||
|
||||
let
|
||||
-- main package names, in standard build order
|
||||
@ -229,6 +231,123 @@ main = do
|
||||
webManualNameToManpageName u | "hledger" `isPrefixOf` u = u <.> "1"
|
||||
| otherwise = "hledger_" ++ u <.> "5"
|
||||
|
||||
-- VERSION NUMBERS
|
||||
|
||||
-- Update all packages' version strings based on the version saved in PKG/.version.
|
||||
-- If a version number is provided as first argument, save that in the .version files first.
|
||||
-- If one or more subdirectories are provided as arguments, save/update only those.
|
||||
-- See also CONTRIBUTING.md > Version numbers.
|
||||
phony "setversion" $ do
|
||||
let
|
||||
(mver, dirargs) = (headMay ver', drop 1 ver' ++ dirs')
|
||||
where (ver',dirs') = span isVersion ruleargs
|
||||
(specifieddirs, specifiedpkgs) =
|
||||
case dirargs of [] -> (pkgandprojdirs, pkgdirs)
|
||||
ds -> (ds, ds)
|
||||
-- if a version was provided, update .version files in the specified directories
|
||||
let specifiedversionfiles = map (</> ".version") specifieddirs
|
||||
case mver of
|
||||
Just v -> liftIO $ forM_ specifiedversionfiles $ \f -> writeFile f (v++"\n")
|
||||
Nothing -> return ()
|
||||
|
||||
-- update all files depending on .version in the specified packages
|
||||
let dependents = concat [
|
||||
map (</> "defs.m4") specifiedpkgs
|
||||
,map (</> "package.yaml") specifiedpkgs
|
||||
]
|
||||
need dependents
|
||||
|
||||
-- and maybe commit them
|
||||
when commit $ do
|
||||
let msg = unwords [
|
||||
"; bump"
|
||||
,case specifiedpkgs of
|
||||
[] -> "version"
|
||||
ps -> intercalate ", " ps ++ " version"
|
||||
,case mver of
|
||||
Nothing -> ""
|
||||
Just v -> "to " ++ v
|
||||
]
|
||||
cmd Shell ("git commit -m '"++msg++"' --") specifiedversionfiles dependents
|
||||
|
||||
-- PKG/defs.m4 <- PKG/.version
|
||||
"hledger*/defs.m4" %> \out -> do
|
||||
let versionfile = takeDirectory out </> ".version"
|
||||
need [versionfile]
|
||||
version <- ((head . words) <$>) $ liftIO $ readFile versionfile
|
||||
date <- liftIO getCurrentDay
|
||||
let manualdate = formatTime defaultTimeLocale "%B %Y" date
|
||||
cmd_ Shell sed "-i -e" (
|
||||
"'s/(_version_}}, *)\\{\\{[^}]+/\\1{{"++version++"/;"
|
||||
++" s/(_monthyear_}}, *)\\{\\{[^}]+/\\1{{"++manualdate++"/;"
|
||||
++"'")
|
||||
out
|
||||
|
||||
-- PKG/package.yaml <- PKG/.version
|
||||
"hledger*/package.yaml" %> \out -> do
|
||||
let versionfile = takeDirectory out </> ".version"
|
||||
need [versionfile]
|
||||
version <- ((head . words) <$>) $ liftIO $ readFile versionfile
|
||||
let ma:jor:_ = splitOn "." version
|
||||
nextmajorversion = intercalate "." $ ma : (show $ read jor+1) : []
|
||||
|
||||
-- One simple task: update some strings in a small text file.
|
||||
-- Several ugly solutions:
|
||||
--
|
||||
-- 1. use haskell list utils. Tedious.
|
||||
-- old <- liftIO $ readFileStrictly out
|
||||
-- let isversionline s = "version" `isPrefixOf` (dropWhile isSpace $ takeWhile (not.(`elem` " :")) s)
|
||||
-- (before, _:after) = break isversionline $ lines old
|
||||
-- -- oldversion = words versionline !! 1
|
||||
-- new = unlines $ before ++ ["version: "++version] ++ after
|
||||
-- liftIO $ writeFile out new
|
||||
--
|
||||
-- 2. use regular expressions in haskell. Haskell has no portable,
|
||||
-- featureful, replacing, backreference-supporting regex lib yet.
|
||||
--
|
||||
-- 3. use sed. Have to assume non-GNU sed, eg on mac.
|
||||
|
||||
-- Things to update in package.yaml:
|
||||
--
|
||||
-- version: VER
|
||||
cmd_ Shell sed "-i -e" ("'s/(^version *:).*/\\1 "++version++"/'") out
|
||||
--
|
||||
-- -DVERSION="VER"
|
||||
cmd_ Shell sed "-i -e" ("'s/(-DVERSION=)\"[^\"]+/\\1\""++version++"/'") out
|
||||
--
|
||||
-- this package's dependencies on other hledger packages (typically hledger-lib, hledger)
|
||||
--
|
||||
-- This one is a bit tricky, and we do it with these limitations:
|
||||
-- a. We handle bounds in one of these forms (allowing extra whitespace):
|
||||
-- ==A
|
||||
-- >A
|
||||
-- >=A
|
||||
-- >A && <B
|
||||
-- >=A && <B
|
||||
-- b. We set
|
||||
-- the new lower bound to: this package's new version, V
|
||||
-- the new upper bound if any, to: the next major version after V
|
||||
-- both of which may not be what's desired.
|
||||
-- c. We convert > bounds to >= bounds.
|
||||
--
|
||||
-- hledger[-PKG] ==LOWER
|
||||
let versionre = "([0-9]+\\.)*[0-9]+" -- 2 or 3 part version number regexp
|
||||
cmd_ Shell sed "-i -e" ("'s/(hledger(-[a-z]+)?) *== *"++versionre++" *$/\\1 == "++version++"/'") out
|
||||
--
|
||||
-- hledger[-PKG] >[=]LOWER
|
||||
cmd_ Shell sed "-i -e" ("'s/(hledger(-[a-z]+)?) *>=? *"++versionre++" *$/\\1 >= "++version++"/'") out
|
||||
--
|
||||
-- hledger[-PKG] >[=]LOWER && <UPPER
|
||||
let
|
||||
pat = "(hledger(-[a-z]+)?) *>=? *"++versionre++" *&& *< *"++versionre++" *$"
|
||||
rpl = "\\1 >="++version++" \\&\\& <"++nextmajorversion -- This was a beast. These ampersands must be backslash-escaped.
|
||||
arg = "'s/"++pat++"/"++rpl++"/'"
|
||||
cmd_ Shell sed "-i -e" arg out
|
||||
|
||||
-- tagrelease: \
|
||||
-- $(call def-help,tagrelease, commit a release tag based on $(VERSIONFILE) for each package )
|
||||
-- for p in $(PACKAGES); do git tag -f $$p-$(VERSION); done
|
||||
|
||||
-- MANUALS
|
||||
|
||||
-- Generate the manuals in plain text, nroff, info, and markdown formats.
|
||||
@ -484,7 +603,6 @@ main = do
|
||||
,if isCommitHash changelogversion then [] else [oldheading]
|
||||
,rest
|
||||
]
|
||||
dryrun = any (`elem` ruleopts) ["--dry-run", "--dry", "-n"]
|
||||
|
||||
liftIO $ if
|
||||
| lastrev == newrev -> pure () -- putStrLn $ out ++ ": up to date"
|
||||
@ -495,108 +613,6 @@ main = do
|
||||
|
||||
)
|
||||
|
||||
-- VERSION NUMBERS
|
||||
|
||||
-- Update all packages' version strings based on the version saved in PKG/.version.
|
||||
-- If a version number is provided as first argument, save that in the .version files first.
|
||||
-- If one or more subdirectories are provided as arguments, save/update only those.
|
||||
-- See also CONTRIBUTING.md > Version numbers.
|
||||
phony "setversion" $ do
|
||||
let
|
||||
(mver, dirargs) = (headMay ver', drop 1 ver' ++ dirs')
|
||||
where (ver',dirs') = span isVersion ruleargs
|
||||
(specifieddirs, specifiedpkgs) =
|
||||
case dirargs of [] -> (pkgandprojdirs, pkgdirs)
|
||||
ds -> (ds, ds)
|
||||
-- if a version was provided, update .version files in the specified directories
|
||||
case mver of
|
||||
Just v -> liftIO $ forM_ specifieddirs $ \d -> writeFile (d </> ".version") (v++"\n")
|
||||
Nothing -> return ()
|
||||
|
||||
-- update all files depending on .version in the specified packages
|
||||
need $ concat [
|
||||
map (</> "defs.m4") specifiedpkgs
|
||||
,map (</> "package.yaml") specifiedpkgs
|
||||
]
|
||||
|
||||
-- PKG/defs.m4 <- PKG/.version
|
||||
"hledger*/defs.m4" %> \out -> do
|
||||
let versionfile = takeDirectory out </> ".version"
|
||||
need [versionfile]
|
||||
version <- ((head . words) <$>) $ liftIO $ readFile versionfile
|
||||
date <- liftIO getCurrentDay
|
||||
let manualdate = formatTime defaultTimeLocale "%B %Y" date
|
||||
cmd_ Shell sed "-i -e" (
|
||||
"'s/(_version_}}, *)\\{\\{[^}]+/\\1{{"++version++"/;"
|
||||
++" s/(_monthyear_}}, *)\\{\\{[^}]+/\\1{{"++manualdate++"/;"
|
||||
++"'")
|
||||
out
|
||||
|
||||
-- PKG/package.yaml <- PKG/.version
|
||||
"hledger*/package.yaml" %> \out -> do
|
||||
let versionfile = takeDirectory out </> ".version"
|
||||
need [versionfile]
|
||||
version <- ((head . words) <$>) $ liftIO $ readFile versionfile
|
||||
let ma:jor:_ = splitOn "." version
|
||||
nextmajorversion = intercalate "." $ ma : (show $ read jor+1) : []
|
||||
|
||||
-- One simple task: update some strings in a small text file.
|
||||
-- Several ugly solutions:
|
||||
--
|
||||
-- 1. use haskell list utils. Tedious.
|
||||
-- old <- liftIO $ readFileStrictly out
|
||||
-- let isversionline s = "version" `isPrefixOf` (dropWhile isSpace $ takeWhile (not.(`elem` " :")) s)
|
||||
-- (before, _:after) = break isversionline $ lines old
|
||||
-- -- oldversion = words versionline !! 1
|
||||
-- new = unlines $ before ++ ["version: "++version] ++ after
|
||||
-- liftIO $ writeFile out new
|
||||
--
|
||||
-- 2. use regular expressions in haskell. Haskell has no portable,
|
||||
-- featureful, replacing, backreference-supporting regex lib yet.
|
||||
--
|
||||
-- 3. use sed. Have to assume non-GNU sed, eg on mac.
|
||||
|
||||
-- Things to update in package.yaml:
|
||||
--
|
||||
-- version: VER
|
||||
cmd_ Shell sed "-i -e" ("'s/(^version *:).*/\\1 "++version++"/'") out
|
||||
--
|
||||
-- -DVERSION="VER"
|
||||
cmd_ Shell sed "-i -e" ("'s/(-DVERSION=)\"[^\"]+/\\1\""++version++"/'") out
|
||||
--
|
||||
-- this package's dependencies on other hledger packages (typically hledger-lib, hledger)
|
||||
--
|
||||
-- This one is a bit tricky, and we do it with these limitations:
|
||||
-- a. We handle bounds in one of these forms (allowing extra whitespace):
|
||||
-- ==A
|
||||
-- >A
|
||||
-- >=A
|
||||
-- >A && <B
|
||||
-- >=A && <B
|
||||
-- b. We set
|
||||
-- the new lower bound to: this package's new version, V
|
||||
-- the new upper bound if any, to: the next major version after V
|
||||
-- both of which may not be what's desired.
|
||||
-- c. We convert > bounds to >= bounds.
|
||||
--
|
||||
-- hledger[-PKG] ==LOWER
|
||||
let versionre = "([0-9]+\\.)*[0-9]+" -- 2 or 3 part version number regexp
|
||||
cmd_ Shell sed "-i -e" ("'s/(hledger(-[a-z]+)?) *== *"++versionre++" *$/\\1 == "++version++"/'") out
|
||||
--
|
||||
-- hledger[-PKG] >[=]LOWER
|
||||
cmd_ Shell sed "-i -e" ("'s/(hledger(-[a-z]+)?) *>=? *"++versionre++" *$/\\1 >= "++version++"/'") out
|
||||
--
|
||||
-- hledger[-PKG] >[=]LOWER && <UPPER
|
||||
let
|
||||
pat = "(hledger(-[a-z]+)?) *>=? *"++versionre++" *&& *< *"++versionre++" *$"
|
||||
rpl = "\\1 >="++version++" \\&\\& <"++nextmajorversion -- This was a beast. These ampersands must be backslash-escaped.
|
||||
arg = "'s/"++pat++"/"++rpl++"/'"
|
||||
cmd_ Shell sed "-i -e" arg out
|
||||
|
||||
-- tagrelease: \
|
||||
-- $(call def-help,tagrelease, commit a release tag based on $(VERSIONFILE) for each package )
|
||||
-- for p in $(PACKAGES); do git tag -f $$p-$(VERSION); done
|
||||
|
||||
-- MISC
|
||||
|
||||
-- update
|
||||
|
Loading…
Reference in New Issue
Block a user