annotate hgsubversion/util.py @ 1025:2bf860f327e2

util: move pickle_atomic from svnmeta to util
author David Schleimer <dschleimer@fb.com>
date Tue, 21 May 2013 16:34:06 -0700
parents f0ebc7113429
children 2c64453f98a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1025
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
1 import cPickle as pickle
889
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
2 import errno
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
3 import re
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4 import os
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
5 import urllib
951
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
6 from collections import deque
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7
620
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
8 from mercurial import cmdutil
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
9 from mercurial import error
196
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 195
diff changeset
10 from mercurial import hg
34
50d55c3e0d85 Some refactors of the previous change, including transparent upgrade of old-style pickled dictionaries.
Augie Fackler <durin42@gmail.com>
parents: 19
diff changeset
11 from mercurial import node
250
79349fd04836 utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents: 249
diff changeset
12 from mercurial import util as hgutil
34
50d55c3e0d85 Some refactors of the previous change, including transparent upgrade of old-style pickled dictionaries.
Augie Fackler <durin42@gmail.com>
parents: 19
diff changeset
13
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
14 try:
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
15 from mercurial import revset
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
16 except ImportError:
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
17 pass
196
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 195
diff changeset
18
889
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
19 import maps
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
20
764
bc5c176b63eb svnexternals: support pushing subrepo based externals
Patrick Mezard <pmezard@gmail.com>
parents: 760
diff changeset
21 ignoredfiles = set(['.hgtags', '.hgsvnexternals', '.hgsub', '.hgsubstate'])
760
bf1c27a89c76 Extract files not to be pushed in util
Patrick Mezard <pmezard@gmail.com>
parents: 754
diff changeset
22
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
23 b_re = re.compile(r'^\+\+\+ b\/([^\n]*)', re.MULTILINE)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
24 a_re = re.compile(r'^--- a\/([^\n]*)', re.MULTILINE)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
25 devnull_re = re.compile(r'^([-+]{3}) /dev/null', re.MULTILINE)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
26 header_re = re.compile(r'^diff --git .* b\/(.*)', re.MULTILINE)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
27 newfile_devnull_re = re.compile(r'^--- /dev/null\n\+\+\+ b/([^\n]*)',
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
28 re.MULTILINE)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
29
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
30
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
31 def formatrev(rev):
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
32 if rev == -1:
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
33 return '\t(working copy)'
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
34 return '\t(revision %d)' % rev
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
35
973
21197f5ee9de expand configured paths
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 952
diff changeset
36 def configpath(ui, name):
21197f5ee9de expand configured paths
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 952
diff changeset
37 path = ui.config('hgsubversion', name)
21197f5ee9de expand configured paths
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 952
diff changeset
38 return path and hgutil.expandpath(path)
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
39
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
40 def filterdiff(diff, oldrev, newrev):
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
41 diff = newfile_devnull_re.sub(r'--- \1\t(revision 0)' '\n'
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
42 r'+++ \1\t(working copy)',
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
43 diff)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
44 oldrev = formatrev(oldrev)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
45 newrev = formatrev(newrev)
832
e9af7eba88db globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents: 828
diff changeset
46 diff = a_re.sub(r'--- \1' + oldrev, diff)
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
47 diff = b_re.sub(r'+++ \1' + newrev, diff)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
48 diff = devnull_re.sub(r'\1 /dev/null\t(working copy)', diff)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
49 diff = header_re.sub(r'Index: \1' + '\n' + ('=' * 67), diff)
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
50 return diff
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
51
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
52
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
53 def parentrev(ui, repo, meta, hashes):
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
54 """Find the svn parent revision of the repo's dirstate.
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
55 """
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
56 workingctx = repo.parents()[0]
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
57 outrev = outgoing_revisions(repo, hashes, workingctx.node())
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
58 if outrev:
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
59 workingctx = repo[outrev[-1]].parents()[0]
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
60 return workingctx
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
61
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
62
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
63 def islocalrepo(url):
806
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
64 path = str(url) # convert once up front
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
65 if path.startswith('file:///'):
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
66 prefixlen = len('file://')
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
67 elif path.startswith('file:/'):
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
68 prefixlen = len('file:')
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
69 else:
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
70 return False
806
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
71 if '#' in path.split('/')[-1]: # strip off #anchor
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
72 path = path[:path.rfind('#')]
ec074ebaa80f util: make islocalrepo() a bit more tolerant with file:// urls
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 805
diff changeset
73 path = url[prefixlen:]
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
74 path = urllib.url2pathname(path).replace(os.sep, '/')
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
75 while '/' in path:
832
e9af7eba88db globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents: 828
diff changeset
76 if reduce(lambda x, y: x and y,
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
77 map(lambda p: os.path.exists(os.path.join(path, p)),
832
e9af7eba88db globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents: 828
diff changeset
78 ('hooks', 'format', 'db',))):
440
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
79 return True
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
80 path = path.rsplit('/', 1)[0]
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
81 return False
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
82
80909328aef1 move remaining cmdutils into util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 431
diff changeset
83
196
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 195
diff changeset
84 def version(ui):
509
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
85 """Return version information if available."""
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
86 try:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
87 import __version__
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
88 return __version__.version
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
89 except ImportError:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
90 try:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
91 dn = os.path.dirname
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
92 repo = hg.repository(ui, dn(dn(__file__)))
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
93 ver = repo.dirstate.parents()[0]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
94 return node.hex(ver)[:12]
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
95 except:
ac9c9e1a8022 setup: write out version info
Augie Fackler <durin42@gmail.com>
parents: 497
diff changeset
96 return 'unknown'
196
77812f98e250 Add a naive hg svn version command that works as long as hgsubversion is run from a checkout.
Augie Fackler <durin42@gmail.com>
parents: 195
diff changeset
97
0
f2636cfed115 Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
98
469
5567af673f83 Revive svn+http(s) URLs support (issue94)
Patrick Mezard <pmezard@gmail.com>
parents: 465
diff changeset
99 def normalize_url(url):
754
caa527346a0f svncommands: abort on missing metadata or Subversion URL (fixes #226)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 752
diff changeset
100 if not url:
caa527346a0f svncommands: abort on missing metadata or Subversion URL (fixes #226)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 752
diff changeset
101 return url
475
15443c592f7a Remove the svn+ from svn+https urls before calling the Subversion API. This was already being done for svn+http urls.
David Stanek <dstanek@dstanek.com>
parents: 469
diff changeset
102 if url.startswith('svn+http://') or url.startswith('svn+https://'):
469
5567af673f83 Revive svn+http(s) URLs support (issue94)
Patrick Mezard <pmezard@gmail.com>
parents: 465
diff changeset
103 url = url[4:]
555
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
104 url, revs, checkout = parseurl(url)
284
f8f9a2993705 Implement parseurl support (#revision in repository urls)
Martijn Pieters <mj@zopatista.com>
parents: 281
diff changeset
105 url = url.rstrip('/')
f8f9a2993705 Implement parseurl support (#revision in repository urls)
Martijn Pieters <mj@zopatista.com>
parents: 281
diff changeset
106 if checkout:
f8f9a2993705 Implement parseurl support (#revision in repository urls)
Martijn Pieters <mj@zopatista.com>
parents: 281
diff changeset
107 url = '%s#%s' % (url, checkout)
f8f9a2993705 Implement parseurl support (#revision in repository urls)
Martijn Pieters <mj@zopatista.com>
parents: 281
diff changeset
108 return url
140
9ffde8662967 util: Add a command to normalize svn urls and use it in a couple of places. Test that it works and prevents failed assertions.
Augie Fackler <durin42@gmail.com>
parents: 124
diff changeset
109
828
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
110
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
111 def load_string(file_path, default=None, limit=1024):
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
112 if not os.path.exists(file_path):
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
113 return default
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
114 try:
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
115 f = open(file_path, 'r')
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
116 ret = f.read(limit)
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
117 f.close()
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
118 except:
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
119 return default
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
120 if ret == '':
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
121 return default
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
122 return ret
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
123
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
124
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
125 def save_string(file_path, string):
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
126 if string is None:
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
127 string = ""
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
128 f = open(file_path, 'wb')
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
129 f.write(str(string))
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
130 f.close()
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
131
1025
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
132 def pickle_atomic(data, file_path):
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
133 """pickle some data to a path atomically.
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
134
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
135 This is present because I kept corrupting my revmap by managing to hit ^C
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
136 during the pickle of that file.
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
137 """
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
138 f = hgutil.atomictempfile(file_path, 'w+b', 0644)
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
139 pickle.dump(data, f)
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
140 # Older versions of hg have .rename() instead of .close on
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
141 # atomictempfile.
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
142 if getattr(hgutil.atomictempfile, 'rename', False):
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
143 f.rename()
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
144 else:
2bf860f327e2 util: move pickle_atomic from svnmeta to util
David Schleimer <dschleimer@fb.com>
parents: 1010
diff changeset
145 f.close()
828
016f11e5f189 utils: add {save,load}_string since this is a fairly common idiom
Yonggang Luo <luoyonggang@gmail.com>
parents: 806
diff changeset
146
580
35529f736fa2 util: add progress wrapper to maintain 1.3 support
Augie Fackler <durin42@gmail.com>
parents: 555
diff changeset
147 # TODO remove when we drop 1.3 support
35529f736fa2 util: add progress wrapper to maintain 1.3 support
Augie Fackler <durin42@gmail.com>
parents: 555
diff changeset
148 def progress(ui, *args, **kwargs):
35529f736fa2 util: add progress wrapper to maintain 1.3 support
Augie Fackler <durin42@gmail.com>
parents: 555
diff changeset
149 if getattr(ui, 'progress', False):
35529f736fa2 util: add progress wrapper to maintain 1.3 support
Augie Fackler <durin42@gmail.com>
parents: 555
diff changeset
150 return ui.progress(*args, **kwargs)
140
9ffde8662967 util: Add a command to normalize svn urls and use it in a couple of places. Test that it works and prevents failed assertions.
Augie Fackler <durin42@gmail.com>
parents: 124
diff changeset
151
620
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
152 # TODO remove when we drop 1.5 support
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
153 remoteui = getattr(cmdutil, 'remoteui', getattr(hg, 'remoteui', False))
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
154 if not remoteui:
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
155 raise ImportError('Failed to import remoteui')
8acae2416ec1 wrappers: cope with remoteui move to hg (hg cset d1908cb95a82)
Augie Fackler <durin42@gmail.com>
parents: 619
diff changeset
156
555
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
157 def parseurl(url, heads=[]):
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
158 parsed = hg.parseurl(url, heads)
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
159 if len(parsed) == 3:
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
160 # old hg, remove when we can be 1.5-only
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
161 svn_url, heads, checkout = parsed
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
162 else:
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
163 svn_url, heads = parsed
619
8beb5e28c23b util: handle change to hg.parseurl from 3d6915f5a2bb
Augie Fackler <durin42@gmail.com>
parents: 582
diff changeset
164 if isinstance(heads, tuple) and len(heads) == 2:
8beb5e28c23b util: handle change to hg.parseurl from 3d6915f5a2bb
Augie Fackler <durin42@gmail.com>
parents: 582
diff changeset
165 # hg 1.6 or later
8beb5e28c23b util: handle change to hg.parseurl from 3d6915f5a2bb
Augie Fackler <durin42@gmail.com>
parents: 582
diff changeset
166 _junk, heads = heads
555
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
167 if heads:
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
168 checkout = heads[0]
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
169 else:
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
170 checkout = None
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
171 return svn_url, heads, checkout
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
172
cbd7065e6ab4 util: add parseurl method to abstract away differences between 1.4 and 1.5
Augie Fackler <durin42@gmail.com>
parents: 509
diff changeset
173
39
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
174 class PrefixMatch(object):
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
175 def __init__(self, prefix):
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
176 self.p = prefix
140
9ffde8662967 util: Add a command to normalize svn urls and use it in a couple of places. Test that it works and prevents failed assertions.
Augie Fackler <durin42@gmail.com>
parents: 124
diff changeset
177
39
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
178 def files(self):
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
179 return []
140
9ffde8662967 util: Add a command to normalize svn urls and use it in a couple of places. Test that it works and prevents failed assertions.
Augie Fackler <durin42@gmail.com>
parents: 124
diff changeset
180
39
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
181 def __call__(self, fn):
b3c7b844b782 Some more fixes of cases discovered in the melange repo. If anyone knows how I can reproduce a "replaced" state in Subversion, I'd love to be able to make a real test case for this code.
Augie Fackler <durin42@gmail.com>
parents: 34
diff changeset
182 return fn.startswith(self.p)
99
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
183
416
cd6317fe70be invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 410
diff changeset
184 def outgoing_revisions(repo, reverse_map, sourcerev):
99
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
185 """Given a repo and an hg_editor, determines outgoing revisions for the
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
186 current working copy state.
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
187 """
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
188 outgoing_rev_hashes = []
152
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
189 if sourcerev in reverse_map:
99
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
190 return
152
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
191 sourcerev = repo[sourcerev]
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
192 while (not sourcerev.node() in reverse_map
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
193 and sourcerev.node() != node.nullid):
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
194 outgoing_rev_hashes.append(sourcerev.node())
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
195 sourcerev = sourcerev.parents()
221
ced45b753ba7 util: better error messages when finding svn parent of a revision.
Augie Fackler <durin42@gmail.com>
parents: 198
diff changeset
196 if len(sourcerev) != 1:
250
79349fd04836 utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents: 249
diff changeset
197 raise hgutil.Abort("Sorry, can't find svn parent of a merge revision.")
152
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
198 sourcerev = sourcerev[0]
1fde85a10f9e push: Fix the bad implementation that required modifying the dirstate to push.
Augie Fackler <durin42@gmail.com>
parents: 140
diff changeset
199 if sourcerev.node() != node.nullid:
99
1da7aafdd323 Refactored outgoing_revisions into util where it really belongs.
Augie Fackler <durin42@gmail.com>
parents: 39
diff changeset
200 return outgoing_rev_hashes
124
291925677a9f tag_repo: remove gentags command, extend repo.tags(), HgChangeEditor now takes either repo or repo_path
Luke Opperman <luke@loppear.com>
parents: 115
diff changeset
201
805
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
202 def outgoing_common_and_heads(repo, reverse_map, sourcerev):
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
203 """Given a repo and an hg_editor, determines outgoing revisions for the
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
204 current working copy state. Returns a tuple (common, heads) like
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
205 discovery.findcommonoutgoing does.
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
206 """
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
207 if sourcerev in reverse_map:
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
208 return ([sourcerev], [sourcerev]) # nothing outgoing
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
209 sourcecx = repo[sourcerev]
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
210 while (not sourcecx.node() in reverse_map
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
211 and sourcecx.node() != node.nullid):
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
212 ps = sourcecx.parents()
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
213 if len(ps) != 1:
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
214 raise hgutil.Abort("Sorry, can't find svn parent of a merge revision.")
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
215 sourcecx = ps[0]
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
216 if sourcecx.node() != node.nullid:
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
217 return ([sourcecx.node()], [sourcerev])
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
218 return ([sourcerev], [sourcerev]) # nothing outgoing
a3f727c41c1d Fix breakage introduced by discovery refactoring
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 794
diff changeset
219
769
cc1d4aa3ba41 configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 764
diff changeset
220 def default_commit_msg(ui):
770
4dfc41b15d9a make the default substition for an empty commit description the empty string
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 769
diff changeset
221 return ui.config('hgsubversion', 'defaultmessage', '')
186
6266ba36ee15 Create patch to make normal output much less verbose…
Dan Villiom Podlaski Christiansen <danchr@cs.au.dk>
parents: 185
diff changeset
222
198
df4611050286 Output consolidation; decrease the ‘Fetching...’ message to debug level.
Dan Villiom Podlaski Christiansen <danchr@cs.au.dk>
parents: 196
diff changeset
223 def describe_commit(ui, h, b):
df4611050286 Output consolidation; decrease the ‘Fetching...’ message to debug level.
Dan Villiom Podlaski Christiansen <danchr@cs.au.dk>
parents: 196
diff changeset
224 ui.note(' committed to "%s" as %s\n' % ((b or 'default'), node.short(h)))
223
330f0b15d417 issue67: mercurial 1.3 util incompatibility with encoding swap
Luke Opperman <luke@loppear.com>
parents: 221
diff changeset
225
330f0b15d417 issue67: mercurial 1.3 util incompatibility with encoding swap
Luke Opperman <luke@loppear.com>
parents: 221
diff changeset
226
330f0b15d417 issue67: mercurial 1.3 util incompatibility with encoding swap
Luke Opperman <luke@loppear.com>
parents: 221
diff changeset
227 def swap_out_encoding(new_encoding="UTF-8"):
281
8ff0b3261b7f util: drop 1.2 support in the encoding swap.
Augie Fackler <durin42@gmail.com>
parents: 275
diff changeset
228 from mercurial import encoding
8ff0b3261b7f util: drop 1.2 support in the encoding swap.
Augie Fackler <durin42@gmail.com>
parents: 275
diff changeset
229 old = encoding.encoding
8ff0b3261b7f util: drop 1.2 support in the encoding swap.
Augie Fackler <durin42@gmail.com>
parents: 275
diff changeset
230 encoding.encoding = new_encoding
223
330f0b15d417 issue67: mercurial 1.3 util incompatibility with encoding swap
Luke Opperman <luke@loppear.com>
parents: 221
diff changeset
231 return old
410
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
232
952
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
233 def isancestor(ctx, ancestorctx):
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
234 """Return True if ancestorctx is equal or an ancestor of ctx."""
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
235 if ctx == ancestorctx:
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
236 return True
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
237 for actx in ctx.ancestors():
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
238 if actx == ancestorctx:
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
239 return True
9c3b4f59e7e6 stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents: 951
diff changeset
240 return False
410
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
241
497
cad864ed29de util: make aresamefiles take one file and just be issamefile instead.
Augie Fackler <durin42@gmail.com>
parents: 475
diff changeset
242 def issamefile(parentctx, childctx, f):
582
44c56a7727c4 editor: fix issamefile() and copy detection in replay mode
Patrick Mezard <pmezard@gmail.com>
parents: 580
diff changeset
243 """Return True if f exists and is the same in childctx and parentctx"""
44c56a7727c4 editor: fix issamefile() and copy detection in replay mode
Patrick Mezard <pmezard@gmail.com>
parents: 580
diff changeset
244 if f not in parentctx or f not in childctx:
44c56a7727c4 editor: fix issamefile() and copy detection in replay mode
Patrick Mezard <pmezard@gmail.com>
parents: 580
diff changeset
245 return False
410
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
246 if parentctx == childctx:
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
247 return True
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
248 if parentctx.rev() > childctx.rev():
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
249 parentctx, childctx = childctx, parentctx
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
250
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
251 def selfandancestors(selfctx):
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
252 yield selfctx
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
253 for ctx in selfctx.ancestors():
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
254 yield ctx
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
255
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
256 for pctx in selfandancestors(childctx):
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
257 if pctx.rev() <= parentctx.rev():
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
258 return True
497
cad864ed29de util: make aresamefiles take one file and just be issamefile instead.
Augie Fackler <durin42@gmail.com>
parents: 475
diff changeset
259 if f in pctx.files():
cad864ed29de util: make aresamefiles take one file and just be issamefile instead.
Augie Fackler <durin42@gmail.com>
parents: 475
diff changeset
260 return False
410
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
261 # parentctx is not an ancestor of childctx, files are unrelated
eb524b957345 move aresamefiles() from HgChangeReceiver to util
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 408
diff changeset
262 return False
707
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
263
884
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
264
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
265 def getsvnrev(ctx, defval=None):
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
266 '''Extract SVN revision from commit metadata'''
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
267 return ctx.extra().get('convert_revision', defval)
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
268
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
269
707
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
270 def _templatehelper(ctx, kw):
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
271 '''
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
272 Helper function for displaying information about converted changesets.
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
273 '''
884
1b261e0f85aa Abstract away the details of where svn revs are stored in a commit
Bryan O'Sullivan <bryano@fb.com>
parents: 832
diff changeset
274 convertinfo = getsvnrev(ctx, '')
707
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
275
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
276 if not convertinfo or not convertinfo.startswith('svn:'):
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
277 return ''
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
278
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
279 if kw == 'svnuuid':
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
280 return convertinfo[4:40]
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
281 elif kw == 'svnpath':
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
282 return convertinfo[40:].rsplit('@', 1)[0]
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
283 elif kw == 'svnrev':
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
284 return convertinfo[40:].rsplit('@', 1)[-1]
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
285 else:
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
286 raise hgutil.Abort('unrecognized hgsubversion keyword %s' % kw)
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
287
794
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
288 def svnrevkw(**args):
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
289 """:svnrev: String. Converted subversion revision number."""
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
290 return _templatehelper(args['ctx'], 'svnrev')
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
291
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
292 def svnpathkw(**args):
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
293 """:svnpath: String. Converted subversion revision project path."""
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
294 return _templatehelper(args['ctx'], 'svnpath')
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
295
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
296 def svnuuidkw(**args):
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
297 """:svnuuid: String. Converted subversion revision repository identifier."""
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
298 return _templatehelper(args['ctx'], 'svnuuid')
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
299
707
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
300 templatekeywords = {
794
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
301 'svnrev': svnrevkw,
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
302 'svnpath': svnpathkw,
c32c92fdca5b util: use real function definitions for keywords, document them
Patrick Mezard <pmezard@gmail.com>
parents: 770
diff changeset
303 'svnuuid': svnuuidkw,
707
cb32d90f915e templatekw: clean up implementation & test; add help.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 620
diff changeset
304 }
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
305
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
306 def revset_fromsvn(repo, subset, x):
752
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
307 '''``fromsvn()``
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
308 Select changesets that originate from Subversion.
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
309 '''
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
310 args = revset.getargs(x, 0, 0, "fromsvn takes no arguments")
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
311
889
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
312 rev = repo.changelog.rev
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
313 bin = node.bin
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
314 try:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
315 svnrevs = set(rev(bin(l.split(' ', 2)[1]))
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
316 for l in maps.RevMap.readmapfile(repo, missingok=False))
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
317 return filter(svnrevs.__contains__, subset)
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
318 except IOError, err:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
319 if err.errno != errno.ENOENT:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
320 raise
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
321 raise hgutil.Abort("svn metadata is missing - "
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
322 "run 'hg svn rebuildmeta' to reconstruct it")
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
323
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
324 def revset_svnrev(repo, subset, x):
752
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
325 '''``svnrev(number)``
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
326 Select changesets that originate in the given Subversion revision.
bb64ad4ce982 revsets: add docstrings.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 722
diff changeset
327 '''
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
328 args = revset.getargs(x, 1, 1, "svnrev takes one argument")
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
329
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
330 rev = revset.getstring(args[0],
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
331 "the argument to svnrev() must be a number")
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
332 try:
889
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
333 revnum = int(rev)
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
334 except ValueError:
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
335 raise error.ParseError("the argument to svnrev() must be a number")
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
336
889
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
337 rev = rev + ' '
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
338 revs = []
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
339 try:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
340 for l in maps.RevMap.readmapfile(repo, missingok=False):
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
341 if l.startswith(rev):
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
342 n = l.split(' ', 2)[1]
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
343 r = repo[node.bin(n)].rev()
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
344 if r in subset:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
345 revs.append(r)
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
346 return revs
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
347 except IOError, err:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
348 if err.errno != errno.ENOENT:
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
349 raise
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
350 raise hgutil.Abort("svn metadata is missing - "
7a98fbadcae9 revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents: 884
diff changeset
351 "run 'hg svn rebuildmeta' to reconstruct it")
722
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
352
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
353 revsets = {
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
354 'fromsvn': revset_fromsvn,
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
355 'svnrev': revset_svnrev,
aa24148a7454 uisetup: add fromsvn() and svnrev() revsets.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 707
diff changeset
356 }
944
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
357
1009
f0bde4bf1f78 revsets: add support for 'r123' revision labels
Matt Mackall <mpm@selenic.com>
parents: 975
diff changeset
358 def revset_stringset(orig, repo, subset, x):
f0bde4bf1f78 revsets: add support for 'r123' revision labels
Matt Mackall <mpm@selenic.com>
parents: 975
diff changeset
359 if x.startswith('r') and x[1:].isdigit():
f0bde4bf1f78 revsets: add support for 'r123' revision labels
Matt Mackall <mpm@selenic.com>
parents: 975
diff changeset
360 return revset_svnrev(repo, subset, ('string', x[1:]))
1010
f0ebc7113429 revsets: fix nativerevs fallback
Matt Mackall <mpm@selenic.com>
parents: 1009
diff changeset
361 return orig(repo, subset, x)
1009
f0bde4bf1f78 revsets: add support for 'r123' revision labels
Matt Mackall <mpm@selenic.com>
parents: 975
diff changeset
362
944
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
363 def getfilestoresize(ui):
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
364 """Return the replay or stupid file memory store size in megabytes or -1"""
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
365 size = ui.configint('hgsubversion', 'filestoresize', 200)
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
366 if size >= 0:
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
367 size = size*(2**20)
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
368 else:
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
369 size = -1
d6db289f1548 pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents: 889
diff changeset
370 return size
951
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
371
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
372 # Copy-paste from mercurial.util to avoid having to deal with backward
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
373 # compatibility, plus the cache size is configurable.
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
374 def lrucachefunc(func, size):
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
375 '''cache most recent results of function calls'''
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
376 cache = {}
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
377 order = deque()
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
378 if func.func_code.co_argcount == 1:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
379 def f(arg):
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
380 if arg not in cache:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
381 if len(cache) > size:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
382 del cache[order.popleft()]
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
383 cache[arg] = func(arg)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
384 else:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
385 order.remove(arg)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
386 order.append(arg)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
387 return cache[arg]
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
388 else:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
389 def f(*args):
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
390 if args not in cache:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
391 if len(cache) > size:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
392 del cache[order.popleft()]
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
393 cache[args] = func(*args)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
394 else:
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
395 order.remove(args)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
396 order.append(args)
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
397 return cache[args]
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
398
bd9c292665fd editor: add a small changectx cache
Patrick Mezard <patrick@mezard.eu>
parents: 944
diff changeset
399 return f
974
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
400
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
401 def parse_revnum(svnrepo, r):
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
402 try:
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
403 return int(r or 0)
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
404 except ValueError:
975
9ffa1daf7b08 understand 'tip' as meaning Subversion 'HEAD'
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 974
diff changeset
405 if isinstance(r, str) and r.lower() in ('head', 'tip'):
974
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
406 return svnrepo.last_changed_rev
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
407 else:
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
408 # TODO: use error.RepoLookupError when we drop 1.3?
336f4bce479a consolidate revision parsing
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 973
diff changeset
409 raise hgutil.Abort("unknown Subversion revision %r" % r)