mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
mq: initializing patchheader class directly from patch content
The patch header needs only be read in order to instantiate the class, and as such it makes more sense to do it within the class.
This commit is contained in:
parent
d3e34e566d
commit
ee45037723
171
hgext/mq.py
171
hgext/mq.py
@ -57,12 +57,86 @@ class statusentry:
|
|||||||
return self.rev + ':' + self.name
|
return self.rev + ':' + self.name
|
||||||
|
|
||||||
class patchheader(object):
|
class patchheader(object):
|
||||||
def __init__(self, message, comments, user, date, haspatch):
|
def __init__(self, pf):
|
||||||
|
def eatdiff(lines):
|
||||||
|
while lines:
|
||||||
|
l = lines[-1]
|
||||||
|
if (l.startswith("diff -") or
|
||||||
|
l.startswith("Index:") or
|
||||||
|
l.startswith("===========")):
|
||||||
|
del lines[-1]
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
def eatempty(lines):
|
||||||
|
while lines:
|
||||||
|
l = lines[-1]
|
||||||
|
if re.match('\s*$', l):
|
||||||
|
del lines[-1]
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
message = []
|
||||||
|
comments = []
|
||||||
|
user = None
|
||||||
|
date = None
|
||||||
|
format = None
|
||||||
|
subject = None
|
||||||
|
diffstart = 0
|
||||||
|
|
||||||
|
for line in file(pf):
|
||||||
|
line = line.rstrip()
|
||||||
|
if line.startswith('diff --git'):
|
||||||
|
diffstart = 2
|
||||||
|
break
|
||||||
|
if diffstart:
|
||||||
|
if line.startswith('+++ '):
|
||||||
|
diffstart = 2
|
||||||
|
break
|
||||||
|
if line.startswith("--- "):
|
||||||
|
diffstart = 1
|
||||||
|
continue
|
||||||
|
elif format == "hgpatch":
|
||||||
|
# parse values when importing the result of an hg export
|
||||||
|
if line.startswith("# User "):
|
||||||
|
user = line[7:]
|
||||||
|
elif line.startswith("# Date "):
|
||||||
|
date = line[7:]
|
||||||
|
elif not line.startswith("# ") and line:
|
||||||
|
message.append(line)
|
||||||
|
format = None
|
||||||
|
elif line == '# HG changeset patch':
|
||||||
|
format = "hgpatch"
|
||||||
|
elif (format != "tagdone" and (line.startswith("Subject: ") or
|
||||||
|
line.startswith("subject: "))):
|
||||||
|
subject = line[9:]
|
||||||
|
format = "tag"
|
||||||
|
elif (format != "tagdone" and (line.startswith("From: ") or
|
||||||
|
line.startswith("from: "))):
|
||||||
|
user = line[6:]
|
||||||
|
format = "tag"
|
||||||
|
elif format == "tag" and line == "":
|
||||||
|
# when looking for tags (subject: from: etc) they
|
||||||
|
# end once you find a blank line in the source
|
||||||
|
format = "tagdone"
|
||||||
|
elif message or line:
|
||||||
|
message.append(line)
|
||||||
|
comments.append(line)
|
||||||
|
|
||||||
|
eatdiff(message)
|
||||||
|
eatdiff(comments)
|
||||||
|
eatempty(message)
|
||||||
|
eatempty(comments)
|
||||||
|
|
||||||
|
# make sure message isn't empty
|
||||||
|
if format and format.startswith("tag") and subject:
|
||||||
|
message.insert(0, "")
|
||||||
|
message.insert(0, subject)
|
||||||
|
|
||||||
self.message = message
|
self.message = message
|
||||||
self.comments = comments
|
self.comments = comments
|
||||||
self.user = user
|
self.user = user
|
||||||
self.date = date
|
self.date = date
|
||||||
self.haspatch = haspatch
|
self.haspatch = diffstart > 1
|
||||||
|
|
||||||
def setuser(self, user):
|
def setuser(self, user):
|
||||||
if not self.setheader(['From: ', '# User '], user):
|
if not self.setheader(['From: ', '# User '], user):
|
||||||
@ -314,83 +388,6 @@ class queue:
|
|||||||
if self.series_dirty: write_list(self.full_series, self.series_path)
|
if self.series_dirty: write_list(self.full_series, self.series_path)
|
||||||
if self.guards_dirty: write_list(self.active_guards, self.guards_path)
|
if self.guards_dirty: write_list(self.active_guards, self.guards_path)
|
||||||
|
|
||||||
def readheaders(self, patch):
|
|
||||||
def eatdiff(lines):
|
|
||||||
while lines:
|
|
||||||
l = lines[-1]
|
|
||||||
if (l.startswith("diff -") or
|
|
||||||
l.startswith("Index:") or
|
|
||||||
l.startswith("===========")):
|
|
||||||
del lines[-1]
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
def eatempty(lines):
|
|
||||||
while lines:
|
|
||||||
l = lines[-1]
|
|
||||||
if re.match('\s*$', l):
|
|
||||||
del lines[-1]
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
pf = self.join(patch)
|
|
||||||
message = []
|
|
||||||
comments = []
|
|
||||||
user = None
|
|
||||||
date = None
|
|
||||||
format = None
|
|
||||||
subject = None
|
|
||||||
diffstart = 0
|
|
||||||
|
|
||||||
for line in file(pf):
|
|
||||||
line = line.rstrip()
|
|
||||||
if line.startswith('diff --git'):
|
|
||||||
diffstart = 2
|
|
||||||
break
|
|
||||||
if diffstart:
|
|
||||||
if line.startswith('+++ '):
|
|
||||||
diffstart = 2
|
|
||||||
break
|
|
||||||
if line.startswith("--- "):
|
|
||||||
diffstart = 1
|
|
||||||
continue
|
|
||||||
elif format == "hgpatch":
|
|
||||||
# parse values when importing the result of an hg export
|
|
||||||
if line.startswith("# User "):
|
|
||||||
user = line[7:]
|
|
||||||
elif line.startswith("# Date "):
|
|
||||||
date = line[7:]
|
|
||||||
elif not line.startswith("# ") and line:
|
|
||||||
message.append(line)
|
|
||||||
format = None
|
|
||||||
elif line == '# HG changeset patch':
|
|
||||||
format = "hgpatch"
|
|
||||||
elif (format != "tagdone" and (line.startswith("Subject: ") or
|
|
||||||
line.startswith("subject: "))):
|
|
||||||
subject = line[9:]
|
|
||||||
format = "tag"
|
|
||||||
elif (format != "tagdone" and (line.startswith("From: ") or
|
|
||||||
line.startswith("from: "))):
|
|
||||||
user = line[6:]
|
|
||||||
format = "tag"
|
|
||||||
elif format == "tag" and line == "":
|
|
||||||
# when looking for tags (subject: from: etc) they
|
|
||||||
# end once you find a blank line in the source
|
|
||||||
format = "tagdone"
|
|
||||||
elif message or line:
|
|
||||||
message.append(line)
|
|
||||||
comments.append(line)
|
|
||||||
|
|
||||||
eatdiff(message)
|
|
||||||
eatdiff(comments)
|
|
||||||
eatempty(message)
|
|
||||||
eatempty(comments)
|
|
||||||
|
|
||||||
# make sure message isn't empty
|
|
||||||
if format and format.startswith("tag") and subject:
|
|
||||||
message.insert(0, "")
|
|
||||||
message.insert(0, subject)
|
|
||||||
return patchheader(message, comments, user, date, diffstart > 1)
|
|
||||||
|
|
||||||
def removeundo(self, repo):
|
def removeundo(self, repo):
|
||||||
undo = repo.sjoin('undo')
|
undo = repo.sjoin('undo')
|
||||||
if not os.path.exists(undo):
|
if not os.path.exists(undo):
|
||||||
@ -433,7 +430,7 @@ class queue:
|
|||||||
if n is None:
|
if n is None:
|
||||||
raise util.Abort(_("repo commit failed"))
|
raise util.Abort(_("repo commit failed"))
|
||||||
try:
|
try:
|
||||||
ph = mergeq.readheaders(patch)
|
ph = patchheader(mergeq.join(patch))
|
||||||
except:
|
except:
|
||||||
raise util.Abort(_("unable to read %s") % patch)
|
raise util.Abort(_("unable to read %s") % patch)
|
||||||
|
|
||||||
@ -560,7 +557,7 @@ class queue:
|
|||||||
pf = os.path.join(patchdir, patchname)
|
pf = os.path.join(patchdir, patchname)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ph = self.readheaders(patchname)
|
ph = patchheader(self.join(patchname))
|
||||||
except:
|
except:
|
||||||
self.ui.warn(_("Unable to read %s\n") % patchname)
|
self.ui.warn(_("Unable to read %s\n") % patchname)
|
||||||
err = 1
|
err = 1
|
||||||
@ -1120,7 +1117,7 @@ class queue:
|
|||||||
raise util.Abort(_("cannot refresh a revision with children"))
|
raise util.Abort(_("cannot refresh a revision with children"))
|
||||||
cparents = repo.changelog.parents(top)
|
cparents = repo.changelog.parents(top)
|
||||||
patchparent = self.qparents(repo, top)
|
patchparent = self.qparents(repo, top)
|
||||||
ph = self.readheaders(patchfn)
|
ph = patchheader(self.join(patchfn))
|
||||||
|
|
||||||
patchf = self.opener(patchfn, 'r')
|
patchf = self.opener(patchfn, 'r')
|
||||||
|
|
||||||
@ -1349,7 +1346,7 @@ class queue:
|
|||||||
summary=False):
|
summary=False):
|
||||||
def displayname(patchname):
|
def displayname(patchname):
|
||||||
if summary:
|
if summary:
|
||||||
ph = self.readheaders(patchname)
|
ph = patchheader(self.join(patchname))
|
||||||
msg = ph.message
|
msg = ph.message
|
||||||
msg = msg and ': ' + msg[0] or ': '
|
msg = msg and ': ' + msg[0] or ': '
|
||||||
else:
|
else:
|
||||||
@ -1922,7 +1919,7 @@ def refresh(ui, repo, *pats, **opts):
|
|||||||
if message:
|
if message:
|
||||||
raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
|
raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
|
||||||
patch = q.applied[-1].name
|
patch = q.applied[-1].name
|
||||||
ph = q.readheaders(patch)
|
ph = patchheader(q.join(patch))
|
||||||
message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
|
message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
|
||||||
setupheaderopts(ui, opts)
|
setupheaderopts(ui, opts)
|
||||||
ret = q.refresh(repo, pats, msg=message, **opts)
|
ret = q.refresh(repo, pats, msg=message, **opts)
|
||||||
@ -1984,7 +1981,7 @@ def fold(ui, repo, *files, **opts):
|
|||||||
|
|
||||||
for p in patches:
|
for p in patches:
|
||||||
if not message:
|
if not message:
|
||||||
ph = q.readheaders(p)
|
ph = patchheader(q.join(p))
|
||||||
if ph.message:
|
if ph.message:
|
||||||
messages.append(ph.message)
|
messages.append(ph.message)
|
||||||
pf = q.join(p)
|
pf = q.join(p)
|
||||||
@ -1994,7 +1991,7 @@ def fold(ui, repo, *files, **opts):
|
|||||||
patch.updatedir(ui, repo, files)
|
patch.updatedir(ui, repo, files)
|
||||||
|
|
||||||
if not message:
|
if not message:
|
||||||
ph = q.readheaders(parent)
|
ph = patchheader(q.join(parent))
|
||||||
message, user = ph.message, ph.user
|
message, user = ph.message, ph.user
|
||||||
for msg in messages:
|
for msg in messages:
|
||||||
message.append('* * *')
|
message.append('* * *')
|
||||||
@ -2075,7 +2072,7 @@ def header(ui, repo, patch=None):
|
|||||||
ui.write('no patches applied\n')
|
ui.write('no patches applied\n')
|
||||||
return 1
|
return 1
|
||||||
patch = q.lookup('qtip')
|
patch = q.lookup('qtip')
|
||||||
ph = repo.mq.readheaders(patch)
|
ph = patchheader(repo.mq.join(patch))
|
||||||
|
|
||||||
ui.write('\n'.join(ph.message) + '\n')
|
ui.write('\n'.join(ph.message) + '\n')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user