31 # public functions |
31 # public functions |
32 |
32 |
33 def extract(ui, fileobj): |
33 def extract(ui, fileobj): |
34 '''extract patch from data read from fileobj. |
34 '''extract patch from data read from fileobj. |
35 |
35 |
36 patch can be normal patch or contained in email message. |
36 patch can be a normal patch or contained in an email message. |
37 |
37 |
38 return tuple (filename, message, user, date). any item in returned |
38 return tuple (filename, message, user, date, node, p1, p2). |
39 tuple can be None. if filename is None, fileobj did not contain |
39 Any item in the returned tuple can be None. If filename is None, |
40 patch. caller must unlink filename when done.''' |
40 fileobj did not contain a patch. Caller must unlink filename when done.''' |
41 |
41 |
42 # attempt to detect the start of a patch |
42 # attempt to detect the start of a patch |
43 # (this heuristic is borrowed from quilt) |
43 # (this heuristic is borrowed from quilt) |
44 diffre = re.compile(r'^(?:Index:[ \t]|diff[ \t]|RCS file: |' + |
44 diffre = re.compile(r'^(?:Index:[ \t]|diff[ \t]|RCS file: |' + |
45 'retrieving revision [0-9]+(\.[0-9]+)*$|' + |
45 'retrieving revision [0-9]+(\.[0-9]+)*$|' + |
95 if line.startswith('# User '): |
97 if line.startswith('# User '): |
96 user = line[7:] |
98 user = line[7:] |
97 ui.debug('From: %s\n' % user) |
99 ui.debug('From: %s\n' % user) |
98 elif line.startswith("# Date "): |
100 elif line.startswith("# Date "): |
99 date = line[7:] |
101 date = line[7:] |
|
102 elif line.startswith("# Node ID "): |
|
103 nodeid = line[10:] |
|
104 elif line.startswith("# Parent "): |
|
105 parents.append(line[10:]) |
100 elif line == '---' and 'git-send-email' in msg['X-Mailer']: |
106 elif line == '---' and 'git-send-email' in msg['X-Mailer']: |
101 ignoretext = True |
107 ignoretext = True |
102 if not line.startswith('# ') and not ignoretext: |
108 if not line.startswith('# ') and not ignoretext: |
103 cfp.write(line) |
109 cfp.write(line) |
104 cfp.write('\n') |
110 cfp.write('\n') |
115 raise |
121 raise |
116 |
122 |
117 tmpfp.close() |
123 tmpfp.close() |
118 if not diffs_seen: |
124 if not diffs_seen: |
119 os.unlink(tmpname) |
125 os.unlink(tmpname) |
120 return None, message, user, date |
126 return None, message, user, date, None, None, None |
121 return tmpname, message, user, date |
127 p1 = parents and parents.pop(0) or None |
|
128 p2 = parents and parents.pop(0) or None |
|
129 return tmpname, message, user, date, nodeid, p1, p2 |
122 |
130 |
123 GP_PATCH = 1 << 0 # we have to run patch |
131 GP_PATCH = 1 << 0 # we have to run patch |
124 GP_FILTER = 1 << 1 # there's some copy/rename operation |
132 GP_FILTER = 1 << 1 # there's some copy/rename operation |
125 GP_BINARY = 1 << 2 # there's a binary patch |
133 GP_BINARY = 1 << 2 # there's a binary patch |
126 |
134 |