hash-object: cleanup handling of command line options

git hash-object used to process the --stdin command line argument
before reading subsequent arguments.  This caused 'git hash-object
--stdin -w' to fail to actually write the object into the
database, while '-w --stdin' properly did.  Now git hash-object
first reads all arguments, and then processes them.

This regresses one insane use case.  git hash-object used to allow
multiple --stdin arguments on the command line:

   $ git hash-object --stdin --stdin
     foo
     ^D
     bar
     ^D

Now git hash-object errors out if --stdin is given more than once.

Reported by Josh Triplett through
 http://bugs.debian.org/464432

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Gerrit Pape
2008-02-21 10:06:47 +00:00
committed by Junio C Hamano
parent fd74cb0874
commit 8a2f5e5b03
2 changed files with 46 additions and 1 deletions

35
t/t5303-hash-object.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
test_description=git-hash-object
. ./test-lib.sh
test_expect_success \
'git hash-object -w --stdin saves the object' \
'obname=$(echo foo | git hash-object -w --stdin) &&
obpath=$(echo $obname | sed -e "s/\(..\)/\1\//") &&
test -r .git/objects/"$obpath" &&
rm -f .git/objects/"$obpath"'
test_expect_success \
'git hash-object --stdin -w saves the object' \
'obname=$(echo foo | git hash-object --stdin -w) &&
obpath=$(echo $obname | sed -e "s/\(..\)/\1\//") &&
test -r .git/objects/"$obpath" &&
rm -f .git/objects/"$obpath"'
test_expect_success \
'git hash-object --stdin file1 <file0 first operates on file0, then file1' \
'echo foo > file1 &&
obname0=$(echo bar | git hash-object --stdin) &&
obname1=$(git hash-object file1) &&
obname0new=$(echo bar | git hash-object --stdin file1 | sed -n -e 1p) &&
obname1new=$(echo bar | git hash-object --stdin file1 | sed -n -e 2p) &&
test "$obname0" = "$obname0new" &&
test "$obname1" = "$obname1new"'
test_expect_success \
'git hash-object refuses multiple --stdin arguments' \
'! git hash-object --stdin --stdin < file1'
test_done