mirror of
https://github.com/daylinmorgan/task.mk.git
synced 2024-11-14 21:17:53 -06:00
Compare commits
8 commits
bf0394c5e1
...
3244dba8dc
Author | SHA1 | Date | |
---|---|---|---|
3244dba8dc | |||
0ebf57bd9e | |||
39289ae67b | |||
dca98b8698 | |||
4fcab2a13b | |||
949c35e2a3 | |||
5c65cae578 | |||
83fe41dbe4 |
9 changed files with 96 additions and 44 deletions
6
.github/workflows/docs.yml
vendored
6
.github/workflows/docs.yml
vendored
|
@ -2,8 +2,8 @@ name: GitHub Pages
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
tags: ["v*.*.*"]
|
||||||
- main
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
|
@ -20,7 +20,7 @@ jobs:
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v3
|
uses: actions/setup-python@v3
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: "3.9"
|
||||||
|
|
||||||
- name: Upgrade pip
|
- name: Upgrade pip
|
||||||
run: |
|
run: |
|
||||||
|
|
10
.task.cfg.mk
Normal file
10
.task.cfg.mk
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
define USAGE
|
||||||
|
{a.style('usage','header')}:\n make <recipe>\n
|
||||||
|
Turn your {a.style('`Makefile`','b_magenta')} into
|
||||||
|
the {a.italic}{a.underline}task runner{a.end} you always needed.
|
||||||
|
See the example output below.\n
|
||||||
|
endef
|
||||||
|
|
||||||
|
EPILOG = \nfor more info: gh.dayl.in/task.mk
|
||||||
|
PRINT_VARS := VERSION SHELL
|
||||||
|
|
55
Makefile
55
Makefile
|
@ -1,12 +1,10 @@
|
||||||
VERSION ?= $(shell git describe --tags --always --dirty | sed s'/dirty/dev/')
|
VERSION ?= $(shell git describe --tags --always --dirty=dev)
|
||||||
TEMPLATES := $(shell find src/ -type f)
|
TEMPLATES := $(shell find src/ -type f)
|
||||||
.DEFAULT_GOAL := help
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
msg = $(if $(tprint),$(call tprint,{a.bold}==> {a.magenta}$(1){a.end}),@echo '==> $(1)')
|
msg = $(if $(tprint),$(call tprint,{a.bold}==> {a.magenta}$(1){a.end}),@echo '==> $(1)')
|
||||||
|
|
||||||
|
### task.mk development |> -d -ms b_green --align center
|
||||||
### task.mk development | args: -d -ms b_green --align center
|
## bootstrap | generate local dev environment |> -ms b_magenta -gs b_cyan
|
||||||
## bootstrap | generate local dev environment
|
|
||||||
.PHONY: bootstrap env hooks
|
.PHONY: bootstrap env hooks
|
||||||
bootstrap: env hooks
|
bootstrap: env hooks
|
||||||
env:
|
env:
|
||||||
|
@ -17,6 +15,7 @@ hooks:
|
||||||
@git config core.hooksPath .githooks
|
@git config core.hooksPath .githooks
|
||||||
docs-env:
|
docs-env:
|
||||||
@mamba run -p ./env pip install mkdocs-material mkdocs-git-revision-date-localized-plugin
|
@mamba run -p ./env pip install mkdocs-material mkdocs-git-revision-date-localized-plugin
|
||||||
|
|
||||||
## l, lint | lint the python
|
## l, lint | lint the python
|
||||||
.PHONY: l lint
|
.PHONY: l lint
|
||||||
l lint:
|
l lint:
|
||||||
|
@ -29,33 +28,40 @@ l lint:
|
||||||
assets:
|
assets:
|
||||||
@yartsu -o assets/help.svg -t "make help" -- make --no-print-directory help
|
@yartsu -o assets/help.svg -t "make help" -- make --no-print-directory help
|
||||||
|
|
||||||
|
define release_sh
|
||||||
|
./generate.py $(subst v,,$(VERSION)) > task.mk
|
||||||
|
sed -i 's/task.mk\/.*\/task.mk/task.mk\/$(VERSION)\/task.mk/g' README.md docs/index.md
|
||||||
|
git add task.mk README.md docs/index.md
|
||||||
|
git commit -m "release: $(VERSION)" --no-verify
|
||||||
|
git tag $(VERSION)
|
||||||
|
endef
|
||||||
|
|
||||||
## release | release new version of task.mk
|
## release | release new version of task.mk
|
||||||
.PHONY: release
|
.PHONY: release
|
||||||
release: version-check
|
release: version-check
|
||||||
$(call msg,Release Project)
|
$(call msg,Release Project)
|
||||||
@./generate.py $(VERSION) > task.mk
|
$(call tbash,release_sh)
|
||||||
@sed -i 's/task.mk\/.*\/task.mk/task.mk\/v$(VERSION)\/task.mk/g' README.md
|
|
||||||
@sed -i 's/task.mk\/.*\/task.mk/task.mk\/v$(VERSION)\/task.mk/g' docs/index.md
|
|
||||||
@git add task.mk README.md docs/index.md
|
|
||||||
@git commit -m "release: v$(VERSION)" --no-verify
|
|
||||||
@git tag v$(VERSION)
|
|
||||||
|
|
||||||
## c, clean | remove the generated files
|
## c, clean | remove the generated files
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
c clean:
|
c clean:
|
||||||
@rm -f task.mk .task.mk
|
@rm -f task.mk .task.mk
|
||||||
|
|
||||||
|
define version_check_sh
|
||||||
|
if [[ "${VERSION}" == *'-'* ]]; then
|
||||||
|
$(call tprint-sh,{a.red}VERSION INVALID! Uncommited or untagged work{a.end})
|
||||||
|
exit 1
|
||||||
|
elif [[ $(shell echo "${VERSION}" | awk -F. '{ print NF }') -lt 3 ]];then\
|
||||||
|
$(call tprint-sh,{a.red}VERSION INVALID! Expected CalVer string{a.end})
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
endef
|
||||||
|
|
||||||
.PHONY: version-check
|
.PHONY: version-check
|
||||||
version-check:
|
version-check:
|
||||||
@if [[ "${VERSION}" == *'-'* ]]; then\
|
@$(call tprint,>> version: {a.green}$(VERSION){a.end})
|
||||||
$(call tprint-sh,{a.red}VERSION INVALID! Uncommited or untagged work{a.end});\
|
@$(call tbash,version_check_sh)
|
||||||
echo ">> version: $(VERSION)"; exit 1;\
|
@$(call tprint,>> {a.green}VERSION LOOKS GOOD!{a.end})
|
||||||
elif [[ $(shell echo "${VERSION}" | awk -F. '{ print NF }') -lt 3 ]];then\
|
|
||||||
$(call tprint-sh,{a.red}VERSION INVALID! Expected CalVer string{a.end});\
|
|
||||||
echo ">> version: $(VERSION)"; exit 1;\
|
|
||||||
else \
|
|
||||||
$(call tprint-sh,{a.green}VERSION LOOKS GOOD!{a.end});\
|
|
||||||
fi
|
|
||||||
|
|
||||||
## info | demonstrate usage of tprint
|
## info | demonstrate usage of tprint
|
||||||
.PHONY: task
|
.PHONY: task
|
||||||
|
@ -68,15 +74,6 @@ info:
|
||||||
task.mk: $(TEMPLATES) generate.py
|
task.mk: $(TEMPLATES) generate.py
|
||||||
./generate.py $(VERSION) > task.mk
|
./generate.py $(VERSION) > task.mk
|
||||||
|
|
||||||
define USAGE
|
|
||||||
{a.style('usage','header')}:\n make <recipe>\n
|
|
||||||
Turn your {a.style('`Makefile`','b_magenta')} into
|
|
||||||
the {a.italic}{a.underline}task runner{a.end} you always needed.
|
|
||||||
See the example output below.\n
|
|
||||||
endef
|
|
||||||
|
|
||||||
EPILOG = \nfor more info: gh.dayl.in/task.mk
|
|
||||||
PRINT_VARS := VERSION SHELL
|
|
||||||
-include .task.mk
|
-include .task.mk
|
||||||
.task.mk: $(TEMPLATES) generate.py
|
.task.mk: $(TEMPLATES) generate.py
|
||||||
$(call msg,re-jinjaing the local .task.mk)
|
$(call msg,re-jinjaing the local .task.mk)
|
||||||
|
|
|
@ -54,6 +54,7 @@ See this project's `make info` for an example.
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
You can quickly customize some of the default behavior of `task.mk` by overriding the below variables prior to the `-include .task.mk`.
|
You can quickly customize some of the default behavior of `task.mk` by overriding the below variables prior to the `-include .task.mk`.
|
||||||
|
These can also be included in a seperate file `.task.cfg.mk`.
|
||||||
|
|
||||||
```make
|
```make
|
||||||
# ---- [config] ---- #
|
# ---- [config] ---- #
|
||||||
|
@ -87,7 +88,7 @@ may be easier than balancing sub-shells and strung together awk commands.
|
||||||
|
|
||||||
When `make` expands the function it will take the parameters passed to `py` and expand them.
|
When `make` expands the function it will take the parameters passed to `py` and expand them.
|
||||||
`$(1)` is the variable name and `$(2)` in this case is the implicit pattern from the rule. Pay attention to quotes.
|
`$(1)` is the variable name and `$(2)` in this case is the implicit pattern from the rule. Pay attention to quotes.
|
||||||
If you need to debug your python script, use `DEBUG=1` when you run `make` and it will first print the script that will be piped to `python`.
|
If you need to debug your python script, use `TASKMK_DEBUG=1` when you run `make` and it will first print the script that will be piped to `python`.
|
||||||
|
|
||||||
```make
|
```make
|
||||||
define list_files_py
|
define list_files_py
|
||||||
|
|
|
@ -5,7 +5,7 @@ ifeq (help,$(firstword $(MAKECMDGOALS)))
|
||||||
endif
|
endif
|
||||||
## h, help | show this help
|
## h, help | show this help
|
||||||
h help:
|
h help:
|
||||||
$(call py,help_py) || { echo "exiting early!"; exit 1; }
|
$(call py,help_py)
|
||||||
_help: export SHOW_HIDDEN=true
|
_help: export SHOW_HIDDEN=true
|
||||||
_help: help
|
_help: help
|
||||||
ifdef PRINT_VARS
|
ifdef PRINT_VARS
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# ---- [config] ---- #
|
# ---- [config] ---- #
|
||||||
|
-include .task.cfg.mk
|
||||||
HEADER_STYLE ?= b_cyan
|
HEADER_STYLE ?= b_cyan
|
||||||
ACCENT_STYLE ?= b_yellow
|
ACCENT_STYLE ?= b_yellow
|
||||||
PARAMS_STYLE ?= $(ACCENT_STYLE)
|
PARAMS_STYLE ?= $(ACCENT_STYLE)
|
||||||
|
|
28
src/help.py
28
src/help.py
|
@ -20,8 +20,30 @@ a = ansi = Ansi(target="stdout")
|
||||||
MaxLens = namedtuple("MaxLens", "goal msg")
|
MaxLens = namedtuple("MaxLens", "goal msg")
|
||||||
|
|
||||||
###- double dollar signs to prevent make escaping them -###
|
###- double dollar signs to prevent make escaping them -###
|
||||||
|
###- re.X requires all important whitespace is escaped -###
|
||||||
pattern = re.compile(
|
pattern = re.compile(
|
||||||
r"^## (?P<goal>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$"
|
r"""
|
||||||
|
^\#\#\
|
||||||
|
(?P<goal>.*?)\s?\|\s?(?P<msg>.*?)
|
||||||
|
\s?
|
||||||
|
(?:
|
||||||
|
(?:\|\s?args:\s?|\|>)
|
||||||
|
\s?
|
||||||
|
(?P<msgargs>.*?)
|
||||||
|
)?
|
||||||
|
$$
|
||||||
|
|
|
||||||
|
^\#\#\#\
|
||||||
|
(?P<rawmsg>.*?)
|
||||||
|
\s?
|
||||||
|
(?:
|
||||||
|
(?:\|\s?args:|\|\>)
|
||||||
|
\s?
|
||||||
|
(?P<rawargs>.*?)
|
||||||
|
)?
|
||||||
|
$$
|
||||||
|
""",
|
||||||
|
re.X,
|
||||||
)
|
)
|
||||||
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
|
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
|
||||||
|
|
||||||
|
@ -185,14 +207,14 @@ def print_help():
|
||||||
def print_arg_help(help_args):
|
def print_arg_help(help_args):
|
||||||
print(f"{ansi.style('task.mk recipe help','header')}\n")
|
print(f"{ansi.style('task.mk recipe help','header')}\n")
|
||||||
for arg in help_args.split():
|
for arg in help_args.split():
|
||||||
print("\n".join(parse_goal(gen_makefile(), arg)))
|
print("\n".join((*parse_goal(gen_makefile(), arg), "\n")))
|
||||||
print()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
help_args = os.getenv("HELP_ARGS")
|
help_args = os.getenv("HELP_ARGS")
|
||||||
if help_args:
|
if help_args:
|
||||||
print_arg_help(help_args)
|
print_arg_help(help_args)
|
||||||
|
print(f"{ansi.faint}exiting task.mk{ansi.end}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
print_help()
|
print_help()
|
||||||
|
|
|
@ -8,7 +8,7 @@ _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))
|
||||||
_escape_printf = $(subst \,\\,$(subst %,%%,$1))
|
_escape_printf = $(subst \,\\,$(subst %,%%,$1))
|
||||||
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
|
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
|
||||||
_printline = printf -- "<----------------------------------->\n"
|
_printline = printf -- "<----------------------------------->\n"
|
||||||
ifdef DEBUG
|
ifdef TASKMK_DEBUG
|
||||||
define _debug_runner
|
define _debug_runner
|
||||||
@printf "$(1) Script:\n";$(_printline);
|
@printf "$(1) Script:\n";$(_printline);
|
||||||
@printf "$(call _create_string,$(3))\n" | cat -n
|
@printf "$(call _create_string,$(3))\n" | cat -n
|
||||||
|
|
33
task.mk
33
task.mk
|
@ -1,7 +1,7 @@
|
||||||
# }> [github.com/daylinmorgan/task.mk] <{ #
|
# }> [github.com/daylinmorgan/task.mk] <{ #
|
||||||
# Copyright (c) 2022 Daylin Morgan
|
# Copyright (c) 2022 Daylin Morgan
|
||||||
# MIT License
|
# MIT License
|
||||||
# version: v22.9.28-3-g76e9ece-dev
|
# version: v22.9.28-8-g4fcab2adev
|
||||||
#
|
#
|
||||||
# task.mk should be included at the bottom of your Makefile with `-include .task.mk`
|
# task.mk should be included at the bottom of your Makefile with `-include .task.mk`
|
||||||
# See below for the standard configuration options that should be set prior to including this file.
|
# See below for the standard configuration options that should be set prior to including this file.
|
||||||
|
@ -27,7 +27,7 @@ ifeq (help,$(firstword $(MAKECMDGOALS)))
|
||||||
endif
|
endif
|
||||||
## h, help | show this help
|
## h, help | show this help
|
||||||
h help:
|
h help:
|
||||||
$(call py,help_py) || { echo "exiting early!"; exit 1; }
|
$(call py,help_py)
|
||||||
_help: export SHOW_HIDDEN=true
|
_help: export SHOW_HIDDEN=true
|
||||||
_help: help
|
_help: help
|
||||||
ifdef PRINT_VARS
|
ifdef PRINT_VARS
|
||||||
|
@ -64,7 +64,7 @@ _escape_shellstring = $(subst `,\`,$(subst ",\",$(subst $$,\$$,$(subst \,\\,$1))
|
||||||
_escape_printf = $(subst \,\\,$(subst %,%%,$1))
|
_escape_printf = $(subst \,\\,$(subst %,%%,$1))
|
||||||
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
|
_create_string = $(subst $(_newline),\n,$(call _escape_shellstring,$(call _escape_printf,$1)))
|
||||||
_printline = printf -- "<----------------------------------->\n"
|
_printline = printf -- "<----------------------------------->\n"
|
||||||
ifdef DEBUG
|
ifdef TASKMK_DEBUG
|
||||||
define _debug_runner
|
define _debug_runner
|
||||||
@printf "$(1) Script:\n";$(_printline);
|
@printf "$(1) Script:\n";$(_printline);
|
||||||
@printf "$(call _create_string,$(3))\n" | cat -n
|
@printf "$(call _create_string,$(3))\n" | cat -n
|
||||||
|
@ -91,7 +91,28 @@ $(utils_py)
|
||||||
a = ansi = Ansi(target="stdout")
|
a = ansi = Ansi(target="stdout")
|
||||||
MaxLens = namedtuple("MaxLens", "goal msg")
|
MaxLens = namedtuple("MaxLens", "goal msg")
|
||||||
pattern = re.compile(
|
pattern = re.compile(
|
||||||
r"^## (?P<goal>.*?) \| (?P<msg>.*?)(?:\s?\| args: (?P<msgargs>.*?))?$$|^### (?P<rawmsg>.*?)?(?:\s?\| args: (?P<rawargs>.*?))?$$"
|
r"""
|
||||||
|
^\#\#\
|
||||||
|
(?P<goal>.*?)\s?\|\s?(?P<msg>.*?)
|
||||||
|
\s?
|
||||||
|
(?:
|
||||||
|
(?:\|\s?args:\s?|\|>)
|
||||||
|
\s?
|
||||||
|
(?P<msgargs>.*?)
|
||||||
|
)?
|
||||||
|
$$
|
||||||
|
|
|
||||||
|
^\#\#\#\
|
||||||
|
(?P<rawmsg>.*?)
|
||||||
|
\s?
|
||||||
|
(?:
|
||||||
|
(?:\|\s?args:|\|\>)
|
||||||
|
\s?
|
||||||
|
(?P<rawargs>.*?)
|
||||||
|
)?
|
||||||
|
$$
|
||||||
|
""",
|
||||||
|
re.X,
|
||||||
)
|
)
|
||||||
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
|
goal_pattern = re.compile(r"""^(?!#|\t)(.*):.*\n\t""", re.MULTILINE)
|
||||||
def parseargs(argstring):
|
def parseargs(argstring):
|
||||||
|
@ -229,12 +250,12 @@ def print_help():
|
||||||
def print_arg_help(help_args):
|
def print_arg_help(help_args):
|
||||||
print(f"{ansi.style('task.mk recipe help','header')}\n")
|
print(f"{ansi.style('task.mk recipe help','header')}\n")
|
||||||
for arg in help_args.split():
|
for arg in help_args.split():
|
||||||
print("\n".join(parse_goal(gen_makefile(), arg)))
|
print("\n".join((*parse_goal(gen_makefile(), arg), "\n")))
|
||||||
print()
|
|
||||||
def main():
|
def main():
|
||||||
help_args = os.getenv("HELP_ARGS")
|
help_args = os.getenv("HELP_ARGS")
|
||||||
if help_args:
|
if help_args:
|
||||||
print_arg_help(help_args)
|
print_arg_help(help_args)
|
||||||
|
print(f"{ansi.faint}exiting task.mk{ansi.end}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
print_help()
|
print_help()
|
||||||
|
|
Loading…
Reference in a new issue