default: help

SRC   := ../contracts
DST   := patched
DIFF  := diff
SRCS  := $(shell find $(SRC) -type f)
DSTS  := $(shell find $(DST) -type f)
DIFFS := $(shell find $(DIFF) -type f)

###############################################################################
# Apply all patches in the $DIFF folder to the $DST folder
apply: $(DST) $(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$(DIFFS)))

# Reset the $DST folder
$(DST): FORCE
	@rm -rf $@
	@cp -r $(SRC) $@

# Update a solidity file in the $DST directory using the corresponding patch
$(DST)/%.sol: FORCE | $(DST)
	@echo Applying patch to $@
	@patch -p0 -d $(DST) < $(patsubst $(DST)_%,$(DIFF)/%.patch,$(subst /,_,$@))

###############################################################################
# Record all difference between $SRC and $DST in patches
record: $(DIFF) $(patsubst %,$(DIFF)/%.patch,$(subst /,_,$(subst $(SRC)/,,$(SRCS)) $(subst $(DST)/,,$(DSTS))))

# Create the $DIFF folder
$(DIFF): FORCE
	@rm -rf $@
	@mkdir $@

# Create the patch file by comparing the source and the destination
$(DIFF)/%.patch: FORCE | $(DIFF)
	@echo Generating patch $@
	@diff -ruN \
		$(patsubst $(DIFF)/%.patch,$(SRC)/%,$(subst _,/,$@)) \
		$(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$@)) \
		| sed 's+$(SRC)/++g' \
		| sed 's+$(DST)/++g' \
		> $@
	@[ -s $@ ] || rm $@

###############################################################################
help:
	@echo "usage:"
	@echo "  make apply:  create $(DST) directory by applying the patches to $(SRC)"
	@echo "  make record: record the patches capturing the differences between $(SRC) and $(DST)"
	@echo "  make clean:  remove all generated files (those ignored by git)"

clean:
	git clean -fdX

FORCE: ;
