summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jh-checksource.sh98
1 files changed, 63 insertions, 35 deletions
diff --git a/jh-checksource.sh b/jh-checksource.sh
index ef3cf47..89046e4 100644
--- a/jh-checksource.sh
+++ b/jh-checksource.sh
@@ -3,43 +3,71 @@
sep='<nofileevercontainsthis>'
resep='@'
-safe_types=(
- '.*text.*'
- '(GIF|JPEG|PNG) image data.*'
-)
-safe_files=("$@")
-
-unsafe_files="$(mktemp)"
-
-safevar="$(mktemp)"
-find . -type f -exec file -F"$sep" {} + | while read line; do
- file="$(echo "$line"|sed "s${resep}${sep}.*${resep}${resep}")"
- type="$(echo "$line"|sed "s${resep}.*${sep}\s*${resep}${resep}")"
- echo false > "$safevar"
- if [[ "$file" =~ ".*/\.git/.*" ]]; then
- echo true > "$safevar"
- fi
- for filename in "${safe_files[@]}"; do
- if [[ "$file" = "$filename" ]]; then
- echo true > "$safevar"
+safe_types_regexp=('text' '(GIF|JPEG|PNG) image data')
+safe_types_string=()
+safe_files_rexexp=('.*/\.git/.*')
+safe_files_string=()
+
+normalize_filename() {
+ local cwd="`pwd`"
+ readlink -m -- "$1"|sed "s|^$cwd/|./|"
+}
+
+matches_string() {
+ local needle=$1
+ shift
+ for straw in "$@"; do
+ if [[ "$needle" = "$straw" ]]; then
+ return 0
fi
done
- for filetype in "${safe_types[@]}"; do
- if [[ "$type" =~ "$filetype" ]]; then
- echo true > "$safevar"
+ return 1
+}
+
+matches_regexp() {
+ local needle=$1
+ shift
+ for straw in "$@"; do
+ if [[ "$needle" =~ $straw ]]; then
+ return 0
fi
done
- if [[ "$(cat "$safevar")" = 'true' ]]; then
- printf "%s\n" "$file"
+ return 1
+}
+
+main() {
+ # Parse arguments
+ for file in "$@"; do safe_files_string+=("$(normalize_filename "$file")"); done
+
+ # Init
+ unsafe_files="$(mktemp)"
+
+ # Heavy lifting
+ find . -type f -exec file -F"$sep" {} + | while read line; do
+ file="$(echo "$line"|sed "s${resep}${sep}.*${resep}${resep}")"
+ type="$(echo "$line"|sed "s${resep}.*${sep}\s*${resep}${resep}")"
+
+ file="$(normalize_filename "$file")"
+
+ if \
+ matches_string "$file" "${safe_files_string[@]}" || \
+ matches_string "$type" "${safe_types_string[@]}" || \
+ matches_regexp "$file" "${safe_files_regexp[@]}" || \
+ matches_regexp "$type" "${safe_types_regexp[@]}" ; then
+ : # do nothing
+ else
+ printf "%s\n" "$file"
+ fi
+ done > "$unsafe_files"
+
+ if [[ -n "$(cat "$unsafe_files")" ]]; then
+ echo "==> WARNING: The source directory `pwd` contains binary files:"
+ sed 's/./ -> &/' "$unsafe_files"
+ rm -f "$unsafe_files"
+ exit 1
+ else
+ rm -f "$unsafe_files"
fi
-done > "$unsafe_files"
-rm -f "$safevar"
-
-if [[ -n "$(cat "$unsafe_files")" ]]; then
- echo " ==> The source directory `pwd` contains binary files:"
- sed 's/./ ->/' "$unsafe_files"
- rm -f "$unsafe_files"
- exit 1
-else
- rm -f "$unsafe_files"
-fi
+}
+
+main "$@"