commit 7783f73c4beef7010e3332dee7f94dad9a54109f from: Mark Jamsek date: Mon Feb 20 04:31:13 2023 UTC use chunk offset to efficiently detect conflict markers Rather than skip lines, use the new diff APIs to directly seek to each chunk with newly added lines for more efficient conflict marker detection. ok stsp@ commit - 3db5a0afedc4111bd9721c0e5229cd217202ac84 commit + 7783f73c4beef7010e3332dee7f94dad9a54109f blob - 2d75c470b84a9c0f07ca7ccd39595267ab24fd49 blob + 08328fe81ea2c2cf86331c9b155ab3b6134f9836 --- lib/worktree.c +++ lib/worktree.c @@ -1557,16 +1557,12 @@ get_modified_file_content_status(unsigned char *status if (err) goto done; - if (fseek(ondisk_file, 0L, SEEK_SET) == -1) { - err = got_ferror(ondisk_file, GOT_ERR_IO); - goto done; - } - r = diffreg_result->result; for (n = 0; n < r->chunks.len; n += nchunks_parsed) { struct diff_chunk *c; struct diff_chunk_context cc = {}; + off_t pos; int clc, crc; /* @@ -1577,20 +1573,20 @@ get_modified_file_content_status(unsigned char *status clc = diff_chunk_get_left_count(c); crc = diff_chunk_get_right_count(c); - if (!crc && clc) { + if (!crc || crc == clc) { nchunks_parsed = 1; - continue; /* removed lines */ + continue; /* removed or unchanged lines */ } - diff_chunk_context_load_change(&cc, &nchunks_parsed, r, n, 0); - - while (ln < cc.right.start) { - err = skip_one_line(ondisk_file); - if (err) - goto done; - ++ln; + pos = diff_chunk_get_right_start_pos(c); + if (fseek(ondisk_file, pos, SEEK_SET) == -1) { + err = got_ferror(ondisk_file, GOT_ERR_IO); + goto done; } + diff_chunk_context_load_change(&cc, &nchunks_parsed, r, n, 0); + ln = cc.right.start; + while (ln < cc.right.end) { linelen = getline(&line, &linesize, ondisk_file); if (linelen == -1) {