-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgem-update.mk
executable file
·45 lines (33 loc) · 1.35 KB
/
gem-update.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/sh
_=; exec ${MAKE-make} -s -C "${0%/*}" -f "${0##*/}" "$@"
GIT := $(if $(shell command -v git 2>&-),git)
nonexec :=
print-database :=
keep-going :=
$(foreach mflags,$(filter-out --%,$(filter -%,$(MFLAGS) $(MAKEFLAGS))),\
$(if $(findstring n,$(mflags)),$(eval nonexec := n))\
$(if $(findstring p,$(mflags)),$(eval print-database := p))\
$(if $(findstring k,$(mflags)),$(eval keep-going := k))\
)
gem-srcdirs := $(dir $(wildcard */.git))
master = $(shell $(GIT) -C $(1) for-each-ref --count=1 '--format=%(refname:short)' refs/heads/master refs/heads/main)
%/.status.:
@$(GIT) -C $(@D) status --porcelain | sed 's|^|$(@D): |'
%/.fetch.: .WAIT
@$(GIT) -C $(@D) fetch | sed 's|^|$(@D): |'
%/.master.:
@$(GIT) -C $(@D) checkout $(call master,$(@D)) 2>&1 | \
sed '/^Your branch is up to date/d;/^Already on /d;s|^|$(@D): |'
%/.update.: %/.master.
@$(GIT) -C $(@D) rebase | sed 's|^|$(@D): |'
%/.no-purge.:
@MAKE='$(MAKE)' $(GIT) -C $(@D) clean -dfxn $(purge-opts) | \
sed 's!\(Would remove\|Removing\) !&$(@D)/!'
%/.purge.:
@MAKE='$(MAKE)' $(GIT) -C $(@D) clean -dfx$(nonexec) $(purge-opts) | \
sed 's!\(Would remove\|Removing\) !&$(@D)/!'
ops := $(shell sed -n 's|^%/\.\(.*\)\.:.*|\1|p' $(MAKEFILE_LIST))
$(foreach op,$(ops),\
$(eval $(value op): $$(addsuffix .$(value op).,$$(gem-srcdirs)))\
)
.PHONEY: $(foreach op,$(ops),$(addsuffix .$(op).,$(gem-srcdirs)))