Merge branch 'jc/gitlink' into next
authorJunio C Hamano <junkio@cox.net>
Wed, 17 May 2006 10:16:50 +0000 (03:16 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 17 May 2006 10:16:50 +0000 (03:16 -0700)
* jc/gitlink:
read-tree: reorganize bind_merge code.

1  2 
read-tree.c
diff --combined read-tree.c
index aa6172b52eeadb4f118e5145c182270342a70bf0,fb1d6829d9e62de541a00dd7c1ab6d7041099255..675a59f8070b6ca5ce1789b823d85e881939c778
@@@ -13,7 -13,6 +13,7 @@@
  #include <sys/time.h>
  #include <signal.h>
  
 +static int reset = 0;
  static int merge = 0;
  static int update = 0;
  static int index_only = 0;
@@@ -420,10 -419,6 +420,10 @@@ static void verify_uptodate(struct cach
                        return;
                errno = 0;
        }
 +      if (reset) {
 +              ce->ce_flags |= htons(CE_UPDATE);
 +              return;
 +      }
        if (errno == ENOENT)
                return;
        die("Entry '%s' not uptodate. Cannot merge.", ce->name);
@@@ -453,8 -448,6 +453,8 @@@ static int merged_entry(struct cache_en
                        invalidate_ce_path(old);
                }
        }
 +      else
 +              invalidate_ce_path(merge);
        merge->ce_flags &= ~htons(CE_STAGEMASK);
        add_cache_entry(merge, ADD_CACHE_OK_TO_ADD);
        return 1;
@@@ -690,7 -683,7 +690,7 @@@ static int twoway_merge(struct cache_en
   * Bind merge.
   *
   * Keep the index entries at stage0, collapse stage1 but make sure
-  * stage0 does not have anything in prefix.
+  * stage0 does not have anything there.
   */
  static int bind_merge(struct cache_entry **src)
  {
        if (merge_size != 1)
                return error("Cannot do a bind merge of %d trees\n",
                             merge_size);
-       if (!a)
-               return merged_entry(old, NULL);
-       if (old)
+       if (a && old)
                die("Entry '%s' overlaps.  Cannot bind.", a->name);
-       return merged_entry(a, NULL);
+       if (!a)
+               return keep_entry(old);
+       else
+               return merged_entry(a, NULL);
  }
  
  /*
@@@ -725,15 -718,9 +725,15 @@@ static int oneway_merge(struct cache_en
  
        if (!a) {
                invalidate_ce_path(old);
 -              return 0;
 +              return deleted_entry(old, NULL);
        }
        if (old && same(old, a)) {
 +              if (reset) {
 +                      struct stat st;
 +                      if (lstat(old->name, &st) ||
 +                          ce_match_stat(old, &st, 1))
 +                              old->ce_flags |= htons(CE_UPDATE);
 +              }
                return keep_entry(old);
        }
        return merged_entry(a, NULL);
@@@ -801,7 -788,7 +801,7 @@@ static struct cache_file cache_file
  
  int main(int argc, char **argv)
  {
 -      int i, newfd, reset, stage = 0;
 +      int i, newfd, stage = 0;
        unsigned char sha1[20];
        merge_fn_t fn = NULL;
  
                if (1 < index_only + update)
                        usage(read_tree_usage);
  
 -              if (get_sha1(arg, sha1) < 0)
 -                      usage(read_tree_usage);
 +              if (get_sha1(arg, sha1))
 +                      die("Not a valid object name %s", arg);
                if (list_tree(sha1) < 0)
                        die("failed to unpack tree object %s", arg);
                stage++;
         * valid cache-tree because the index must match exactly
         * what came from the tree.
         */
 -      if (trees->item && !prefix && (!merge || (stage == 2))) {
 +      if (trees && trees->item && (!merge || (stage == 2))) {
                cache_tree_free(&active_cache_tree);
                prime_cache_tree();
        }