зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/sh-setup-in-filter-branch'
Refactoring to avoid code duplication in shell scripts. * jk/sh-setup-in-filter-branch: filter-branch: use git-sh-setup's ident parsing functions git-sh-setup: refactor ident-parsing functions
This commit is contained in:
Коммит
deb2458132
|
@ -64,37 +64,19 @@ EOF
|
||||||
|
|
||||||
eval "$functions"
|
eval "$functions"
|
||||||
|
|
||||||
# When piped a commit, output a script to set the ident of either
|
finish_ident() {
|
||||||
# "author" or "committer
|
# Ensure non-empty id name.
|
||||||
|
echo "case \"\$GIT_$1_NAME\" in \"\") GIT_$1_NAME=\"\${GIT_$1_EMAIL%%@*}\" && export GIT_$1_NAME;; esac"
|
||||||
|
# And make sure everything is exported.
|
||||||
|
echo "export GIT_$1_NAME"
|
||||||
|
echo "export GIT_$1_EMAIL"
|
||||||
|
echo "export GIT_$1_DATE"
|
||||||
|
}
|
||||||
|
|
||||||
set_ident () {
|
set_ident () {
|
||||||
lid="$(echo "$1" | tr "[A-Z]" "[a-z]")"
|
parse_ident_from_commit author AUTHOR committer COMMITTER
|
||||||
uid="$(echo "$1" | tr "[a-z]" "[A-Z]")"
|
finish_ident AUTHOR
|
||||||
pick_id_script='
|
finish_ident COMMITTER
|
||||||
/^'$lid' /{
|
|
||||||
s/'\''/'\''\\'\'\''/g
|
|
||||||
h
|
|
||||||
s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/
|
|
||||||
s/'\''/'\''\'\'\''/g
|
|
||||||
s/.*/GIT_'$uid'_NAME='\''&'\''; export GIT_'$uid'_NAME/p
|
|
||||||
|
|
||||||
g
|
|
||||||
s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/
|
|
||||||
s/'\''/'\''\'\'\''/g
|
|
||||||
s/.*/GIT_'$uid'_EMAIL='\''&'\''; export GIT_'$uid'_EMAIL/p
|
|
||||||
|
|
||||||
g
|
|
||||||
s/^'$lid' [^<]* <[^>]*> \(.*\)$/@\1/
|
|
||||||
s/'\''/'\''\'\'\''/g
|
|
||||||
s/.*/GIT_'$uid'_DATE='\''&'\''; export GIT_'$uid'_DATE/p
|
|
||||||
|
|
||||||
q
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
LANG=C LC_ALL=C sed -ne "$pick_id_script"
|
|
||||||
# Ensure non-empty id name.
|
|
||||||
echo "case \"\$GIT_${uid}_NAME\" in \"\") GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\" && export GIT_${uid}_NAME;; esac"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
USAGE="[--env-filter <command>] [--tree-filter <command>]
|
USAGE="[--env-filter <command>] [--tree-filter <command>]
|
||||||
|
@ -320,10 +302,8 @@ while read commit parents; do
|
||||||
git cat-file commit "$commit" >../commit ||
|
git cat-file commit "$commit" >../commit ||
|
||||||
die "Cannot read commit $commit"
|
die "Cannot read commit $commit"
|
||||||
|
|
||||||
eval "$(set_ident AUTHOR <../commit)" ||
|
eval "$(set_ident <../commit)" ||
|
||||||
die "setting author failed for commit $commit"
|
die "setting author/committer failed for commit $commit"
|
||||||
eval "$(set_ident COMMITTER <../commit)" ||
|
|
||||||
die "setting committer failed for commit $commit"
|
|
||||||
eval "$filter_env" < /dev/null ||
|
eval "$filter_env" < /dev/null ||
|
||||||
die "env filter failed: $filter_env"
|
die "env filter failed: $filter_env"
|
||||||
|
|
||||||
|
|
|
@ -191,28 +191,52 @@ require_clean_work_tree () {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Generate a sed script to parse identities from a commit.
|
||||||
|
#
|
||||||
|
# Reads the commit from stdin, which should be in raw format (e.g., from
|
||||||
|
# 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
|
||||||
|
s/^$lid "'\([^<]*\) <[^>]*> .*$/\1/'"
|
||||||
|
s/.*/GIT_${uid}_NAME='&'/p
|
||||||
|
|
||||||
|
g
|
||||||
|
s/^$lid "'[^<]* <\([^>]*\)> .*$/\1/'"
|
||||||
|
s/.*/GIT_${uid}_EMAIL='&'/p
|
||||||
|
|
||||||
|
g
|
||||||
|
s/^$lid "'[^<]* <[^>]*> \(.*\)$/@\1/'"
|
||||||
|
s/.*/GIT_${uid}_DATE='&'/p
|
||||||
|
}
|
||||||
|
"
|
||||||
|
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 () {
|
get_author_ident_from_commit () {
|
||||||
pick_author_script='
|
|
||||||
/^author /{
|
|
||||||
s/'\''/'\''\\'\'\''/g
|
|
||||||
h
|
|
||||||
s/^author \([^<]*\) <[^>]*> .*$/\1/
|
|
||||||
s/.*/GIT_AUTHOR_NAME='\''&'\''/p
|
|
||||||
|
|
||||||
g
|
|
||||||
s/^author [^<]* <\([^>]*\)> .*$/\1/
|
|
||||||
s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
|
|
||||||
|
|
||||||
g
|
|
||||||
s/^author [^<]* <[^>]*> \(.*\)$/@\1/
|
|
||||||
s/.*/GIT_AUTHOR_DATE='\''&'\''/p
|
|
||||||
|
|
||||||
q
|
|
||||||
}
|
|
||||||
'
|
|
||||||
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
|
||||||
|
|
|
@ -167,10 +167,11 @@ test_expect_success 'author information is preserved' '
|
||||||
test_tick &&
|
test_tick &&
|
||||||
GIT_AUTHOR_NAME="B V Uips" git commit -m bvuips &&
|
GIT_AUTHOR_NAME="B V Uips" git commit -m bvuips &&
|
||||||
git branch preserved-author &&
|
git branch preserved-author &&
|
||||||
git filter-branch -f --msg-filter "cat; \
|
(sane_unset GIT_AUTHOR_NAME &&
|
||||||
|
git filter-branch -f --msg-filter "cat; \
|
||||||
test \$GIT_COMMIT != $(git rev-parse master) || \
|
test \$GIT_COMMIT != $(git rev-parse master) || \
|
||||||
echo Hallo" \
|
echo Hallo" \
|
||||||
preserved-author &&
|
preserved-author) &&
|
||||||
test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
|
test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче