;just: port more make rules

This commit is contained in:
Simon Michael 2023-12-15 19:28:20 -10:00
parent f7763cbc9c
commit f4156475cf

579
Justfile
View File

@ -5,7 +5,8 @@
# https://just.systems/man/en/chapter_31.html Functions # https://just.systems/man/en/chapter_31.html Functions
# https://cheatography.com/linux-china/cheat-sheets/justfile Cheatsheet # https://cheatography.com/linux-china/cheat-sheets/justfile Cheatsheet
# https://github.com/casey/just/discussions # https://github.com/casey/just/discussions
# See also Makefile, Shake.hs. # This has absorbed all of Makefile; uncomment and update remaining bits when needed.
# See also Shake.hs.
# ** prelude # ** prelude
@help: @help:
@ -21,7 +22,7 @@
just -q _check || just --fmt --unstable just -q _check || just --fmt --unstable
@_watch: @_watch:
watchexec -w {{ justfile() }} -- 'just; just -q _check && echo format ok || echo format non-standard' watchexec -w {{ justfile() }} -- 'just; just -q _check && echo format ok || echo non-standard format'
# ** vars # ** vars
# GHC-compiled executables require a locale (and not just C) or they # GHC-compiled executables require a locale (and not just C) or they
@ -349,7 +350,6 @@ TESTING:
# run tests that are reasonably quick (files, unit, functional) and benchmarks # run tests that are reasonably quick (files, unit, functional) and benchmarks
test: filestest functest test: filestest functest
#bench
# For quieter tests add --silent. It may hide troubleshooting info. # For quieter tests add --silent. It may hide troubleshooting info.
# For very verbose tests add --verbosity=debug. It seems hard to get something in between. # For very verbose tests add --verbosity=debug. It seems hard to get something in between.
@ -465,110 +465,74 @@ installtest:
BENCHMARKING: BENCHMARKING:
# generate standard sample journals in examples/ # generate standard sample journals in examples/
mksamplejournals: samplejournals:
tools/generatejournal.hs 3 5 5 > examples/ascii.journal
tools/generatejournal.hs 3 5 5 --chinese > examples/chinese.journal
tools/generatejournal.hs 3 5 5 --mixed > examples/mixed.journal
tools/generatejournal.hs 10 10 10 > examples/10x10x10.journal
tools/generatejournal.hs 100 100 10 > examples/100x100x10.journal
tools/generatejournal.hs 1000 1000 10 > examples/1000x1000x10.journal
tools/generatejournal.hs 1000 10000 10 > examples/1000x10000x10.journal
tools/generatejournal.hs 2000 1000 10 > examples/2000x1000x10.journal
tools/generatejournal.hs 3000 1000 10 > examples/3000x1000x10.journal
tools/generatejournal.hs 4000 1000 10 > examples/4000x1000x10.journal
tools/generatejournal.hs 5000 1000 10 > examples/5000x1000x10.journal
tools/generatejournal.hs 6000 1000 10 > examples/6000x1000x10.journal
tools/generatejournal.hs 7000 1000 10 > examples/7000x1000x10.journal
tools/generatejournal.hs 8000 1000 10 > examples/8000x1000x10.journal
tools/generatejournal.hs 9000 1000 10 > examples/9000x1000x10.journal
tools/generatejournal.hs 10000 1000 10 > examples/10000x1000x10.journal
tools/generatejournal.hs 10000 10000 10 > examples/10000x10000x10.journal
tools/generatejournal.hs 100000 1000 10 > examples/100000x1000x10.journal
tools/generatejournal.hs 1000000 1000 10 > examples/1000000x1000x10.journal
# $ just --set BENCHEXES ledger,hledger bench
BENCHEXES := 'hledger'
bench: quickbench
# run benchmark commands in bench.sh for each of BENCHEXES, with quickbench
@quickbench:
printf "Running benchmarks with {{ BENCHEXES }} (times are approximate, can be skewed):\n"
which quickbench >/dev/null && quickbench -w {{ BENCHEXES }} || echo "quickbench not installed (see bench.sh), skipping"
# samplejournals bench.sh
# bench: samplejournals tests/bench.tests tools/simplebench \
# $(call def-help,bench,\
# run simple performance benchmarks and archive results\
# Requires some commands defined in tests/bench.tests and some BENCHEXES defined above.\
# )
# tools/simplebench -v -ftests/bench.tests $(BENCHEXES) | tee doc/profs/$(TIME).bench
# @rm -f benchresults.*
# @(cd doc/profs; rm -f latest.bench; ln -s $(TIME).bench latest.bench)
# criterionbench: samplejournals tools/criterionbench \
# $(call def-help,criterionbench,\
# run criterion benchmark tests and save graphical results\
# )
# tools/criterionbench -t png -k png
# progressionbench: samplejournals tools/progressionbench \
# $(call def-help,progressionbench,\
# run progression benchmark tests and save graphical results\
# )
# tools/progressionbench -- -t png -k png
# show throughput at various data sizes with the given hledger executable (requires samplejournals)
@throughput HLEDGEREXE:
echo date: `date`
echo system: `uname -a`
echo executable: {{ HLEDGEREXE }}
echo version: `{{ HLEDGEREXE }} --version`
for n in 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 100000 ; do \
printf "%6d txns: " $n; {{ HLEDGEREXE }} stats -f examples/${n}x1000x10.journal | tail -1; \
done
date
# show throughput at various data sizes with the latest hledger dev build, optimised or not (requires samplejournals)
@throughput-dev:
stack build hledger
stack exec -- just throughput hledger
# samplejournals: $(call def-help,samplejournals, regenerate standard sample journals in examples/) \
# examples/sample.journal \
# examples/10x10x10.journal \
# examples/100x100x10.journal \
# examples/1000x1000x10.journal \
# examples/1000x10000x10.journal \
# examples/2000x1000x10.journal \
# examples/3000x1000x10.journal \
# examples/4000x1000x10.journal \
# examples/5000x1000x10.journal \
# examples/6000x1000x10.journal \
# examples/7000x1000x10.journal \
# examples/8000x1000x10.journal \
# examples/9000x1000x10.journal \
# examples/10000x1000x10.journal \
# examples/10000x10000x10.journal \
# examples/100000x1000x10.journal \
# examples/1000000x1000x10.journal \
# # examples/ascii.journal \
# # examples/chinese.journal \
# # examples/mixed.journal \
# examples/sample.journal:
# true # XXX should probably regenerate this
# examples/10x10x10.journal: tools/generatejournal
# tools/generatejournal 10 10 10 >$@
# examples/100x100x10.journal: tools/generatejournal
# tools/generatejournal 100 100 10 >$@
# examples/1000x1000x10.journal: tools/generatejournal
# tools/generatejournal 1000 1000 10 >$@
# examples/1000x10000x10.journal: tools/generatejournal
# tools/generatejournal 1000 10000 10 >$@
# examples/2000x1000x10.journal: tools/generatejournal
# tools/generatejournal 2000 1000 10 >$@
# examples/3000x1000x10.journal: tools/generatejournal
# tools/generatejournal 3000 1000 10 >$@
# examples/4000x1000x10.journal: tools/generatejournal
# tools/generatejournal 4000 1000 10 >$@
# examples/5000x1000x10.journal: tools/generatejournal
# tools/generatejournal 5000 1000 10 >$@
# examples/6000x1000x10.journal: tools/generatejournal
# tools/generatejournal 6000 1000 10 >$@
# examples/7000x1000x10.journal: tools/generatejournal
# tools/generatejournal 7000 1000 10 >$@
# examples/8000x1000x10.journal: tools/generatejournal
# tools/generatejournal 8000 1000 10 >$@
# examples/9000x1000x10.journal: tools/generatejournal
# tools/generatejournal 9000 1000 10 >$@
# examples/10000x1000x10.journal: tools/generatejournal
# tools/generatejournal 10000 1000 10 >$@
# examples/10000x10000x10.journal: tools/generatejournal
# tools/generatejournal 10000 10000 10 >$@
# examples/100000x1000x10.journal: tools/generatejournal
# tools/generatejournal 100000 1000 10 >$@
# examples/1000000x1000x10.journal: tools/generatejournal
# tools/generatejournal 1000000 1000 10 >$@
# examples/ascii.journal: tools/generatejournal
# tools/generatejournal 3 5 5 >$@
# examples/chinese.journal: tools/generatejournal
# tools/generatejournal 3 5 5 --chinese >$@
# examples/mixed.journal: tools/generatejournal
# tools/generatejournal 3 5 5 --mixed >$@
# # hledger executables to bench test, can be overridden by env var,
# # eg: BENCHEXES=ledger,hledger-1.18,hledger make bench
# BENCHEXES ?= hledger
# bench: quickbench
# quickbench: samplejournals bench.sh $(call def-help,quickbench, benchmark commands in bench.sh with quickbench and $(BENCHEXES))
# @echo; echo "run quick performance benchmarks in bench.sh (approximate, can be skewed):"
# @which quickbench >/dev/null && quickbench -w $(BENCHEXES) || echo "quickbench not installed (see bench.sh), skipping"
# # bench: samplejournals tests/bench.tests tools/simplebench \
# # $(call def-help,bench,\
# # run simple performance benchmarks and archive results\
# # Requires some commands defined in tests/bench.tests and some BENCHEXES defined above.\
# # )
# # tools/simplebench -v -ftests/bench.tests $(BENCHEXES) | tee doc/profs/$(TIME).bench
# # @rm -f benchresults.*
# # @(cd doc/profs; rm -f latest.bench; ln -s $(TIME).bench latest.bench)
# # criterionbench: samplejournals tools/criterionbench \
# # $(call def-help,criterionbench,\
# # run criterion benchmark tests and save graphical results\
# # )
# # tools/criterionbench -t png -k png
# # progressionbench: samplejournals tools/progressionbench \
# # $(call def-help,progressionbench,\
# # run progression benchmark tests and save graphical results\
# # )
# # tools/progressionbench -- -t png -k png
# throughput: throughput-hledger \
# $(call def-help,throughput, show throughput at various data sizes with the default hledger executable )
# throughput-%: samplejournals \
# $(call def-help,throughput-HLEDGEREXE, show throughput at various data sizes with the given hledger executable )
# @echo date: `date`
# @echo system: `uname -a`
# @echo executable: $*
# @echo version: `$* --version`
# @for n in 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 100000 ; do \
# printf "%6d txns: " $$n; $* stats -f examples/$${n}x1000x10.journal | tail -1; \
# done
# @date
# throughput-dev: samplejournals \
# $(call def-help,throughput-dev, show throughput at various data sizes with the latest hledger dev build (optimised or not) )
# @stack build hledger
# @stack exec -- make -s throughput
# # prof: samplejournals \ # # prof: samplejournals \
# # $(call def-help,prof,\ # # $(call def-help,prof,\
# # generate and archive an execution profile\ # # generate and archive an execution profile\
@ -632,60 +596,73 @@ mksamplejournals:
# # view the last html code coverage report\ # # view the last html code coverage report\
# # ) # # )
# # $(VIEWHTML) doc/profs/coverage/index.html # # $(VIEWHTML) doc/profs/coverage/index.html
# ############################################################################### # ** documentation
# $(call def-help-subheading,DOCUMENTATION: (see also Shake.hs))
# # http://www.haskell.org/haddock/doc/html/invoking.html DOCUMENTATION:
# STACKHADDOCK=time $(STACK) --verbosity=error haddock --fast --no-keep-going \
# --only-locals --no-haddock-deps --no-haddock-hyperlink-source \ # see also Shake.hs
# --haddock-arguments="--no-warnings" # http://www.haskell.org/haddock/doc/html/invoking.html
# # -ghc-options='-optP-P' # workaround for http://trac.haskell.org/haddock/ticket/284
# # uncomment to run haddock on fewer packages, saving time # optimise and commit RELEASING value map diagram
# #HADDOCKPKGS=hledger-lib @releasediag:
# releasediag: \ pngquant doc/HledgerReleaseValueMap.png -f -o doc/HledgerReleaseValueMap.png
# $(call def-help,releasediag, optimise and commit RELEASING value map diagram ) git add doc/HledgerReleaseValueMap.png
# pngquant doc/HledgerReleaseValueMap.png -f -o doc/HledgerReleaseValueMap.png && git add doc/HledgerReleaseValueMap.png && git commit -m ';doc: RELEASING: update value map' -- doc/HledgerReleaseValueMap.png git commit -m ';doc: RELEASING: update value map' -- doc/HledgerReleaseValueMap.png
# # Renders all hledger packages. Run make haddock-open to open contents page.
# haddock: \ STACKHADDOCK := 'time ' + STACK + ' --verbosity=error haddock --fast --no-keep-going \
# $(call def-help,haddock, regenerate haddock docs for the hledger packages and open them ) --only-locals --no-haddock-deps --no-haddock-hyperlink-source \
# $(STACKHADDOCK) $(HADDOCKPKGS) && make -s haddock-open # --open shows all deps and packages --haddock-arguments="--no-warnings" \
'
# -ghc-options='-optP-P' # workaround for http://trac.haskell.org/haddock/ticket/284
HADDOCKPKGS := 'hledger-lib'
# regenerate haddock docs for the hledger packages and open them
haddock:
{{ STACKHADDOCK }} {{ HADDOCKPKGS }}
just haddock-open # --open shows all deps and packages
# # Rerenders all hledger packages. Run make haddock-open to open contents page. # # Rerenders all hledger packages. Run make haddock-open to open contents page.
# haddock-watch1: \ # haddock-watch1: \
# $(call def-help,haddock-watch, regenerate haddock docs when files change ) # $(call def-help,haddock-watch, regenerate haddock docs when files change )
# $(STACKHADDOCK) $(HADDOCK_PKGS) --file-watch --exec='echo done' # $(STACKHADDOCK) $(HADDOCK_PKGS) --file-watch --exec='echo done'
# # Rerenders hledger-lib modules, opens hledger-lib contents page. # # Rerenders hledger-lib modules, opens hledger-lib contents page.
# haddock-watch2: \ # haddock-watch2: \
# $(call def-help,haddock-watch2, regenerate hledger-lib haddock docs when files change ) # $(call def-help,haddock-watch2, regenerate hledger-lib haddock docs when files change )
# watchexec -r -e yaml,cabal,hs --print-events -- \ # watchexec -r -e yaml,cabal,hs --print-events -- \
# $(STACKHADDOCK) --verbosity=info $(HADDOCK_PKGS) --exec="'echo done'" hledger-lib --open # $(STACKHADDOCK) --verbosity=info $(HADDOCK_PKGS) --exec="'echo done'" hledger-lib --open
# # Rerenders/reopens the Hledger module, without submodules. (Fastest) # # Rerenders/reopens the Hledger module, without submodules. (Fastest)
# haddock-watch: \ # haddock-watch: \
# $(call def-help,haddock-watch3, quickly regenerate & reload Hledger.hs haddock when files change ) # $(call def-help,haddock-watch3, quickly regenerate & reload Hledger.hs haddock when files change )
# watchexec -r -e yaml,cabal,hs --print-events --shell=none -- bash -c 'mkdir -p tmp && rm -f tmp/Hledger.html && haddock -h -o tmp hledger-lib/Hledger.hs --no-warnings --no-print-missing-docs 2>&1 | grep -v "Could not find documentation" && open tmp/Hledger.html' # watchexec -r -e yaml,cabal,hs --print-events --shell=none -- bash -c 'mkdir -p tmp && rm -f tmp/Hledger.html && haddock -h -o tmp hledger-lib/Hledger.hs --no-warnings --no-print-missing-docs 2>&1 | grep -v "Could not find documentation" && open tmp/Hledger.html'
# haddock-open: \
# $(call def-help,haddock-open, open the haddock packages contents page in a browser ) # open the haddock packages contents page in a browser
# $(BROWSE) `stack path --local-install-root`/doc/index.html haddock-open:
{{ BROWSE }} `{{ STACK }} path --local-install-root`/doc/index.html
# hoogle-setup: $(call def-help,hoogle-setup, install hoogle then build haddocks and a hoogle db for the project and all deps ) # hoogle-setup: $(call def-help,hoogle-setup, install hoogle then build haddocks and a hoogle db for the project and all deps )
# stack hoogle --rebuild # stack hoogle --rebuild
# HOOGLEBROWSER="/Applications/Firefox Dev.app/Contents/MacOS/firefox" # safari not supported # HOOGLEBROWSER="/Applications/Firefox Dev.app/Contents/MacOS/firefox" # safari not supported
# hoogle-serve: $(call def-help,hoogle-serve, run hoogle web app and open in browser after doing setup if needed ) # hoogle-serve: $(call def-help,hoogle-serve, run hoogle web app and open in browser after doing setup if needed )
# $(HOOGLEBROWSER) http://localhost:8080 & # $(HOOGLEBROWSER) http://localhost:8080 &
# stack --verbosity=warn hoogle --server # stack --verbosity=warn hoogle --server
# # sourcegraph: \ # # sourcegraph: \
# # $(call def-help,sourcegraph,\ # # $(call def-help,sourcegraph,\
# # \ # # \
# # ) # # )
# # for p in $(PACKAGES); do (cd $$p; SourceGraph $$p.cabal); done # # for p in $(PACKAGES); do (cd $$p; SourceGraph $$p.cabal); done
# manuals-watch: Shake \ # manuals-watch: Shake \
# $(call def-help,manuals-watch, rerender manuals when their source files change ) # $(call def-help,manuals-watch, rerender manuals when their source files change )
# ls $(DOCSOURCEFILES) | entr ./Shake -VV manuals # ls $(DOCSOURCEFILES) | entr ./Shake -VV manuals
# man-watch: man-watch-hledger \ # man-watch: man-watch-hledger \
# $(call def-help,man-watch, run man on the hledger man page when its source file changes ) # $(call def-help,man-watch, run man on the hledger man page when its source file changes )
# man-watch-%: Shake \ # man-watch-%: Shake \
# $(call def-help,man-watch-PROG, run man on the given man page when its source file changes. Eg make man-watch-hledger-web ) # $(call def-help,man-watch-PROG, run man on the given man page when its source file changes. Eg make man-watch-hledger-web )
# $(WATCHEXEC) -r -w $*/$*.m4.md './Shake $*/$*.1 && man $*/$*.1' # $(WATCHEXEC) -r -w $*/$*.m4.md './Shake $*/$*.1 && man $*/$*.1'
# shakehelp-watch: \ # shakehelp-watch: \
# $(call def-help,shakehelp-watch, rerender Shake.hs's help when it changes) # $(call def-help,shakehelp-watch, rerender Shake.hs's help when it changes)
# ls Shake.hs | entr -c ./Shake.hs # ls Shake.hs | entr -c ./Shake.hs
# # The following rule, for updating the website, gets called on hledger.org by: # # The following rule, for updating the website, gets called on hledger.org by:
# # 1. github-post-receive (github webhook handler), when something is pushed # # 1. github-post-receive (github webhook handler), when something is pushed
# # to the main or wiki repos on Github. Config: # # to the main or wiki repos on Github. Config:
@ -696,29 +673,29 @@ mksamplejournals:
# .PHONY: site # .PHONY: site
# # Use the existing Shake executable without recompiling it, so as not to automatially run unreviewed code by hook ? I think this no longer applies. # # Use the existing Shake executable without recompiling it, so as not to automatially run unreviewed code by hook ? I think this no longer applies.
# # site: $(call def-help,site-build, update the hledger.org website (run this on hledger.org, or run "make hledgerorg" elsewhere) ) # # site: $(call def-help,site-build, update the hledger.org website (run this on hledger.org, or run "make hledgerorg" elsewhere) )
# # @[ ! -x Shake ] \ # # @[ ! -x Shake ] \
# # && echo 'Please run "make Shake" first (manual compilation required for safety)' \ # # && echo 'Please run "make Shake" first (manual compilation required for safety)' \
# # || ( \ # # || ( \
# # echo; \ # # echo; \
# # ./Shake -V site; \ # # ./Shake -V site; \
# # ) 2>&1 | tee -a site.log # # ) 2>&1 | tee -a site.log
# site: Shake \ # site: Shake \
# $(call def-help,site, update the hledger.org website (run on hledger.org, or run "make hledgerorg" elsewhere) ) # $(call def-help,site, update the hledger.org website (run on hledger.org, or run "make hledgerorg" elsewhere) )
# ./Shake -V site 2>&1 | tee -a site.log # ./Shake -V site 2>&1 | tee -a site.log
# BROWSE=open # BROWSE=open
# BROWSEDELAY=5 # BROWSEDELAY=5
# LOCALSITEURL=http://localhost:3000/dev/hledger.html # LOCALSITEURL=http://localhost:3000/dev/hledger.html
# site-watch: $(call def-help,site-watch, open a browser on the website (in ./site) and rerender when docs or web pages change ) # site-watch: $(call def-help,site-watch, open a browser on the website (in ./site) and rerender when docs or web pages change )
# @make -s Shake # @make -s Shake
# @(printf "\nbrowser will open in $(BROWSEDELAY)s (adjust BROWSE in Makefile if needed)...\n\n"; sleep $(BROWSEDELAY); $(BROWSE) $(LOCALSITEURL)) & # @(printf "\nbrowser will open in $(BROWSEDELAY)s (adjust BROWSE in Makefile if needed)...\n\n"; sleep $(BROWSEDELAY); $(BROWSE) $(LOCALSITEURL)) &
# @$(WATCHEXEC) --print-events -e md,m4 -i hledger.md -i hledger-ui.md -i hledger-web.md -r './Shake webmanuals && ./Shake orgfiles && make -sC site serve' # @$(WATCHEXEC) --print-events -e md,m4 -i hledger.md -i hledger-ui.md -i hledger-web.md -r './Shake webmanuals && ./Shake orgfiles && make -sC site serve'
# ** installing # ** installing
INSTALLING: INSTALLING:
# # copy the current ~/.local/bin/hledger to bin/old/hledger-VER # # copy the current ~/.local/bin/hledger to bin/old/hledger-VER
# @copy-as VER: # @copy-as VER:
# cp ~/.local/bin/hledger bin/old/hledger-{{ VER }}; echo "bin/hledger-{{ VER }}" # cp ~/.local/bin/hledger bin/old/hledger-{{ VER }}; echo "bin/hledger-{{ VER }}"
# stack install, then copy the hledger executables to bin/old/hledger*-VER # stack install, then copy the hledger executables to bin/old/hledger*-VER
@installas VER: @installas VER:
@ -839,8 +816,6 @@ _gitSwitchAutoCreate BRANCH:
git switch -c {{ BRANCH }} git switch -c {{ BRANCH }}
fi fi
# ###############################################################################
# $(call def-help-subheading,RELEASING:)
# # old/desired release process: # # old/desired release process:
# # a normal release: echo 0.7 >.version; make release # # a normal release: echo 0.7 >.version; make release
# # a bugfix release: echo 0.7.1 >.version; make release # # a bugfix release: echo 0.7.1 >.version; make release
@ -850,161 +825,161 @@ _gitSwitchAutoCreate BRANCH:
# ISCLEAN=git diff-index --quiet HEAD -- # ISCLEAN=git diff-index --quiet HEAD --
# # stop if the working directory has uncommitted changes # # stop if the working directory has uncommitted changes
# iscleanwd: # iscleanwd:
# @$(ISCLEAN) || (echo "please clean the working directory first"; false) # @$(ISCLEAN) || (echo "please clean the working directory first"; false)
# # stop if the given file(s) have uncommitted changes # # stop if the given file(s) have uncommitted changes
# isclean-%: # isclean-%:
# @$(ISCLEAN) $* || (echo "please clean these files first: $*"; false) # @$(ISCLEAN) $* || (echo "please clean these files first: $*"; false)
# # update all cabal files based on latest package.yaml files using stack's built-in hpack # # update all cabal files based on latest package.yaml files using stack's built-in hpack
# cabal: $(call def-help,cabal, regenerate cabal files from package.yaml files with stack ) # cabal: $(call def-help,cabal, regenerate cabal files from package.yaml files with stack )
# $(STACK) build --dry-run --silent # $(STACK) build --dry-run --silent
# # Update all cabal files based on latest package.yaml files using a specific hpack version. # # Update all cabal files based on latest package.yaml files using a specific hpack version.
# # To avoid warnings, this should be the same version as stack's built-in hpack. # # To avoid warnings, this should be the same version as stack's built-in hpack.
# cabal-with-hpack-%: # cabal-with-hpack-%:
# $(STACK) build --with-hpack hpack-$* --dry-run --silent # $(STACK) build --with-hpack hpack-$* --dry-run --silent
# # updatecabal: gencabal $(call def-help,updatecabal, regenerate cabal files and commit ) # # updatecabal: gencabal $(call def-help,updatecabal, regenerate cabal files and commit )
# # @read -p "please review changes then press enter to commit $(shell ls */*.cabal)" # # @read -p "please review changes then press enter to commit $(shell ls */*.cabal)"
# # git commit -m "update cabal files" $(shell ls */*.cabal) # # git commit -m "update cabal files" $(shell ls */*.cabal)
# # we use shake for this job; so dependencies aren't checked here # # we use shake for this job; so dependencies aren't checked here
# manuals: Shake $(call def-help,manuals, regenerate and commit CLI help and manuals (might need -B) ) # manuals: Shake $(call def-help,manuals, regenerate and commit CLI help and manuals (might need -B) )
# ./Shake manuals # ./Shake manuals
# git commit -m ";doc: regen manuals" -m "[ci skip]" hledger*/hledger*.{1,5,info,txt} hledger/Hledger/Cli/Commands/*.txt # git commit -m ";doc: regen manuals" -m "[ci skip]" hledger*/hledger*.{1,5,info,txt} hledger/Hledger/Cli/Commands/*.txt
# tag: $(call def-help,tag, make git release tags for the project and all packages ) # tag: $(call def-help,tag, make git release tags for the project and all packages )
# @for p in $(PACKAGES); do make tag-$$p; done # @for p in $(PACKAGES); do make tag-$$p; done
# @make tag-project # @make tag-project
# tag-%: $(call def-help,tag-PKG, make a git release tag for PKG ) # tag-%: $(call def-help,tag-PKG, make a git release tag for PKG )
# git tag -fs $*-`cat $*/.version` -m "Release $*-`cat $*/.version`" # git tag -fs $*-`cat $*/.version` -m "Release $*-`cat $*/.version`"
# tag-project: $(call def-help,tag-project, make a git release tag for the project as a whole ) # tag-project: $(call def-help,tag-project, make a git release tag for the project as a whole )
# git tag -fs `cat .version` -m "Release `cat .version`, https://hledger.org/release-notes.html#hledger-`cat .version | sed -e 's/\./-/g'`" # git tag -fs `cat .version` -m "Release `cat .version`, https://hledger.org/release-notes.html#hledger-`cat .version | sed -e 's/\./-/g'`"
# @printf "if tagging a major release, please also review and run this command:\n" # @printf "if tagging a major release, please also review and run this command:\n"
# @printf " git tag -fs `cat .version`.99 master -m \"Start of next release cycle. This tag influences git describe and dev builds' version strings.\"\n" # @printf " git tag -fs `cat .version`.99 master -m \"Start of next release cycle. This tag influences git describe and dev builds' version strings.\"\n"
# # hackageupload-dry: \ # # hackageupload-dry: \
# # $(call def-help,hackageupload-dry,\ # # $(call def-help,hackageupload-dry,\
# # upload all packages to hackage; dry run\ # # upload all packages to hackage; dry run\
# # ) # # )
# # for p in $(PACKAGES); do cabal upload $$p/dist/$$p-$(VERSION).tar.gz -v2 --check; done # # for p in $(PACKAGES); do cabal upload $$p/dist/$$p-$(VERSION).tar.gz -v2 --check; done
# hackageupload: \ # hackageupload: \
# $(call def-help,hackageupload, upload all packages to hackage from a release branch) # $(call def-help,hackageupload, upload all packages to hackage from a release branch)
# tools/hackageupload $(PACKAGES) # tools/hackageupload $(PACKAGES)
# # showreleasestats stats: \ # # showreleasestats stats: \
# # showreleasedays \ # # showreleasedays \
# # showunreleasedchangecount \ # # showunreleasedchangecount \
# # showloc \ # # showloc \
# # showtestcount \ # # showtestcount \
# # showunittestcoverage \ # # showunittestcoverage \
# # showreleaseauthors \ # # showreleaseauthors \
# # showunreleasedcodechanges \ # # showunreleasedcodechanges \
# # showunpushedchanges \ # # showunpushedchanges \
# # $(call def-help,showreleasestats stats,\ # # $(call def-help,showreleasestats stats,\
# # show project stats useful for release notes\ # # show project stats useful for release notes\
# # ) # # )
# # # showerrors # # # showerrors
# # FROMTAG=. # # FROMTAG=.
# # showreleasedays: \ # # showreleasedays: \
# # $(call def-help,showreleasedays,\ # # $(call def-help,showreleasedays,\
# # \ # # \
# # ) # # )
# # @echo Days since last release: # # @echo Days since last release:
# # @tools/dayssincetag.hs $(FROMTAG) | head -1 | cut -d' ' -f-1 # # @tools/dayssincetag.hs $(FROMTAG) | head -1 | cut -d' ' -f-1
# # @echo # # @echo
# # # XXX # # # XXX
# # showunreleasedchangecount: \ # # showunreleasedchangecount: \
# # $(call def-help,showunreleasedchangecount,\ # # $(call def-help,showunreleasedchangecount,\
# # \ # # \
# # ) # # )
# # @echo Commits since last release: # # @echo Commits since last release:
# # @darcs changes --from-tag $(FROMTAG) --count # # @darcs changes --from-tag $(FROMTAG) --count
# # @echo # # @echo
# describe: $(call def-help,describe, show a precise git-describe version string ) # describe: $(call def-help,describe, show a precise git-describe version string )
# @git describe --tags --match 'hledger-[0-9]*' --dirty # @git describe --tags --match 'hledger-[0-9]*' --dirty
# # showreleaseauthors: $(call def-help,showreleaseauthors, show author names since last release) # # showreleaseauthors: $(call def-help,showreleaseauthors, show author names since last release)
# # @echo Commit authors since last release: # # @echo Commit authors since last release:
# # @git shortlog -sn $(CHANGELOGSTART).. # TODO undefined # # @git shortlog -sn $(CHANGELOGSTART).. # TODO undefined
# showauthors: $(call def-help,showauthors, show all commit author names) # showauthors: $(call def-help,showauthors, show all commit author names)
# @echo "Commit authors ($$(git shortlog -sn | wc -l | awk '{print $$1}'))": # @echo "Commit authors ($$(git shortlog -sn | wc -l | awk '{print $$1}'))":
# @git shortlog -sn # @git shortlog -sn
# cloc: $(call def-help,cloc, count lines of source code ) # cloc: $(call def-help,cloc, count lines of source code )
# @echo Lines of code including tests: # @echo Lines of code including tests:
# @cloc --exclude-lang=HTML --exclude-dir=.stack-work,.idea,dist,old,bin,doc,site,.tutorial-data,static,angular . # @cloc --exclude-lang=HTML --exclude-dir=.stack-work,.idea,dist,old,bin,doc,site,.tutorial-data,static,angular .
# SCC=scc -z --cocomo-project-type semi-detached -f wide -s code # SCC=scc -z --cocomo-project-type semi-detached -f wide -s code
# scc: $(call def-help,scc, count lines of source code with scc) # scc: $(call def-help,scc, count lines of source code with scc)
# @echo Lines of code including tests: # @echo Lines of code including tests:
# @$(SCC) -i hs,sh,m4,hamlet # @$(SCC) -i hs,sh,m4,hamlet
# sccv: $(call def-help,sccv, count lines of source code with scc showing all files) # sccv: $(call def-help,sccv, count lines of source code with scc showing all files)
# @echo Lines of code including tests: # @echo Lines of code including tests:
# @$(SCC) -i hs,sh,m4,hamlet --by-file # @$(SCC) -i hs,sh,m4,hamlet --by-file
# # `ls $(SOURCEFILES)` # # `ls $(SOURCEFILES)`
# # sloc: \ # # sloc: \
# # $(call def-help,sloc,\ # # $(call def-help,sloc,\
# # \ # # \
# # ) # # )
# # @sloccount hledger-lib hledger hledger-web # # @sloccount hledger-lib hledger hledger-web
# # cloc: \ # # cloc: \
# # $(call def-help,cloc,\ # # $(call def-help,cloc,\
# # \ # # \
# # ) # # )
# # @echo # # @echo
# # @echo "Lines of code as of `date`:" # # @echo "Lines of code as of `date`:"
# # @echo # # @echo
# # @echo "hledger-lib, hledger" # # @echo "hledger-lib, hledger"
# # @cloc -q hledger-lib hledger 2>&1 | grep -v 'defined(' # # @cloc -q hledger-lib hledger 2>&1 | grep -v 'defined('
# # @echo # # @echo
# # @echo "hledger-web" # # @echo "hledger-web"
# # @cloc -q hledger-web 2>&1 | grep -v 'defined(' # # @cloc -q hledger-web 2>&1 | grep -v 'defined('
# # @echo # # @echo
# # @echo "hledger-lib, hledger, hledger-web" # # @echo "hledger-lib, hledger, hledger-web"
# # @cloc -q hledger-lib hledger hledger-web 2>&1 | grep -v 'defined(' # # @cloc -q hledger-lib hledger hledger-web 2>&1 | grep -v 'defined('
# # showtestcount: \ # # showtestcount: \
# # $(call def-help,showtestcount,\ # # $(call def-help,showtestcount,\
# # \ # # \
# # ) # # )
# # @echo "Unit tests:" # # @echo "Unit tests:"
# # @hledger test 2>&1 | cut -d' ' -f2 # # @hledger test 2>&1 | cut -d' ' -f2
# # @echo "Functional tests:" # # @echo "Functional tests:"
# # @make --no-print functest | egrep '^ Total' | awk '{print $$2}' # # @make --no-print functest | egrep '^ Total' | awk '{print $$2}'
# # @echo # # @echo
# # showunittestcoverage: \ # # showunittestcoverage: \
# # $(call def-help,showunittestcoverage,\ # # $(call def-help,showunittestcoverage,\
# # \ # # \
# # ) # # )
# # @echo Unit test coverage: # # @echo Unit test coverage:
# # @make --no-print quickcoverage | grep 'expressions' # # @make --no-print quickcoverage | grep 'expressions'
# # @echo # # @echo
# # # showerrors: # # # showerrors:
# # # @echo Known errors: # # # @echo Known errors:
# # # @awk '/^** errors/, /^** / && !/^** errors/' NOTES.org | grep '^\*\*\* ' | tail +1 # # # @awk '/^** errors/, /^** / && !/^** errors/' NOTES.org | grep '^\*\*\* ' | tail +1
# # # @echo # # # @echo
# # # XXX # # # XXX
# # showunpushedchanges showunpushed: \ # # showunpushedchanges showunpushed: \
# # $(call def-help,showunpushedchanges showunpushed,\ # # $(call def-help,showunpushedchanges showunpushed,\
# # \ # # \
# # ) # # )
# # @echo "Changes not yet pushed upstream (to `darcs show repo | grep 'Default Remote' | cut -c 17-`):" # # @echo "Changes not yet pushed upstream (to `darcs show repo | grep 'Default Remote' | cut -c 17-`):"
# # @-darcs push simon@joyful.com:/repos/hledger --dry-run | grep '*' | tac # # @-darcs push simon@joyful.com:/repos/hledger --dry-run | grep '*' | tac
# # @echo # # @echo
# # # XXX # # # XXX
# # showunreleasedcodechanges showunreleased showchanges: \ # # showunreleasedcodechanges showunreleased showchanges: \
# # $(call def-help,showunreleasedcodechanges showunreleased showchanges,\ # # $(call def-help,showunreleasedcodechanges showunreleased showchanges,\
# # \ # # \
# # ) # # )
# # @echo "hledger code changes since last release:" # # @echo "hledger code changes since last release:"
# # @darcs changes --from-tag $(FROMTAG) --matches "not (name docs: or name doc: or name site: or name tools:)" | grep '*' # # @darcs changes --from-tag $(FROMTAG) --matches "not (name docs: or name doc: or name site: or name tools:)" | grep '*'
# # @echo # # @echo
# # # XXX # # # XXX
# # showcodechanges: \ # # showcodechanges: \
# # $(call def-help,showcodechanges,\ # # $(call def-help,showcodechanges,\
# # \ # # \
# # ) # # )
# # @echo "hledger code changes:" # # @echo "hledger code changes:"
# # @darcs changes --matches "not (name docs: or name site: or name tools:)" | egrep '^ +(\*|tagged)' # # @darcs changes --matches "not (name docs: or name site: or name tools:)" | egrep '^ +(\*|tagged)'
# # @echo # # @echo
# nix-hledger-version: $(call def-help,nix-hledger-version, show which version of hledger has reached nixpkgs) # nix-hledger-version: $(call def-help,nix-hledger-version, show which version of hledger has reached nixpkgs)
# @curl -s https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/development/haskell-modules/hackage-packages.nix | grep -A1 'pname = "hledger"' # @curl -s https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/development/haskell-modules/hackage-packages.nix | grep -A1 'pname = "hledger"'
# nix-hledger-versions: $(call def-help,nix-hledger-versions, show versions of all hledger packages in nixpkgs) # nix-hledger-versions: $(call def-help,nix-hledger-versions, show versions of all hledger packages in nixpkgs)
# @curl -s https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/development/haskell-modules/hackage-packages.nix | grep -A1 'pname = "hledger' # @curl -s https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/development/haskell-modules/hackage-packages.nix | grep -A1 'pname = "hledger'
# nix-view-commits: $(call def-help,nix-view-commits, show recent haskell commits in nixpkgs) # nix-view-commits: $(call def-help,nix-view-commits, show recent haskell commits in nixpkgs)
# @open 'https://github.com/NixOS/nixpkgs/commits/master/pkgs/development/haskell-modules/hackage-packages.nix' # @open 'https://github.com/NixOS/nixpkgs/commits/master/pkgs/development/haskell-modules/hackage-packages.nix'
# list-commits: $(call def-help,list-commits, list all commits chronologically and numbered) # list-commits: $(call def-help,list-commits, list all commits chronologically and numbered)
# @git log --format='%ad %h %s (%an)' --date=short --reverse | cat -n # @git log --format='%ad %h %s (%an)' --date=short --reverse | cat -n
# ** misc # ** misc
MISC: MISC:
@ -1080,51 +1055,51 @@ mkwebdirs:
# ############################################################################### # ###############################################################################
# $(call def-help-subheading,MISCELLANEOUS:) # $(call def-help-subheading,MISCELLANEOUS:)
# installcommithook: $(call def-help,installcommithook, symlink tools/commitlint as .git/hooks/commit-msg) # installcommithook: $(call def-help,installcommithook, symlink tools/commitlint as .git/hooks/commit-msg)
# ln -s ../../tools/commitlint .git/hooks/commit-msg # ln -s ../../tools/commitlint .git/hooks/commit-msg
# watch-%: $(call def-help,watch-RULE, run make RULE repeatedly when any committed file changes) # watch-%: $(call def-help,watch-RULE, run make RULE repeatedly when any committed file changes)
# @git ls-files | entr -r make $* # @git ls-files | entr -r make $*
# Shake: Shake.hs $(call def-help,Shake, ensure the Shake script is compiled ) # Shake: Shake.hs $(call def-help,Shake, ensure the Shake script is compiled )
# ./Shake.hs # ./Shake.hs
# usage: cabalusage stackusage \ # usage: cabalusage stackusage \
# $(call def-help,usage, show size of various dirs ) # $(call def-help,usage, show size of various dirs )
# du -sh .git bin data doc extra # du -sh .git bin data doc extra
# du -sh . # du -sh .
# stackusage: \ # stackusage: \
# $(call def-help,stackusage, show size of stack working dirs if any ) # $(call def-help,stackusage, show size of stack working dirs if any )
# -du -shc `find . -name '.stack*'` # -du -shc `find . -name '.stack*'`
# cabalusage: \ # cabalusage: \
# $(call def-help,cabalusage, show size of cabal working dirs if any ) # $(call def-help,cabalusage, show size of cabal working dirs if any )
# -du -shc */dist* 2>/dev/null # -du -shc */dist* 2>/dev/null
# # Generate an emacs TAGS file. Tag: # # Generate an emacs TAGS file. Tag:
# # 1. haskell source files with hasktags # # 1. haskell source files with hasktags
# # 2. other source files recognised by (exuberant) ctags and not excluded by .ctags. Keep .ctags up to date. # # 2. other source files recognised by (exuberant) ctags and not excluded by .ctags. Keep .ctags up to date.
# # 3. some extra files missed by the above, as just their file names (for tags-search, tags-query-replace etc.) # # 3. some extra files missed by the above, as just their file names (for tags-search, tags-query-replace etc.)
# etags:$(call def-help,etags, generate emacs TAGS file for haskell source and other project files ) # etags:$(call def-help,etags, generate emacs TAGS file for haskell source and other project files )
# hasktags -e $(SOURCEFILES) # hasktags -e $(SOURCEFILES)
# ctags -a -e -R # ctags -a -e -R
# for f in \ # for f in \
# $(WEBTEMPLATEFILES) \ # $(WEBTEMPLATEFILES) \
# $(DOCSOURCEFILES) \ # $(DOCSOURCEFILES) \
# $(TESTFILES) \ # $(TESTFILES) \
# $(HPACKFILES) \ # $(HPACKFILES) \
# $(CABALFILES) \ # $(CABALFILES) \
# Shake.hs \ # Shake.hs \
# ; do printf " \n$$f,1\n" >> TAGS; done # ; do printf " \n$$f,1\n" >> TAGS; done
# -etagsls >TAGS.files # -etagsls >TAGS.files
# etags-ls: # list files indexed in TAGS # etags-ls: # list files indexed in TAGS
# @rg -v '[  ]' TAGS | rg -r '$$1' '^(.*?)([0-9]+)?,[0-9,]+*' # @rg -v '[  ]' TAGS | rg -r '$$1' '^(.*?)([0-9]+)?,[0-9,]+*'
# cleantags: \ # cleantags: \
# $(call def-help-hide,cleantags, remove tag files ) # $(call def-help-hide,cleantags, remove tag files )
# rm -f TAGS tags # rm -f TAGS tags
# stackclean: \ # stackclean: \
# $(call def-help-hide,stackclean, remove .stack-work/ dirs ) # $(call def-help-hide,stackclean, remove .stack-work/ dirs )
# $(STACK) purge # $(STACK) purge
# cleanghco: \ # cleanghco: \
# $(call def-help-hide,cleanghc, remove ghc build leftovers ) # $(call def-help-hide,cleanghc, remove ghc build leftovers )
# rm -rf `find . -name "*.o" -o -name "*.hi" -o -name "*.dyn_o" -o -name "*.dyn_hi" -o -name "*~" | grep -vE '\.(stack-work|cabal-sandbox|virthualenv)'` # rm -rf `find . -name "*.o" -o -name "*.hi" -o -name "*.dyn_o" -o -name "*.dyn_hi" -o -name "*~" | grep -vE '\.(stack-work|cabal-sandbox|virthualenv)'`
# #rm -f `fd -I '\.(hi|o|dyn_hi|dyn_o)$'` # #rm -f `fd -I '\.(hi|o|dyn_hi|dyn_o)$'`
# clean: cleanghco \ # clean: cleanghco \
# $(call def-help,clean, default cleanup (ghc build leftovers) ) # $(call def-help,clean, default cleanup (ghc build leftovers) )
# Clean: stackclean cleanghco cleantags \ # Clean: stackclean cleanghco cleantags \
# $(call def-help,Clean, thorough cleanup (stack/ghc leftovers/tags) ) # $(call def-help,Clean, thorough cleanup (stack/ghc leftovers/tags) )
# # reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1)),$(1)) # # reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1)),$(1))