Re: git checkout under 1.7.6 does not properly list untracked files and aborts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



----- Original Message -----
From: Joshua Jensen
Date: 9/19/2011 1:44 PM
----- Original Message -----
From: Joshua Jensen
Date: 9/9/2011 2:04 PM
This may be an msysGit 1.7.6 issue, as that is what I am using. It also occurs in msysGit 1.7.5, but I am almost certain it did not happen in msysGit 1.7.2.

Given an untracked file in the working directory that has been added to an alternate branch, when switching to that alternate branch, 'git checkout' exits with an error code but does not print anything to the console. It should print an untracked file error.

I have been trying to track this down in code. The point where the error messages are printed, display_error_msgs, is never hit.
Okay, so I've tracked this down, but I am unsure what the correct fix is.

In unpack-trees.c's unpack_trees() function, there are some lines that read:

    if (ce->ce_flags & CE_ADDED &&
        verify_absent(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o))
            return -1;

If the 'return -1' is changed to 'goto return_failed', then a proper error message appears:

error: The following untracked working tree files would be overwritten by checkout:
        one/file/listed/here.txt
    Please move or remove them before you can switch branches.
    Aborting

The thing is, there are multiple files that would be overwritten by checkout, and I believe an older version of Git showed me the entire list before aborting.
While probably not correct, the following patch collects all files that would be overwritten and logs them to the output:

---
 unpack-trees.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/unpack-trees.c b/unpack-trees.c
index cc616c3..e1f7263 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -993,7 +993,7 @@ static int verify_absent(struct cache_entry *, enum unpack_trees_error_types, st
  */
int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
 {
-    int i, ret;
+    int i, ret = 0;
     static struct cache_entry *dfc;
     struct exclude_list el;

@@ -1100,9 +1100,10 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
              * Do the real check now because we have had
              * correct CE_NEW_SKIP_WORKTREE
              */
-            if (ce->ce_flags & CE_ADDED &&
- verify_absent(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o))
-                    return -1;
+            if (ce->ce_flags & CE_ADDED) {
+ int result = verify_absent(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o);
+                ret = min(ret, result);
+            }

             if (apply_sparse_checkout(ce, o)) {
                 ret = -1;
@@ -1112,6 +1113,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
                 empty_worktree = 0;

         }
+        if (ret == -1)
+            goto return_failed;
         if (o->result.cache_nr && empty_worktree) {
             /* dubious---why should this fail??? */
ret = unpack_failed(o, "Sparse checkout leaves no entry on working directory");
--
1.7.6.msysgit.1


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]