##// END OF EJS Templates
compression: introduce a `storage.revlog.zstd.level` configuration...
compression: introduce a `storage.revlog.zstd.level` configuration This option control the zstd compression level used when compressing revlog chunk. The usage of zstd for revlog compression has not graduated from experimental yet, but we intend to fix that soon. The option name for the compression level is more straight forward to pick, so this changesets comes first. Having a dedicated option for each compression engine is useful because they don't support the same range of values. I ran the same measurement as for the zlib compression level (in the parent changesets). The variation in repository size is stay mostly in the same (small) range. The "read/write" performance see smallish variation, but are overall much better than zlib. Write performance show the same tend of having better write performance for when reaching high-end compression. Again, we don't intend to change the default zstd compression level (currently: 3) in this series. However this is worth investigating in the future. The Performance comparison of zlib vs zstd is quite impressive. The repository size stay in the same range, but the performance are much better in all situations. Comparison summary ================== We are looking at: - performance range for zlib - performance range for zstd - comparison of default zstd (level-3) to default zlib (level 6) - comparison of the slowest zstd time to the fastest zlib time Read performance: ----------------- | zlib | zstd | cmp | f2s mercurial | 0.170159 - 0.189219 | 0.144127 - 0.149624 | 80% | 88% pypy | 2.679217 - 2.768691 | 1.532317 - 1.705044 | 60% | 63% netbeans | 122.477027 - 141.620281 | 72.996346 - 89.731560 | 58% | 73% mozilla | 147.867662 - 170.572118 | 91.700995 - 105.853099 | 56% | 71% Write performance: ------------------ | zlib | zstd | cmp | f2s mercurial | 53.250304 - 56.2936129 | 40.877025 - 45.677286 | 75% | 86% pypy | 460.721984 - 476.589918 | 270.545409 - 301.002219 | 63% | 65% netbeans | 520.560316 - 715.930400 | 370.356311 - 428.329652 | 55% | 82% mozilla | 739.803002 - 987.056093 | 505.152906 - 591.930683 | 57% | 80% Raw data -------- repo alg lvl .hg/store size 00manifest.d read write mercurial zlib 1 49,402,813 5,963,475 0.170159 53.250304 mercurial zlib 6 47,197,397 5,875,730 0.182820 56.264320 mercurial zlib 9 47,121,596 5,849,781 0.189219 56.293612 mercurial zstd 1 49,737,084 5,966,355 0.144127 40.877025 mercurial zstd 3 48,961,867 5,895,208 0.146376 42.268142 mercurial zstd 5 48,200,592 5,938,676 0.149624 43.162875 mercurial zstd 10 47,833,520 5,913,353 0.145185 44.012489 mercurial zstd 15 47,314,604 5,728,679 0.147686 45.677286 mercurial zstd 20 47,330,502 5,830,539 0.145789 45.025407 mercurial zstd 22 47,330,076 5,830,539 0.143996 44.690460 pypy zlib 1 370,830,572 28,462,425 2.679217 460.721984 pypy zlib 6 340,112,317 27,648,747 2.768691 467.537158 pypy zlib 9 338,360,736 27,639,003 2.763495 476.589918 pypy zstd 1 362,377,479 27,916,214 1.532317 270.545409 pypy zstd 3 354,137,693 27,905,988 1.686718 294.951509 pypy zstd 5 342,640,043 27,655,774 1.705044 301.002219 pypy zstd 10 334,224,327 27,164,493 1.567287 285.186239 pypy zstd 15 329,000,363 26,645,965 1.637729 299.561332 pypy zstd 20 324,534,039 26,199,547 1.526813 302.149827 pypy zstd 22 324,530,595 26,198,932 1.525718 307.821218 netbeans zlib 1 1,281,847,810 165,495,457 122.477027 520.560316 netbeans zlib 6 1,205,284,353 159,161,207 139.876147 715.930400 netbeans zlib 9 1,197,135,671 155,034,586 141.620281 678.297064 netbeans zstd 1 1,259,581,737 160,840,613 72.996346 370.356311 netbeans zstd 3 1,232,978,122 157,691,551 81.622317 396.733087 netbeans zstd 5 1,208,034,075 160,246,880 83.080549 364.342626 netbeans zstd 10 1,188,624,176 156,083,417 79.323935 403.594602 netbeans zstd 15 1,176,973,589 153,859,477 89.731560 428.329652 netbeans zstd 20 1,162,958,258 151,147,535 82.842667 392.335349 netbeans zstd 22 1,162,707,029 151,150,220 82.565695 402.840655 mozilla zlib 1 2,775,497,186 298,527,987 147.867662 751.263721 mozilla zlib 6 2,596,856,420 286,597,671 170.572118 987.056093 mozilla zlib 9 2,587,542,494 287,018,264 163.622338 739.803002 mozilla zstd 1 2,723,159,348 286,617,532 91.700995 570.042751 mozilla zstd 3 2,665,055,001 286,152,013 95.240155 561.412805 mozilla zstd 5 2,607,819,817 288,060,030 101.978048 505.152906 mozilla zstd 10 2,558,761,085 283,967,648 104.113481 497.771202 mozilla zstd 15 2,526,216,060 275,581,300 105.853099 591.930683 mozilla zstd 20 2,485,114,806 266,478,859 95.268795 576.515389 mozilla zstd 22 2,484,869,080 266,456,505 94.429282 572.785537

File last commit:

r41714:83d62df2 default
r42211:bb271ec2 default
Show More
monotone.py
373 lines | 13.1 KiB | text/x-python | PythonLexer
Martin Geisler
convert: add copyright and license headers to back-ends
r8250 # monotone.py - monotone support for the convert extension
#
# Copyright 2008, 2009 Mikkel Fahnoe Jorgensen <mikkel@dvide.com> and
# others
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
timeless
convert: monotone use absolute_import
r28372 from __future__ import absolute_import
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
timeless
convert: monotone use absolute_import
r28372 import os
import re
Yuya Nishihara
py3: move up symbol imports to enforce import-checker rules...
r29205 from mercurial.i18n import _
timeless
convert: monotone use absolute_import
r28372 from mercurial import (
error,
Pulkit Goyal
py3: use pycompat.byteskwargs in hgext/convert/...
r36347 pycompat,
timeless
convert: monotone use absolute_import
r28372 )
Boris Feld
util: extract all date-related utils in utils/dateutil module...
r36625 from mercurial.utils import dateutil
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
timeless
convert: monotone use absolute_import
r28372 from . import common
class monotone_source(common.converter_source, common.commandline):
Matt Harbison
convert: save an indicator of the repo type for sources and sinks...
r35168 def __init__(self, ui, repotype, path=None, revs=None):
common.converter_source.__init__(self, ui, repotype, path, revs)
Durham Goode
convert: add support for specifying multiple revs...
r25748 if revs and len(revs) > 1:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('monotone source does not support specifying '
Durham Goode
convert: add support for specifying multiple revs...
r25748 'multiple revs'))
timeless
convert: monotone use absolute_import
r28372 common.commandline.__init__(self, ui, 'mtn')
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 self.ui = ui
self.path = path
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 self.automatestdio = False
Durham Goode
convert: add support for specifying multiple revs...
r25748 self.revs = revs
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
timeless
convert: monotone use absolute_import
r28372 norepo = common.NoRepo(_("%s does not look like a monotone repository")
% path)
Matt Mackall
convert: attempt to check repo type before checking for tool
r7973 if not os.path.exists(os.path.join(path, '_MTN')):
Patrick Mezard
convert/mtn: allow monotone database files as sources
r8052 # Could be a monotone repository (SQLite db file)
try:
Pulkit Goyal
py3: replace file() with open()...
r36412 f = open(path, 'rb')
Matt Mackall
hgext: fixup a couple missed file().read() instances
r14179 header = f.read(16)
f.close()
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except IOError:
Patrick Mezard
convert/mtn: allow monotone database files as sources
r8052 header = ''
if header != 'SQLite format 3\x00':
raise norepo
Matt Mackall
convert: attempt to check repo type before checking for tool
r7973
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 # regular expressions for parsing monotone output
Pulkit Goyal
py3: make sure regexes are bytes...
r36411 space = br'\s*'
name = br'\s+"((?:\\"|[^"])*)"\s*'
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 value = name
Pulkit Goyal
py3: make sure regexes are bytes...
r36411 revision = br'\s+\[(\w+)\]\s*'
lines = br'(?:.|\n)+'
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
self.dir_re = re.compile(space + "dir" + name)
Matt Mackall
many, many trivial check-code fixups
r10282 self.file_re = re.compile(space + "file" + name +
"content" + revision)
self.add_file_re = re.compile(space + "add_file" + name +
"content" + revision)
self.patch_re = re.compile(space + "patch" + name +
"from" + revision + "to" + revision)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 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)
Matt Mackall
many, many trivial check-code fixups
r10282 self.tag_re = re.compile(space + "tag" + name + "revision" +
revision)
self.cert_re = re.compile(lines + space + "name" + name +
"value" + value)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
attr = space + "file" + lines + space + "attr" + space
Matt Mackall
many, many trivial check-code fixups
r10282 self.attr_execute_re = re.compile(attr + '"mtn:execute"' +
space + '"true"')
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
# 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
timeless
convert: monotone use absolute_import
r28372 common.checktool('mtn', abort=False)
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
def mtnrun(self, *args, **kwargs):
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 if self.automatestdio:
return self.mtnrunstdio(*args, **kwargs)
else:
return self.mtnrunsingle(*args, **kwargs)
def mtnrunsingle(self, *args, **kwargs):
Pulkit Goyal
py3: add a r'' prefix to prevent transformer from adding b''...
r36348 kwargs[r'd'] = self.path
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 return self.run0('automate', *args, **kwargs)
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 def mtnrunstdio(self, *args, **kwargs):
# Prepare the command in automate stdio format
Pulkit Goyal
py3: use pycompat.byteskwargs in hgext/convert/...
r36347 kwargs = pycompat.byteskwargs(kwargs)
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 command = []
for k, v in kwargs.iteritems():
Pulkit Goyal
py3: use '%d' instead of '%s' for integers...
r41495 command.append("%d:%s" % (len(k), k))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 if v:
Pulkit Goyal
py3: use '%d' instead of '%s' for integers...
r41495 command.append("%d:%s" % (len(v), v))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 if command:
command.insert(0, 'o')
command.append('e')
command.append('l')
for arg in args:
Pulkit Goyal
montone: fix addition to list by using .append() instead of '+'...
r41644 command.append("%d:%s" % (len(arg), arg))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 command.append('e')
command = ''.join(command)
self.ui.debug("mtn: sending '%s'\n" % command)
self.mtnwritefp.write(command)
self.mtnwritefp.flush()
return self.mtnstdioreadcommandoutput(command)
def mtnstdioreadpacket(self):
read = None
commandnbr = ''
while read != ':':
read = self.mtnreadfp.read(1)
if not read:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('bad mtn packet - no end of commandnbr'))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 commandnbr += read
commandnbr = commandnbr[:-1]
stream = self.mtnreadfp.read(1)
if stream not in 'mewptl':
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('bad mtn packet - bad stream type %s') % stream)
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760
read = self.mtnreadfp.read(1)
if read != ':':
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('bad mtn packet - no divider before size'))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760
read = None
lengthstr = ''
while read != ':':
read = self.mtnreadfp.read(1)
if not read:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('bad mtn packet - no end of packet size'))
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 lengthstr += read
try:
Pulkit Goyal
py3: use pycompat.long in hgext/convert/monotone.py...
r41666 length = pycompat.long(lengthstr[:-1])
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 except TypeError:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('bad mtn packet - bad packet size %s')
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 % lengthstr)
read = self.mtnreadfp.read(length)
if len(read) != length:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_("bad mtn packet - unable to read full packet "
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 "read %s of %s") % (len(read), length))
return (commandnbr, stream, length, read)
def mtnstdioreadcommandoutput(self, command):
Daniel Atallah
convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)...
r13792 retval = []
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 while True:
commandnbr, stream, length, output = self.mtnstdioreadpacket()
Pulkit Goyal
py3: use '%d' for integers instead of '%s'...
r41713 self.ui.debug('mtn: read packet %s:%s:%d\n' %
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 (commandnbr, stream, length))
if stream == 'l':
# End of command
if output != '0':
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_("mtn command '%s' returned %s") %
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 (command, output))
break
elif stream in 'ew':
# Error, warning output
self.ui.warn(_('%s error:\n') % self.command)
self.ui.warn(output)
elif stream == 'p':
# Progress messages
self.ui.debug('mtn: ' + output)
elif stream == 'm':
# Main stream - command output
Daniel Atallah
convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)...
r13792 retval.append(output)
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760
Daniel Atallah
convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)...
r13792 return ''.join(retval)
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760
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)
Benoit Boissinot
convert: cleanups in monotone converter
r8458 return name in self.files
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)
Benoit Boissinot
convert: cleanups in monotone converter
r8458 return name in self.dirs
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>"}
Patrick Mezard
convert/mtn: handle change in mtn 0.45 certs output
r9823 certlist = self.mtnrun("certs", rev)
# mtn < 0.45:
# key "test@selenic.com"
# mtn >= 0.45:
# key [ff58a7ffb771907c4ff68995eada1c4da068d328]
Gregory Szorc
convert: use raw string for regular expressions...
r41678 certlist = re.split(br'\n\n key ["\[]', certlist)
Patrick Mezard
convert/mtn: handle change in mtn 0.45 certs output
r9823 for e in certlist:
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 m = self.cert_re.match(e)
if m:
David Reiss
convert.monotone: fix quotes and backslashes in change descriptions.
r6632 name, value = m.groups()
Pulkit Goyal
py3: add some b'' prefixes in hgext/convert/monotone.py...
r41714 value = value.replace(br'\"', '"')
value = value.replace(br'\\', '\\')
David Reiss
convert.monotone: fix quotes and backslashes in change descriptions.
r6632 certs[name] = value
Paul Aurich
convert/mtn: handle subsecond commit dates (issue1616)
r8101 # Monotone may have subsecond dates: 2005-02-05T09:39:12.364306
Paul Aurich
convert/mtn: mtn does not record timezones, mark dates as UTC (issue1624)
r8125 # and all times are stored in UTC
certs["date"] = certs["date"].split('.')[0] + " UTC"
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 return certs
# 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):
Durham Goode
convert: add support for specifying multiple revs...
r25748 if not self.revs:
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 return self.mtnrun("leaves").splitlines()
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 else:
Durham Goode
convert: add support for specifying multiple revs...
r25748 return self.revs
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
Mads Kiilerich
convert: introduce --full for converting all files...
r22300 def getchanges(self, rev, full):
if full:
timeless@mozdev.org
grammar: use does instead of do where appropriate
r26779 raise error.Abort(_("convert from monotone does not support "
"--full"))
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 revision = self.mtnrun("get_revision", rev).split("\n\n")
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 files = {}
Patrick Mezard
convert/mtn: handle files moved in a moved directory (issue1619/2)
r8123 ignoremove = {}
Patrick Mezard
convert/mtn: handle new files in moved directories (issue1619)...
r8099 renameddirs = []
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 copies = {}
for e in revision:
m = self.add_file_re.match(e)
if m:
files[m.group(1)] = rev
Patrick Mezard
convert/mtn: handle files moved in a moved directory (issue1619/2)
r8123 ignoremove[m.group(1)] = rev
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 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):
Patrick Mezard
convert/mtn: handle files moved in a moved directory (issue1619/2)
r8123 ignoremove[toname] = 1
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 copies[toname] = fromname
files[toname] = rev
files[fromname] = rev
Patrick Mezard
convert/mtn: handle new files in moved directories (issue1619)...
r8099 elif self.mtnisdir(toname, rev):
renameddirs.append((fromname, toname))
# Directory renames can be handled only once we have recorded
# all new files
for fromdir, todir in renameddirs:
renamed = {}
for tofile in self.files:
Patrick Mezard
convert/mtn: handle files moved in a moved directory (issue1619/2)
r8123 if tofile in ignoremove:
Patrick Mezard
convert/mtn: handle new files in moved directories (issue1619)...
r8099 continue
if tofile.startswith(todir + '/'):
renamed[tofile] = fromdir + tofile[len(todir):]
Patrick Mezard
convert/mtn: handle directory move into moved directory (issue1619/3)
r8124 # Avoid chained moves like:
# d1(/a) => d3/d1(/a)
# d2 => d3
ignoremove[tofile] = 1
Patrick Mezard
convert/mtn: handle new files in moved directories (issue1619)...
r8099 for tofile, fromfile in renamed.items():
Patrick Mezard
Merge with crew-stable
r8100 self.ui.debug (_("copying file in renamed directory "
"from '%s' to '%s'")
Patrick Mezard
convert/mtn: handle new files in moved directories (issue1619)...
r8099 % (fromfile, tofile), '\n')
files[tofile] = rev
copies[tofile] = fromfile
for fromfile in renamed.values():
files[fromfile] = rev
Mads Kiilerich
convert: optimize convert of files that are unmodified from p2 in merges...
r24395 return (files.items(), copies, set())
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):
Mads Kiilerich
convert: use None value for missing files instead of overloading IOError...
r22296 return None, None
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 try:
Patrick Mezard
convert: merge sources getmode() into getfile()
r11134 data = self.mtnrun("get_file_of", name, r=rev)
Brodie Rao
cleanup: replace naked excepts with except Exception: ...
r16689 except Exception:
Mads Kiilerich
convert: use None value for missing files instead of overloading IOError...
r22296 return None, None
Patrick Mezard
convert: merge sources getmode() into getfile()
r11134 self.mtnloadmanifest(rev)
node, attr = self.files.get(name, (None, ""))
return data, attr
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307
def getcommit(self, rev):
Daniel Atallah
convert/mtn: convert suspended branches as closed branches...
r13779 extra = {}
certs = self.mtngetcerts(rev)
if certs.get('suspend') == certs["branch"]:
Mads Kiilerich
convert: when converting from monotone, use the number 1 for close in extras...
r24178 extra['close'] = 1
Boris Feld
util: extract all date-related utils in utils/dateutil module...
r36625 dateformat = "%Y-%m-%dT%H:%M:%S"
timeless
convert: monotone use absolute_import
r28372 return common.commit(
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 author=certs["author"],
Boris Feld
util: extract all date-related utils in utils/dateutil module...
r36625 date=dateutil.datestr(dateutil.strdate(certs["date"], dateformat)),
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306 desc=certs["changelog"],
rev=rev,
Mikkel Fahnøe Jørgensen
cleanup monotone conversion and use commandline class
r6307 parents=self.mtnrun("parents", rev).splitlines(),
Daniel Atallah
convert/mtn: convert suspended branches as closed branches...
r13779 branch=certs["branch"],
extra=extra)
Mikkel Fahnøe Jørgensen
initial version of monotone source for convert extension
r6306
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
Brodie Rao
cleanup: "raise SomeException()" -> "raise SomeException"
r16687 raise NotImplementedError
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760
def before(self):
# Check if we have a new enough version to use automate stdio
try:
versionstr = self.mtnrunsingle("interface_version")
version = float(versionstr)
except Exception:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_("unable to determine mtn automate interface "
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 "version"))
if version >= 12.0:
self.automatestdio = True
Pulkit Goyal
py3: use "%f" for floats instead of "%s"...
r39655 self.ui.debug("mtn automate version %f - using automate stdio\n" %
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 version)
# launch the long-running automate stdio process
self.mtnwritefp, self.mtnreadfp = self._run2('automate', 'stdio',
'-d', self.path)
# read the headers
read = self.mtnreadfp.readline()
if read != 'format-version: 2\n':
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('mtn automate stdio header unexpected: %s')
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 % read)
while read != '\n':
read = self.mtnreadfp.readline()
if not read:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_("failed to reach end of mtn automate "
Daniel Atallah
convert/mtn: add support for using monotone's "automate stdio" when available...
r13760 "stdio headers"))
else:
self.ui.debug("mtn automate version %s - not using automate stdio "
"(automate >= 12.0 - mtn >= 0.46 is needed)\n" % version)
def after(self):
if self.automatestdio:
self.mtnwritefp.close()
self.mtnwritefp = None
self.mtnreadfp.close()
self.mtnreadfp = None