Merge branch 'jc/maint-fbsd-sh-ifs-workaround' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 8 Jan 2013 19:17:01 +0000 (11:17 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Jan 2013 19:17:01 +0000 (11:17 -0800)
* jc/maint-fbsd-sh-ifs-workaround:
sh-setup: work around "unset IFS" bug in some shells

1  2 
git-sh-setup.sh
diff --combined git-sh-setup.sh
index 22f0aed6db366c3d4a291b3ae646c45002ff86c1,107c144fed596dc8fe36b28a22939acef1cf5fd0..795edd2852aa1c680c3db1776bb84aca7662899d
  # But we protect ourselves from such a user mistake nevertheless.
  unset CDPATH
  
- # Similarly for IFS
- unset IFS
+ # Similarly for IFS, but some shells (e.g. FreeBSD 7.2) are buggy and
+ # do not equate an unset IFS with IFS with the default, so here is
+ # an explicit SP HT LF.
+ IFS='         
+ '
  
  git_broken_path_fix () {
        case ":$PATH:" in
@@@ -191,52 -194,28 +194,52 @@@ require_clean_work_tree () 
        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 () {
 -      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)
        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