From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carl Worth Subject: Re: [PATCH] git-rm: Fix to properly handle files with spaces, tabs, newlines, etc. Date: Wed, 22 Feb 2006 16:37:27 -0800 Message-ID: <873biasyew.wl%cworth@cworth.org> References: <87u0ass7tj.wl%cworth@cworth.org> <43FB8F31.9090302@people.pl> <87slqcs4y5.wl%cworth@cworth.org> <87r75ws48c.wl%cworth@cworth.org> <7vaccjst3x.fsf@assigned-by-dhcp.cox.net> <8764n7rl6s.wl%cworth@cworth.org> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: multipart/signed; boundary="pgp-sign-Multipart_Wed_Feb_22_16:37:27_2006-1"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Cc: Krzysiek Pawlik , git@vger.kernel.org X-From: git-owner@vger.kernel.org Thu Feb 23 01:38:59 2006 Return-path: Envelope-to: gcvg-git@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FC4VP-0001Dc-Tg for gcvg-git@gmane.org; Thu, 23 Feb 2006 01:38:55 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932366AbWBWAit (ORCPT ); Wed, 22 Feb 2006 19:38:49 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932377AbWBWAit (ORCPT ); Wed, 22 Feb 2006 19:38:49 -0500 Received: from theworths.org ([217.160.253.102]:7360 "EHLO theworths.org") by vger.kernel.org with ESMTP id S932366AbWBWAis (ORCPT ); Wed, 22 Feb 2006 19:38:48 -0500 Received: (qmail 17873 invoked from network); 22 Feb 2006 19:38:47 -0500 Received: from localhost (HELO raht.cworth.org) (127.0.0.1) by localhost with SMTP; 22 Feb 2006 19:38:47 -0500 To: Junio C Hamano In-Reply-To: <8764n7rl6s.wl%cworth@cworth.org> User-Agent: Wanderlust/2.14.0 (Africa) Emacs/21.4 Mule/5.0 (SAKAKI) Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: --pgp-sign-Multipart_Wed_Feb_22_16:37:27_2006-1 Content-Type: text/plain; charset=US-ASCII New tests are added to the git-rm test case to cover this as well. Signed-off-by: Carl Worth --- Please ignore the previous patch. This is what I intended to send. (For as useful as the index is---and yes, I have found it very useful---I still find it easy to inadvertently commit stale data with it. I guess what might help me is a command to update into the index all files that are currently in the "updated but not checked in (will commit)" state as reported by git status. Does such a command exist?) -Carl git-rm.sh | 37 ++++++++++++++++++++----------------- t/t3600-rm.sh | 52 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 55 insertions(+), 34 deletions(-) 3bd80bae8dc2b004a3109018f0efb0007804b79d diff --git a/git-rm.sh b/git-rm.sh index 0a3f546..fda4541 100755 --- a/git-rm.sh +++ b/git-rm.sh @@ -4,7 +4,6 @@ USAGE='[-f] [-n] [-v] [--] ...' SUBDIRECTORY_OK='Yes' . git-sh-setup -index_remove_option=--force-remove remove_files= show_only= verbose= @@ -12,7 +11,6 @@ while : ; do case "$1" in -f) remove_files=true - index_remote_option=--force ;; -n) show_only=true @@ -45,23 +43,28 @@ case "$#" in ;; esac -files=$( - if test -f "$GIT_DIR/info/exclude" ; then - git-ls-files \ - --exclude-from="$GIT_DIR/info/exclude" \ - --exclude-per-directory=.gitignore -- "$@" - else - git-ls-files \ +if test -f "$GIT_DIR/info/exclude" +then + git-ls-files -z \ + --exclude-from="$GIT_DIR/info/exclude" \ --exclude-per-directory=.gitignore -- "$@" - fi | sort | uniq -) - -case "$show_only" in -true) - echo $files +else + git-ls-files -z \ + --exclude-per-directory=.gitignore -- "$@" +fi | +case "$show_only,$remove_files" in +true,*) + xargs -0 echo + ;; +*,true) + xargs -0 sh -c " + while [ \$# -gt 0 ]; do + file=\$1; shift + rm -- \"\$file\" && git-update-index --remove $verbose \"\$file\" + done + " inline ;; *) - [[ "$remove_files" = "true" ]] && rm -- $files - git-update-index $index_remove_option $verbose $files + git-update-index --force-remove $verbose -z --stdin ;; esac diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 8415732..cabfadd 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -7,36 +7,54 @@ test_description='Test of the various op . ./test-lib.sh -# Setup some files to be removed -touch foo bar -git-add foo bar -# Need one to test -- -touch -- -q -git update-index --add -- -q -git-commit -m "add foo, bar, and -q" +# Setup some files to be removed, some with funny characters +touch -- foo bar baz 'space embedded' 'tab embedded' 'newline +embedded' -q +git-add -- foo bar baz 'space embedded' 'tab embedded' 'newline +embedded' -q +git-commit -m "add files" test_expect_success \ - 'Pre-check that foo is in index before git-rm foo' \ - 'git-ls-files --error-unmatch foo' + 'Pre-check that foo exists and is in index before git-rm foo' \ + '[ -f foo ] && git-ls-files --error-unmatch foo' test_expect_success \ 'Test that git-rm foo succeeds' \ 'git-rm foo' -test_expect_failure \ - 'Post-check that foo is not in index after git-rm foo' \ - 'git-ls-files --error-unmatch foo' +test_expect_success \ + 'Post-check that foo exists but is not in index after git-rm foo' \ + '[ -f foo ] && ! git-ls-files --error-unmatch foo' + +test_expect_success \ + 'Pre-check that bar exists and is in index before "git-rm -f bar"' \ + '[ -f bar ] && git-ls-files --error-unmatch bar' test_expect_success \ - 'Test that "git-rm -f bar" works' \ + 'Test that "git-rm -f bar" succeeds' \ 'git-rm -f bar' -test_expect_failure \ - 'Post-check that bar no longer exists' \ - '[ -f bar ]' +test_expect_success \ + 'Post-check that bar does not exist and is not in index after "git-rm -f bar"' \ + '! [ -f bar ] && ! git-ls-files --error-unmatch bar' test_expect_success \ - 'Test that "git-rm -- -q" works to delete a file named -q' \ + 'Test that "git-rm -- -q" succeeds (remove a file that looks like an option)' \ 'git-rm -- -q' +test_expect_success \ + "Test that \"git-rm -f\" succeeds with embedded space, tab, or newline characters." \ + "git-rm -f 'space embedded' 'tab embedded' 'newline +embedded'" + +chmod u-w . +test_expect_failure \ + 'Test that "git-rm -f" fails if its rm fails' \ + 'git-rm -f baz' +chmod u+w . + +test_expect_success \ + 'When the rm in "git-rm -f" fails, it should not remove the file from the index' \ + 'git-ls-files --error-unmatch baz' + test_done -- 1.2.2.g3d52-dirty --pgp-sign-Multipart_Wed_Feb_22_16:37:27_2006-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) iD8DBQBD/QPH6JDdNq8qSWgRAvn/AJ9xgt/sCeNHBOT26ipdg71FAHiS8QCeN+84 Cf9JJc7brCS6UuglmNQvX6I= =EaJx -----END PGP SIGNATURE----- --pgp-sign-Multipart_Wed_Feb_22_16:37:27_2006-1--