buffer->nr += len;
}
+static void clear_buffer(struct buffer *buffer)
+{
+ free(buffer->ptr);
+ buffer->ptr = NULL;
+ buffer->nr = buffer->alloc = 0;
+}
+
static int handle_file(const char *path,
unsigned char *sha1, const char *output)
{
SHA1_Init(&ctx);
while (fgets(buf, sizeof(buf), f)) {
- if (!(-prefixcmp(buf, "<<<<<<< ")))
+ if (!prefixcmp(buf, "<<<<<<< "))
hunk = 1;
- else if (!(-prefixcmp(buf, "=======")))
+ else if (!prefixcmp(buf, "======="))
hunk = 2;
- else if (!(-prefixcmp(buf, ">>>>>>> "))) {
+ else if (!prefixcmp(buf, ">>>>>>> ")) {
+ int one_is_longer = (one->nr > two->nr);
+ int common_len = one_is_longer ? two->nr : one->nr;
+ int cmp = memcmp(one->ptr, two->ptr, common_len);
+
hunk_no++;
hunk = 0;
- if (memcmp(one->ptr, two->ptr, one->nr < two->nr ?
- one->nr : two->nr) > 0) {
+ if ((cmp > 0) || ((cmp == 0) && one_is_longer)) {
struct buffer *swap = one;
one = two;
two = swap;
SHA1_Update(&ctx, two->ptr, two->nr);
SHA1_Update(&ctx, "\0", 1);
}
+ clear_buffer(one);
+ clear_buffer(two);
} else if (hunk == 1)
append_line(one, buf);
else if (hunk == 2)
return error("Could not read index");
for (i = 0; i + 2 < active_nr; i++) {
struct cache_entry *e1 = active_cache[i];
- struct cache_entry *e2 = active_cache[i + 1];
- struct cache_entry *e3 = active_cache[i + 2];
- if (ce_stage(e1) == 1 && ce_stage(e2) == 2 &&
- ce_stage(e3) == 3 && ce_same_name(e1, e2) &&
- ce_same_name(e1, e3)) {
+ struct cache_entry *e2 = active_cache[i+1];
+ struct cache_entry *e3 = active_cache[i+2];
+ if (ce_stage(e1) == 1 &&
+ ce_stage(e2) == 2 &&
+ ce_stage(e3) == 3 &&
+ ce_same_name(e1, e2) && ce_same_name(e1, e3) &&
+ S_ISREG(ntohl(e1->ce_mode)) &&
+ S_ISREG(ntohl(e2->ce_mode)) &&
+ S_ISREG(ntohl(e3->ce_mode))) {
path_list_insert((const char *)e1->name, conflict);
- i += 3;
+ i += 2;
}
}
return 0;