Mercurial > hgsubversion
annotate hgsubversion/maps.py @ 976:ab3c02dad95c
maps: only show 'reading ...' as debug output
I find it a bit too chatty for verbose output...
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Sun, 11 Nov 2012 15:30:49 +0100 |
parents | 24fbba02cb8f |
children | e015cd34168d |
rev | line source |
---|---|
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
1 ''' Module for self-contained maps. ''' |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
2 |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
3 import errno |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
4 import os |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
5 from mercurial import util as hgutil |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
6 from mercurial import node |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
7 |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
8 import svncommands |
829
5061640fe5bc
revmap: load/save _youngest using new load_string and save_string API
Yonggang Luo <luoyonggang@gmail.com>
parents:
826
diff
changeset
|
9 import util |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
10 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
11 class AuthorMap(dict): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
12 '''A mapping from Subversion-style authors to Mercurial-style |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
13 authors, and back. The data is stored persistently on disk. |
322
05cd4a5138bf
Move some .warn() calls to noisy levels instead.
Augie Fackler <durin42@gmail.com>
parents:
310
diff
changeset
|
14 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
15 If the 'hgsubversion.defaultauthors' configuration option is set to false, |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
16 attempting to obtain an unknown author will fail with an Abort. |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
17 ''' |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
18 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
19 def __init__(self, ui, path, defaulthost=None): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
20 '''Initialise a new AuthorMap. |
322
05cd4a5138bf
Move some .warn() calls to noisy levels instead.
Augie Fackler <durin42@gmail.com>
parents:
310
diff
changeset
|
21 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
22 The ui argument is used to print diagnostic messages. |
322
05cd4a5138bf
Move some .warn() calls to noisy levels instead.
Augie Fackler <durin42@gmail.com>
parents:
310
diff
changeset
|
23 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
24 The path argument is the location of the backing store, |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
25 typically .hg/svn/authors. |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
26 ''' |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
27 self.ui = ui |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
28 self.path = path |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
29 if defaulthost: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
30 self.defaulthost = '@%s' % defaulthost.lstrip('@') |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
31 else: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
32 self.defaulthost = '' |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
33 self.super = super(AuthorMap, self) |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
34 self.super.__init__() |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
35 self.load(path) |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
36 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
37 def load(self, path): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
38 ''' Load mappings from a file at the specified path. ''' |
818
9aed3bfc92d6
authormap: expand environment variables when evaluating map path
maugustin <maugustin@gmx.net>
parents:
809
diff
changeset
|
39 |
9aed3bfc92d6
authormap: expand environment variables when evaluating map path
maugustin <maugustin@gmx.net>
parents:
809
diff
changeset
|
40 path = os.path.expandvars(path) |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
41 if not os.path.exists(path): |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
42 return |
430
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
43 |
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
44 writing = False |
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
45 if path != self.path: |
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
46 writing = open(self.path, 'a') |
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
47 |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
48 self.ui.debug('reading authormap from %s\n' % path) |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
49 f = open(path, 'r') |
820
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
50 for number, line_org in enumerate(f): |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
51 |
820
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
52 line = line_org.split('#')[0] |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
53 if not line.strip(): |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
54 continue |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
55 |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
56 try: |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
57 src, dst = line.split('=', 1) |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
58 except (IndexError, ValueError): |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
59 msg = 'ignoring line %i in author map %s: %s\n' |
579
21a389e4d8b5
maps: if operation can continue, it should probably not use ui.warn()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
60 self.ui.status(msg % (number, path, line.rstrip())) |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
61 continue |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
62 |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
63 src = src.strip() |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
64 dst = dst.strip() |
820
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
65 |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
66 if writing: |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
67 if not src in self: |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
68 self.ui.debug('adding author %s to author map\n' % src) |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
69 elif dst != self[src]: |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
70 msg = 'overriding author: "%s" to "%s" (%s)\n' |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
71 self.ui.status(msg % (self[src], dst, src)) |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
72 writing.write(line_org) |
09f7c1c09207
authormap: only append new or changed authors
maugustin <maugustin@gmx.net>
parents:
818
diff
changeset
|
73 |
430
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
74 self[src] = dst |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
75 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
76 f.close() |
430
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
77 if writing: |
2851b81c65ce
maps: make sure AuthorMaps don't overwrite themselves, fix overriding
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
78 writing.close() |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
79 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
80 def __getitem__(self, author): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
81 ''' Similar to dict.__getitem__, except in case of an unknown author. |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
82 In such cases, a new value is generated and added to the dictionary |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
83 as well as the backing store. ''' |
735
c2b9e08ecf10
maps: map a missing author to '(no author)'
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
729
diff
changeset
|
84 if author is None: |
c2b9e08ecf10
maps: map a missing author to '(no author)'
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
729
diff
changeset
|
85 author = '(no author)' |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
86 if author in self: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
87 result = self.super.__getitem__(author) |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
88 elif self.ui.configbool('hgsubversion', 'defaultauthors', True): |
310
15b8bab03504
Change default author substitution to avoid updating test hashes.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
307
diff
changeset
|
89 self[author] = result = '%s%s' % (author, self.defaulthost) |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
90 msg = 'substituting author "%s" for default "%s"\n' |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
91 self.ui.debug(msg % (author, result)) |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
92 else: |
359
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
93 msg = 'author %s has no entry in the author map!' |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
94 raise hgutil.Abort(msg % author) |
e74321f6f8a1
Author maps: code/message style (prevent line continuations).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
358
diff
changeset
|
95 self.ui.debug('mapping author "%s" to "%s"\n' % (author, result)) |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
96 return result |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
97 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
98 def reverselookup(self, author): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
99 for svnauthor, hgauthor in self.iteritems(): |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
100 if author == hgauthor: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
101 return svnauthor |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
102 else: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
103 # Mercurial incorrectly splits at e.g. '.', so we roll our own. |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
104 return author.rsplit('@', 1)[0] |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
105 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
106 |
728
cfefeefad199
rename TagMap to Tags, to free up the TagMap name
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
725
diff
changeset
|
107 class Tags(dict): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
108 """Map tags to converted node identifier. |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
109 |
729 | 110 tag names are non-empty strings. Tags are saved in a file |
111 called tagmap, for backwards compatibility reasons. | |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
112 """ |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
113 VERSION = 2 |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
114 |
458
974102998578
rebuildmeta: remove any existing tagmap file.
Augie Fackler <durin42@gmail.com>
parents:
453
diff
changeset
|
115 @classmethod |
974102998578
rebuildmeta: remove any existing tagmap file.
Augie Fackler <durin42@gmail.com>
parents:
453
diff
changeset
|
116 def filepath(cls, repo): |
974102998578
rebuildmeta: remove any existing tagmap file.
Augie Fackler <durin42@gmail.com>
parents:
453
diff
changeset
|
117 return os.path.join(repo.path, 'svn', 'tagmap') |
974102998578
rebuildmeta: remove any existing tagmap file.
Augie Fackler <durin42@gmail.com>
parents:
453
diff
changeset
|
118 |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
119 def __init__(self, repo, endrev=None): |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
120 dict.__init__(self) |
458
974102998578
rebuildmeta: remove any existing tagmap file.
Augie Fackler <durin42@gmail.com>
parents:
453
diff
changeset
|
121 self.path = self.filepath(repo) |
725 | 122 self.endrev = endrev |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
123 if os.path.isfile(self.path): |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
124 self._load(repo) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
125 else: |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
126 self._write() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
127 |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
128 def _load(self, repo): |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
129 f = open(self.path) |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
130 ver = int(f.readline()) |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
131 if ver < self.VERSION: |
579
21a389e4d8b5
maps: if operation can continue, it should probably not use ui.warn()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
132 repo.ui.status('tag map outdated, running rebuildmeta...\n') |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
133 f.close() |
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
134 os.unlink(self.path) |
573
00393e9abff8
svncommands: make repo optional (useful for things like listauthors)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
519
diff
changeset
|
135 svncommands.rebuildmeta(repo.ui, repo, ()) |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
136 return |
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
137 elif ver != self.VERSION: |
891
83cc6e9e8425
kill all 'print' statements in the extension proper
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
889
diff
changeset
|
138 raise hgutil.Abort('tagmap too new -- please upgrade') |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
139 for l in f: |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
140 ha, revision, tag = l.split(' ', 2) |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
141 revision = int(revision) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
142 tag = tag[:-1] |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
143 if self.endrev is not None and revision > self.endrev: |
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
144 break |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
145 if not tag: |
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
146 continue |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
147 dict.__setitem__(self, tag, node.bin(ha)) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
148 f.close() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
149 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
150 def _write(self): |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
151 assert self.endrev is None |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
152 f = open(self.path, 'w') |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
153 f.write('%s\n' % self.VERSION) |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
154 f.close() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
155 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
156 def update(self, other): |
725 | 157 for k, v in other.iteritems(): |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
158 self[k] = v |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
159 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
160 def __contains__(self, tag): |
593
eb16630bceb1
maps: fix a % formatting bug
Augie Fackler <durin42@gmail.com>
parents:
579
diff
changeset
|
161 return (tag and dict.__contains__(self, tag) |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
162 and dict.__getitem__(self, tag) != node.nullid) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
163 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
164 def __getitem__(self, tag): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
165 if tag and tag in self: |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
166 return dict.__getitem__(self, tag) |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
167 raise KeyError() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
168 |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
169 def __setitem__(self, tag, info): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
170 if not tag: |
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
171 raise hgutil.Abort('tag cannot be empty') |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
172 ha, revision = info |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
173 f = open(self.path, 'a') |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
174 f.write('%s %s %s\n' % (node.hex(ha), revision, tag)) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
175 f.close() |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
176 dict.__setitem__(self, tag, ha) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
177 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
178 |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
179 class RevMap(dict): |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
180 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
181 VERSION = 1 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
182 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
183 def __init__(self, repo): |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
184 dict.__init__(self) |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
185 self.path = self.mappath(repo) |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
186 self.repo = repo |
821
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
187 self.ypath = os.path.join(repo.path, 'svn', 'lastpulled') |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
188 # TODO(durin42): Consider moving management of the youngest |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
189 # file to svnmeta itself rather than leaving it here. |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
190 # must load youngest file first, or else self._load() can |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
191 # clobber the info |
829
5061640fe5bc
revmap: load/save _youngest using new load_string and save_string API
Yonggang Luo <luoyonggang@gmail.com>
parents:
826
diff
changeset
|
192 _yonngest_str = util.load_string(self.ypath, '0') |
5061640fe5bc
revmap: load/save _youngest using new load_string and save_string API
Yonggang Luo <luoyonggang@gmail.com>
parents:
826
diff
changeset
|
193 self._youngest = int(_yonngest_str.strip()) |
647
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
194 self.oldest = 0 |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
195 if os.path.isfile(self.path): |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
196 self._load() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
197 else: |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
198 self._write() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
199 |
821
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
200 def _set_youngest(self, rev): |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
201 self._youngest = max(self._youngest, rev) |
829
5061640fe5bc
revmap: load/save _youngest using new load_string and save_string API
Yonggang Luo <luoyonggang@gmail.com>
parents:
826
diff
changeset
|
202 util.save_string(self.ypath, str(self._youngest) + '\n') |
821
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
203 |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
204 def _get_youngest(self): |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
205 return self._youngest |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
206 |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
207 youngest = property(_get_youngest, _set_youngest) |
f28e0f54a6ef
svnmeta: store youngest revision pulled from subversion
Augie Fackler <durin42@gmail.com>
parents:
820
diff
changeset
|
208 |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
209 def hashes(self): |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
210 return dict((v, k) for (k, v) in self.iteritems()) |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
211 |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
212 def branchedits(self, branch, rev): |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
213 check = lambda x: x[0][1] == branch and x[0][0] < rev.revnum |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
214 return sorted(filter(check, self.iteritems()), reverse=True) |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
215 |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
216 @staticmethod |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
217 def mappath(repo): |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
218 return os.path.join(repo.path, 'svn', 'rev_map') |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
219 |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
220 @classmethod |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
221 def readmapfile(cls, repo, missingok=True): |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
222 try: |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
223 f = open(cls.mappath(repo)) |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
224 except IOError, err: |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
225 if not missingok or err.errno != errno.ENOENT: |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
226 raise |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
227 return iter([]) |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
228 ver = int(f.readline()) |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
229 if ver != cls.VERSION: |
891
83cc6e9e8425
kill all 'print' statements in the extension proper
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
889
diff
changeset
|
230 raise hgutil.Abort('revmap too new -- please upgrade') |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
231 return f |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
232 |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
233 def _load(self): |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
234 for l in self.readmapfile(self.repo): |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
235 revnum, ha, branch = l.split(' ', 2) |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
236 if branch == '\n': |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
237 branch = None |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
238 else: |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
239 branch = branch[:-1] |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
240 revnum = int(revnum) |
647
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
241 if revnum > self.youngest or not self.youngest: |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
242 self.youngest = revnum |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
243 if revnum < self.oldest or not self.oldest: |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
244 self.oldest = revnum |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
245 dict.__setitem__(self, (revnum, branch), node.bin(ha)) |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
246 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
247 def _write(self): |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
248 f = open(self.path, 'w') |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
249 f.write('%s\n' % self.VERSION) |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
250 f.close() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
251 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
252 def __setitem__(self, key, ha): |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
253 revnum, branch = key |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
254 f = open(self.path, 'a') |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
255 b = branch or '' |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
256 f.write(str(revnum) + ' ' + node.hex(ha) + ' ' + b + '\n') |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
257 f.close() |
647
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
258 if revnum > self.youngest or not self.youngest: |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
259 self.youngest = revnum |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
260 if revnum < self.oldest or not self.oldest: |
3ff8666b1479
maps: rename revmap.seen to revmap.youngest; add revmap.oldest.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
636
diff
changeset
|
261 self.oldest = revnum |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
262 dict.__setitem__(self, (revnum, branch), ha) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
263 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
264 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
265 class FileMap(object): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
266 |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
267 VERSION = 1 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
268 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
269 def __init__(self, ui, path): |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
270 '''Initialise a new FileMap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
271 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
272 The ui argument is used to print diagnostic messages. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
273 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
274 The path argument is the location of the backing store, |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
275 typically .hg/svn/filemap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
276 ''' |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
277 self.ui = ui |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
278 self.path = path |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
279 self.include = {} |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
280 self.exclude = {} |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
281 if os.path.isfile(self.path): |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
282 self._load() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
283 else: |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
284 self._write() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
285 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
286 def _rpairs(self, name): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
287 e = len(name) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
288 while e != -1: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
289 yield name[:e], name[e+1:] |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
290 e = name.rfind('/', 0, e) |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
291 yield '.', name |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
292 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
293 def check(self, m, path): |
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
294 m = getattr(self, m) |
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
295 for pre, _suf in self._rpairs(path): |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
296 if pre in m: |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
297 return m[pre] |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
298 return -1 |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
299 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
300 def __contains__(self, path): |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
301 if not len(path): |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
302 return True |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
303 if len(self.include): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
304 inc = self.check('include', path) |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
305 elif not len(self.exclude): |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
306 return True |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
307 else: |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
308 inc = 0 |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
309 if len(self.exclude): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
310 exc = self.check('exclude', path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
311 else: |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
312 exc = -1 |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
313 # respect rule order: newer rules override older |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
314 return inc > exc |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
315 |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
316 # Needed so empty filemaps are false |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
317 def __len__(self): |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
318 return len(self.include) + len(self.exclude) |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
319 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
320 def add(self, fn, m, path): |
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
321 mapping = getattr(self, m) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
322 if path in mapping: |
593
eb16630bceb1
maps: fix a % formatting bug
Augie Fackler <durin42@gmail.com>
parents:
579
diff
changeset
|
323 msg = 'duplicate %s entry in %s: "%s"\n' |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
324 self.ui.status(msg % (m, fn, path)) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
325 return |
956
24fbba02cb8f
maps: fix filemap loading --verbose message
Patrick Mezard <patrick@mezard.eu>
parents:
891
diff
changeset
|
326 bits = m.rstrip('e'), path |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
327 self.ui.debug('%sing %s\n' % bits) |
847
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
328 # respect rule order |
0de18c5c2e35
Respect filemap rule order (rules that come first are overridden by rules that come later)
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
846
diff
changeset
|
329 mapping[path] = len(self) |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
330 if fn != self.path: |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
331 f = open(self.path, 'a') |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
332 f.write(m + ' ' + path + '\n') |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
333 f.close() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
334 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
335 def load(self, fn): |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
336 self.ui.debug('reading file map from %s\n' % fn) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
337 f = open(fn, 'r') |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
338 self.load_fd(f, fn) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
339 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
340 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
341 def load_fd(self, f, fn): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
342 for line in f: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
343 if line.strip() == '' or line.strip()[0] == '#': |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
344 continue |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
345 try: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
346 cmd, path = line.split(' ', 1) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
347 cmd = cmd.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
348 path = path.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
349 if cmd in ('include', 'exclude'): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
350 self.add(fn, cmd, path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
351 continue |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
352 self.ui.warn('unknown filemap command %s\n' % cmd) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
353 except IndexError: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
354 msg = 'ignoring bad line in filemap %s: %s\n' |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
355 self.ui.warn(msg % (fn, line.rstrip())) |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
356 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
357 def _load(self): |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
358 self.ui.debug('reading in-repo file map from %s\n' % self.path) |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
359 f = open(self.path) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
360 ver = int(f.readline()) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
361 if ver != self.VERSION: |
891
83cc6e9e8425
kill all 'print' statements in the extension proper
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
889
diff
changeset
|
362 raise hgutil.Abort('filemap too new -- please upgrade') |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
363 self.load_fd(f, self.path) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
364 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
365 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
366 def _write(self): |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
367 f = open(self.path, 'w') |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
368 f.write('%s\n' % self.VERSION) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
369 f.close() |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
370 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
371 class BranchMap(dict): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
372 '''Facility for controlled renaming of branch names. Example: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
373 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
374 oldname = newname |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
375 other = default |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
376 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
377 All changes on the oldname branch will now be on the newname branch; all |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
378 changes on other will now be on default (have no branch name set). |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
379 ''' |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
380 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
381 def __init__(self, ui, path): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
382 self.ui = ui |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
383 self.path = path |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
384 self.super = super(BranchMap, self) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
385 self.super.__init__() |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
386 self.load(path) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
387 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
388 def load(self, path): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
389 '''Load mappings from a file at the specified path.''' |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
390 if not os.path.exists(path): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
391 return |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
392 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
393 writing = False |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
394 if path != self.path: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
395 writing = open(self.path, 'a') |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
396 |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
397 self.ui.debug('reading branchmap from %s\n' % path) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
398 f = open(path, 'r') |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
399 for number, line in enumerate(f): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
400 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
401 if writing: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
402 writing.write(line) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
403 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
404 line = line.split('#')[0] |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
405 if not line.strip(): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
406 continue |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
407 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
408 try: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
409 src, dst = line.split('=', 1) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
410 except (IndexError, ValueError): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
411 msg = 'ignoring line %i in branch map %s: %s\n' |
579
21a389e4d8b5
maps: if operation can continue, it should probably not use ui.warn()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
412 self.ui.status(msg % (number, path, line.rstrip())) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
413 continue |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
414 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
415 src = src.strip() |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
416 dst = dst.strip() |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
417 self.ui.debug('adding branch %s to branch map\n' % src) |
636
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
418 |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
419 if not dst: |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
420 # prevent people from assuming such lines are valid |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
421 raise hgutil.Abort('removing branches is not supported, yet\n' |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
422 '(line %i in branch map %s)' |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
423 % (number, path)) |
d4f433ee709a
branchmap: reject empty mappings
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
624
diff
changeset
|
424 elif src in self and dst != self[src]: |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
425 msg = 'overriding branch: "%s" to "%s" (%s)\n' |
579
21a389e4d8b5
maps: if operation can continue, it should probably not use ui.warn()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
426 self.ui.status(msg % (self[src], dst, src)) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
427 self[src] = dst |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
428 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
429 f.close() |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
430 if writing: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
431 writing.close() |
729 | 432 |
433 class TagMap(dict): | |
434 '''Facility for controlled renaming of tags. Example: | |
435 | |
436 oldname = newname | |
437 other = | |
438 | |
809
ab372e38fb6c
maps: clean up whitespace
Augie Fackler <durin42@gmail.com>
parents:
742
diff
changeset
|
439 The oldname tag from SVN will be represented as newname in the hg tags; |
ab372e38fb6c
maps: clean up whitespace
Augie Fackler <durin42@gmail.com>
parents:
742
diff
changeset
|
440 the other tag will not be reflected in the hg repository. |
729 | 441 ''' |
442 | |
443 def __init__(self, ui, path): | |
444 self.ui = ui | |
445 self.path = path | |
446 self.super = super(TagMap, self) | |
447 self.super.__init__() | |
448 self.load(path) | |
449 | |
450 def load(self, path): | |
451 '''Load mappings from a file at the specified path.''' | |
452 if not os.path.exists(path): | |
453 return | |
454 | |
455 writing = False | |
456 if path != self.path: | |
457 writing = open(self.path, 'a') | |
458 | |
976
ab3c02dad95c
maps: only show 'reading ...' as debug output
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
956
diff
changeset
|
459 self.ui.debug('reading tag renames from %s\n' % path) |
729 | 460 f = open(path, 'r') |
461 for number, line in enumerate(f): | |
462 | |
463 if writing: | |
464 writing.write(line) | |
465 | |
466 line = line.split('#')[0] | |
467 if not line.strip(): | |
468 continue | |
469 | |
470 try: | |
471 src, dst = line.split('=', 1) | |
472 except (IndexError, ValueError): | |
473 msg = 'ignoring line %i in tag renames %s: %s\n' | |
474 self.ui.status(msg % (number, path, line.rstrip())) | |
475 continue | |
476 | |
477 src = src.strip() | |
478 dst = dst.strip() | |
479 self.ui.debug('adding tag %s to tag renames\n' % src) | |
480 | |
481 if src in self and dst != self[src]: | |
482 msg = 'overriding tag rename: "%s" to "%s" (%s)\n' | |
483 self.ui.status(msg % (self[src], dst, src)) | |
484 self[src] = dst | |
485 | |
486 f.close() | |
487 if writing: | |
488 writing.close() |