#!/bin/sh # # Copyright (C) 2014 Joey Hess # Copyright (C) 2016 Klaus Ethgen # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # This script can be used to add git-annex metadata to files when they're # committed. It is typically installed as .git/hooks/pre-commit-annex # # You can also run this script by hand, passing it the names of files # already checked into git-annex, and it will extract/refresh the git-annex # metadata from the files. tool="$(git config metadata.tool || :)" if [ -z "$tool" ]; then tool=extract fi case "$tool" in exiftool) tool_exec="exiftool -unknown -zip -veryShort -ignoreMinorErrors -use MWG -dateFormat '%Y-%m-%dT%H:%M:%S'" ;; *) tool_exec="$tool" ;; esac extract_fields="$(git config metadata.extract || :)" if [ -n "$extract_fields" ]; then tools=extract extract_want="^($(echo "$extract_fields" | sed -e 's/ /|/g' -e 's/_/ /g'))" fi exiftool_fields="$(git config metadata.exiftool || :)" if [ -n "$exiftool_fields" ]; then tools="exiftool $tools" exiftool_want="^($(echo "$exiftool_fields" | sed -e 's/ /|/g' -e 's/_/ /g'))" fi if [ -z "$tools" ]; then exit 0 fi case "$(git config --bool metadata.overwrite || :)" in true) equal="=" ;; *) equal="?=" ;; esac if git rev-parse --verify HEAD >/dev/null 2>&1; then against="HEAD" else # Initial commit: diff against an empty tree object against="4b825dc642cb6eb9a060e54bf8d69288fbee4904" fi addmeta() { file="$1" field="$2" value="$3" afield="$(echo "$field" | tr ' ' '_')" git -c annex.alwayscommit=false annex metadata \ --set "$afield$equal$value" --quiet -- "$file" } process() { if [ -e "$f" ]; then echo "adding metadata for $f" for tool in $tools; do case "$tool" in exiftool) tool_exec="exiftool -unknown -zip -veryShort -ignoreMinorErrors -use MWG -dateFormat '%Y-%m-%dT%H:%M:%S'" ;; *) tool_exec="$tool" ;; esac LC_ALL=C $tool_exec "./$f" | eval egrep --text -i \""\$${tool}_want"\" | while read line; do case "$tool" in extract) field="${line%% - *}" value="${line#* - }" ;; exiftool) field="${line%%: *}" value="${line#*: }" ;; esac if [ -n "$value" ]; then addmeta "$f" "$field" "$value" fi done done fi } if [ -n "$*" ]; then for f in "$@"; do process "$f" done else git diff-index --name-only --cached $against | while read f; do process "$f" done fi