Merge branch 'jn/rerere-fail-on-auto-update-failure'
authorJunio C Hamano <gitster@pobox.com>
Wed, 11 Feb 2015 21:41:44 +0000 (13:41 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 11 Feb 2015 21:41:45 +0000 (13:41 -0800)
"git rerere" (invoked internally from many mergy operations) did
not correctly signal errors when told to update the working tree
files and failed to do so for whatever reason.

* jn/rerere-fail-on-auto-update-failure:
rerere: error out on autoupdate failure

1  2 
rerere.c
diff --combined rerere.c
index 1b0555f1a5a0233e931b13a088c052a56aef3977,d20c1be8f7906160b89912634818ca6c1245e446..31644dec04fe4a77d43624720ff516de2d746dbc
+++ b/rerere.c
@@@ -1,5 -1,4 +1,5 @@@
  #include "cache.h"
 +#include "lockfile.h"
  #include "string-list.h"
  #include "rerere.h"
  #include "xdiff-interface.h"
@@@ -477,27 -476,23 +477,23 @@@ out
  
  static struct lock_file index_lock;
  
- static int update_paths(struct string_list *update)
+ static void update_paths(struct string_list *update)
  {
        int i;
-       int fd = hold_locked_index(&index_lock, 0);
-       int status = 0;
  
-       if (fd < 0)
-               return -1;
+       hold_locked_index(&index_lock, 1);
  
        for (i = 0; i < update->nr; i++) {
                struct string_list_item *item = &update->items[i];
-               if (add_file_to_cache(item->string, ADD_CACHE_IGNORE_ERRORS))
-                       status = -1;
+               if (add_file_to_cache(item->string, 0))
+                       exit(128);
        }
  
-       if (!status && active_cache_changed) {
+       if (active_cache_changed) {
                if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
                        die("Unable to write new index file");
-       } else if (fd >= 0)
+       } else
                rollback_lock_file(&index_lock);
-       return status;
  }
  
  static int do_plain_rerere(struct string_list *rr, int fd)
        return write_rr(rr, fd);
  }
  
 -static int git_rerere_config(const char *var, const char *value, void *cb)
 +static void git_rerere_config(void)
  {
 -      if (!strcmp(var, "rerere.enabled"))
 -              rerere_enabled = git_config_bool(var, value);
 -      else if (!strcmp(var, "rerere.autoupdate"))
 -              rerere_autoupdate = git_config_bool(var, value);
 -      else
 -              return git_default_config(var, value, cb);
 -      return 0;
 +      git_config_get_bool("rerere.enabled", &rerere_enabled);
 +      git_config_get_bool("rerere.autoupdate", &rerere_autoupdate);
 +      git_config(git_default_config, NULL);
  }
  
  static int is_rerere_enabled(void)
@@@ -603,7 -602,7 +599,7 @@@ int setup_rerere(struct string_list *me
  {
        int fd;
  
 -      git_config(git_rerere_config, NULL);
 +      git_rerere_config();
        if (!is_rerere_enabled())
                return -1;
  
@@@ -696,6 -695,24 +692,6 @@@ static void unlink_rr_item(const char *
        rmdir(git_path("rr-cache/%s", name));
  }
  
 -struct rerere_gc_config_cb {
 -      int cutoff_noresolve;
 -      int cutoff_resolve;
 -};
 -
 -static int git_rerere_gc_config(const char *var, const char *value, void *cb)
 -{
 -      struct rerere_gc_config_cb *cf = cb;
 -
 -      if (!strcmp(var, "gc.rerereresolved"))
 -              cf->cutoff_resolve = git_config_int(var, value);
 -      else if (!strcmp(var, "gc.rerereunresolved"))
 -              cf->cutoff_noresolve = git_config_int(var, value);
 -      else
 -              return git_default_config(var, value, cb);
 -      return 0;
 -}
 -
  void rerere_gc(struct string_list *rr)
  {
        struct string_list to_remove = STRING_LIST_INIT_DUP;
        struct dirent *e;
        int i, cutoff;
        time_t now = time(NULL), then;
 -      struct rerere_gc_config_cb cf = { 15, 60 };
 +      int cutoff_noresolve = 15;
 +      int cutoff_resolve = 60;
  
 -      git_config(git_rerere_gc_config, &cf);
 +      git_config_get_int("gc.rerereresolved", &cutoff_resolve);
 +      git_config_get_int("gc.rerereunresolved", &cutoff_noresolve);
 +      git_config(git_default_config, NULL);
        dir = opendir(git_path("rr-cache"));
        if (!dir)
                die_errno("unable to open rr-cache directory");
  
                then = rerere_last_used_at(e->d_name);
                if (then) {
 -                      cutoff = cf.cutoff_resolve;
 +                      cutoff = cutoff_resolve;
                } else {
                        then = rerere_created_at(e->d_name);
                        if (!then)
                                continue;
 -                      cutoff = cf.cutoff_noresolve;
 +                      cutoff = cutoff_noresolve;
                }
                if (then < now - cutoff * 86400)
                        string_list_append(&to_remove, e->d_name);