* 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.