commit - db9ae6560f9f90548b4e4d4d69f372b51f869792
commit + 450d9f6b216b7cdde9e4079e0db459d3bd2caa0d
blob - 89e894cb419ae5b35cd91c980ca7cc01cdc1f048
blob + 8bba5c9f9469a7fe3ccbd275bbcb22c0ad909f0b
--- lib/worktree.c
+++ lib/worktree.c
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;
/*
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) {