diff options
author | Joey Hess <joey@kitenet.net> | 2014-03-02 18:01:07 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2014-03-02 20:11:58 -0400 |
commit | 66c4abb748f3982ef334a3320e49bfc6647e87d9 (patch) | |
tree | 1785f2bee2250d74a01c5de2e06b8b0b65822f45 /doc/tips | |
parent | e916f8028ce1f90e851166b35f3bcec976aa09b3 (diff) |
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.
Diffstat (limited to 'doc/tips')
-rw-r--r-- | doc/tips/automatically_adding_metadata.mdwn | 24 | ||||
-rwxr-xr-x | doc/tips/automatically_adding_metadata/pre-commit-annex | 61 |
2 files changed, 85 insertions, 0 deletions
diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn new file mode 100644 index 000000000..bd8fea737 --- /dev/null +++ b/doc/tips/automatically_adding_metadata.mdwn @@ -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` diff --git a/doc/tips/automatically_adding_metadata/pre-commit-annex b/doc/tips/automatically_adding_metadata/pre-commit-annex new file mode 100755 index 000000000..4897493cf --- /dev/null +++ b/doc/tips/automatically_adding_metadata/pre-commit-annex @@ -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 |