##// END OF EJS Templates
use repo[changeid] to get a changectx
use repo[changeid] to get a changectx

File last commit:

r6632:aa3f6188 default
r6747:f6c00b17 default
Show More
monotone.py
201 lines | 6.8 KiB | text/x-python | PythonLexer
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 # monotone support for the convert extension
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 import os, re, time
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 from mercurial import util
Patrick Mezard
convert: allow missing tools not to stop source type detection
r6332 from common import NoRepo, MissingTool, commit, converter_source, checktool
from common import commandline
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 from mercurial.i18n import _
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 class monotone_source(converter_source, commandline):
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def __init__(self, ui, path=None, rev=None):
converter_source.__init__(self, ui, path, rev)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 commandline.__init__(self, ui, 'mtn')
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.ui = ui
self.path = path
# regular expressions for parsing monotone output
space = r'\s*'
David Reiss
convert.monotone: fix quotes and backslashes in change descriptions.
r6632 name = r'\s+"((?:\\"|[^"])*)"\s*'
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 value = name
revision = r'\s+\[(\w+)\]\s*'
lines = r'(?:.|\n)+'
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
self.dir_re = re.compile(space + "dir" + name)
self.file_re = re.compile(space + "file" + name + "content" + revision)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.add_file_re = re.compile(space + "add_file" + name + "content" + revision)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.patch_re = re.compile(space + "patch" + name + "from" + revision + "to" + revision)
self.rename_re = re.compile(space + "rename" + name + "to" + name)
Patrick Mezard
convert: record deleted files in monotone source
r6376 self.delete_re = re.compile(space + "delete" + name)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.tag_re = re.compile(space + "tag" + name + "revision" + revision)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.cert_re = re.compile(lines + space + "name" + name + "value" + value)
attr = space + "file" + lines + space + "attr" + space
self.attr_execute_re = re.compile(attr + '"mtn:execute"' + space + '"true"')
# cached data
self.manifest_rev = None
self.manifest = None
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.files = None
self.dirs = None
norepo = NoRepo (_("%s does not look like a monotone repo") % path)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 if not os.path.exists(path):
raise norepo
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Patrick Mezard
convert: allow missing tools not to stop source type detection
r6332 checktool('mtn', abort=False)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
# test if there are any revisions
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.rev = None
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.getheads()
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 except:
raise norepo
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.rev = rev
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 def mtnrun(self, *args, **kwargs):
kwargs['d'] = self.path
return self.run0('automate', *args, **kwargs)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def mtnloadmanifest(self, rev):
if self.manifest_rev == rev:
return
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.manifest = self.mtnrun("get_manifest_of", rev).split("\n\n")
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.manifest_rev = rev
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.files = {}
self.dirs = {}
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 for e in self.manifest:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 m = self.file_re.match(e)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 if m:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 attr = ""
name = m.group(1)
node = m.group(2)
if self.attr_execute_re.match(e):
attr += "x"
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.files[name] = (node, attr)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 m = self.dir_re.match(e)
if m:
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.dirs[m.group(1)] = True
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
def mtnisfile(self, name, rev):
# a non-file could be a directory or a deleted or renamed file
self.mtnloadmanifest(rev)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.files[name]
return True
except KeyError:
return False
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def mtnisdir(self, name, rev):
self.mtnloadmanifest(rev)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 self.dirs[name]
return True
except KeyError:
return False
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def mtngetcerts(self, rev):
certs = {"author":"<missing>", "date":"<missing>",
"changelog":"<missing>", "branch":"<missing>"}
David Reiss
convert.monotone: fix quotes and backslashes in change descriptions.
r6632 cert_list = self.mtnrun("certs", rev).split('\n\n key "')
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 for e in cert_list:
m = self.cert_re.match(e)
if m:
David Reiss
convert.monotone: fix quotes and backslashes in change descriptions.
r6632 name, value = m.groups()
value = value.replace(r'\"', '"')
value = value.replace(r'\\', '\\')
certs[name] = value
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 return certs
def mtnrenamefiles(self, files, fromdir, todir):
renamed = {}
for tofile in files:
suffix = tofile.lstrip(todir)
if todir + suffix == tofile:
renamed[tofile] = (fromdir + suffix).lstrip("/")
return renamed
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 # implement the converter_source interface:
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def getheads(self):
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 if not self.rev:
return self.mtnrun("leaves").splitlines()
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 else:
return [self.rev]
def getchanges(self, rev):
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
revision = self.mtnrun("get_revision", rev).split("\n\n")
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 files = {}
copies = {}
for e in revision:
m = self.add_file_re.match(e)
if m:
files[m.group(1)] = rev
m = self.patch_re.match(e)
if m:
files[m.group(1)] = rev
# Delete/rename is handled later when the convert engine
# discovers an IOError exception from getfile,
# but only if we add the "from" file to the list of changes.
Patrick Mezard
convert: record deleted files in monotone source
r6376 m = self.delete_re.match(e)
if m:
files[m.group(1)] = rev
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 m = self.rename_re.match(e)
if m:
toname = m.group(2)
fromname = m.group(1)
if self.mtnisfile(toname, rev):
copies[toname] = fromname
files[toname] = rev
files[fromname] = rev
if self.mtnisdir(toname, rev):
renamed = self.mtnrenamefiles(self.files, fromname, toname)
for tofile, fromfile in renamed.items():
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 self.ui.debug (_("copying file in renamed dir from '%s' to '%s'") % (fromfile, tofile), '\n')
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 files[tofile] = rev
for fromfile in renamed.values():
files[fromfile] = rev
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 return (files.items(), copies)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
def getmode(self, name, rev):
self.mtnloadmanifest(rev)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 node, attr = self.files[name]
return attr
except KeyError:
return ""
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 def getfile(self, name, rev):
if not self.mtnisfile(name, rev):
raise IOError() # file was deleted or renamed
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
return self.mtnrun("get_file_of", name, r=rev)
except:
raise IOError() # file was deleted or renamed
def getcommit(self, rev):
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 certs = self.mtngetcerts(rev)
return commit(
author=certs["author"],
date=util.datestr(util.strdate(certs["date"], "%Y-%m-%dT%H:%M:%S")),
desc=certs["changelog"],
rev=rev,
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 parents=self.mtnrun("parents", rev).splitlines(),
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 branch=certs["branch"])
def gettags(self):
tags = {}
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 for e in self.mtnrun("tags").split("\n\n"):
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 m = self.tag_re.match(e)
if m:
tags[m.group(1)] = m.group(2)
return tags
def getchangedfiles(self, rev, i):
# This function is only needed to support --filemap
# ... and we don't support that
raise NotImplementedError()