* How to fix (and find) many git-* --check errors? @ 2008-08-08 12:49 "Peter Valdemar Mørch (Lists)" 2008-08-08 13:23 ` Jeff King ` (3 more replies) 0 siblings, 4 replies; 6+ messages in thread From: "Peter Valdemar Mørch (Lists)" @ 2008-08-08 12:49 UTC (permalink / raw) To: git We have > 37000 white space "errors" in HEAD, mostly trailing whitespace, and I'm looking for a $ git diff --check | git??? --whitespace=fix command. Is there such a beast? I see that git-apply has a --whitespace=<action> option, but I don't seem to grock how to be able to use it for fixing my working directory. Details follow: I can create a perl script that does this for me (e.g. inspired by 1.5.6's hooks/pre-commit's perl version of git diff --check) and post it here if anybody would like it, but I'd rather use some well-tested method if one exists. And it seems git-apply has the functionality somehow. Of course, I can also: $ git diff --check > tmpcfile # (Or some other command to find all of them under ./) $ vim :cfile tmpcfile Thank you for --check having a handy output format, BTW! But I prefer automation (and automated auditing of the results) for 37000 lines. Also the way I found them is like this: $ git diff --check $(git log --pretty=format:%H | tail -1)..HEAD . (The diff between "the empty commit" and HEAD - well between the first commit and HEAD anyway. Is there a ref for "totally empty" or the revision before the first commit? Or a more elegant way to get this list?) Peter -- Peter Valdemar Mørch http://www.morch.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to fix (and find) many git-* --check errors? 2008-08-08 12:49 How to fix (and find) many git-* --check errors? "Peter Valdemar Mørch (Lists)" @ 2008-08-08 13:23 ` Jeff King 2008-08-08 13:28 ` Björn Steinbrink ` (2 subsequent siblings) 3 siblings, 0 replies; 6+ messages in thread From: Jeff King @ 2008-08-08 13:23 UTC (permalink / raw) To: "Peter Valdemar Mørch (Lists)"; +Cc: git On Fri, Aug 08, 2008 at 02:49:00PM +0200, "Peter Valdemar Mørch (Lists)" wrote: > (The diff between "the empty commit" and HEAD - well between the first > commit and HEAD anyway. Is there a ref for "totally empty" or the > revision before the first commit? Or a more elegant way to get this > list?) It is not advertised, but we always recognize the empty sha1 of the empty tree: git diff --check 4b825dc642cb6eb9a060e54bf8d69288fbee4904 In fact, just the other day I was using this for the Nth time and got tired of looking it up in the code, so I wrote the patch below. I don't know if it is too crazy to be included in mainline git (it was discussed a long time ago, but I think the general response was "what would it be good for?"). --- cache.h | 4 ++++ refs.c | 4 ++++ sha1_file.c | 3 +-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cache.h b/cache.h index 30f1d62..4aa02ae 100644 --- a/cache.h +++ b/cache.h @@ -567,6 +567,10 @@ static inline unsigned int hexval(unsigned char c) #define MINIMUM_ABBREV 4 #define DEFAULT_ABBREV 7 +#define EMPTY_TREE_SHA1 \ + "\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \ + "\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04" + extern int get_sha1(const char *str, unsigned char *sha1); extern int get_sha1_with_mode(const char *str, unsigned char *sha1, unsigned *mode); extern int get_sha1_hex(const char *hex, unsigned char *sha1); diff --git a/refs.c b/refs.c index 39a3b23..0acbcbc 100644 --- a/refs.c +++ b/refs.c @@ -427,6 +427,10 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * } list = list->next; } + if (!strcmp(ref, "EMPTY")) { + hashcpy(sha1, (unsigned char *)EMPTY_TREE_SHA1); + return ref; + } if (reading || errno != ENOENT) return NULL; hashclr(sha1); diff --git a/sha1_file.c b/sha1_file.c index 2aff59b..38aad13 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1985,8 +1985,7 @@ static int cached_object_nr, cached_object_alloc; static struct cached_object empty_tree = { /* empty tree sha1: 4b825dc642cb6eb9a060e54bf8d69288fbee4904 */ - "\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" - "\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04", + EMPTY_TREE_SHA1, OBJ_TREE, "", 0 -- 1.6.0.rc1.260.g4782 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: How to fix (and find) many git-* --check errors? 2008-08-08 12:49 How to fix (and find) many git-* --check errors? "Peter Valdemar Mørch (Lists)" 2008-08-08 13:23 ` Jeff King @ 2008-08-08 13:28 ` Björn Steinbrink 2008-08-08 14:57 ` "Peter Valdemar Mørch (Lists)" 2008-08-08 19:27 ` Junio C Hamano 3 siblings, 0 replies; 6+ messages in thread From: Björn Steinbrink @ 2008-08-08 13:28 UTC (permalink / raw) To: Peter Valdemar Mørch (Lists); +Cc: git On 2008.08.08 14:49:00 +0200, "Peter Valdemar Mørch (Lists)" wrote: > We have > 37000 white space "errors" in HEAD, mostly trailing > whitespace, and I'm looking for a > > $ git diff --check | git??? --whitespace=fix > > command. > > Is there such a beast? > > I see that git-apply has a --whitespace=<action> option, but I don't > seem to grock how to be able to use it for fixing my working directory. I'd probably do something like: # Create a commit with an empty tree rm .git/index git commit -m tmp rm -r * (include dotfiles if required, ie. remove all tracked files) git diff -R HEAD^ | git apply --index --whitespace=fix git commit --amend -m "Whitespace fixed up" But probably there's some smarter way than that. Björn ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to fix (and find) many git-* --check errors? 2008-08-08 12:49 How to fix (and find) many git-* --check errors? "Peter Valdemar Mørch (Lists)" 2008-08-08 13:23 ` Jeff King 2008-08-08 13:28 ` Björn Steinbrink @ 2008-08-08 14:57 ` "Peter Valdemar Mørch (Lists)" 2008-08-08 19:27 ` Junio C Hamano 3 siblings, 0 replies; 6+ messages in thread From: "Peter Valdemar Mørch (Lists)" @ 2008-08-08 14:57 UTC (permalink / raw) To: git Thanks to hints from both Jeff King and Björn Stenbrink I got it working. Here is my script, if anybody is interested. It handles both fixing whitespace in current workspace diffs: $ git-fix-whitespace file (requires existing diffs) and fixing all whitespace problems in a file: $ git-fix-whitespace -f file (asserts no existing diffs) Now all I need to do is grock how to fix stuff already in the index, but I'll leave that for another day... Peter ----------------- #!/bin/bash # Take a -f option to fix all whitespace problems in entire files # completely. Otherwise only fix current diffs. # Option handling while getopts fh? o do case "$o" in f) fixEntireFile=1;; [h?]) echo >&2 "Usage: $0 [-f] file ..." echo >&2 "-f: Fix the entire file" echo >&2 " Otherwise only fix current diffs" exit 1;; esac done shift $(($OPTIND-1)) # A constant for a rev that is empty EMPTY_TREE_SHA1=4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Check to see we're on a clean HEAD just to be sure. # (Not sure this is necessary, but just in case.) git --no-pager diff --exit-code HEAD -- "$@" > /dev/null if [ $? = 0 ] ; then # There is no current diff if [ "$fixEntireFile" != "" ] ; then # Good, there is no diff, and we've been asked to fix # the entire file # Remove all files - the -f for rm is just needed if # $@ happens to contain only untracked files git-ls-tree -z -r --name-status HEAD "$@" | \ xargs --null rm -f # Re-create the files - but with whitespace fixed git diff $EMPTY_TREE_SHA1 HEAD -- "$@" | \ git-apply --whitespace=fix else echo >&2 '*Error*: there no diff with HEAD' exit 1 fi else # There is a current diff if [ "$fixEntireFile" = "" ] ; then # Good, there is a current diff, that we need to fix TEMP_FILE=$(tempfile) git diff -- "$@" > $TEMP_FILE git checkout HEAD -- "$@" git apply --whitespace=fix $TEMP_FILE rm $TEMP_FILE else echo >&2 '*Error*: there is diff with HEAD' exit 1 fi fi ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to fix (and find) many git-* --check errors? 2008-08-08 12:49 How to fix (and find) many git-* --check errors? "Peter Valdemar Mørch (Lists)" ` (2 preceding siblings ...) 2008-08-08 14:57 ` "Peter Valdemar Mørch (Lists)" @ 2008-08-08 19:27 ` Junio C Hamano 2008-08-09 7:28 ` "Peter Valdemar Mørch (Lists)" 3 siblings, 1 reply; 6+ messages in thread From: Junio C Hamano @ 2008-08-08 19:27 UTC (permalink / raw) To: Peter Valdemar Mørch (Lists); +Cc: git "Peter Valdemar Mørch (Lists)" <4ux6as402@sneakemail.com> writes: > We have > 37000 white space "errors" in HEAD, mostly trailing > whitespace, and I'm looking for a > > $ git diff --check | git??? --whitespace=fix > > command. Starting from a clean checkout, you could do something like this: $ git reset --hard $ rm .git/index $ git diff --binary -R HEAD >P.diff $ git apply --whitespace=fix --cached <P.diff $ git commit -m "Fixed all whitespace gotchas" P.diff contains essentially everything, and you are recreating everything from that patch. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to fix (and find) many git-* --check errors? 2008-08-08 19:27 ` Junio C Hamano @ 2008-08-09 7:28 ` "Peter Valdemar Mørch (Lists)" 0 siblings, 0 replies; 6+ messages in thread From: "Peter Valdemar Mørch (Lists)" @ 2008-08-09 7:28 UTC (permalink / raw) To: git Junio C Hamano gitster-at-pobox.com |Lists| wrote: > Starting from a clean checkout, you could do something like this: > > $ git reset --hard > $ rm .git/index > $ git diff --binary -R HEAD >P.diff > $ git apply --whitespace=fix --cached <P.diff > $ git commit -m "Fixed all whitespace gotchas" > > P.diff contains essentially everything, and you are recreating everything > from that patch. Thanks for taking the time to answer my many mails and questions. It really is helpful to me. Rambling on: Scary with the "rm .git/index"! It bascially creates an empty index it seems... That was news to me. As a newbie I try not to meddle too much in .git/ ... I tried the above on git.git, and it gave: warning: 485 lines applied after fixing whitespace errors. I would suggest finishing the above with: $ git checkout HEAD otherwise, the working dir is stuck at the old unfixed state. But like I posted earlier, I have another solution that works on selected files. With git, there is always more than one way to do things, it seems... Peter -- Peter Valdemar Mørch http://www.morch.com ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-08-09 7:30 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-08-08 12:49 How to fix (and find) many git-* --check errors? "Peter Valdemar Mørch (Lists)" 2008-08-08 13:23 ` Jeff King 2008-08-08 13:28 ` Björn Steinbrink 2008-08-08 14:57 ` "Peter Valdemar Mørch (Lists)" 2008-08-08 19:27 ` Junio C Hamano 2008-08-09 7:28 ` "Peter Valdemar Mørch (Lists)"
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).