Re: [PATCH/RFCv5 3/3] git rebase -i: add static check for commands and SHA-1
From: Matthieu Moy <hidden>
Date: 2016-06-15 23:05:14
Galan Rémi [off-list ref] writes:
+# from the todolist in stdin
+check_bad_cmd_and_sha () {
+ git stripspace --strip-comments |
+ while read -r command sha1 rest
+ do
+ case $command in
+ ''|noop|x|"exec")
+ ;;
+ pick|p|drop|d|reword|r|edit|e|squash|s|fixup|f)
+ if test -z $sha1
+ then
+ echo "$command $rest" >>"$todo".badsha
+ else
+ sha1_verif="$(git rev-parse --verify --quiet $sha1^{commit})"
+ if test -z $sha1_verif
+ then
+ echo "$command $sha1 $rest" \
+ >>"$todo".badsha
When you reach the right end of your screen because of indentation,
cutting lines with \ is rarely the best option. Having 5 levels of
indentation is a sign that you should make more functions.
How about:
check_bad_cmd_and_sha () {
git stripspace --strip-comments |
while read -r command sha1 rest
do
case $command in
''|noop|x|"exec")
;;
pick|p|drop|d|reword|r|edit|e|squash|s|fixup|f)
check_commit_id $sha1
;;
*)
record_bad_command $sha1
;;
esac
}
?
+ *) + if test -z $sha1 + then + echo "$command" >>"$todo".badcmd
Avoid echo on user-supplied data.
+ else + commit="$(git rev-list --oneline -1 --ignore-missing $sha1 2>/dev/null)" + if test -z "$commit" + then + echo "$command $sha1 $rest" \ + >>"$todo".badcmd + else + echo "$command $commit" >>"$todo".badcmd + fi + fi
What are you trying to do here? It seems that you are trying to recover the line, but the line is your input, you shouldn't have to recompute it. Why isn't printf '%s %s %s' "$command" "$sha1" "$rest" sufficient in all cases? Maybe it would be better to read line by line (to avoid loosing whitespace information for example), like while read -r line do printf '%s' "$line" | read -r cmd sha1 rest case $sha1 in ... or maybe it's overkill.
+ check_bad_cmd_and_sha <"$todo" + + if test -s "$todo".badsha + then + raiseError=t
We usually don't use camelCase in shell-scripts. raise_error would be the usual way to spell in in Git's codebase. -- Matthieu Moy http://www-verimag.imag.fr/~moy/