Merge branch 'jk/portable'
authorJunio C Hamano <gitster@pobox.com>
Sat, 15 Mar 2008 08:10:53 +0000 (01:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 15 Mar 2008 08:10:53 +0000 (01:10 -0700)
* jk/portable:
t6000lib: re-fix tr portability
t7505: use SHELL_PATH in hook
t9112: add missing #!/bin/sh header
filter-branch: use $SHELL_PATH instead of 'sh'
filter-branch: don't use xargs -0
add NO_EXTERNAL_GREP build option
t6000lib: tr portability fix
t4020: don't use grep -a
add test_cmp function for test scripts
remove use of "tail -n 1" and "tail -1"
grep portability fix: don't use "-e" or "-q"
more tr portability test script fixes
t0050: perl portability fix
tr portability fixes

1  2 
git-submodule.sh
t/t4201-shortlog.sh
diff --combined git-submodule.sh
index 5f1d5ef06e2a60e7777d5d5532d3f738ab610440,ceb22952aa940e1a13f0b6ccbf30fdc19bd9eba2..56ec3536e0c40190329b9867b46e36753f30efb2
@@@ -4,9 -4,7 +4,9 @@@
  #
  # Copyright (c) 2007 Lars Hjemli
  
 -USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'
 +USAGE="[--quiet] [--cached] \
 +[add <repo> [-b branch]|status|init|update|summary [-n|--summary-limit <n>] [<commit>]] \
 +[--] [<path>...]"
  OPTIONS_SPEC=
  . git-sh-setup
  require_work_tree
@@@ -232,7 -230,7 +232,7 @@@ cmd_init(
                shift
        done
  
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                # Skip already registered paths
@@@ -286,7 -284,7 +286,7 @@@ cmd_update(
                shift
        done
  
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
@@@ -332,175 -330,7 +332,175 @@@ set_name_rev () 
        ) )
        test -z "$revname" || revname=" ($revname)"
  }
 +#
 +# Show commit summary for submodules in index or working tree
 +#
 +# If '--cached' is given, show summary between index and given commit,
 +# or between working tree and given commit
 +#
 +# $@ = [commit (default 'HEAD'),] requested paths (default all)
 +#
 +cmd_summary() {
 +      summary_limit=-1
 +
 +      # parse $args after "submodule ... summary".
 +      while test $# -ne 0
 +      do
 +              case "$1" in
 +              --cached)
 +                      cached="$1"
 +                      ;;
 +              -n|--summary-limit)
 +                      if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2"
 +                      then
 +                              :
 +                      else
 +                              usage
 +                      fi
 +                      shift
 +                      ;;
 +              --)
 +                      shift
 +                      break
 +                      ;;
 +              -*)
 +                      usage
 +                      ;;
 +              *)
 +                      break
 +                      ;;
 +              esac
 +              shift
 +      done
 +
 +      test $summary_limit = 0 && return
 +
 +      if rev=$(git rev-parse --verify "$1^0" 2>/dev/null)
 +      then
 +              head=$rev
 +              shift
 +      else
 +              head=HEAD
 +      fi
 +
 +      cd_to_toplevel
 +      # Get modified modules cared by user
 +      modules=$(git diff-index $cached --raw $head -- "$@" |
 +              grep -e '^:160000' -e '^:[0-7]* 160000' |
 +              while read mod_src mod_dst sha1_src sha1_dst status name
 +              do
 +                      # Always show modules deleted or type-changed (blob<->module)
 +                      test $status = D -o $status = T && echo "$name" && continue
 +                      # Also show added or modified modules which are checked out
 +                      GIT_DIR="$name/.git" git-rev-parse --git-dir >/dev/null 2>&1 &&
 +                      echo "$name"
 +              done
 +      )
 +
 +      test -n "$modules" &&
 +      git diff-index $cached --raw $head -- $modules |
 +      grep -e '^:160000' -e '^:[0-7]* 160000' |
 +      cut -c2- |
 +      while read mod_src mod_dst sha1_src sha1_dst status name
 +      do
 +              if test -z "$cached" &&
 +                      test $sha1_dst = 0000000000000000000000000000000000000000
 +              then
 +                      case "$mod_dst" in
 +                      160000)
 +                              sha1_dst=$(GIT_DIR="$name/.git" git rev-parse HEAD)
 +                              ;;
 +                      100644 | 100755 | 120000)
 +                              sha1_dst=$(git hash-object $name)
 +                              ;;
 +                      000000)
 +                              ;; # removed
 +                      *)
 +                              # unexpected type
 +                              echo >&2 "unexpected mode $mod_dst"
 +                              continue ;;
 +                      esac
 +              fi
 +              missing_src=
 +              missing_dst=
 +
 +              test $mod_src = 160000 &&
 +              ! GIT_DIR="$name/.git" git-rev-parse --verify $sha1_src^0 >/dev/null 2>&1 &&
 +              missing_src=t
 +
 +              test $mod_dst = 160000 &&
 +              ! GIT_DIR="$name/.git" git-rev-parse --verify $sha1_dst^0 >/dev/null 2>&1 &&
 +              missing_dst=t
  
 +              total_commits=
 +              case "$missing_src,$missing_dst" in
 +              t,)
 +                      errmsg="  Warn: $name doesn't contain commit $sha1_src"
 +                      ;;
 +              ,t)
 +                      errmsg="  Warn: $name doesn't contain commit $sha1_dst"
 +                      ;;
 +              t,t)
 +                      errmsg="  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
 +                      ;;
 +              *)
 +                      errmsg=
 +                      total_commits=$(
 +                      if test $mod_src = 160000 -a $mod_dst = 160000
 +                      then
 +                              range="$sha1_src...$sha1_dst"
 +                      elif test $mod_src = 160000
 +                      then
 +                              range=$sha1_src
 +                      else
 +                              range=$sha1_dst
 +                      fi
 +                      GIT_DIR="$name/.git" \
 +                      git log --pretty=oneline --first-parent $range | wc -l
 +                      )
 +                      total_commits=" ($(($total_commits + 0)))"
 +                      ;;
 +              esac
 +
 +              sha1_abbr_src=$(echo $sha1_src | cut -c1-7)
 +              sha1_abbr_dst=$(echo $sha1_dst | cut -c1-7)
 +              if test $status = T
 +              then
 +                      if test $mod_dst = 160000
 +                      then
 +                              echo "* $name $sha1_abbr_src(blob)->$sha1_abbr_dst(submodule)$total_commits:"
 +                      else
 +                              echo "* $name $sha1_abbr_src(submodule)->$sha1_abbr_dst(blob)$total_commits:"
 +                      fi
 +              else
 +                      echo "* $name $sha1_abbr_src...$sha1_abbr_dst$total_commits:"
 +              fi
 +              if test -n "$errmsg"
 +              then
 +                      # Don't give error msg for modification whose dst is not submodule
 +                      # i.e. deleted or changed to blob
 +                      test $mod_dst = 160000 && echo "$errmsg"
 +              else
 +                      if test $mod_src = 160000 -a $mod_dst = 160000
 +                      then
 +                              limit=
 +                              test $summary_limit -gt 0 && limit="-$summary_limit"
 +                              GIT_DIR="$name/.git" \
 +                              git log $limit --pretty='format:  %m %s' \
 +                              --first-parent $sha1_src...$sha1_dst
 +                      elif test $mod_dst = 160000
 +                      then
 +                              GIT_DIR="$name/.git" \
 +                              git log --pretty='format:  > %s' -1 $sha1_dst
 +                      else
 +                              GIT_DIR="$name/.git" \
 +                              git log --pretty='format:  < %s' -1 $sha1_src
 +                      fi
 +                      echo
 +              fi
 +              echo
 +      done
 +}
  #
  # List all submodules, prefixed with:
  #  - submodule not initialized
@@@ -537,7 -367,7 +537,7 @@@ cmd_status(
                shift
        done
  
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
  while test $# != 0 && test -z "$command"
  do
        case "$1" in
 -      add | init | update | status)
 +      add | init | update | status | summary)
                command=$1
                ;;
        -q|--quiet)
                branch="$2"; shift
                ;;
        --cached)
 -              cached=1
 +              cached="$1"
                ;;
        --)
                break
@@@ -610,8 -440,8 +610,8 @@@ the
        usage
  fi
  
 -# "--cached" is accepted only by "status"
 -if test -n "$cached" && test "$command" != status
 +# "--cached" is accepted only by "status" and "summary"
 +if test -n "$cached" && test "$command" != status -a "$command" != summary
  then
        usage
  fi
diff --combined t/t4201-shortlog.sh
index eef4cafda99729977af9bee2eca83493814faede,91ea69631472d9a13184a58a41a55277746b1498..672b28859f0612ec7eef15765ccdb006beac27e6
@@@ -45,11 -45,6 +45,11 @@@ A U Thor (5)
  
  EOF
  
- test_expect_success 'shortlog wrapping' 'diff -u expect out'
+ test_expect_success 'shortlog wrapping' 'test_cmp expect out'
  
 +git log HEAD > log
 +GIT_DIR=non-existing git shortlog -w < log > out
 +
 +test_expect_success 'shortlog from non-git directory' 'diff -u expect out'
 +
  test_done