git-sh-setup: refactor ident-parsing functions
The only ident-parsing function we currently provide is get_author_ident_from_commit. This is not very flexible for two reasons: 1. It takes a commit as an argument, and can't read from commit headers saved on disk. 2. It will only parse authors, not committers. This patch provides a more flexible interface which will parse multiple idents from a commit provide on stdin. We can easily use it as a building block for the current function to retain compatibility. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
87a5461fa7
commit
ce80ca566a
@ -191,28 +191,52 @@ require_clean_work_tree () {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
get_author_ident_from_commit () {
|
# Generate a sed script to parse identities from a commit.
|
||||||
pick_author_script='
|
#
|
||||||
/^author /{
|
# Reads the commit from stdin, which should be in raw format (e.g., from
|
||||||
s/'\''/'\''\\'\'\''/g
|
# cat-file or "--pretty=raw").
|
||||||
|
#
|
||||||
|
# The first argument specifies the ident line to parse (e.g., "author"), and
|
||||||
|
# the second specifies the environment variable to put it in (e.g., "AUTHOR"
|
||||||
|
# for "GIT_AUTHOR_*"). Multiple pairs can be given to parse author and
|
||||||
|
# committer.
|
||||||
|
pick_ident_script () {
|
||||||
|
while test $# -gt 0
|
||||||
|
do
|
||||||
|
lid=$1; shift
|
||||||
|
uid=$1; shift
|
||||||
|
printf '%s' "
|
||||||
|
/^$lid /{
|
||||||
|
s/'/'\\\\''/g
|
||||||
h
|
h
|
||||||
s/^author \([^<]*\) <[^>]*> .*$/\1/
|
s/^$lid "'\([^<]*\) <[^>]*> .*$/\1/'"
|
||||||
s/.*/GIT_AUTHOR_NAME='\''&'\''/p
|
s/.*/GIT_${uid}_NAME='&'/p
|
||||||
|
|
||||||
g
|
g
|
||||||
s/^author [^<]* <\([^>]*\)> .*$/\1/
|
s/^$lid "'[^<]* <\([^>]*\)> .*$/\1/'"
|
||||||
s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
|
s/.*/GIT_${uid}_EMAIL='&'/p
|
||||||
|
|
||||||
g
|
g
|
||||||
s/^author [^<]* <[^>]*> \(.*\)$/@\1/
|
s/^$lid "'[^<]* <[^>]*> \(.*\)$/@\1/'"
|
||||||
s/.*/GIT_AUTHOR_DATE='\''&'\''/p
|
s/.*/GIT_${uid}_DATE='&'/p
|
||||||
|
|
||||||
q
|
|
||||||
}
|
}
|
||||||
'
|
"
|
||||||
|
done
|
||||||
|
echo '/^$/q'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a pick-script as above and feed it to sed. Stdout is suitable for
|
||||||
|
# feeding to eval.
|
||||||
|
parse_ident_from_commit () {
|
||||||
|
LANG=C LC_ALL=C sed -ne "$(pick_ident_script "$@")"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse the author from a commit given as an argument. Stdout is suitable for
|
||||||
|
# feeding to eval to set the usual GIT_* ident variables.
|
||||||
|
get_author_ident_from_commit () {
|
||||||
encoding=$(git config i18n.commitencoding || echo UTF-8)
|
encoding=$(git config i18n.commitencoding || echo UTF-8)
|
||||||
git show -s --pretty=raw --encoding="$encoding" "$1" -- |
|
git show -s --pretty=raw --encoding="$encoding" "$1" -- |
|
||||||
LANG=C LC_ALL=C sed -ne "$pick_author_script"
|
parse_ident_from_commit author AUTHOR
|
||||||
}
|
}
|
||||||
|
|
||||||
# Clear repo-local GIT_* environment variables. Useful when switching to
|
# Clear repo-local GIT_* environment variables. Useful when switching to
|
||||||
|
Loading…
Reference in New Issue
Block a user