##// END OF EJS Templates
mq: initializing patchheader class directly from patch content...
Cédric Duval -
r8653:aa011d12 default
parent child Browse files
Show More
@@ -57,12 +57,86 b' class statusentry:'
57 return self.rev + ':' + self.name
57 return self.rev + ':' + self.name
58
58
59 class patchheader(object):
59 class patchheader(object):
60 def __init__(self, message, comments, user, date, haspatch):
60 def __init__(self, pf):
61 def eatdiff(lines):
62 while lines:
63 l = lines[-1]
64 if (l.startswith("diff -") or
65 l.startswith("Index:") or
66 l.startswith("===========")):
67 del lines[-1]
68 else:
69 break
70 def eatempty(lines):
71 while lines:
72 l = lines[-1]
73 if re.match('\s*$', l):
74 del lines[-1]
75 else:
76 break
77
78 message = []
79 comments = []
80 user = None
81 date = None
82 format = None
83 subject = None
84 diffstart = 0
85
86 for line in file(pf):
87 line = line.rstrip()
88 if line.startswith('diff --git'):
89 diffstart = 2
90 break
91 if diffstart:
92 if line.startswith('+++ '):
93 diffstart = 2
94 break
95 if line.startswith("--- "):
96 diffstart = 1
97 continue
98 elif format == "hgpatch":
99 # parse values when importing the result of an hg export
100 if line.startswith("# User "):
101 user = line[7:]
102 elif line.startswith("# Date "):
103 date = line[7:]
104 elif not line.startswith("# ") and line:
105 message.append(line)
106 format = None
107 elif line == '# HG changeset patch':
108 format = "hgpatch"
109 elif (format != "tagdone" and (line.startswith("Subject: ") or
110 line.startswith("subject: "))):
111 subject = line[9:]
112 format = "tag"
113 elif (format != "tagdone" and (line.startswith("From: ") or
114 line.startswith("from: "))):
115 user = line[6:]
116 format = "tag"
117 elif format == "tag" and line == "":
118 # when looking for tags (subject: from: etc) they
119 # end once you find a blank line in the source
120 format = "tagdone"
121 elif message or line:
122 message.append(line)
123 comments.append(line)
124
125 eatdiff(message)
126 eatdiff(comments)
127 eatempty(message)
128 eatempty(comments)
129
130 # make sure message isn't empty
131 if format and format.startswith("tag") and subject:
132 message.insert(0, "")
133 message.insert(0, subject)
134
61 self.message = message
135 self.message = message
62 self.comments = comments
136 self.comments = comments
63 self.user = user
137 self.user = user
64 self.date = date
138 self.date = date
65 self.haspatch = haspatch
139 self.haspatch = diffstart > 1
66
140
67 def setuser(self, user):
141 def setuser(self, user):
68 if not self.setheader(['From: ', '# User '], user):
142 if not self.setheader(['From: ', '# User '], user):
@@ -314,83 +388,6 b' class queue:'
314 if self.series_dirty: write_list(self.full_series, self.series_path)
388 if self.series_dirty: write_list(self.full_series, self.series_path)
315 if self.guards_dirty: write_list(self.active_guards, self.guards_path)
389 if self.guards_dirty: write_list(self.active_guards, self.guards_path)
316
390
317 def readheaders(self, patch):
318 def eatdiff(lines):
319 while lines:
320 l = lines[-1]
321 if (l.startswith("diff -") or
322 l.startswith("Index:") or
323 l.startswith("===========")):
324 del lines[-1]
325 else:
326 break
327 def eatempty(lines):
328 while lines:
329 l = lines[-1]
330 if re.match('\s*$', l):
331 del lines[-1]
332 else:
333 break
334
335 pf = self.join(patch)
336 message = []
337 comments = []
338 user = None
339 date = None
340 format = None
341 subject = None
342 diffstart = 0
343
344 for line in file(pf):
345 line = line.rstrip()
346 if line.startswith('diff --git'):
347 diffstart = 2
348 break
349 if diffstart:
350 if line.startswith('+++ '):
351 diffstart = 2
352 break
353 if line.startswith("--- "):
354 diffstart = 1
355 continue
356 elif format == "hgpatch":
357 # parse values when importing the result of an hg export
358 if line.startswith("# User "):
359 user = line[7:]
360 elif line.startswith("# Date "):
361 date = line[7:]
362 elif not line.startswith("# ") and line:
363 message.append(line)
364 format = None
365 elif line == '# HG changeset patch':
366 format = "hgpatch"
367 elif (format != "tagdone" and (line.startswith("Subject: ") or
368 line.startswith("subject: "))):
369 subject = line[9:]
370 format = "tag"
371 elif (format != "tagdone" and (line.startswith("From: ") or
372 line.startswith("from: "))):
373 user = line[6:]
374 format = "tag"
375 elif format == "tag" and line == "":
376 # when looking for tags (subject: from: etc) they
377 # end once you find a blank line in the source
378 format = "tagdone"
379 elif message or line:
380 message.append(line)
381 comments.append(line)
382
383 eatdiff(message)
384 eatdiff(comments)
385 eatempty(message)
386 eatempty(comments)
387
388 # make sure message isn't empty
389 if format and format.startswith("tag") and subject:
390 message.insert(0, "")
391 message.insert(0, subject)
392 return patchheader(message, comments, user, date, diffstart > 1)
393
394 def removeundo(self, repo):
391 def removeundo(self, repo):
395 undo = repo.sjoin('undo')
392 undo = repo.sjoin('undo')
396 if not os.path.exists(undo):
393 if not os.path.exists(undo):
@@ -433,7 +430,7 b' class queue:'
433 if n is None:
430 if n is None:
434 raise util.Abort(_("repo commit failed"))
431 raise util.Abort(_("repo commit failed"))
435 try:
432 try:
436 ph = mergeq.readheaders(patch)
433 ph = patchheader(mergeq.join(patch))
437 except:
434 except:
438 raise util.Abort(_("unable to read %s") % patch)
435 raise util.Abort(_("unable to read %s") % patch)
439
436
@@ -560,7 +557,7 b' class queue:'
560 pf = os.path.join(patchdir, patchname)
557 pf = os.path.join(patchdir, patchname)
561
558
562 try:
559 try:
563 ph = self.readheaders(patchname)
560 ph = patchheader(self.join(patchname))
564 except:
561 except:
565 self.ui.warn(_("Unable to read %s\n") % patchname)
562 self.ui.warn(_("Unable to read %s\n") % patchname)
566 err = 1
563 err = 1
@@ -1120,7 +1117,7 b' class queue:'
1120 raise util.Abort(_("cannot refresh a revision with children"))
1117 raise util.Abort(_("cannot refresh a revision with children"))
1121 cparents = repo.changelog.parents(top)
1118 cparents = repo.changelog.parents(top)
1122 patchparent = self.qparents(repo, top)
1119 patchparent = self.qparents(repo, top)
1123 ph = self.readheaders(patchfn)
1120 ph = patchheader(self.join(patchfn))
1124
1121
1125 patchf = self.opener(patchfn, 'r')
1122 patchf = self.opener(patchfn, 'r')
1126
1123
@@ -1349,7 +1346,7 b' class queue:'
1349 summary=False):
1346 summary=False):
1350 def displayname(patchname):
1347 def displayname(patchname):
1351 if summary:
1348 if summary:
1352 ph = self.readheaders(patchname)
1349 ph = patchheader(self.join(patchname))
1353 msg = ph.message
1350 msg = ph.message
1354 msg = msg and ': ' + msg[0] or ': '
1351 msg = msg and ': ' + msg[0] or ': '
1355 else:
1352 else:
@@ -1922,7 +1919,7 b' def refresh(ui, repo, *pats, **opts):'
1922 if message:
1919 if message:
1923 raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
1920 raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
1924 patch = q.applied[-1].name
1921 patch = q.applied[-1].name
1925 ph = q.readheaders(patch)
1922 ph = patchheader(q.join(patch))
1926 message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
1923 message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
1927 setupheaderopts(ui, opts)
1924 setupheaderopts(ui, opts)
1928 ret = q.refresh(repo, pats, msg=message, **opts)
1925 ret = q.refresh(repo, pats, msg=message, **opts)
@@ -1984,7 +1981,7 b' def fold(ui, repo, *files, **opts):'
1984
1981
1985 for p in patches:
1982 for p in patches:
1986 if not message:
1983 if not message:
1987 ph = q.readheaders(p)
1984 ph = patchheader(q.join(p))
1988 if ph.message:
1985 if ph.message:
1989 messages.append(ph.message)
1986 messages.append(ph.message)
1990 pf = q.join(p)
1987 pf = q.join(p)
@@ -1994,7 +1991,7 b' def fold(ui, repo, *files, **opts):'
1994 patch.updatedir(ui, repo, files)
1991 patch.updatedir(ui, repo, files)
1995
1992
1996 if not message:
1993 if not message:
1997 ph = q.readheaders(parent)
1994 ph = patchheader(q.join(parent))
1998 message, user = ph.message, ph.user
1995 message, user = ph.message, ph.user
1999 for msg in messages:
1996 for msg in messages:
2000 message.append('* * *')
1997 message.append('* * *')
@@ -2075,7 +2072,7 b' def header(ui, repo, patch=None):'
2075 ui.write('no patches applied\n')
2072 ui.write('no patches applied\n')
2076 return 1
2073 return 1
2077 patch = q.lookup('qtip')
2074 patch = q.lookup('qtip')
2078 ph = repo.mq.readheaders(patch)
2075 ph = patchheader(repo.mq.join(patch))
2079
2076
2080 ui.write('\n'.join(ph.message) + '\n')
2077 ui.write('\n'.join(ph.message) + '\n')
2081
2078
General Comments 0
You need to be logged in to leave comments. Login now