pre-commit-annex hook script to automatically extract metadata from lots of types of files
Using the extract(1) program to do the heavy lifting. Decided to make git-annex run pre-commit-annex when committing. Since git-annex pre-commit also runs it, it'll be run when git commit is run too, via the pre-commit hook. This basically gives back the pre-commit hook that git-annex took away. The implementation avoids repeatedly looking for the hook script when the assistant is running and committing repeatedly; only checks if the hook is available once. To make the script simpler, made git-annex metadata -s field?=value only set a field when it's not already got a value. This commit was sponsored by bak.
This commit is contained in:
parent
34059c09e2
commit
d0fce426c4
12 changed files with 152 additions and 16 deletions
24
doc/tips/automatically_adding_metadata.mdwn
Normal file
24
doc/tips/automatically_adding_metadata.mdwn
Normal file
|
@ -0,0 +1,24 @@
|
|||
git-annex's [[metadata]] works best when files have a lot of useful
|
||||
metadata attached to them.
|
||||
|
||||
To make git-annex automatically set the year and month when adding files,
|
||||
run `git config annex.genmetadata true`.
|
||||
|
||||
A git commit hook can be set up to extract lots of metadata from files
|
||||
like photos, mp3s, etc.
|
||||
|
||||
* Install the `extract` utility, from <http://www.gnu.org/software/libextractor/>
|
||||
`apt-get install extract`
|
||||
* Download [[pre-commit-annex]] and install it in your git-annex repository
|
||||
as `.git/hooks/pre-commit-annex`.
|
||||
Remember to make the script executable!
|
||||
* Run: `git config metadata.extract "artist album title camera_make video_dimensions"`
|
||||
|
||||
Now any fields you list in metadata.extract to will be extracted and
|
||||
stored when files are committed.
|
||||
|
||||
To get a list of all possible fields, run: `extract -L | sed ' ' _`
|
||||
|
||||
By default, if a git-annex already has a metadata field for a file,
|
||||
its value will not be overwritten with metadata taken from files.
|
||||
To allow overwriting, run: `git config metadata.overwrite true`
|
61
doc/tips/automatically_adding_metadata/pre-commit-annex
Executable file
61
doc/tips/automatically_adding_metadata/pre-commit-annex
Executable file
|
@ -0,0 +1,61 @@
|
|||
#!/bin/sh
|
||||
# This script can be used to add git-annex metadata to files when they're
|
||||
# committed.
|
||||
#
|
||||
# Copyright 2014 Joey Hess <id@joeyh.name>
|
||||
# License: GPL-3+
|
||||
|
||||
extract="$(git config metadata.extract || true)"
|
||||
want="$(perl -e 'print (join("|", map {s/_/ /g; "^$_ - "} (split " ", shift())))' "$extract")"
|
||||
|
||||
if [ -z "$want" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "$want"
|
||||
|
||||
case "$(git config --bool metadata.overwrite || true)" in
|
||||
true)
|
||||
overwrite=1
|
||||
;;
|
||||
*)
|
||||
overwrite=""
|
||||
;;
|
||||
esac
|
||||
|
||||
# By default, any existing metadata git-annex has stored is not overwritten
|
||||
# with metadata taken from files. Uncomment this to enable.
|
||||
#overwrite_metadata=1
|
||||
|
||||
addmeta () {
|
||||
file="$1"
|
||||
field="$2"
|
||||
value="$3"
|
||||
afield="$(echo "$field" | tr ' ' _)"
|
||||
if [ "$overwrite" ]; then
|
||||
p="$afield=$value"
|
||||
|
||||
else
|
||||
p="$afield?=$value"
|
||||
fi
|
||||
git -c annex.alwayscommit=false annex metadata "$file" -s "$p" --quiet
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
IFS="
|
||||
"
|
||||
for f in $(git diff-index --name-only --cached $against); do
|
||||
if [ -e "$f" ]; then
|
||||
for l in $(extract "$f" | egrep "$want"); do
|
||||
field="${l%% - *}"
|
||||
value="${l#* - }"
|
||||
addmeta "$f" "$field" "$value"
|
||||
done
|
||||
fi
|
||||
done
|
Loading…
Add table
Add a link
Reference in a new issue