Git development
 help / color / mirror / Atom feed
* "fatal: git-write-tree: error building trees" from `git stash`
@ 2012-12-27 18:07 Alex Vandiver
  2012-12-27 18:51 ` Junio C Hamano
  0 siblings, 1 reply; 6+ messages in thread
From: Alex Vandiver @ 2012-12-27 18:07 UTC (permalink / raw)
  To: git discussion list

  Heya,
I just ran into the following with `git stash`.  The set-up:

        git init
        echo "Initial" > foo
        git add .
        git commit -m 'Initial commit'
        echo "Rewrite" > foo
        git commit -am 'Second commit, rewrites content'
        echo "Stashed changes" >> foo
        git stash
        git co HEAD~
        
$ git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Recorded preimage for 'foo'

$ git stash
foo: needs merge
foo: needs merge
foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7)
foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a)
foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a)
fatal: git-write-tree: error building trees
Cannot save the current index state

 - Alex

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: "fatal: git-write-tree: error building trees" from `git stash`
  2012-12-27 18:07 "fatal: git-write-tree: error building trees" from `git stash` Alex Vandiver
@ 2012-12-27 18:51 ` Junio C Hamano
  2012-12-27 18:55   ` Alex Vandiver
  0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2012-12-27 18:51 UTC (permalink / raw)
  To: Alex Vandiver; +Cc: git discussion list

Alex Vandiver <alex@chmrr.net> writes:

> Heya,
> I just ran into the following with `git stash`.  The set-up:
> ...
> $ git stash pop
> Auto-merging foo
> CONFLICT (content): Merge conflict in foo
> Recorded preimage for 'foo'
>
> $ git stash
> foo: needs merge
> foo: needs merge
> foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7)
> foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a)
> foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a)
> fatal: git-write-tree: error building trees
> Cannot save the current index state

This is totally expected, isn't it?

You do not save state in the middle of a conflict with "git stash"
(instead, you would "git stash" away your own work in progress
before you start operation that may create and leave conflicts).

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: "fatal: git-write-tree: error building trees" from `git stash`
  2012-12-27 18:51 ` Junio C Hamano
@ 2012-12-27 18:55   ` Alex Vandiver
  2012-12-27 19:05     ` Jeff King
  2012-12-27 19:21     ` Junio C Hamano
  0 siblings, 2 replies; 6+ messages in thread
From: Alex Vandiver @ 2012-12-27 18:55 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git discussion list

On Thu, 2012-12-27 at 10:51 -0800, Junio C Hamano wrote:
> > $ git stash
> > foo: needs merge
> > foo: needs merge
> > foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7)
> > foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a)
> > foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a)
> > fatal: git-write-tree: error building trees
> > Cannot save the current index state
> 
> This is totally expected, isn't it?
> 
> You do not save state in the middle of a conflict with "git stash"
> (instead, you would "git stash" away your own work in progress
> before you start operation that may create and leave conflicts).

Apologies for not being clear.  While being unable to stash is not
unexpected, perhaps, "Cannot stash while resolving conflicts" or similar
would be more understandable to the end user than the above.
 - Alex

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: "fatal: git-write-tree: error building trees" from `git stash`
  2012-12-27 18:55   ` Alex Vandiver
@ 2012-12-27 19:05     ` Jeff King
  2012-12-27 20:11       ` Junio C Hamano
  2012-12-27 19:21     ` Junio C Hamano
  1 sibling, 1 reply; 6+ messages in thread
From: Jeff King @ 2012-12-27 19:05 UTC (permalink / raw)
  To: Alex Vandiver; +Cc: Junio C Hamano, git discussion list

On Thu, Dec 27, 2012 at 01:55:56PM -0500, Alex Vandiver wrote:

> On Thu, 2012-12-27 at 10:51 -0800, Junio C Hamano wrote:
> > > $ git stash
> > > foo: needs merge
> > > foo: needs merge
> > > foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7)
> > > foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a)
> > > foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a)
> > > fatal: git-write-tree: error building trees
> > > Cannot save the current index state
> > 
> > This is totally expected, isn't it?
> > 
> > You do not save state in the middle of a conflict with "git stash"
> > (instead, you would "git stash" away your own work in progress
> > before you start operation that may create and leave conflicts).
> 
> Apologies for not being clear.  While being unable to stash is not
> unexpected, perhaps, "Cannot stash while resolving conflicts" or similar
> would be more understandable to the end user than the above.

Yeah, I think the outcome is reasonable, but that message is just
horrible. Something like this might be better:

diff --git a/git-stash.sh b/git-stash.sh
index 688e259..7ea425c 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -217,6 +217,12 @@ save_stash () {
 
 	stash_msg="$*"
 
+	if ! git diff-index --cached --diff-filter=U --quiet HEAD; then
+		echo >&2 "fatal: unable to stash unmerged entries:"
+		git diff-index --cached --diff-filter=U --name-status HEAD
+		exit 1
+	fi
+
 	git update-index -q --refresh
 	if no_changes
 	then

but I suspect it is not sufficient:

  1. There are other code paths that will end up in write-tree which
     should probably be protected, too.

  2. Unmerged entries are only one reason that write-tree might fail.
     It's OK not to catch them all (since ultimately write-tree will
     complain if need be), but we may want to also handle intent-to-add
     entries with a nicer message.

-Peff

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: "fatal: git-write-tree: error building trees" from `git stash`
  2012-12-27 18:55   ` Alex Vandiver
  2012-12-27 19:05     ` Jeff King
@ 2012-12-27 19:21     ` Junio C Hamano
  1 sibling, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2012-12-27 19:21 UTC (permalink / raw)
  To: Alex Vandiver; +Cc: git discussion list

Alex Vandiver <alex@chmrr.net> writes:

> ... "Cannot stash while resolving conflicts" or similar would be
> more understandable to the end user than the above.

Interestingly enough, the "apply" side is protected with this one
liner:

        # current index state
        c_tree=$(git write-tree) ||
                die "$(gettext "Cannot apply a stash in the middle of a merge")"

since 5fd448f (git stash: Give friendlier errors when there is
nothing to apply, 2009-08-11).  I would think something in line with
that change on the "create" side is a welcome one.

Thanks.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: "fatal: git-write-tree: error building trees" from `git stash`
  2012-12-27 19:05     ` Jeff King
@ 2012-12-27 20:11       ` Junio C Hamano
  0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2012-12-27 20:11 UTC (permalink / raw)
  To: Jeff King; +Cc: Alex Vandiver, git discussion list

Jeff King <peff@peff.net> writes:

> but I suspect it is not sufficient:
>
>   1. There are other code paths that will end up in write-tree which
>      should probably be protected, too.

Among 6 calls to write-tree, only the first ones in create_stash and
apply_stash are about the index the user originally had.  If the
only expected failure case is unmerged entries, it should be
sufficient to protect these two (and the one in apply_stash is
already covered, I think).

>   2. Unmerged entries are only one reason that write-tree might fail.
>      It's OK not to catch them all (since ultimately write-tree will
>      complain if need be), but we may want to also handle intent-to-add
>      entries with a nicer message.

Hrmph.

We used to fail write-tree when I-T-A entries existed and relied on
that behaviour to implement "no state lost"; as we broke write-tree
recently by allowing to write a tree out by pretending that I-T-A
entries do not exist, I think we broke it.  Stashing with I-T-A and
then unstashing it may lose the file.  Sigh...

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-12-27 20:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-27 18:07 "fatal: git-write-tree: error building trees" from `git stash` Alex Vandiver
2012-12-27 18:51 ` Junio C Hamano
2012-12-27 18:55   ` Alex Vandiver
2012-12-27 19:05     ` Jeff King
2012-12-27 20:11       ` Junio C Hamano
2012-12-27 19:21     ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox