mercurial/diffhelpers.c
author Mads Kiilerich <mads@kiilerich.com>
Wed, 09 Jan 2013 02:02:45 +0100
changeset 18338 384df4db6520
parent 16695 0a0933d3d59c
child 23959 c8e7fa41bfc5
permissions -rw-r--r--
merge: merge file flags together with file content The 'x' flag and the 'l' flag are very different. It is usually not a problem to change the 'x' flag of a normal file independent of the content, but one does not simply change the type of a file to 'l' independent of the content. This removes the fmerge function that merged both 'x' and 'l' independent of content early in the merge process. This correctly introduces some conflicts instead of silent incorrect merges. 3-way flag merge will now be done in the resolve process, right next to file content merge. Conflicts can thus be resolved with (slightly inconvenient) resolve commands like 'resolve f --tool internal:other'. It thus brings us closer to be able to re-solve manifest merge after the merge and avoid prompts during merge. This also removes the "conflicting flags for a - (n)one, e(x)ec or sym(l)ink?" prompt that nobody could answer and that made it easy to mix symlink targets and file contents up. Instead it will give a file merge where a sufficiently clever merge tool can help resolving the issue.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     1
/*
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     2
 * diffhelpers.c - helper routines for mpatch
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     3
 *
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     4
 * Copyright 2007 Chris Mason <chris.mason@oracle.com>
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     5
 *
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     6
 * This software may be used and distributed according to the terms
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     7
 * of the GNU General Public License v2, incorporated herein by reference.
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     8
 */
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     9
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    10
#include <Python.h>
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    11
#include <stdlib.h>
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    12
#include <string.h>
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    13
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    14
#include "util.h"
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    15
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    16
static char diffhelpers_doc[] = "Efficient diff parsing";
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    17
static PyObject *diffhelpers_Error;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    18
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    19
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    20
/* fixup the last lines of a and b when the patch has no newline at eof */
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    21
static void _fix_newline(PyObject *hunk, PyObject *a, PyObject *b)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    22
{
16693
f1aa3010642f diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16651
diff changeset
    23
	Py_ssize_t hunksz = PyList_Size(hunk);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    24
	PyObject *s = PyList_GET_ITEM(hunk, hunksz-1);
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    25
	char *l = PyBytes_AsString(s);
16693
f1aa3010642f diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16651
diff changeset
    26
	Py_ssize_t alen = PyList_Size(a);
f1aa3010642f diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16651
diff changeset
    27
	Py_ssize_t blen = PyList_Size(b);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    28
	char c = l[0];
10146
9c59cdafcc24 diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents: 10129
diff changeset
    29
	PyObject *hline;
16693
f1aa3010642f diffhelpers: use Py_ssize_t in _fix_newline()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16651
diff changeset
    30
	Py_ssize_t sz = PyBytes_GET_SIZE(s);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    31
10146
9c59cdafcc24 diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents: 10129
diff changeset
    32
	if (sz > 1 && l[sz-2] == '\r')
9c59cdafcc24 diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents: 10129
diff changeset
    33
		/* tolerate CRLF in last line */
9c59cdafcc24 diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents: 10129
diff changeset
    34
		sz -= 1;
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    35
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    36
	hline = PyBytes_FromStringAndSize(l, sz-1);
10146
9c59cdafcc24 diffhelpers: fix variable declaration for MSVC (not C99)
Patrick Mezard <pmezard@gmail.com>
parents: 10129
diff changeset
    37
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    38
	if (c == ' ' || c == '+') {
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    39
		PyObject *rline = PyBytes_FromStringAndSize(l + 1, sz - 2);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    40
		PyList_SetItem(b, blen-1, rline);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    41
	}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    42
	if (c == ' ' || c == '-') {
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    43
		Py_INCREF(hline);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    44
		PyList_SetItem(a, alen-1, hline);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    45
	}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    46
	PyList_SetItem(hunk, hunksz-1, hline);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    47
}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    48
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    49
/* python callable form of _fix_newline */
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    50
static PyObject *
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    51
fix_newline(PyObject *self, PyObject *args)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    52
{
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    53
	PyObject *hunk, *a, *b;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    54
	if (!PyArg_ParseTuple(args, "OOO", &hunk, &a, &b))
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    55
		return NULL;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    56
	_fix_newline(hunk, a, b);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    57
	return Py_BuildValue("l", 0);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    58
}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    59
16694
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    60
#if (PY_VERSION_HEX < 0x02050000)
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    61
static const char *addlines_format = "OOiiOO";
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    62
#else
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    63
static const char *addlines_format = "OOnnOO";
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    64
#endif
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    65
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    66
/*
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    67
 * read lines from fp into the hunk.  The hunk is parsed into two arrays
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    68
 * a and b.  a gets the old state of the text, b gets the new state
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    69
 * The control char from the hunk is saved when inserting into a, but not b
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    70
 * (for performance while deleting files)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    71
 */
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    72
static PyObject *
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    73
addlines(PyObject *self, PyObject *args)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    74
{
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    75
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    76
	PyObject *fp, *hunk, *a, *b, *x;
16694
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    77
	Py_ssize_t i;
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    78
	Py_ssize_t lena, lenb;
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    79
	Py_ssize_t num;
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    80
	Py_ssize_t todoa, todob;
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    81
	char *s, c;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    82
	PyObject *l;
16694
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    83
	if (!PyArg_ParseTuple(args, addlines_format,
797b76205408 diffhelpers: use Py_ssize_t in addlines()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16693
diff changeset
    84
			      &fp, &hunk, &lena, &lenb, &a, &b))
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    85
		return NULL;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    86
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10146
diff changeset
    87
	while (1) {
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    88
		todoa = lena - PyList_Size(a);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    89
		todob = lenb - PyList_Size(b);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    90
		num = todoa > todob ? todoa : todob;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    91
		if (num == 0)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    92
		    break;
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10146
diff changeset
    93
		for (i = 0; i < num; i++) {
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    94
			x = PyFile_GetLine(fp, 0);
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
    95
			s = PyBytes_AsString(x);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    96
			c = *s;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    97
			if (strcmp(s, "\\ No newline at end of file\n") == 0) {
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    98
				_fix_newline(hunk, a, b);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    99
				continue;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   100
			}
5483
ec2cc1dadbf7 Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4897
diff changeset
   101
			if (c == '\n') {
ec2cc1dadbf7 Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4897
diff changeset
   102
				/* Some patches may be missing the control char
ec2cc1dadbf7 Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4897
diff changeset
   103
				 * on empty lines. Supply a leading space. */
ec2cc1dadbf7 Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4897
diff changeset
   104
				Py_DECREF(x);
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   105
				x = PyBytes_FromString(" \n");
5483
ec2cc1dadbf7 Handle patches with misformatted empty lines
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4897
diff changeset
   106
			}
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   107
			PyList_Append(hunk, x);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   108
			if (c == '+') {
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   109
				l = PyBytes_FromString(s + 1);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   110
				PyList_Append(b, l);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   111
				Py_DECREF(l);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   112
			} else if (c == '-') {
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   113
				PyList_Append(a, x);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   114
			} else {
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   115
				l = PyBytes_FromString(s + 1);
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   116
				PyList_Append(b, l);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   117
				Py_DECREF(l);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   118
				PyList_Append(a, x);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   119
			}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   120
			Py_DECREF(x);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   121
		}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   122
	}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   123
	return Py_BuildValue("l", 0);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   124
}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   125
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   126
/*
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   127
 * compare the lines in a with the lines in b.  a is assumed to have
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   128
 * a control char at the start of each line, this char is ignored in the
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   129
 * compare
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   130
 */
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   131
static PyObject *
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   132
testhunk(PyObject *self, PyObject *args)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   133
{
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   134
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   135
	PyObject *a, *b;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   136
	long bstart;
16695
0a0933d3d59c diffhelpers: use Py_ssize_t in testhunk()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16694
diff changeset
   137
	Py_ssize_t alen, blen;
0a0933d3d59c diffhelpers: use Py_ssize_t in testhunk()
Adrian Buehlmann <adrian@cadifra.com>
parents: 16694
diff changeset
   138
	Py_ssize_t i;
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   139
	char *sa, *sb;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   140
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   141
	if (!PyArg_ParseTuple(args, "OOl", &a, &b, &bstart))
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   142
		return NULL;
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   143
	alen = PyList_Size(a);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   144
	blen = PyList_Size(b);
16651
9e40bc4c1bde diffhelpers: harden testhunk
Matt Mackall <mpm@selenic.com>
parents: 13302
diff changeset
   145
	if (alen > blen - bstart || bstart < 0) {
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   146
		return Py_BuildValue("l", -1);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   147
	}
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10146
diff changeset
   148
	for (i = 0; i < alen; i++) {
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   149
		sa = PyBytes_AsString(PyList_GET_ITEM(a, i));
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   150
		sb = PyBytes_AsString(PyList_GET_ITEM(b, i + bstart));
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10146
diff changeset
   151
		if (strcmp(sa + 1, sb) != 0)
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   152
			return Py_BuildValue("l", -1);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   153
	}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   154
	return Py_BuildValue("l", 0);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   155
}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   156
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   157
static PyMethodDef methods[] = {
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   158
	{"addlines", addlines, METH_VARARGS, "add lines to a hunk\n"},
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   159
	{"fix_newline", fix_newline, METH_VARARGS, "fixup newline counters\n"},
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   160
	{"testhunk", testhunk, METH_VARARGS, "test lines in a hunk\n"},
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   161
	{NULL, NULL}
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   162
};
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   163
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   164
#ifdef IS_PY3K
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   165
static struct PyModuleDef diffhelpers_module = {
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   166
	PyModuleDef_HEAD_INIT,
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   167
	"diffhelpers",
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   168
	diffhelpers_doc,
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   169
	-1,
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   170
	methods
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   171
};
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   172
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   173
PyMODINIT_FUNC PyInit_diffhelpers(void)
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   174
{
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   175
	PyObject *m;
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   176
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   177
	m = PyModule_Create(&diffhelpers_module);
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   178
	if (m == NULL)
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   179
		return NULL;
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   180
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   181
	diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError",
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   182
											NULL, NULL);
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   183
	Py_INCREF(diffhelpers_Error);
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   184
	PyModule_AddObject(m, "diffhelpersError", diffhelpers_Error);
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   185
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   186
	return m;
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   187
}
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   188
#else
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   189
PyMODINIT_FUNC
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   190
initdiffhelpers(void)
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   191
{
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   192
	Py_InitModule3("diffhelpers", methods, diffhelpers_doc);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   193
	diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError",
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   194
	                                        NULL, NULL);
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   195
}
11363
f50103035c38 diffhelpers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10282
diff changeset
   196
#endif
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   197