rerere: move code related to "forget" together

"rerere forget" is the only user of handle_cache() helper, which in turn is the only user of rerere_io that reads from an in-core buffer whose getline method is implemented as rerere_mem_getline(). Gather them together. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Mar 14, 2016 at 15:10 UTC 3d730ed9b21b5397be7fa5bf89298122980b0f58
1 file changed +97 -97
rerere.c
+97 -97
@@ -516,103 +516,6 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output
516 return hunk_no;
517 }
518
519 -/*
520 - * Subclass of rerere_io that reads from an in-core buffer that is a
521 - * strbuf
522 - */
523 -struct rerere_io_mem {
524 - struct rerere_io io;
525 - struct strbuf input;
526 -};
527 -
528 -/*
529 - * ... and its getline() method implementation
530 - */
531 -static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
532 -{
533 - struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
534 - char *ep;
535 - size_t len;
536 -
537 - strbuf_release(sb);
538 - if (!io->input.len)
539 - return -1;
540 - ep = memchr(io->input.buf, '\n', io->input.len);
541 - if (!ep)
542 - ep = io->input.buf + io->input.len;
543 - else if (*ep == '\n')
544 - ep++;
545 - len = ep - io->input.buf;
546 - strbuf_add(sb, io->input.buf, len);
547 - strbuf_remove(&io->input, 0, len);
548 - return 0;
549 -}
550 -
551 -static int handle_cache(const char *path, unsigned char *sha1, const char *output)
552 -{
553 - mmfile_t mmfile[3] = {{NULL}};
554 - mmbuffer_t result = {NULL, 0};
555 - const struct cache_entry *ce;
556 - int pos, len, i, hunk_no;
557 - struct rerere_io_mem io;
558 - int marker_size = ll_merge_marker_size(path);
559 -
560 - /*
561 - * Reproduce the conflicted merge in-core
562 - */
563 - len = strlen(path);
564 - pos = cache_name_pos(path, len);
565 - if (0 <= pos)
566 - return -1;
567 - pos = -pos - 1;
568 -
569 - while (pos < active_nr) {
570 - enum object_type type;
571 - unsigned long size;
572 -
573 - ce = active_cache[pos++];
574 - if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
575 - break;
576 - i = ce_stage(ce) - 1;
577 - if (!mmfile[i].ptr) {
578 - mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
579 - mmfile[i].size = size;
580 - }
581 - }
582 - for (i = 0; i < 3; i++)
583 - if (!mmfile[i].ptr && !mmfile[i].size)
584 - mmfile[i].ptr = xstrdup("");
585 -
586 - /*
587 - * NEEDSWORK: handle conflicts from merges with
588 - * merge.renormalize set, too
589 - */
590 - ll_merge(&result, path, &mmfile[0], NULL,
591 - &mmfile[1], "ours",
592 - &mmfile[2], "theirs", NULL);
593 - for (i = 0; i < 3; i++)
594 - free(mmfile[i].ptr);
595 -
596 - memset(&io, 0, sizeof(io));
597 - io.io.getline = rerere_mem_getline;
598 - if (output)
599 - io.io.output = fopen(output, "w");
600 - else
601 - io.io.output = NULL;
602 - strbuf_init(&io.input, 0);
603 - strbuf_attach(&io.input, result.ptr, result.size, result.size);
604 -
605 - /*
606 - * Grab the conflict ID and optionally write the original
607 - * contents with conflict markers out.
608 - */
609 - hunk_no = handle_path(sha1, (struct rerere_io *)&io, marker_size);
610 - strbuf_release(&io.input);
611 - if (io.io.output)
612 - fclose(io.io.output);
613 - return hunk_no;
614 -}
615 -
519 /*
520 * Look at a cache entry at "i" and see if it is not conflicting,
521 * conflicting and we are willing to handle, or conflicting and
@@ -1005,6 +908,103 @@ int rerere(int flags)
908 return status;
909 }
910
911 +/*
912 + * Subclass of rerere_io that reads from an in-core buffer that is a
913 + * strbuf
914 + */
915 +struct rerere_io_mem {
916 + struct rerere_io io;
917 + struct strbuf input;
918 +};
919 +
920 +/*
921 + * ... and its getline() method implementation
922 + */
923 +static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
924 +{
925 + struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
926 + char *ep;
927 + size_t len;
928 +
929 + strbuf_release(sb);
930 + if (!io->input.len)
931 + return -1;
932 + ep = memchr(io->input.buf, '\n', io->input.len);
933 + if (!ep)
934 + ep = io->input.buf + io->input.len;
935 + else if (*ep == '\n')
936 + ep++;
937 + len = ep - io->input.buf;
938 + strbuf_add(sb, io->input.buf, len);
939 + strbuf_remove(&io->input, 0, len);
940 + return 0;
941 +}
942 +
943 +static int handle_cache(const char *path, unsigned char *sha1, const char *output)
944 +{
945 + mmfile_t mmfile[3] = {{NULL}};
946 + mmbuffer_t result = {NULL, 0};
947 + const struct cache_entry *ce;
948 + int pos, len, i, hunk_no;
949 + struct rerere_io_mem io;
950 + int marker_size = ll_merge_marker_size(path);
951 +
952 + /*
953 + * Reproduce the conflicted merge in-core
954 + */
955 + len = strlen(path);
956 + pos = cache_name_pos(path, len);
957 + if (0 <= pos)
958 + return -1;
959 + pos = -pos - 1;
960 +
961 + while (pos < active_nr) {
962 + enum object_type type;
963 + unsigned long size;
964 +
965 + ce = active_cache[pos++];
966 + if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
967 + break;
968 + i = ce_stage(ce) - 1;
969 + if (!mmfile[i].ptr) {
970 + mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
971 + mmfile[i].size = size;
972 + }
973 + }
974 + for (i = 0; i < 3; i++)
975 + if (!mmfile[i].ptr && !mmfile[i].size)
976 + mmfile[i].ptr = xstrdup("");
977 +
978 + /*
979 + * NEEDSWORK: handle conflicts from merges with
980 + * merge.renormalize set, too?
981 + */
982 + ll_merge(&result, path, &mmfile[0], NULL,
983 + &mmfile[1], "ours",
984 + &mmfile[2], "theirs", NULL);
985 + for (i = 0; i < 3; i++)
986 + free(mmfile[i].ptr);
987 +
988 + memset(&io, 0, sizeof(io));
989 + io.io.getline = rerere_mem_getline;
990 + if (output)
991 + io.io.output = fopen(output, "w");
992 + else
993 + io.io.output = NULL;
994 + strbuf_init(&io.input, 0);
995 + strbuf_attach(&io.input, result.ptr, result.size, result.size);
996 +
997 + /*
998 + * Grab the conflict ID and optionally write the original
999 + * contents with conflict markers out.
1000 + */
1001 + hunk_no = handle_path(sha1, (struct rerere_io *)&io, marker_size);
1002 + strbuf_release(&io.input);
1003 + if (io.io.output)
1004 + fclose(io.io.output);
1005 + return hunk_no;
1006 +}
1007 +
1008 static int rerere_forget_one_path(const char *path, struct string_list *rr)
1009 {
1010 const char *filename;