-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmanaged-files.makefile
More file actions
133 lines (116 loc) · 5.51 KB
/
managed-files.makefile
File metadata and controls
133 lines (116 loc) · 5.51 KB
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
###
##. Dependencies
###
#. POSIX dependencies - @see https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
define check-managed-files-dependency
ifeq ($$(shell command -v $(1) || which $(1) 2>/dev/null),)
$$(error Please provide the command "$(1)")
endif
endef
$(foreach command,mkdir find sort tail diff cp,$(eval $(call check-managed-files-dependency,$(command))))
###
##. Configuration
###
MANAGED_FILES?=$(if $(GIT),$(shell $(GIT) clean -nX 2>/dev/null | sed 's/Would remove //'))
MANAGED_FILES_ORIGIN_DIRECTORY?=.
ifeq ($(MANAGED_FILES_ORIGIN_DIRECTORY),)
$(error The variable MANAGED_FILES_ORIGIN_DIRECTORY should never be empty)
endif
MANAGED_FILES_BACKUP_DIRECTORY?=./.backups
ifeq ($(MANAGED_FILES_BACKUP_DIRECTORY),)
$(error The variable MANAGED_FILES_BACKUP_DIRECTORY should never be empty)
endif
MANAGED_FILES_BACKUP_EXTENSION?=.bck
ifeq ($(MANAGED_FILES_BACKUP_EXTENSION),)
$(error The variable MANAGED_FILES_BACKUP_EXTENSION should never be empty)
endif
###
##. Functions
###
# $(1) is the relative file path from the MANAGED_FILES_ORIGIN_DIRECTORY
back-up-managed-file=\
FILENAME="$(1)"; \
if test ! -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; then \
printf "$(STYLE_WARNING)%s\033[0m\n" "Could not find the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\", skipped making a backup..."; \
else \
mkdir -p "$(MANAGED_FILES_BACKUP_DIRECTORY)"; \
LATEST_BACKUP_FILE="$$(find "$(MANAGED_FILES_BACKUP_DIRECTORY)" -name "$${FILENAME}.*$(MANAGED_FILES_BACKUP_EXTENSION)" 2>/dev/null | sort | tail -1)"; \
if test -z "$${LATEST_BACKUP_FILE}" || ! diff -q "$(1)" "$${LATEST_BACKUP_FILE}" > /dev/null 2>&1; then \
NEW_BACKUP_FILE="$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}.$$(date +%s)$(MANAGED_FILES_BACKUP_EXTENSION)"; \
cp "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}" "$${NEW_BACKUP_FILE}"; \
printf "$(STYLE_SUCCESS)%s\033[0m\n" "The file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\" was backed up to \"$${NEW_BACKUP_FILE}\"."; \
fi; \
fi
# $(1) is the relative file path from the MANAGED_FILES_ORIGIN_DIRECTORY
recover-managed-file=\
FILENAME="$(1)"; \
if test -f "$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}"; then \
if ! diff -q "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}" "$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}" > /dev/null 2>&1; then \
if test -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; then \
$(call back-up-managed-file,$${FILENAME}); \
fi; \
cp "$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}" "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; \
printf "$(STYLE_SUCCESS)%s\033[0m\n" "Updated the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\" from \"$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}\". The old version was backed up."; \
fi; \
else \
LATEST_BACKUP_FILE="$$(find "$(MANAGED_FILES_BACKUP_DIRECTORY)" -wholename "$(MANAGED_FILES_BACKUP_DIRECTORY)/$${FILENAME}.*$(MANAGED_FILES_BACKUP_EXTENSION)" 2>/dev/null | sort | tail -1)"; \
if test -f "$${LATEST_BACKUP_FILE}"; then \
if ! diff -q "$${LATEST_BACKUP_FILE}" "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}" > /dev/null 2>&1; then \
if test -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; then \
$(call back-up-managed-file,$${FILENAME}); \
fi; \
cp "$${LATEST_BACKUP_FILE}" "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; \
printf "$(STYLE_SUCCESS)%s\033[0m\n" "Updated the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\" from \"$${LATEST_BACKUP_FILE}\"."; \
fi; \
else \
if test -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}.dist"; then \
cp "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}.dist" "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; \
printf "$(STYLE_SUCCESS)%s\033[0m\n" "Created the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\" from \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}.dist\"."; \
else \
printf "$(STYLE_WARNING)%s\033[0m\n" "Please create the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\" manually."; \
exit 1; \
fi; \
fi; \
fi; \
touch "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"
# $(1) is the relative file path from the MANAGED_FILES_ORIGIN_DIRECTORY
remove-managed-file=\
FILENAME="$(1)"; \
if test -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; then \
$(call back-up-managed-file,$${FILENAME}); \
rm -f "$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}"; \
printf "$(STYLE_SUCCESS)%s\033[0m\n" "Removed the file \"$(MANAGED_FILES_ORIGIN_DIRECTORY)/$${FILENAME}\"."; \
fi
###
##. Managed Files
###
ifneq ($(MANAGED_FILES),)
#. Create the backups directory
$(MANAGED_FILES_BACKUP_DIRECTORY):
@mkdir -p "$(@)"
# Back up the file %
$(foreach file,$(MANAGED_FILES),$(file).back-up):%.back-up: % | $(MANAGED_FILES_BACKUP_DIRECTORY)
@$(call back-up-managed-file,$(*))
# Recover the file %
$(foreach file,$(MANAGED_FILES),$(file).recover):%.recover:
@$(call recover-managed-file,$(*))
# Remove the file %
$(foreach file,$(MANAGED_FILES),$(file).remove):%.remove:
@$(call remove-managed-file,$(*))
endif
# List all managed files
managed-files.list:
@$(foreach file,$(MANAGED_FILES),printf "%s\n" "$(file)";)
.PHONY: managed-files.list
# Back up all managed files
managed-files.back-up: | $(foreach file,$(MANAGED_FILES),$(file).back-up)
@true
.PHONY: managed-files.back-up
# Recover all managed files
managed-files.recover: | $(foreach file,$(MANAGED_FILES),$(file).recover)
@true
.PHONY: managed-files.recover
# Remove all managed files, keep backups
managed-files.remove: | $(foreach file,$(MANAGED_FILES),$(file).remove)
@true
.PHONY: managed-files.remove