rerere.con commit msvc: add a compile-time flag to allow detailed heap debugging (556702f)
   1#include "cache.h"
   2#include "config.h"
   3#include "lockfile.h"
   4#include "string-list.h"
   5#include "rerere.h"
   6#include "xdiff-interface.h"
   7#include "dir.h"
   8#include "resolve-undo.h"
   9#include "ll-merge.h"
  10#include "attr.h"
  11#include "pathspec.h"
  12#include "object-store.h"
  13#include "sha1-lookup.h"
  14
  15#define RESOLVED 0
  16#define PUNTED 1
  17#define THREE_STAGED 2
  18void *RERERE_RESOLVED = &RERERE_RESOLVED;
  19
  20/* if rerere_enabled == -1, fall back to detection of .git/rr-cache */
  21static int rerere_enabled = -1;
  22
  23/* automatically update cleanly resolved paths to the index */
  24static int rerere_autoupdate;
  25
  26static int rerere_dir_nr;
  27static int rerere_dir_alloc;
  28
  29#define RR_HAS_POSTIMAGE 1
  30#define RR_HAS_PREIMAGE 2
  31static struct rerere_dir {
  32        unsigned char hash[GIT_MAX_HEXSZ];
  33        int status_alloc, status_nr;
  34        unsigned char *status;
  35} **rerere_dir;
  36
  37static void free_rerere_dirs(void)
  38{
  39        int i;
  40        for (i = 0; i < rerere_dir_nr; i++) {
  41                free(rerere_dir[i]->status);
  42                free(rerere_dir[i]);
  43        }
  44        FREE_AND_NULL(rerere_dir);
  45        rerere_dir_nr = rerere_dir_alloc = 0;
  46}
  47
  48static void free_rerere_id(struct string_list_item *item)
  49{
  50        free(item->util);
  51}
  52
  53static const char *rerere_id_hex(const struct rerere_id *id)
  54{
  55        return sha1_to_hex(id->collection->hash);
  56}
  57
  58static void fit_variant(struct rerere_dir *rr_dir, int variant)
  59{
  60        variant++;
  61        ALLOC_GROW(rr_dir->status, variant, rr_dir->status_alloc);
  62        if (rr_dir->status_nr < variant) {
  63                memset(rr_dir->status + rr_dir->status_nr,
  64                       '\0', variant - rr_dir->status_nr);
  65                rr_dir->status_nr = variant;
  66        }
  67}
  68
  69static void assign_variant(struct rerere_id *id)
  70{
  71        int variant;
  72        struct rerere_dir *rr_dir = id->collection;
  73
  74        variant = id->variant;
  75        if (variant < 0) {
  76                for (variant = 0; variant < rr_dir->status_nr; variant++)
  77                        if (!rr_dir->status[variant])
  78                                break;
  79        }
  80        fit_variant(rr_dir, variant);
  81        id->variant = variant;
  82}
  83
  84const char *rerere_path(const struct rerere_id *id, const char *file)
  85{
  86        if (!file)
  87                return git_path("rr-cache/%s", rerere_id_hex(id));
  88
  89        if (id->variant <= 0)
  90                return git_path("rr-cache/%s/%s", rerere_id_hex(id), file);
  91
  92        return git_path("rr-cache/%s/%s.%d",
  93                        rerere_id_hex(id), file, id->variant);
  94}
  95
  96static int is_rr_file(const char *name, const char *filename, int *variant)
  97{
  98        const char *suffix;
  99        char *ep;
 100
 101        if (!strcmp(name, filename)) {
 102                *variant = 0;
 103                return 1;
 104        }
 105        if (!skip_prefix(name, filename, &suffix) || *suffix != '.')
 106                return 0;
 107
 108        errno = 0;
 109        *variant = strtol(suffix + 1, &ep, 10);
 110        if (errno || *ep)
 111                return 0;
 112        return 1;
 113}
 114
 115static void scan_rerere_dir(struct rerere_dir *rr_dir)
 116{
 117        struct dirent *de;
 118        DIR *dir = opendir(git_path("rr-cache/%s", sha1_to_hex(rr_dir->hash)));
 119
 120        if (!dir)
 121                return;
 122        while ((de = readdir(dir)) != NULL) {
 123                int variant;
 124
 125                if (is_rr_file(de->d_name, "postimage", &variant)) {
 126                        fit_variant(rr_dir, variant);
 127                        rr_dir->status[variant] |= RR_HAS_POSTIMAGE;
 128                } else if (is_rr_file(de->d_name, "preimage", &variant)) {
 129                        fit_variant(rr_dir, variant);
 130                        rr_dir->status[variant] |= RR_HAS_PREIMAGE;
 131                }
 132        }
 133        closedir(dir);
 134}
 135
 136static const unsigned char *rerere_dir_hash(size_t i, void *table)
 137{
 138        struct rerere_dir **rr_dir = table;
 139        return rr_dir[i]->hash;
 140}
 141
 142static struct rerere_dir *find_rerere_dir(const char *hex)
 143{
 144        unsigned char hash[GIT_MAX_RAWSZ];
 145        struct rerere_dir *rr_dir;
 146        int pos;
 147
 148        if (get_sha1_hex(hex, hash))
 149                return NULL; /* BUG */
 150        pos = sha1_pos(hash, rerere_dir, rerere_dir_nr, rerere_dir_hash);
 151        if (pos < 0) {
 152                rr_dir = xmalloc(sizeof(*rr_dir));
 153                hashcpy(rr_dir->hash, hash);
 154                rr_dir->status = NULL;
 155                rr_dir->status_nr = 0;
 156                rr_dir->status_alloc = 0;
 157                pos = -1 - pos;
 158
 159                /* Make sure the array is big enough ... */
 160                ALLOC_GROW(rerere_dir, rerere_dir_nr + 1, rerere_dir_alloc);
 161                /* ... and add it in. */
 162                rerere_dir_nr++;
 163                MOVE_ARRAY(rerere_dir + pos + 1, rerere_dir + pos,
 164                           rerere_dir_nr - pos - 1);
 165                rerere_dir[pos] = rr_dir;
 166                scan_rerere_dir(rr_dir);
 167        }
 168        return rerere_dir[pos];
 169}
 170
 171static int has_rerere_resolution(const struct rerere_id *id)
 172{
 173        const int both = RR_HAS_POSTIMAGE|RR_HAS_PREIMAGE;
 174        int variant = id->variant;
 175
 176        if (variant < 0)
 177                return 0;
 178        return ((id->collection->status[variant] & both) == both);
 179}
 180
 181static struct rerere_id *new_rerere_id_hex(char *hex)
 182{
 183        struct rerere_id *id = xmalloc(sizeof(*id));
 184        id->collection = find_rerere_dir(hex);
 185        id->variant = -1; /* not known yet */
 186        return id;
 187}
 188
 189static struct rerere_id *new_rerere_id(unsigned char *sha1)
 190{
 191        return new_rerere_id_hex(sha1_to_hex(sha1));
 192}
 193
 194/*
 195 * $GIT_DIR/MERGE_RR file is a collection of records, each of which is
 196 * "conflict ID", a HT and pathname, terminated with a NUL, and is
 197 * used to keep track of the set of paths that "rerere" may need to
 198 * work on (i.e. what is left by the previous invocation of "git
 199 * rerere" during the current conflict resolution session).
 200 */
 201static void read_rr(struct repository *r, struct string_list *rr)
 202{
 203        struct strbuf buf = STRBUF_INIT;
 204        FILE *in = fopen_or_warn(git_path_merge_rr(r), "r");
 205
 206        if (!in)
 207                return;
 208        while (!strbuf_getwholeline(&buf, in, '\0')) {
 209                char *path;
 210                unsigned char hash[GIT_MAX_RAWSZ];
 211                struct rerere_id *id;
 212                int variant;
 213                const unsigned hexsz = the_hash_algo->hexsz;
 214
 215                /* There has to be the hash, tab, path and then NUL */
 216                if (buf.len < hexsz + 2 || get_sha1_hex(buf.buf, hash))
 217                        die(_("corrupt MERGE_RR"));
 218
 219                if (buf.buf[hexsz] != '.') {
 220                        variant = 0;
 221                        path = buf.buf + hexsz;
 222                } else {
 223                        errno = 0;
 224                        variant = strtol(buf.buf + hexsz + 1, &path, 10);
 225                        if (errno)
 226                                die(_("corrupt MERGE_RR"));
 227                }
 228                if (*(path++) != '\t')
 229                        die(_("corrupt MERGE_RR"));
 230                buf.buf[hexsz] = '\0';
 231                id = new_rerere_id_hex(buf.buf);
 232                id->variant = variant;
 233                string_list_insert(rr, path)->util = id;
 234        }
 235        strbuf_release(&buf);
 236        fclose(in);
 237}
 238
 239static struct lock_file write_lock;
 240
 241static int write_rr(struct string_list *rr, int out_fd)
 242{
 243        int i;
 244        for (i = 0; i < rr->nr; i++) {
 245                struct strbuf buf = STRBUF_INIT;
 246                struct rerere_id *id;
 247
 248                assert(rr->items[i].util != RERERE_RESOLVED);
 249
 250                id = rr->items[i].util;
 251                if (!id)
 252                        continue;
 253                assert(id->variant >= 0);
 254                if (0 < id->variant)
 255                        strbuf_addf(&buf, "%s.%d\t%s%c",
 256                                    rerere_id_hex(id), id->variant,
 257                                    rr->items[i].string, 0);
 258                else
 259                        strbuf_addf(&buf, "%s\t%s%c",
 260                                    rerere_id_hex(id),
 261                                    rr->items[i].string, 0);
 262
 263                if (write_in_full(out_fd, buf.buf, buf.len) < 0)
 264                        die(_("unable to write rerere record"));
 265
 266                strbuf_release(&buf);
 267        }
 268        if (commit_lock_file(&write_lock) != 0)
 269                die(_("unable to write rerere record"));
 270        return 0;
 271}
 272
 273/*
 274 * "rerere" interacts with conflicted file contents using this I/O
 275 * abstraction.  It reads a conflicted contents from one place via
 276 * "getline()" method, and optionally can write it out after
 277 * normalizing the conflicted hunks to the "output".  Subclasses of
 278 * rerere_io embed this structure at the beginning of their own
 279 * rerere_io object.
 280 */
 281struct rerere_io {
 282        int (*getline)(struct strbuf *, struct rerere_io *);
 283        FILE *output;
 284        int wrerror;
 285        /* some more stuff */
 286};
 287
 288static void ferr_write(const void *p, size_t count, FILE *fp, int *err)
 289{
 290        if (!count || *err)
 291                return;
 292        if (fwrite(p, count, 1, fp) != 1)
 293                *err = errno;
 294}
 295
 296static inline void ferr_puts(const char *s, FILE *fp, int *err)
 297{
 298        ferr_write(s, strlen(s), fp, err);
 299}
 300
 301static void rerere_io_putstr(const char *str, struct rerere_io *io)
 302{
 303        if (io->output)
 304                ferr_puts(str, io->output, &io->wrerror);
 305}
 306
 307static void rerere_io_putmem(const char *mem, size_t sz, struct rerere_io *io)
 308{
 309        if (io->output)
 310                ferr_write(mem, sz, io->output, &io->wrerror);
 311}
 312
 313/*
 314 * Subclass of rerere_io that reads from an on-disk file
 315 */
 316struct rerere_io_file {
 317        struct rerere_io io;
 318        FILE *input;
 319};
 320
 321/*
 322 * ... and its getline() method implementation
 323 */
 324static int rerere_file_getline(struct strbuf *sb, struct rerere_io *io_)
 325{
 326        struct rerere_io_file *io = (struct rerere_io_file *)io_;
 327        return strbuf_getwholeline(sb, io->input, '\n');
 328}
 329
 330/*
 331 * Require the exact number of conflict marker letters, no more, no
 332 * less, followed by SP or any whitespace
 333 * (including LF).
 334 */
 335static int is_cmarker(char *buf, int marker_char, int marker_size)
 336{
 337        int want_sp;
 338
 339        /*
 340         * The beginning of our version and the end of their version
 341         * always are labeled like "<<<<< ours" or ">>>>> theirs",
 342         * hence we set want_sp for them.  Note that the version from
 343         * the common ancestor in diff3-style output is not always
 344         * labelled (e.g. "||||| common" is often seen but "|||||"
 345         * alone is also valid), so we do not set want_sp.
 346         */
 347        want_sp = (marker_char == '<') || (marker_char == '>');
 348
 349        while (marker_size--)
 350                if (*buf++ != marker_char)
 351                        return 0;
 352        if (want_sp && *buf != ' ')
 353                return 0;
 354        return isspace(*buf);
 355}
 356
 357static void rerere_strbuf_putconflict(struct strbuf *buf, int ch, size_t size)
 358{
 359        strbuf_addchars(buf, ch, size);
 360        strbuf_addch(buf, '\n');
 361}
 362
 363static int handle_conflict(struct strbuf *out, struct rerere_io *io,
 364                           int marker_size, git_hash_ctx *ctx)
 365{
 366        enum {
 367                RR_SIDE_1 = 0, RR_SIDE_2, RR_ORIGINAL
 368        } hunk = RR_SIDE_1;
 369        struct strbuf one = STRBUF_INIT, two = STRBUF_INIT;
 370        struct strbuf buf = STRBUF_INIT, conflict = STRBUF_INIT;
 371        int has_conflicts = -1;
 372
 373        while (!io->getline(&buf, io)) {
 374                if (is_cmarker(buf.buf, '<', marker_size)) {
 375                        if (handle_conflict(&conflict, io, marker_size, NULL) < 0)
 376                                break;
 377                        if (hunk == RR_SIDE_1)
 378                                strbuf_addbuf(&one, &conflict);
 379                        else
 380                                strbuf_addbuf(&two, &conflict);
 381                        strbuf_release(&conflict);
 382                } else if (is_cmarker(buf.buf, '|', marker_size)) {
 383                        if (hunk != RR_SIDE_1)
 384                                break;
 385                        hunk = RR_ORIGINAL;
 386                } else if (is_cmarker(buf.buf, '=', marker_size)) {
 387                        if (hunk != RR_SIDE_1 && hunk != RR_ORIGINAL)
 388                                break;
 389                        hunk = RR_SIDE_2;
 390                } else if (is_cmarker(buf.buf, '>', marker_size)) {
 391                        if (hunk != RR_SIDE_2)
 392                                break;
 393                        if (strbuf_cmp(&one, &two) > 0)
 394                                strbuf_swap(&one, &two);
 395                        has_conflicts = 1;
 396                        rerere_strbuf_putconflict(out, '<', marker_size);
 397                        strbuf_addbuf(out, &one);
 398                        rerere_strbuf_putconflict(out, '=', marker_size);
 399                        strbuf_addbuf(out, &two);
 400                        rerere_strbuf_putconflict(out, '>', marker_size);
 401                        if (ctx) {
 402                                the_hash_algo->update_fn(ctx, one.buf ?
 403                                                         one.buf : "",
 404                                                         one.len + 1);
 405                                the_hash_algo->update_fn(ctx, two.buf ?
 406                                                         two.buf : "",
 407                                                         two.len + 1);
 408                        }
 409                        break;
 410                } else if (hunk == RR_SIDE_1)
 411                        strbuf_addbuf(&one, &buf);
 412                else if (hunk == RR_ORIGINAL)
 413                        ; /* discard */
 414                else if (hunk == RR_SIDE_2)
 415                        strbuf_addbuf(&two, &buf);
 416        }
 417        strbuf_release(&one);
 418        strbuf_release(&two);
 419        strbuf_release(&buf);
 420
 421        return has_conflicts;
 422}
 423
 424/*
 425 * Read contents a file with conflicts, normalize the conflicts
 426 * by (1) discarding the common ancestor version in diff3-style,
 427 * (2) reordering our side and their side so that whichever sorts
 428 * alphabetically earlier comes before the other one, while
 429 * computing the "conflict ID", which is just an SHA-1 hash of
 430 * one side of the conflict, NUL, the other side of the conflict,
 431 * and NUL concatenated together.
 432 *
 433 * Return 1 if conflict hunks are found, 0 if there are no conflict
 434 * hunks and -1 if an error occured.
 435 */
 436static int handle_path(unsigned char *hash, struct rerere_io *io, int marker_size)
 437{
 438        git_hash_ctx ctx;
 439        struct strbuf buf = STRBUF_INIT, out = STRBUF_INIT;
 440        int has_conflicts = 0;
 441        if (hash)
 442                the_hash_algo->init_fn(&ctx);
 443
 444        while (!io->getline(&buf, io)) {
 445                if (is_cmarker(buf.buf, '<', marker_size)) {
 446                        has_conflicts = handle_conflict(&out, io, marker_size,
 447                                                        hash ? &ctx : NULL);
 448                        if (has_conflicts < 0)
 449                                break;
 450                        rerere_io_putmem(out.buf, out.len, io);
 451                        strbuf_reset(&out);
 452                } else
 453                        rerere_io_putstr(buf.buf, io);
 454        }
 455        strbuf_release(&buf);
 456        strbuf_release(&out);
 457
 458        if (hash)
 459                the_hash_algo->final_fn(hash, &ctx);
 460
 461        return has_conflicts;
 462}
 463
 464/*
 465 * Scan the path for conflicts, do the "handle_path()" thing above, and
 466 * return the number of conflict hunks found.
 467 */
 468static int handle_file(struct index_state *istate,
 469                       const char *path, unsigned char *hash, const char *output)
 470{
 471        int has_conflicts = 0;
 472        struct rerere_io_file io;
 473        int marker_size = ll_merge_marker_size(istate, path);
 474
 475        memset(&io, 0, sizeof(io));
 476        io.io.getline = rerere_file_getline;
 477        io.input = fopen(path, "r");
 478        io.io.wrerror = 0;
 479        if (!io.input)
 480                return error_errno(_("could not open '%s'"), path);
 481
 482        if (output) {
 483                io.io.output = fopen(output, "w");
 484                if (!io.io.output) {
 485                        error_errno(_("could not write '%s'"), output);
 486                        fclose(io.input);
 487                        return -1;
 488                }
 489        }
 490
 491        has_conflicts = handle_path(hash, (struct rerere_io *)&io, marker_size);
 492
 493        fclose(io.input);
 494        if (io.io.wrerror)
 495                error(_("there were errors while writing '%s' (%s)"),
 496                      path, strerror(io.io.wrerror));
 497        if (io.io.output && fclose(io.io.output))
 498                io.io.wrerror = error_errno(_("failed to flush '%s'"), path);
 499
 500        if (has_conflicts < 0) {
 501                if (output)
 502                        unlink_or_warn(output);
 503                return error(_("could not parse conflict hunks in '%s'"), path);
 504        }
 505        if (io.io.wrerror)
 506                return -1;
 507        return has_conflicts;
 508}
 509
 510/*
 511 * Look at a cache entry at "i" and see if it is not conflicting,
 512 * conflicting and we are willing to handle, or conflicting and
 513 * we are unable to handle, and return the determination in *type.
 514 * Return the cache index to be looked at next, by skipping the
 515 * stages we have already looked at in this invocation of this
 516 * function.
 517 */
 518static int check_one_conflict(struct index_state *istate, int i, int *type)
 519{
 520        const struct cache_entry *e = istate->cache[i];
 521
 522        if (!ce_stage(e)) {
 523                *type = RESOLVED;
 524                return i + 1;
 525        }
 526
 527        *type = PUNTED;
 528        while (i < istate->cache_nr && ce_stage(istate->cache[i]) == 1)
 529                i++;
 530
 531        /* Only handle regular files with both stages #2 and #3 */
 532        if (i + 1 < istate->cache_nr) {
 533                const struct cache_entry *e2 = istate->cache[i];
 534                const struct cache_entry *e3 = istate->cache[i + 1];
 535                if (ce_stage(e2) == 2 &&
 536                    ce_stage(e3) == 3 &&
 537                    ce_same_name(e, e3) &&
 538                    S_ISREG(e2->ce_mode) &&
 539                    S_ISREG(e3->ce_mode))
 540                        *type = THREE_STAGED;
 541        }
 542
 543        /* Skip the entries with the same name */
 544        while (i < istate->cache_nr && ce_same_name(e, istate->cache[i]))
 545                i++;
 546        return i;
 547}
 548
 549/*
 550 * Scan the index and find paths that have conflicts that rerere can
 551 * handle, i.e. the ones that has both stages #2 and #3.
 552 *
 553 * NEEDSWORK: we do not record or replay a previous "resolve by
 554 * deletion" for a delete-modify conflict, as that is inherently risky
 555 * without knowing what modification is being discarded.  The only
 556 * safe case, i.e. both side doing the deletion and modification that
 557 * are identical to the previous round, might want to be handled,
 558 * though.
 559 */
 560static int find_conflict(struct repository *r, struct string_list *conflict)
 561{
 562        int i;
 563
 564        if (repo_read_index(r) < 0)
 565                return error(_("index file corrupt"));
 566
 567        for (i = 0; i < r->index->cache_nr;) {
 568                int conflict_type;
 569                const struct cache_entry *e = r->index->cache[i];
 570                i = check_one_conflict(r->index, i, &conflict_type);
 571                if (conflict_type == THREE_STAGED)
 572                        string_list_insert(conflict, (const char *)e->name);
 573        }
 574        return 0;
 575}
 576
 577/*
 578 * The merge_rr list is meant to hold outstanding conflicted paths
 579 * that rerere could handle.  Abuse the list by adding other types of
 580 * entries to allow the caller to show "rerere remaining".
 581 *
 582 * - Conflicted paths that rerere does not handle are added
 583 * - Conflicted paths that have been resolved are marked as such
 584 *   by storing RERERE_RESOLVED to .util field (where conflict ID
 585 *   is expected to be stored).
 586 *
 587 * Do *not* write MERGE_RR file out after calling this function.
 588 *
 589 * NEEDSWORK: we may want to fix the caller that implements "rerere
 590 * remaining" to do this without abusing merge_rr.
 591 */
 592int rerere_remaining(struct repository *r, struct string_list *merge_rr)
 593{
 594        int i;
 595
 596        if (setup_rerere(r, merge_rr, RERERE_READONLY))
 597                return 0;
 598        if (repo_read_index(r) < 0)
 599                return error(_("index file corrupt"));
 600
 601        for (i = 0; i < r->index->cache_nr;) {
 602                int conflict_type;
 603                const struct cache_entry *e = r->index->cache[i];
 604                i = check_one_conflict(r->index, i, &conflict_type);
 605                if (conflict_type == PUNTED)
 606                        string_list_insert(merge_rr, (const char *)e->name);
 607                else if (conflict_type == RESOLVED) {
 608                        struct string_list_item *it;
 609                        it = string_list_lookup(merge_rr, (const char *)e->name);
 610                        if (it != NULL) {
 611                                free_rerere_id(it);
 612                                it->util = RERERE_RESOLVED;
 613                        }
 614                }
 615        }
 616        return 0;
 617}
 618
 619/*
 620 * Try using the given conflict resolution "ID" to see
 621 * if that recorded conflict resolves cleanly what we
 622 * got in the "cur".
 623 */
 624static int try_merge(struct index_state *istate,
 625                     const struct rerere_id *id, const char *path,
 626                     mmfile_t *cur, mmbuffer_t *result)
 627{
 628        int ret;
 629        mmfile_t base = {NULL, 0}, other = {NULL, 0};
 630
 631        if (read_mmfile(&base, rerere_path(id, "preimage")) ||
 632            read_mmfile(&other, rerere_path(id, "postimage")))
 633                ret = 1;
 634        else
 635                /*
 636                 * A three-way merge. Note that this honors user-customizable
 637                 * low-level merge driver settings.
 638                 */
 639                ret = ll_merge(result, path, &base, NULL, cur, "", &other, "",
 640                               istate, NULL);
 641
 642        free(base.ptr);
 643        free(other.ptr);
 644
 645        return ret;
 646}
 647
 648/*
 649 * Find the conflict identified by "id"; the change between its
 650 * "preimage" (i.e. a previous contents with conflict markers) and its
 651 * "postimage" (i.e. the corresponding contents with conflicts
 652 * resolved) may apply cleanly to the contents stored in "path", i.e.
 653 * the conflict this time around.
 654 *
 655 * Returns 0 for successful replay of recorded resolution, or non-zero
 656 * for failure.
 657 */
 658static int merge(struct index_state *istate, const struct rerere_id *id, const char *path)
 659{
 660        FILE *f;
 661        int ret;
 662        mmfile_t cur = {NULL, 0};
 663        mmbuffer_t result = {NULL, 0};
 664
 665        /*
 666         * Normalize the conflicts in path and write it out to
 667         * "thisimage" temporary file.
 668         */
 669        if ((handle_file(istate, path, NULL, rerere_path(id, "thisimage")) < 0) ||
 670            read_mmfile(&cur, rerere_path(id, "thisimage"))) {
 671                ret = 1;
 672                goto out;
 673        }
 674
 675        ret = try_merge(istate, id, path, &cur, &result);
 676        if (ret)
 677                goto out;
 678
 679        /*
 680         * A successful replay of recorded resolution.
 681         * Mark that "postimage" was used to help gc.
 682         */
 683        if (utime(rerere_path(id, "postimage"), NULL) < 0)
 684                warning_errno(_("failed utime() on '%s'"),
 685                              rerere_path(id, "postimage"));
 686
 687        /* Update "path" with the resolution */
 688        f = fopen(path, "w");
 689        if (!f)
 690                return error_errno(_("could not open '%s'"), path);
 691        if (fwrite(result.ptr, result.size, 1, f) != 1)
 692                error_errno(_("could not write '%s'"), path);
 693        if (fclose(f))
 694                return error_errno(_("writing '%s' failed"), path);
 695
 696out:
 697        free(cur.ptr);
 698        free(result.ptr);
 699
 700        return ret;
 701}
 702
 703static void update_paths(struct repository *r, struct string_list *update)
 704{
 705        struct lock_file index_lock = LOCK_INIT;
 706        int i;
 707
 708        repo_hold_locked_index(r, &index_lock, LOCK_DIE_ON_ERROR);
 709
 710        for (i = 0; i < update->nr; i++) {
 711                struct string_list_item *item = &update->items[i];
 712                if (add_file_to_index(r->index, item->string, 0))
 713                        exit(128);
 714                fprintf_ln(stderr, _("Staged '%s' using previous resolution."),
 715                        item->string);
 716        }
 717
 718        if (write_locked_index(r->index, &index_lock,
 719                               COMMIT_LOCK | SKIP_IF_UNCHANGED))
 720                die(_("unable to write new index file"));
 721}
 722
 723static void remove_variant(struct rerere_id *id)
 724{
 725        unlink_or_warn(rerere_path(id, "postimage"));
 726        unlink_or_warn(rerere_path(id, "preimage"));
 727        id->collection->status[id->variant] = 0;
 728}
 729
 730/*
 731 * The path indicated by rr_item may still have conflict for which we
 732 * have a recorded resolution, in which case replay it and optionally
 733 * update it.  Or it may have been resolved by the user and we may
 734 * only have the preimage for that conflict, in which case the result
 735 * needs to be recorded as a resolution in a postimage file.
 736 */
 737static void do_rerere_one_path(struct index_state *istate,
 738                               struct string_list_item *rr_item,
 739                               struct string_list *update)
 740{
 741        const char *path = rr_item->string;
 742        struct rerere_id *id = rr_item->util;
 743        struct rerere_dir *rr_dir = id->collection;
 744        int variant;
 745
 746        variant = id->variant;
 747
 748        /* Has the user resolved it already? */
 749        if (variant >= 0) {
 750                if (!handle_file(istate, path, NULL, NULL)) {
 751                        copy_file(rerere_path(id, "postimage"), path, 0666);
 752                        id->collection->status[variant] |= RR_HAS_POSTIMAGE;
 753                        fprintf_ln(stderr, _("Recorded resolution for '%s'."), path);
 754                        free_rerere_id(rr_item);
 755                        rr_item->util = NULL;
 756                        return;
 757                }
 758                /*
 759                 * There may be other variants that can cleanly
 760                 * replay.  Try them and update the variant number for
 761                 * this one.
 762                 */
 763        }
 764
 765        /* Does any existing resolution apply cleanly? */
 766        for (variant = 0; variant < rr_dir->status_nr; variant++) {
 767                const int both = RR_HAS_PREIMAGE | RR_HAS_POSTIMAGE;
 768                struct rerere_id vid = *id;
 769
 770                if ((rr_dir->status[variant] & both) != both)
 771                        continue;
 772
 773                vid.variant = variant;
 774                if (merge(istate, &vid, path))
 775                        continue; /* failed to replay */
 776
 777                /*
 778                 * If there already is a different variant that applies
 779                 * cleanly, there is no point maintaining our own variant.
 780                 */
 781                if (0 <= id->variant && id->variant != variant)
 782                        remove_variant(id);
 783
 784                if (rerere_autoupdate)
 785                        string_list_insert(update, path);
 786                else
 787                        fprintf_ln(stderr,
 788                                   _("Resolved '%s' using previous resolution."),
 789                                   path);
 790                free_rerere_id(rr_item);
 791                rr_item->util = NULL;
 792                return;
 793        }
 794
 795        /* None of the existing one applies; we need a new variant */
 796        assign_variant(id);
 797
 798        variant = id->variant;
 799        handle_file(istate, path, NULL, rerere_path(id, "preimage"));
 800        if (id->collection->status[variant] & RR_HAS_POSTIMAGE) {
 801                const char *path = rerere_path(id, "postimage");
 802                if (unlink(path))
 803                        die_errno(_("cannot unlink stray '%s'"), path);
 804                id->collection->status[variant] &= ~RR_HAS_POSTIMAGE;
 805        }
 806        id->collection->status[variant] |= RR_HAS_PREIMAGE;
 807        fprintf_ln(stderr, _("Recorded preimage for '%s'"), path);
 808}
 809
 810static int do_plain_rerere(struct repository *r,
 811                           struct string_list *rr, int fd)
 812{
 813        struct string_list conflict = STRING_LIST_INIT_DUP;
 814        struct string_list update = STRING_LIST_INIT_DUP;
 815        int i;
 816
 817        find_conflict(r, &conflict);
 818
 819        /*
 820         * MERGE_RR records paths with conflicts immediately after
 821         * merge failed.  Some of the conflicted paths might have been
 822         * hand resolved in the working tree since then, but the
 823         * initial run would catch all and register their preimages.
 824         */
 825        for (i = 0; i < conflict.nr; i++) {
 826                struct rerere_id *id;
 827                unsigned char hash[GIT_MAX_RAWSZ];
 828                const char *path = conflict.items[i].string;
 829                int ret;
 830
 831                /*
 832                 * Ask handle_file() to scan and assign a
 833                 * conflict ID.  No need to write anything out
 834                 * yet.
 835                 */
 836                ret = handle_file(r->index, path, hash, NULL);
 837                if (ret != 0 && string_list_has_string(rr, path)) {
 838                        remove_variant(string_list_lookup(rr, path)->util);
 839                        string_list_remove(rr, path, 1);
 840                }
 841                if (ret < 1)
 842                        continue;
 843
 844                id = new_rerere_id(hash);
 845                string_list_insert(rr, path)->util = id;
 846
 847                /* Ensure that the directory exists. */
 848                mkdir_in_gitdir(rerere_path(id, NULL));
 849        }
 850
 851        for (i = 0; i < rr->nr; i++)
 852                do_rerere_one_path(r->index, &rr->items[i], &update);
 853
 854        if (update.nr)
 855                update_paths(r, &update);
 856
 857        return write_rr(rr, fd);
 858}
 859
 860static void git_rerere_config(void)
 861{
 862        git_config_get_bool("rerere.enabled", &rerere_enabled);
 863        git_config_get_bool("rerere.autoupdate", &rerere_autoupdate);
 864        git_config(git_default_config, NULL);
 865}
 866
 867static GIT_PATH_FUNC(git_path_rr_cache, "rr-cache")
 868
 869static int is_rerere_enabled(void)
 870{
 871        int rr_cache_exists;
 872
 873        if (!rerere_enabled)
 874                return 0;
 875
 876        rr_cache_exists = is_directory(git_path_rr_cache());
 877        if (rerere_enabled < 0)
 878                return rr_cache_exists;
 879
 880        if (!rr_cache_exists && mkdir_in_gitdir(git_path_rr_cache()))
 881                die(_("could not create directory '%s'"), git_path_rr_cache());
 882        return 1;
 883}
 884
 885int setup_rerere(struct repository *r, struct string_list *merge_rr, int flags)
 886{
 887        int fd;
 888
 889        git_rerere_config();
 890        if (!is_rerere_enabled())
 891                return -1;
 892
 893        if (flags & (RERERE_AUTOUPDATE|RERERE_NOAUTOUPDATE))
 894                rerere_autoupdate = !!(flags & RERERE_AUTOUPDATE);
 895        if (flags & RERERE_READONLY)
 896                fd = 0;
 897        else
 898                fd = hold_lock_file_for_update(&write_lock,
 899                                               git_path_merge_rr(r),
 900                                               LOCK_DIE_ON_ERROR);
 901        read_rr(r, merge_rr);
 902        return fd;
 903}
 904
 905/*
 906 * The main entry point that is called internally from codepaths that
 907 * perform mergy operations, possibly leaving conflicted index entries
 908 * and working tree files.
 909 */
 910int repo_rerere(struct repository *r, int flags)
 911{
 912        struct string_list merge_rr = STRING_LIST_INIT_DUP;
 913        int fd, status;
 914
 915        fd = setup_rerere(r, &merge_rr, flags);
 916        if (fd < 0)
 917                return 0;
 918        status = do_plain_rerere(r, &merge_rr, fd);
 919        free_rerere_dirs();
 920        return status;
 921}
 922
 923/*
 924 * Subclass of rerere_io that reads from an in-core buffer that is a
 925 * strbuf
 926 */
 927struct rerere_io_mem {
 928        struct rerere_io io;
 929        struct strbuf input;
 930};
 931
 932/*
 933 * ... and its getline() method implementation
 934 */
 935static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
 936{
 937        struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
 938        char *ep;
 939        size_t len;
 940
 941        strbuf_release(sb);
 942        if (!io->input.len)
 943                return -1;
 944        ep = memchr(io->input.buf, '\n', io->input.len);
 945        if (!ep)
 946                ep = io->input.buf + io->input.len;
 947        else if (*ep == '\n')
 948                ep++;
 949        len = ep - io->input.buf;
 950        strbuf_add(sb, io->input.buf, len);
 951        strbuf_remove(&io->input, 0, len);
 952        return 0;
 953}
 954
 955static int handle_cache(struct index_state *istate,
 956                        const char *path, unsigned char *hash, const char *output)
 957{
 958        mmfile_t mmfile[3] = {{NULL}};
 959        mmbuffer_t result = {NULL, 0};
 960        const struct cache_entry *ce;
 961        int pos, len, i, has_conflicts;
 962        struct rerere_io_mem io;
 963        int marker_size = ll_merge_marker_size(istate, path);
 964
 965        /*
 966         * Reproduce the conflicted merge in-core
 967         */
 968        len = strlen(path);
 969        pos = index_name_pos(istate, path, len);
 970        if (0 <= pos)
 971                return -1;
 972        pos = -pos - 1;
 973
 974        while (pos < istate->cache_nr) {
 975                enum object_type type;
 976                unsigned long size;
 977
 978                ce = istate->cache[pos++];
 979                if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
 980                        break;
 981                i = ce_stage(ce) - 1;
 982                if (!mmfile[i].ptr) {
 983                        mmfile[i].ptr = read_object_file(&ce->oid, &type,
 984                                                         &size);
 985                        mmfile[i].size = size;
 986                }
 987        }
 988        for (i = 0; i < 3; i++)
 989                if (!mmfile[i].ptr && !mmfile[i].size)
 990                        mmfile[i].ptr = xstrdup("");
 991
 992        /*
 993         * NEEDSWORK: handle conflicts from merges with
 994         * merge.renormalize set, too?
 995         */
 996        ll_merge(&result, path, &mmfile[0], NULL,
 997                 &mmfile[1], "ours",
 998                 &mmfile[2], "theirs",
 999                 istate, NULL);
1000        for (i = 0; i < 3; i++)
1001                free(mmfile[i].ptr);
1002
1003        memset(&io, 0, sizeof(io));
1004        io.io.getline = rerere_mem_getline;
1005        if (output)
1006                io.io.output = fopen(output, "w");
1007        else
1008                io.io.output = NULL;
1009        strbuf_init(&io.input, 0);
1010        strbuf_attach(&io.input, result.ptr, result.size, result.size);
1011
1012        /*
1013         * Grab the conflict ID and optionally write the original
1014         * contents with conflict markers out.
1015         */
1016        has_conflicts = handle_path(hash, (struct rerere_io *)&io, marker_size);
1017        strbuf_release(&io.input);
1018        if (io.io.output)
1019                fclose(io.io.output);
1020        return has_conflicts;
1021}
1022
1023static int rerere_forget_one_path(struct index_state *istate,
1024                                  const char *path,
1025                                  struct string_list *rr)
1026{
1027        const char *filename;
1028        struct rerere_id *id;
1029        unsigned char hash[GIT_MAX_RAWSZ];
1030        int ret;
1031        struct string_list_item *item;
1032
1033        /*
1034         * Recreate the original conflict from the stages in the
1035         * index and compute the conflict ID
1036         */
1037        ret = handle_cache(istate, path, hash, NULL);
1038        if (ret < 1)
1039                return error(_("could not parse conflict hunks in '%s'"), path);
1040
1041        /* Nuke the recorded resolution for the conflict */
1042        id = new_rerere_id(hash);
1043
1044        for (id->variant = 0;
1045             id->variant < id->collection->status_nr;
1046             id->variant++) {
1047                mmfile_t cur = { NULL, 0 };
1048                mmbuffer_t result = {NULL, 0};
1049                int cleanly_resolved;
1050
1051                if (!has_rerere_resolution(id))
1052                        continue;
1053
1054                handle_cache(istate, path, hash, rerere_path(id, "thisimage"));
1055                if (read_mmfile(&cur, rerere_path(id, "thisimage"))) {
1056                        free(cur.ptr);
1057                        error(_("failed to update conflicted state in '%s'"), path);
1058                        goto fail_exit;
1059                }
1060                cleanly_resolved = !try_merge(istate, id, path, &cur, &result);
1061                free(result.ptr);
1062                free(cur.ptr);
1063                if (cleanly_resolved)
1064                        break;
1065        }
1066
1067        if (id->collection->status_nr <= id->variant) {
1068                error(_("no remembered resolution for '%s'"), path);
1069                goto fail_exit;
1070        }
1071
1072        filename = rerere_path(id, "postimage");
1073        if (unlink(filename)) {
1074                if (errno == ENOENT)
1075                        error(_("no remembered resolution for '%s'"), path);
1076                else
1077                        error_errno(_("cannot unlink '%s'"), filename);
1078                goto fail_exit;
1079        }
1080
1081        /*
1082         * Update the preimage so that the user can resolve the
1083         * conflict in the working tree, run us again to record
1084         * the postimage.
1085         */
1086        handle_cache(istate, path, hash, rerere_path(id, "preimage"));
1087        fprintf_ln(stderr, _("Updated preimage for '%s'"), path);
1088
1089        /*
1090         * And remember that we can record resolution for this
1091         * conflict when the user is done.
1092         */
1093        item = string_list_insert(rr, path);
1094        free_rerere_id(item);
1095        item->util = id;
1096        fprintf(stderr, _("Forgot resolution for '%s'\n"), path);
1097        return 0;
1098
1099fail_exit:
1100        free(id);
1101        return -1;
1102}
1103
1104int rerere_forget(struct repository *r, struct pathspec *pathspec)
1105{
1106        int i, fd;
1107        struct string_list conflict = STRING_LIST_INIT_DUP;
1108        struct string_list merge_rr = STRING_LIST_INIT_DUP;
1109
1110        if (repo_read_index(r) < 0)
1111                return error(_("index file corrupt"));
1112
1113        fd = setup_rerere(r, &merge_rr, RERERE_NOAUTOUPDATE);
1114        if (fd < 0)
1115                return 0;
1116
1117        /*
1118         * The paths may have been resolved (incorrectly);
1119         * recover the original conflicted state and then
1120         * find the conflicted paths.
1121         */
1122        unmerge_index(r->index, pathspec);
1123        find_conflict(r, &conflict);
1124        for (i = 0; i < conflict.nr; i++) {
1125                struct string_list_item *it = &conflict.items[i];
1126                if (!match_pathspec(r->index, pathspec, it->string,
1127                                    strlen(it->string), 0, NULL, 0))
1128                        continue;
1129                rerere_forget_one_path(r->index, it->string, &merge_rr);
1130        }
1131        return write_rr(&merge_rr, fd);
1132}
1133
1134/*
1135 * Garbage collection support
1136 */
1137
1138static timestamp_t rerere_created_at(struct rerere_id *id)
1139{
1140        struct stat st;
1141
1142        return stat(rerere_path(id, "preimage"), &st) ? (time_t) 0 : st.st_mtime;
1143}
1144
1145static timestamp_t rerere_last_used_at(struct rerere_id *id)
1146{
1147        struct stat st;
1148
1149        return stat(rerere_path(id, "postimage"), &st) ? (time_t) 0 : st.st_mtime;
1150}
1151
1152/*
1153 * Remove the recorded resolution for a given conflict ID
1154 */
1155static void unlink_rr_item(struct rerere_id *id)
1156{
1157        unlink_or_warn(rerere_path(id, "thisimage"));
1158        remove_variant(id);
1159        id->collection->status[id->variant] = 0;
1160}
1161
1162static void prune_one(struct rerere_id *id,
1163                      timestamp_t cutoff_resolve, timestamp_t cutoff_noresolve)
1164{
1165        timestamp_t then;
1166        timestamp_t cutoff;
1167
1168        then = rerere_last_used_at(id);
1169        if (then)
1170                cutoff = cutoff_resolve;
1171        else {
1172                then = rerere_created_at(id);
1173                if (!then)
1174                        return;
1175                cutoff = cutoff_noresolve;
1176        }
1177        if (then < cutoff)
1178                unlink_rr_item(id);
1179}
1180
1181void rerere_gc(struct repository *r, struct string_list *rr)
1182{
1183        struct string_list to_remove = STRING_LIST_INIT_DUP;
1184        DIR *dir;
1185        struct dirent *e;
1186        int i;
1187        timestamp_t now = time(NULL);
1188        timestamp_t cutoff_noresolve = now - 15 * 86400;
1189        timestamp_t cutoff_resolve = now - 60 * 86400;
1190
1191        if (setup_rerere(r, rr, 0) < 0)
1192                return;
1193
1194        git_config_get_expiry_in_days("gc.rerereresolved", &cutoff_resolve, now);
1195        git_config_get_expiry_in_days("gc.rerereunresolved", &cutoff_noresolve, now);
1196        git_config(git_default_config, NULL);
1197        dir = opendir(git_path("rr-cache"));
1198        if (!dir)
1199                die_errno(_("unable to open rr-cache directory"));
1200        /* Collect stale conflict IDs ... */
1201        while ((e = readdir(dir))) {
1202                struct rerere_dir *rr_dir;
1203                struct rerere_id id;
1204                int now_empty;
1205
1206                if (is_dot_or_dotdot(e->d_name))
1207                        continue;
1208                rr_dir = find_rerere_dir(e->d_name);
1209                if (!rr_dir)
1210                        continue; /* or should we remove e->d_name? */
1211
1212                now_empty = 1;
1213                for (id.variant = 0, id.collection = rr_dir;
1214                     id.variant < id.collection->status_nr;
1215                     id.variant++) {
1216                        prune_one(&id, cutoff_resolve, cutoff_noresolve);
1217                        if (id.collection->status[id.variant])
1218                                now_empty = 0;
1219                }
1220                if (now_empty)
1221                        string_list_append(&to_remove, e->d_name);
1222        }
1223        closedir(dir);
1224
1225        /* ... and then remove the empty directories */
1226        for (i = 0; i < to_remove.nr; i++)
1227                rmdir(git_path("rr-cache/%s", to_remove.items[i].string));
1228        string_list_clear(&to_remove, 0);
1229        rollback_lock_file(&write_lock);
1230}
1231
1232/*
1233 * During a conflict resolution, after "rerere" recorded the
1234 * preimages, abandon them if the user did not resolve them or
1235 * record their resolutions.  And drop $GIT_DIR/MERGE_RR.
1236 *
1237 * NEEDSWORK: shouldn't we be calling this from "reset --hard"?
1238 */
1239void rerere_clear(struct repository *r, struct string_list *merge_rr)
1240{
1241        int i;
1242
1243        if (setup_rerere(r, merge_rr, 0) < 0)
1244                return;
1245
1246        for (i = 0; i < merge_rr->nr; i++) {
1247                struct rerere_id *id = merge_rr->items[i].util;
1248                if (!has_rerere_resolution(id)) {
1249                        unlink_rr_item(id);
1250                        rmdir(rerere_path(id, NULL));
1251                }
1252        }
1253        unlink_or_warn(git_path_merge_rr(r));
1254        rollback_lock_file(&write_lock);
1255}