--- a/hg
+++ b/hg
@@ -65,6 +65,7 @@ def diff(files = None, node1 = None, nod
if not node1:
node1 = repo.current
(c, a, d) = repo.diffdir(repo.root, node1)
+ a = [] # ignore unknown files in repo, by popular request
def read(f): return file(os.path.join(repo.root, f)).read()
change = repo.changelog.read(node1)
@@ -72,11 +73,16 @@ def diff(files = None, node1 = None, nod
date1 = date(change)
if files:
- c = filterfiles(c, files)
- d = filterfiles(d, files)
+ c, a, d = map(lambda x: filterfiles(x, files), (c, a, d))
for f in c:
- to = repo.file(f).read(mmap[f])
+ to = ""
+ if mmap.has_key(f):
+ to = repo.file(f).read(mmap[f])
+ tn = read(f)
+ sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
+ for f in a:
+ to = ""
tn = read(f)
sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
for f in d:
--- a/mercurial/mpatch.c
+++ b/mercurial/mpatch.c
@@ -39,17 +39,25 @@ struct flist {
static struct flist *lalloc(int size)
{
- struct flist *a;
+ struct flist *a = NULL;
a = malloc(sizeof(struct flist));
- a->head = a->tail = a->base = malloc(sizeof(struct frag) * size);
+ if (a) {
+ a->base = malloc(sizeof(struct frag) * size);
+ if (!a->base)
+ free(a);
+ else
+ a->head = a->tail = a->base;
+ }
return a;
}
static void lfree(struct flist *a)
{
- free(a->base);
- free(a);
+ if (a) {
+ free(a->base);
+ free(a);
+ }
}
static int lsize(struct flist *a)
@@ -144,33 +152,37 @@ static int discard(struct flist *src, in
this deletes a and b and returns the resultant list. */
static struct flist *combine(struct flist *a, struct flist *b)
{
- struct flist *c;
- struct frag *bh = b->head, *ct;
+ struct flist *c = NULL;
+ struct frag *bh, *ct;
int offset = 0, post;
- c = lalloc((lsize(a) + lsize(b)) * 2);
+ if (a && b)
+ c = lalloc((lsize(a) + lsize(b)) * 2);
+
+ if (c) {
- while (bh != b->tail) {
- /* save old hunks */
- offset = gather(c, a, bh->start, offset);
+ for (bh = b->head; bh != b->tail; bh++) {
+ /* save old hunks */
+ offset = gather(c, a, bh->start, offset);
- /* discard replaced hunks */
- post = discard(a, bh->end, offset);
+ /* discard replaced hunks */
+ post = discard(a, bh->end, offset);
- /* insert new hunk */
- ct = c->tail;
- ct->start = bh->start - offset;
- ct->end = bh->end - post;
- ct->len = bh->len;
- ct->data = bh->data;
- c->tail++;
- bh++;
- offset = post;
+ /* insert new hunk */
+ ct = c->tail;
+ ct->start = bh->start - offset;
+ ct->end = bh->end - post;
+ ct->len = bh->len;
+ ct->data = bh->data;
+ c->tail++;
+ offset = post;
+ }
+
+ /* hold on to tail from a */
+ memcpy(c->tail, a->head, sizeof(struct frag) * lsize(a));
+ c->tail += lsize(a);
}
- /* hold on to tail from a */
- memcpy(c->tail, a->head, sizeof(struct frag) * lsize(a));
- c->tail += lsize(a);
lfree(a);
lfree(b);
return c;
@@ -242,6 +254,8 @@ static struct flist *fold(PyObject *bins
if (start + 1 == end) {
/* trivial case, output a decoded list */
PyObject *tmp = PyList_GetItem(bins, start);
+ if (!tmp)
+ return NULL;
return decode(PyString_AsString(tmp), PyString_Size(tmp));
}
@@ -259,7 +273,7 @@ patches(PyObject *self, PyObject *args)
char *in, *out;
int len, outlen;
- if (!PyArg_ParseTuple(args, "OO:mpatch", &text, &bins))
+ if (!PyArg_ParseTuple(args, "SO:mpatch", &text, &bins))
return NULL;
len = PyList_Size(bins);
@@ -270,13 +284,18 @@ patches(PyObject *self, PyObject *args)
}
patch = fold(bins, 0, len);
+ if (!patch)
+ return PyErr_NoMemory();
+
outlen = calcsize(PyString_Size(text), patch);
result = PyString_FromStringAndSize(NULL, outlen);
- in = PyString_AsString(text);
- out = PyString_AsString(result);
- apply(out, in, PyString_Size(text), patch);
+ if (result) {
+ in = PyString_AsString(text);
+ out = PyString_AsString(result);
+ apply(out, in, PyString_Size(text), patch);
+ }
+
lfree(patch);
-
return result;
}