* [Bug] git add -i fails in multiple ways prior to first commit.
@ 2008-02-12 0:59 Rhodes, Kate
2008-02-13 10:16 ` Jeff King
0 siblings, 1 reply; 13+ messages in thread
From: Rhodes, Kate @ 2008-02-12 0:59 UTC (permalink / raw)
To: git
$ git init
$ touch foo.txt
$ git add foo.txt
$ git add -i
fatal: bad revision 'HEAD'
staged unstaged path
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>
* status fails to report the current status
* update fails to work at all
* revert fails to work (not that there should be anything to revert
but it shouldn't return a "fatal: bad revision 'HEAD'" message.
* add untracked works
* patch works
* diff fails
* help returns instructions that are incorrect owing to the fact that
half of the things don't work in this state.
* quit, thankfully, works. :)
Why this is important:
git add's interactive mode is intended to make things easier, thus it
stands to reason that people new to git are going to want to use it.
Presenting them with so many broken commands so early on is,
obviously, a really bad idea.
-masukomi
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Bug] git add -i fails in multiple ways prior to first commit.
2008-02-12 0:59 [Bug] git add -i fails in multiple ways prior to first commit Rhodes, Kate
@ 2008-02-13 10:16 ` Jeff King
2008-02-13 10:23 ` Jakub Narebski
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Jeff King @ 2008-02-13 10:16 UTC (permalink / raw)
To: Rhodes, Kate; +Cc: git
On Mon, Feb 11, 2008 at 07:59:46PM -0500, Rhodes, Kate wrote:
> * status fails to report the current status
> * update fails to work at all
Below is a patch to address these two. It works by simulating the
diff as if HEAD contained nothing. The 'diff' command is still broken
(it would need to generate fake diff output against an empty tree).
However, I wonder if this is the best approach. It would be nice if
there were a shorthand for "the empty tree" for diffing, so you could
just diff against that rather than HEAD, and have the regular plumbing
generate.
I suppose we could just create that tree object, though it adds a slight
amount of cruft to the object database.
---
git-add--interactive.perl | 62 ++++++++++++++++++++++++++++++++-------------
1 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 17ca5b8..b9f9abe 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -82,6 +82,17 @@ sub list_untracked {
my $status_fmt = '%12s %12s %s';
my $status_head = sprintf($status_fmt, 'staged', 'unstaged', 'path');
+sub is_initial_commit {
+ return system('git rev-parse HEAD -- >/dev/null 2>&1') != 0;
+}
+
+sub count_blob_lines {
+ my $sha1 = shift;
+ my @lines = run_cmd_pipe(qw(git cat-file blob), $sha1);
+ return scalar(@lines);
+}
+
+
# Returns list of hashes, contents of each of which are:
# VALUE: pathname
# BINARY: is a binary path
@@ -103,27 +114,42 @@ sub list_modified {
return if (!@tracked);
}
- for (run_cmd_pipe(qw(git diff-index --cached
- --numstat --summary HEAD --), @tracked)) {
- if (($add, $del, $file) =
- /^([-\d]+) ([-\d]+) (.*)/) {
- my ($change, $bin);
- if ($add eq '-' && $del eq '-') {
- $change = 'binary';
- $bin = 1;
- }
- else {
- $change = "+$add/-$del";
- }
+ if (is_initial_commit()) {
+ for (run_cmd_pipe(qw(git ls-files --stage --exclude-standard
+ --), @tracked)) {
+ my ($sha1, $file) = /\d+ ([0-9a-f]+) \d\t(.*)/
+ or die "invalid ls-files output: $_";
+ my $n = count_blob_lines($sha1);
$data{$file} = {
- INDEX => $change,
- BINARY => $bin,
+ INDEX => "+$n/-0",
FILE => 'nothing',
- }
+ INDEXADDDEL => 'create',
+ };
}
- elsif (($adddel, $file) =
- /^ (create|delete) mode [0-7]+ (.*)$/) {
- $data{$file}{INDEX_ADDDEL} = $adddel;
+ }
+ else {
+ for (run_cmd_pipe(qw(git diff-index --cached
+ --numstat --summary HEAD --), @tracked)) {
+ if (($add, $del, $file) =
+ /^([-\d]+) ([-\d]+) (.*)/) {
+ my ($change, $bin);
+ if ($add eq '-' && $del eq '-') {
+ $change = 'binary';
+ $bin = 1;
+ }
+ else {
+ $change = "+$add/-$del";
+ }
+ $data{$file} = {
+ INDEX => $change,
+ BINARY => $bin,
+ FILE => 'nothing',
+ }
+ }
+ elsif (($adddel, $file) =
+ /^ (create|delete) mode [0-7]+ (.*)$/) {
+ $data{$file}{INDEX_ADDDEL} = $adddel;
+ }
}
}
--
1.5.4.1.1296.g34f89-dirty
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Bug] git add -i fails in multiple ways prior to first commit.
2008-02-13 10:16 ` Jeff King
@ 2008-02-13 10:23 ` Jakub Narebski
2008-02-13 10:37 ` Jeff King
2008-02-13 10:50 ` [PATCH] add--interactive: handle initial commit better Jeff King
2008-02-13 11:30 ` [Bug] git add -i fails in multiple ways prior to first commit Junio C Hamano
2 siblings, 1 reply; 13+ messages in thread
From: Jakub Narebski @ 2008-02-13 10:23 UTC (permalink / raw)
To: Jeff King; +Cc: Rhodes, Kate, git
Jeff King <peff@peff.net> writes:
> However, I wonder if this is the best approach. It would be nice if
> there were a shorthand for "the empty tree" for diffing,
/dev/null? --root?
--
Jakub Narebski
Poland
ShadeHawk on #git
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Bug] git add -i fails in multiple ways prior to first commit.
2008-02-13 10:23 ` Jakub Narebski
@ 2008-02-13 10:37 ` Jeff King
0 siblings, 0 replies; 13+ messages in thread
From: Jeff King @ 2008-02-13 10:37 UTC (permalink / raw)
To: Jakub Narebski; +Cc: Rhodes, Kate, git
On Wed, Feb 13, 2008 at 02:23:48AM -0800, Jakub Narebski wrote:
> > However, I wonder if this is the best approach. It would be nice if
> > there were a shorthand for "the empty tree" for diffing,
>
> /dev/null? --root?
--root doesn't work since it is so entwined with diffing against an
actual tree. I was thinking something more like turning the magic ref
"EMPTY_TREE" internally into the empty tree, and then everything would
just work.
Or is that what you were suggesting "/dev/null" for? Another possible
name is 4b825dc642cb6eb9a060e54bf8d69288fbee4904, which is the SHA-1 of
the empty tree (currently, but I don't suppose we are going to change the
tree format anytime soon).
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] add--interactive: handle initial commit better
2008-02-13 10:16 ` Jeff King
2008-02-13 10:23 ` Jakub Narebski
@ 2008-02-13 10:50 ` Jeff King
2008-02-13 11:25 ` Jeff King
2008-02-13 11:30 ` [Bug] git add -i fails in multiple ways prior to first commit Junio C Hamano
2 siblings, 1 reply; 13+ messages in thread
From: Jeff King @ 2008-02-13 10:50 UTC (permalink / raw)
To: Rhodes, Kate; +Cc: git, Junio C Hamano
On Wed, Feb 13, 2008 at 05:16:49AM -0500, Jeff King wrote:
> However, I wonder if this is the best approach. It would be nice if
> there were a shorthand for "the empty tree" for diffing, so you could
> just diff against that rather than HEAD, and have the regular plumbing
> generate.
>
> I suppose we could just create that tree object, though it adds a slight
> amount of cruft to the object database.
And here it is. I think this is a more sane approach in general than the
last patch. The only ugly thing is the empty tree hack, but that can be
addressed with a patch to allow referencing the empty tree without it
existing in the object db.
-- >8 --
There were several points where we looked at the HEAD
commit; for initial commits, this is meaningless. So instead
we:
- show staged status data as a diff against the empty tree
instead of HEAD
- show file diffs as creation events
- use "git rm --cached" to revert instead of going back to
the HEAD commit
The empty tree diff is a little hack-ish. We actually write
the empty tree object from a fake index using "git
write-tree". This would be a bit cleaner if we could
magically reference the empty tree.
Signed-off-by: Jeff King <peff@peff.net>
---
git-add--interactive.perl | 64 +++++++++++++++++++++++++++++++++-----------
1 files changed, 48 insertions(+), 16 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 17ca5b8..bae631e 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -82,6 +82,28 @@ sub list_untracked {
my $status_fmt = '%12s %12s %s';
my $status_head = sprintf($status_fmt, 'staged', 'unstaged', 'path');
+{
+ my $initial;
+ sub is_initial_commit {
+ $initial = system('git rev-parse HEAD -- >/dev/null 2>&1') != 0
+ unless defined $initial;
+ return $initial;
+ }
+}
+
+{
+ my $sha1;
+ sub get_empty_tree {
+ if (!$sha1) {
+ local $ENV{GIT_INDEX_FILE} = "$GIT_DIR/empty_index";
+ $sha1 = run_cmd_pipe(qw(git write-tree));
+ chomp $sha1;
+ unlink($ENV{GIT_INDEX_FILE});
+ }
+ return $sha1;
+ }
+}
+
# Returns list of hashes, contents of each of which are:
# VALUE: pathname
# BINARY: is a binary path
@@ -103,8 +125,10 @@ sub list_modified {
return if (!@tracked);
}
+ my $reference = is_initial_commit() ? get_empty_tree() : 'HEAD';
for (run_cmd_pipe(qw(git diff-index --cached
- --numstat --summary HEAD --), @tracked)) {
+ --numstat --summary), $reference,
+ '--', @tracked)) {
if (($add, $del, $file) =
/^([-\d]+) ([-\d]+) (.*)/) {
my ($change, $bin);
@@ -476,21 +500,27 @@ sub revert_cmd {
HEADER => $status_head, },
list_modified());
if (@update) {
- my @lines = run_cmd_pipe(qw(git ls-tree HEAD --),
- map { $_->{VALUE} } @update);
- my $fh;
- open $fh, '| git update-index --index-info'
- or die;
- for (@lines) {
- print $fh $_;
+ if (is_initial_commit()) {
+ system(qw(git rm --cached),
+ map { $_->{VALUE} } @update);
}
- close($fh);
- for (@update) {
- if ($_->{INDEX_ADDDEL} &&
- $_->{INDEX_ADDDEL} eq 'create') {
- system(qw(git update-index --force-remove --),
- $_->{VALUE});
- print "note: $_->{VALUE} is untracked now.\n";
+ else {
+ my @lines = run_cmd_pipe(qw(git ls-tree HEAD --),
+ map { $_->{VALUE} } @update);
+ my $fh;
+ open $fh, '| git update-index --index-info'
+ or die;
+ for (@lines) {
+ print $fh $_;
+ }
+ close($fh);
+ for (@update) {
+ if ($_->{INDEX_ADDDEL} &&
+ $_->{INDEX_ADDDEL} eq 'create') {
+ system(qw(git update-index --force-remove --),
+ $_->{VALUE});
+ print "note: $_->{VALUE} is untracked now.\n";
+ }
}
}
refresh();
@@ -956,7 +986,9 @@ sub diff_cmd {
HEADER => $status_head, },
@mods);
return if (!@them);
- system(qw(git diff -p --cached HEAD --), map { $_->{VALUE} } @them);
+ my $reference = is_initial_commit() ? get_empty_tree() : 'HEAD';
+ system(qw(git diff -p --cached), $reference, '--',
+ map { $_->{VALUE} } @them);
}
sub quit_cmd {
--
1.5.4.1.1296.g34f89-dirty
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 10:50 ` [PATCH] add--interactive: handle initial commit better Jeff King
@ 2008-02-13 11:25 ` Jeff King
2008-02-13 12:19 ` Johannes Schindelin
0 siblings, 1 reply; 13+ messages in thread
From: Jeff King @ 2008-02-13 11:25 UTC (permalink / raw)
To: Rhodes, Kate; +Cc: git, Junio C Hamano
On Wed, Feb 13, 2008 at 05:50:51AM -0500, Jeff King wrote:
> And here it is. I think this is a more sane approach in general than the
> last patch. The only ugly thing is the empty tree hack, but that can be
> addressed with a patch to allow referencing the empty tree without it
> existing in the object db.
And this patch hard-codes the empty tree. I _think_ this shouldn't cause
us any problems, as it just reuses the existing pretend_sha1_file
infrastructure. However that infrastructure is very rarely used.
This patch also contains the matching fix to git-add--interactive (on
top of my last patch). They should probably just be squashed together,
but I can submit a cleaned up 2-patch series if people agree that this
is a good idea.
-- >8 --
hard-code the empty tree object
Now any commands may reference the empty tree object by its
sha1 (4b825dc642cb6eb9a060e54bf8d69288fbee4904). This is
useful for showing some diffs, especially for initial
commits.
Signed-off-by: Jeff King <peff@peff.net>
---
git-add--interactive.perl | 13 ++-----------
sha1_file.c | 11 +++++++++++
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index bae631e..a0a81f1 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -91,17 +91,8 @@ my $status_head = sprintf($status_fmt, 'staged', 'unstaged', 'path');
}
}
-{
- my $sha1;
- sub get_empty_tree {
- if (!$sha1) {
- local $ENV{GIT_INDEX_FILE} = "$GIT_DIR/empty_index";
- $sha1 = run_cmd_pipe(qw(git write-tree));
- chomp $sha1;
- unlink($ENV{GIT_INDEX_FILE});
- }
- return $sha1;
- }
+sub get_empty_tree {
+ return '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
}
# Returns list of hashes, contents of each of which are:
diff --git a/sha1_file.c b/sha1_file.c
index 4179949..1a6c7c8 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1845,6 +1845,15 @@ static struct cached_object {
} *cached_objects;
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",
+ OBJ_TREE,
+ "",
+ 0
+};
+
static struct cached_object *find_cached_object(const unsigned char *sha1)
{
int i;
@@ -1854,6 +1863,8 @@ static struct cached_object *find_cached_object(const unsigned char *sha1)
if (!hashcmp(co->sha1, sha1))
return co;
}
+ if (!hashcmp(sha1, empty_tree.sha1))
+ return &empty_tree;
return NULL;
}
--
1.5.4.1.1297.g3482b-dirty
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Bug] git add -i fails in multiple ways prior to first commit.
2008-02-13 10:16 ` Jeff King
2008-02-13 10:23 ` Jakub Narebski
2008-02-13 10:50 ` [PATCH] add--interactive: handle initial commit better Jeff King
@ 2008-02-13 11:30 ` Junio C Hamano
2008-02-13 11:34 ` Jeff King
2 siblings, 1 reply; 13+ messages in thread
From: Junio C Hamano @ 2008-02-13 11:30 UTC (permalink / raw)
To: Jeff King; +Cc: Rhodes, Kate, git
Jeff King <peff@peff.net> writes:
> However, I wonder if this is the best approach. It would be nice if
> there were a shorthand for "the empty tree" for diffing, so you could
> just diff against that rather than HEAD, and have the regular plumbing
> generate.
I guess you can set your worktree to an empty directory and run
diff-files backwards, like perhaps:
mkdir /var/tmp/empty
(cd .git && GIT_WORK_TREE=/var/tmp/empty git diff -R)
Have I tried it? No --- I am not sick enough to be motivated.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Bug] git add -i fails in multiple ways prior to first commit.
2008-02-13 11:30 ` [Bug] git add -i fails in multiple ways prior to first commit Junio C Hamano
@ 2008-02-13 11:34 ` Jeff King
0 siblings, 0 replies; 13+ messages in thread
From: Jeff King @ 2008-02-13 11:34 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Rhodes, Kate, git
On Wed, Feb 13, 2008 at 03:30:44AM -0800, Junio C Hamano wrote:
> > However, I wonder if this is the best approach. It would be nice if
> > there were a shorthand for "the empty tree" for diffing, so you could
> > just diff against that rather than HEAD, and have the regular plumbing
> > generate.
>
> I guess you can set your worktree to an empty directory and run
> diff-files backwards, like perhaps:
>
> mkdir /var/tmp/empty
> (cd .git && GIT_WORK_TREE=/var/tmp/empty git diff -R)
>
> Have I tried it? No --- I am not sick enough to be motivated.
Actually, I thought of that already. It does work, though when I tried
it, I failed to 'cd .git' which broke it. But yes, I think it is a
nastier solution than just using the "virtual" empty tree.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 11:25 ` Jeff King
@ 2008-02-13 12:19 ` Johannes Schindelin
2008-02-13 13:11 ` Jakub Narebski
0 siblings, 1 reply; 13+ messages in thread
From: Johannes Schindelin @ 2008-02-13 12:19 UTC (permalink / raw)
To: Jeff King; +Cc: Rhodes, Kate, git, Junio C Hamano
Hi,
On Wed, 13 Feb 2008, Jeff King wrote:
> diff --git a/sha1_file.c b/sha1_file.c
> index 4179949..1a6c7c8 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -1845,6 +1845,15 @@ static struct cached_object {
> } *cached_objects;
> 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",
> + OBJ_TREE,
> + "",
> + 0
> +};
> +
> static struct cached_object *find_cached_object(const unsigned char *sha1)
> {
> int i;
> @@ -1854,6 +1863,8 @@ static struct cached_object *find_cached_object(const unsigned char *sha1)
> if (!hashcmp(co->sha1, sha1))
> return co;
> }
> + if (!hashcmp(sha1, empty_tree.sha1))
> + return &empty_tree;
> return NULL;
> }
Heh. This is cute. But it is also a bit hard to reference, no? I mean,
you have to remember the SHA-1 of it...
Maybe {} ?
Ciao,
Dscho
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 12:19 ` Johannes Schindelin
@ 2008-02-13 13:11 ` Jakub Narebski
2008-02-13 13:15 ` Jeff King
2008-02-13 13:22 ` Johannes Schindelin
0 siblings, 2 replies; 13+ messages in thread
From: Jakub Narebski @ 2008-02-13 13:11 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Jeff King, Rhodes, Kate, git, Junio C Hamano
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> On Wed, 13 Feb 2008, Jeff King wrote:
> > }
> > + if (!hashcmp(sha1, empty_tree.sha1))
> > + return &empty_tree;
> > return NULL;
> > }
>
> Heh. This is cute. But it is also a bit hard to reference, no? I mean,
> you have to remember the SHA-1 of it...
>
> Maybe {} ?
Or NULL? You can do this even without modifying git code, I think, by
adding refs/NULL with appropriate sha-1...
^{tree} I think resolves to HEAD^{tree}
--
Jakub Narebski
Poland
ShadeHawk on #git
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 13:11 ` Jakub Narebski
@ 2008-02-13 13:15 ` Jeff King
2008-02-13 13:22 ` Johannes Schindelin
1 sibling, 0 replies; 13+ messages in thread
From: Jeff King @ 2008-02-13 13:15 UTC (permalink / raw)
To: Jakub Narebski; +Cc: Johannes Schindelin, Rhodes, Kate, git, Junio C Hamano
On Wed, Feb 13, 2008 at 05:11:10AM -0800, Jakub Narebski wrote:
> > Heh. This is cute. But it is also a bit hard to reference, no? I mean,
> > you have to remember the SHA-1 of it...
> >
> > Maybe {} ?
>
> Or NULL? You can do this even without modifying git code, I think, by
> adding refs/NULL with appropriate sha-1...
You still need my patch, unless you want to create the empty tree object
in the databsae. The existence of the object and its name are separate.
If you want to add a magic ref or syntax that maps to the correct SHA-1,
then that makes sense to me.
-Peff
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 13:11 ` Jakub Narebski
2008-02-13 13:15 ` Jeff King
@ 2008-02-13 13:22 ` Johannes Schindelin
2008-02-13 13:45 ` Johannes Schindelin
1 sibling, 1 reply; 13+ messages in thread
From: Johannes Schindelin @ 2008-02-13 13:22 UTC (permalink / raw)
To: Jakub Narebski; +Cc: Jeff King, Rhodes, Kate, git, Junio C Hamano
Hi,
On Wed, 13 Feb 2008, Jakub Narebski wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>
> > On Wed, 13 Feb 2008, Jeff King wrote:
> > > }
> > > + if (!hashcmp(sha1, empty_tree.sha1))
> > > + return &empty_tree;
> > > return NULL;
> > > }
> >
> > Heh. This is cute. But it is also a bit hard to reference, no? I mean,
> > you have to remember the SHA-1 of it...
> >
> > Maybe {} ?
>
> Or NULL?
I was talking about a special handling: "{}" is not a valid refname. But
"NULL" _is_. So I wanted to avoid that "NULL" explicitely.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] add--interactive: handle initial commit better
2008-02-13 13:22 ` Johannes Schindelin
@ 2008-02-13 13:45 ` Johannes Schindelin
0 siblings, 0 replies; 13+ messages in thread
From: Johannes Schindelin @ 2008-02-13 13:45 UTC (permalink / raw)
To: Jakub Narebski; +Cc: Jeff King, Rhodes, Kate, git, Junio C Hamano
Hi,
On Wed, 13 Feb 2008, Johannes Schindelin wrote:
> On Wed, 13 Feb 2008, Jakub Narebski wrote:
>
> > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> >
> > > On Wed, 13 Feb 2008, Jeff King wrote:
> > > > }
> > > > + if (!hashcmp(sha1, empty_tree.sha1))
> > > > + return &empty_tree;
> > > > return NULL;
> > > > }
> > >
> > > Heh. This is cute. But it is also a bit hard to reference, no? I
> > > mean, you have to remember the SHA-1 of it...
> > >
> > > Maybe {} ?
IOW something like this (on top of your two patches; feel free to merge):
-- snipsnap --
[PATCH] Make {} synonymous to the empty tree
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
cache.h | 5 +++++
sha1_file.c | 4 +---
sha1_name.c | 5 +++++
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h
index f4c56fa..b71f772 100644
--- a/cache.h
+++ b/cache.h
@@ -266,6 +266,11 @@ static inline enum object_type object_type(unsigned int mode)
#define INFOATTRIBUTES_FILE "info/attributes"
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
+/* empty tree sha1: 4b825dc642cb6eb9a060e54bf8d69288fbee4904 */
+#define EMPTY_TREE_SHA1 (unsigned char *)\
+ "\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \
+ "\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04"
+
extern int is_bare_repository_cfg;
extern int is_bare_repository(void);
extern int is_inside_git_dir(void);
diff --git a/sha1_file.c b/sha1_file.c
index 1a6c7c8..cba629a 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1846,9 +1846,7 @@ static struct cached_object {
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
diff --git a/sha1_name.c b/sha1_name.c
index 6cfd1f9..3a39a55 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -760,5 +760,10 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)
return get_tree_entry(tree_sha1, cp+1, sha1, mode);
}
}
+ if (ret && !strcmp(name, "{}")) {
+ *mode = 0755;
+ hashcpy(sha1, EMPTY_TREE_SHA1);
+ ret = 0;
+ }
return ret;
}
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2008-02-13 13:46 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-12 0:59 [Bug] git add -i fails in multiple ways prior to first commit Rhodes, Kate
2008-02-13 10:16 ` Jeff King
2008-02-13 10:23 ` Jakub Narebski
2008-02-13 10:37 ` Jeff King
2008-02-13 10:50 ` [PATCH] add--interactive: handle initial commit better Jeff King
2008-02-13 11:25 ` Jeff King
2008-02-13 12:19 ` Johannes Schindelin
2008-02-13 13:11 ` Jakub Narebski
2008-02-13 13:15 ` Jeff King
2008-02-13 13:22 ` Johannes Schindelin
2008-02-13 13:45 ` Johannes Schindelin
2008-02-13 11:30 ` [Bug] git add -i fails in multiple ways prior to first commit Junio C Hamano
2008-02-13 11:34 ` Jeff King
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).