Ejemplo n.º 1
0
static int fill_theirs_hunk(xdfenv_t *xe, const char *name,
			      const char *ancestor_name,
			      int size, int i, int style,
			      xdmerge_t *m, char *dest, int marker_size)
{
	int marker1_size = (name ? strlen(name) + 1 : 0);
	int marker2_size = (ancestor_name ? strlen(ancestor_name) + 1 : 0);

	if (marker_size <= 0)
		marker_size = DEFAULT_CONFLICT_MARKER_SIZE;

	/* Before changed part */
	size += xdl_recs_copy(xe, i, m->i1 - i, 0,
			dest ? dest + size : NULL);
	
	if (style == XDL_MERGE_DIFF3) {
		/* Shared preimage */
		if (!dest) {
			size += marker_size + 1 + marker2_size;
		} else {
			memset(dest + size, '|', marker_size);
			size += marker_size;
			if (marker2_size) {
				dest[size] = ' ';
				memcpy(dest + size + 1, ancestor_name, marker2_size - 1);
				size += marker2_size;
			}
			dest[size++] = '\n';
		}
		size += xdl_orig_copy(xe, m->i0, m->chg0, 1,
				      dest ? dest + size : NULL);
	}

	if (!dest) {
		size += marker_size + 1;
	} else {
		memset(dest + size, '=', marker_size);
		size += marker_size;
		dest[size++] = '\n';
	}

	/* Postimage from side #2 */
	size += xdl_recs_copy(xe, m->i2, m->chg2, 1,
			      dest ? dest + size : NULL);
	if (!dest) {
		size += marker_size + 1 + marker1_size;
	} else {
		memset(dest + size, '+', marker_size);
		size += marker_size;
		if (marker1_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name, marker1_size - 1);
			size += marker1_size;
		}
		dest[size++] = '\n';
	}

	return size;
}
Ejemplo n.º 2
0
static int xdl_fill_merge_buffer(size_t *out,
				 xdfenv_t *xe1, const char *name1,
				 xdfenv_t *xe2, const char *name2,
				 const char *ancestor_name,
				 int favor,
				 xdmerge_t *m, char *dest, int style,
				 int marker_size)
{
	size_t size, copied;
	int i;

	*out = 0;

	for (size = i = 0; m; m = m->next) {
		if (favor && !m->mode)
			m->mode = favor;

		if (m->mode == 0) {
			if (fill_conflict_hunk(&size, xe1, name1, xe2, name2,
						  ancestor_name,
						  size, i, style, m, dest,
						  marker_size) < 0)
				return -1;
		}
		else if (m->mode & 3) {
			/* Before conflicting part */
			if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0,
					      dest ? dest + size : NULL) < 0)
				return -1;
			GITERR_CHECK_ALLOC_ADD(&size, size, copied);

			/* Postimage from side #1 */
			if (m->mode & 1) {
				if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, (m->mode & 2),
						      dest ? dest + size : NULL) < 0)
					return -1;
				GITERR_CHECK_ALLOC_ADD(&size, size, copied);
			}

			/* Postimage from side #2 */
			if (m->mode & 2) {
				if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, 0,
						      dest ? dest + size : NULL) < 0)
					return -1;
				GITERR_CHECK_ALLOC_ADD(&size, size, copied);
			}
		} else
			continue;
		i = m->i1 + m->chg1;
	}

	if (xdl_recs_copy(&copied, xe1, i, xe1->xdf2.nrec - i, 0,
			      dest ? dest + size : NULL) < 0)
		return -1;
	GITERR_CHECK_ALLOC_ADD(&size, size, copied);

	*out = size;
	return 0;
}
Ejemplo n.º 3
0
static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
				 xdfenv_t *xe2, const char *name2,
				 const char *ancestor_name,
				 int favor,
				 xdmerge_t *m, char *dest, int style,
				 int marker_size, int mark_all)
{
	int size, i;

	for (size = i = 0; m; m = m->next) {
		if (favor && !m->mode)
			m->mode = favor;

		if (m->mode == 0)
			size = fill_conflict_hunk(xe1, name1, xe2, name2,
						  ancestor_name,
						  size, i, style, m, dest,
						  marker_size);
		else if (m->mode & 3) {
			if (mark_all) {
				/* Before conflicting part */
				size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
						      dest ? dest + size : NULL);
				/* Postimage from side #1 */
				if (m->mode & 1)
					size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
							      dest ? dest + size : NULL);
				/* Postimage from side #2 */
				if (m->mode & 2)
					size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
							      dest ? dest + size : NULL);
			} else {
				if (m->mode & 1)
					size += fill_ours_hunk(xe1, name1,
			      	ancestor_name, size, i, style, m,
							dest, marker_size);
				if (m->mode & 2)
					size += fill_theirs_hunk(xe2, name2,
			      	ancestor_name, size, i, style, m,
							dest, marker_size);
			}
		} else
		continue;
		i = m->i1 + m->chg1;
	}
	size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
			      dest ? dest + size : NULL);
	return size;
}
Ejemplo n.º 4
0
static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
			      xdfenv_t *xe2, const char *name2,
			      const char *name3,
			      int size, int i, int style,
			      xdmerge_t *m, char *dest, int marker_size)
{
	int marker1_size = (name1 ? strlen(name1) + 1 : 0);
	int marker2_size = (name2 ? strlen(name2) + 1 : 0);
	int marker3_size = (name3 ? strlen(name3) + 1 : 0);

	if (marker_size <= 0)
		marker_size = DEFAULT_CONFLICT_MARKER_SIZE;

	/* Before conflicting part */
	size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
			      dest ? dest + size : NULL);

	if (!dest) {
		size += marker_size + 1 + marker1_size;
	} else {
		memset(dest + size, '<', marker_size);
		size += marker_size;
		if (marker1_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name1, marker1_size - 1);
			size += marker1_size;
		}
		dest[size++] = '\n';
	}

	/* Postimage from side #1 */
	size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
			      dest ? dest + size : NULL);

	if (style == XDL_MERGE_DIFF3) {
		/* Shared preimage */
		if (!dest) {
			size += marker_size + 1 + marker3_size;
		} else {
			memset(dest + size, '|', marker_size);
			size += marker_size;
			if (marker3_size) {
				dest[size] = ' ';
				memcpy(dest + size + 1, name3, marker3_size - 1);
				size += marker3_size;
			}
			dest[size++] = '\n';
		}
		size += xdl_orig_copy(xe1, m->i0, m->chg0, 1,
				      dest ? dest + size : NULL);
	}

	if (!dest) {
		size += marker_size + 1;
	} else {
		memset(dest + size, '=', marker_size);
		size += marker_size;
		dest[size++] = '\n';
	}

	/* Postimage from side #2 */
	size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
			      dest ? dest + size : NULL);
	if (!dest) {
		size += marker_size + 1 + marker2_size;
	} else {
		memset(dest + size, '>', marker_size);
		size += marker_size;
		if (marker2_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name2, marker2_size - 1);
			size += marker2_size;
		}
		dest[size++] = '\n';
	}
	return size;
}
Ejemplo n.º 5
0
static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
			      xdfenv_t *xe2, const char *name2,
			      const char *name3,
			      size_t size, int i, int style,
			      xdmerge_t *m, char *dest, int marker_size)
{
	int marker1_size = (name1 ? (int)strlen(name1) + 1 : 0);
	int marker2_size = (name2 ? (int)strlen(name2) + 1 : 0);
	int marker3_size = (name3 ? (int)strlen(name3) + 1 : 0);
	size_t copied;

	*out = 0;

	if (marker_size <= 0)
		marker_size = DEFAULT_CONFLICT_MARKER_SIZE;

	/* Before conflicting part */
	if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0,
			      dest ? dest + size : NULL) < 0)
		return -1;

	GITERR_CHECK_ALLOC_ADD(&size, size, copied);

	if (!dest) {
		GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker1_size);
	} else {
		memset(dest + size, '<', marker_size);
		size += marker_size;
		if (marker1_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name1, marker1_size - 1);
			size += marker1_size;
		}
		dest[size++] = '\n';
	}

	/* Postimage from side #1 */
	if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, 1,
			      dest ? dest + size : NULL) < 0)
		return -1;

	GITERR_CHECK_ALLOC_ADD(&size, size, copied);

	if (style == XDL_MERGE_DIFF3) {
		/* Shared preimage */
		if (!dest) {
			GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker3_size);
		} else {
			memset(dest + size, '|', marker_size);
			size += marker_size;
			if (marker3_size) {
				dest[size] = ' ';
				memcpy(dest + size + 1, name3, marker3_size - 1);
				size += marker3_size;
			}
			dest[size++] = '\n';
		}

		if (xdl_orig_copy(&copied, xe1, m->i0, m->chg0, 1,
				      dest ? dest + size : NULL) < 0)
			return -1;
		GITERR_CHECK_ALLOC_ADD(&size, size, copied);
	}

	if (!dest) {
		GITERR_CHECK_ALLOC_ADD3(&size, size, marker_size, 1);
	} else {
		memset(dest + size, '=', marker_size);
		size += marker_size;
		dest[size++] = '\n';
	}

	/* Postimage from side #2 */

	if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, 1,
			      dest ? dest + size : NULL) < 0)
		return -1;
	GITERR_CHECK_ALLOC_ADD(&size, size, copied);

	if (!dest) {
		GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker2_size);
	} else {
		memset(dest + size, '>', marker_size);
		size += marker_size;
		if (marker2_size) {
			dest[size] = ' ';
			memcpy(dest + size + 1, name2, marker2_size - 1);
			size += marker2_size;
		}
		dest[size++] = '\n';
	}

	*out = size;
	return 0;
}