PREFIX ?= /usr/local BINPREFIX ?= "$(PREFIX)/bin" SYSCONFDIR ?= $(PREFIX)/etc SHELL := bash OS = $(shell uname) ifeq ($(OS), FreeBSD) MANPREFIX ?= "$(PREFIX)/man/man1" ifeq ($(MANPREFIX), /usr/local) MANPREFIX = "/usr/local/man/man1" endif else MANPREFIX ?= "$(PREFIX)/share/man/man1" endif ifeq ($(OS), Darwin) COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash_completion.d" else ifeq ($(OS), FreeBSD) COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash_completion.d" else COMPL_DIR ?= "$(DESTDIR)$(SYSCONFDIR)/bash-completion/completions" endif BINS = $(wildcard bin/git-*) MANS = $(wildcard man/git-*.md) MAN_BINS = $(filter-out man/git-extras.md, $(MANS)) MAN_HTML = $(MANS:.md=.html) MAN_PAGES = $(MANS:.md=.1) CODE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) INSTALL_VIA ?= source # Libraries used by all commands LIB = "helper/reset-env" "helper/git-extra-utility" COMMANDS = $(subst bin/, , $(BINS)) default: install docs: $(MAN_HTML) $(MAN_PAGES) check: @echo "Check dependencies before installation" @./check_dependencies.sh @echo install: check @if [ "$(INSTALL_VIA)" = brew ]; then \ git apply brew-release.patch || { echo "Can't apply brew release patch"; exit 1; } \ fi mkdir -p $(DESTDIR)$(MANPREFIX) mkdir -p $(DESTDIR)$(BINPREFIX) @echo '... installing bins to '$(DESTDIR)$(BINPREFIX) @echo '... installing man pages to '$(DESTDIR)$(MANPREFIX) $(eval TEMPFILE := $(shell mktemp -q $${TMPDIR:-/tmp}/git-extras.XXXXXX 2>/dev/null || mktemp -q)) @# chmod from rw-------(default) to rwxrwxr-x, so that users can exec the scripts @chmod 775 $(TEMPFILE) $(eval EXISTED_ALIASES := $(shell \ git config --get-regexp 'alias\..*' | awk '{print "git-" substr($$1, 7)}')) @$(foreach COMMAND, $(COMMANDS), \ should_install='yes'; \ if [ ! -z "$(filter $(COMMAND), $(EXISTED_ALIASES))" ] && [ "$$SKIP_CONFLICT_CHECK" != yes ]; then \ read -p "$(COMMAND) conflicts with an alias, still install it? [y/n]: " answer; \ if [ "$$answer" = 'n' ] || [ "$$answer" = 'N' ]; then \ should_install="no"; \ fi; \ fi; \ if [ "$$should_install" = 'yes' ]; then \ echo "... installing $(COMMAND)"; \ head -1 bin/$(COMMAND) > $(TEMPFILE); \ cat $(LIB) >> $(TEMPFILE); \ if ! grep "$(COMMAND)" not_need_git_repo >/dev/null; then \ cat ./helper/is-git-repo >> $(TEMPFILE); \ fi; \ if grep "$(COMMAND)" need_git_commit >/dev/null; then \ cat ./helper/has-git-commit >> $(TEMPFILE); \ fi; \ tail -n +2 bin/$(COMMAND) >> $(TEMPFILE); \ cp -f $(TEMPFILE) $(DESTDIR)$(BINPREFIX)/$(COMMAND); \ fi; \ ) @if [ -z "$(wildcard man/git-*.1)" ]; then \ echo "WARNING: man pages not created, use 'make docs' (which requires 'ronn' ruby lib)"; \ else \ cp -f man/git-*.1 $(DESTDIR)$(MANPREFIX); \ echo "cp -f man/git-*.1 $(DESTDIR)$(MANPREFIX)"; \ fi @mkdir -p $(COMPL_DIR) cp -f etc/bash_completion.sh $(COMPL_DIR)/git-extras @echo "" @echo "If you are a zsh user, you may want to 'source $(CODE_DIR)etc/git-extras-completion.zsh'" \ "and put this line into ~/.zshrc to enable zsh completion" @echo "If you are a fish user, you may want to copy or link '$(CODE_DIR)etc/git-extras.fish'" \ "to '~/.config/fish/completions/'" man/index.txt: $(MANS) echo '# manuals' > $@.tmp for file in $(sort $^) ; do \ extra=$${file%.md} ; \ extra=$${extra#man/} ; \ echo "$$extra(1) $$extra" >> $@.tmp ; \ done mv -f $@.tmp $@ man/git-extras.md: $(MAN_BINS) ln=$$(awk '/## COMMANDS/{print NR};' $@) ; \ awk "NR <= $$ln+1" $@ > $@.tmp for file in $(sort $^) ; do \ head -n1 $$file | \ sed 's/^/ - **/;s/ -- /** /' >> $@.tmp ; \ done ln=$$(awk '/## AUTHOR/{print NR};' $@) ; \ awk "NR >= $$ln-1" $@ >> $@.tmp mv -f $@.tmp $@ man/%.html: man/%.md man/index.txt ronn \ --manual "Git Extras" \ --html \ --pipe \ $< > $@ man/%.1: man/%.md ronn -r \ --manual "Git Extras" \ --pipe \ $< > $@ uninstall: @$(foreach BIN, $(BINS), \ echo "... uninstalling $(DESTDIR)$(BINPREFIX)/$(notdir $(BIN))"; \ rm -f $(DESTDIR)$(BINPREFIX)/$(notdir $(BIN)); \ ) @$(foreach MAN, $(MAN_PAGES), \ echo "... uninstalling $(DESTDIR)$(MANPREFIX)/$(notdir $(MAN))"; \ rm -f $(DESTDIR)$(MANPREFIX)/$(notdir $(MAN)); \ ) rm -f $(COMPL_DIR)/git-extras clean: docclean docclean: rm -f man/*.1 rm -f man/*.html test: bats ./tests .PHONY: default docs check install uninstall clean docclean test