Merge branch 'jn/cherry-pick-refresh-index' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 9 Dec 2010 18:36:51 +0000 (10:36 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Dec 2010 18:36:51 +0000 (10:36 -0800)
* jn/cherry-pick-refresh-index:
cherry-pick/revert: transparently refresh index

1  2 
builtin/revert.c
diff --combined builtin/revert.c
index 57b51e4a0e148062e1945d640b81559d65e4c2ba,d849f40fcc177616fa9f9c6f2f10f3625d568902..bb6e9e83b756b47dae449064ca7762fe3558fc0e
@@@ -442,7 -442,7 +442,7 @@@ static int do_pick_commit(void
        else
                parent = commit->parents->item;
  
 -      if (allow_ff && !hashcmp(parent->object.sha1, head))
 +      if (allow_ff && parent && !hashcmp(parent->object.sha1, head))
                return fast_forward_to(commit->object.sha1, head);
  
        if (parent && parse_commit(parent) < 0)
@@@ -547,6 -547,21 +547,21 @@@ static void prepare_revs(struct rev_inf
                die("empty commit set passed");
  }
  
+ static void read_and_refresh_cache(const char *me)
+ {
+       static struct lock_file index_lock;
+       int index_fd = hold_locked_index(&index_lock, 0);
+       if (read_index_preload(&the_index, NULL) < 0)
+               die("git %s: failed to read the index", me);
+       refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
+       if (the_index.cache_changed) {
+               if (write_index(&the_index, index_fd) ||
+                   commit_locked_index(&index_lock))
+                       die("git %s: failed to refresh the index", me);
+       }
+       rollback_lock_file(&index_lock);
+ }
  static int revert_or_cherry_pick(int argc, const char **argv)
  {
        struct rev_info revs;
                        die("cherry-pick --ff cannot be used with --edit");
        }
  
-       if (read_cache() < 0)
-               die("git %s: failed to read the index", me);
+       read_and_refresh_cache(me);
  
        prepare_revs(&revs);