Mercurial > hgsubversion
annotate hgsubversion/maps.py @ 1421:0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Finally we have changed other code to not read rev_map directly. In order to
prevent future code accessing rev_map without going through RevMap, change
the readmapfile to a private instance method.
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 24 May 2016 00:15:20 +0100 |
parents | 2e4145e452cd |
children | 372afb75f465 |
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 |
1394
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
5 import re |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
6 from mercurial import util as hgutil |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
7 from mercurial.node import bin, hex, nullid |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
8 |
1374
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
9 import subprocess |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
10 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
|
11 import util |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
12 |
1383
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
13 class BaseMap(dict): |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
14 '''A base class for the different type of mappings: author, branch, and |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
15 tags.''' |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
16 def __init__(self, meta): |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
17 self.meta = meta |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
18 super(BaseMap, self).__init__() |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
19 |
1394
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
20 self._commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*') |
1401
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
21 self.syntaxes = ('re', 'glob') |
1394
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
22 |
1383
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
23 # trickery: all subclasses have the same name as their file and config |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
24 # names, e.g. AuthorMap is meta.authormap_file for the filename and |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
25 # 'authormap' for the config option |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
26 self.mapname = self.__class__.__name__.lower() |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
27 self.mapfilename = self.mapname + '_file' |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
28 self.load(self.meta.__getattribute__(self.mapfilename)) |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
29 |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
30 # append mappings specified from the commandline |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
31 clmap = util.configpath(self.meta.ui, self.mapname) |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
32 if clmap: |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
33 self.load(clmap) |
73c76f99ca08
maps: add a basemap class
Sean Farley <sean.michael.farley@gmail.com>
parents:
1382
diff
changeset
|
34 |
1395
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
35 def _findkey(self, key): |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
36 '''Takes a string and finds the first corresponding key that matches |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
37 via regex''' |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
38 if not key: |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
39 return None |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
40 |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
41 # compile a new regex key if we're given a string; can't use |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
42 # hgutil.compilere since we need regex.sub |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
43 k = key |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
44 if isinstance(key, str): |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
45 k = re.compile(re.escape(key)) |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
46 |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
47 # preference goes to matching the exact pattern, i.e. 'foo' should |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
48 # first match 'foo' before trying regexes |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
49 for regex in self: |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
50 if regex.pattern == k.pattern: |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
51 return regex |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
52 |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
53 # if key isn't a string, then we are done; nothing matches |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
54 if not isinstance(key, str): |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
55 return None |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
56 |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
57 # now we test the regex; the above loop will be faster and is |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
58 # equivalent to not having regexes (i.e. just doing string compares) |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
59 for regex in self: |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
60 if regex.search(key): |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
61 return regex |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
62 return None |
53184be1b1fd
maps: add _findkey method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1394
diff
changeset
|
63 |
1396
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
64 def get(self, key, default=None): |
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
65 '''Similar to dict.get, except we use our own matcher, _findkey.''' |
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
66 if self._findkey(key): |
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
67 return self[key] |
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
68 return default |
77594c88d91f
maps: add custom get method
Sean Farley <sean.michael.farley@gmail.com>
parents:
1395
diff
changeset
|
69 |
1397
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
70 def __getitem__(self, key): |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
71 '''Similar to dict.get, except we use our own matcher, _findkey. If the key is |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
72 a string, then we can use our regex matching to map its value. |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
73 ''' |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
74 k = self._findkey(key) |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
75 val = super(BaseMap, self).__getitem__(k) |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
76 |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
77 # if key is a string then we can transform it using our regex, else we |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
78 # don't have enough information, so we just return the val |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
79 if isinstance(key, str): |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
80 val = k.sub(val, key) |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
81 |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
82 return val |
304fdb9810a6
maps: add custom __getitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1396
diff
changeset
|
83 |
1398
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
84 def __setitem__(self, key, value): |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
85 '''Similar to dict.__setitem__, except we compile the string into a regex, if |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
86 need be. |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
87 ''' |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
88 # try to find the regex already in the map |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
89 k = self._findkey(key) |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
90 # if we found one, then use it |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
91 if k: |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
92 key = k |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
93 # else make a new regex |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
94 if isinstance(key, str): |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
95 key = re.compile(re.escape(key)) |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
96 super(BaseMap, self).__setitem__(key, value) |
75745298d99d
maps: add custom __setitem__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1397
diff
changeset
|
97 |
1399
3b96075bffa7
maps: add custom __contains__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1398
diff
changeset
|
98 def __contains__(self, key): |
3b96075bffa7
maps: add custom __contains__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1398
diff
changeset
|
99 '''Similar to dict.get, except we use our own matcher, _findkey.''' |
3b96075bffa7
maps: add custom __contains__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1398
diff
changeset
|
100 return self._findkey(key) is not None |
3b96075bffa7
maps: add custom __contains__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1398
diff
changeset
|
101 |
1384
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
102 def load(self, path): |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
103 '''Load mappings from a file at the specified path.''' |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
104 path = os.path.expandvars(path) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
105 if not os.path.exists(path): |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
106 return |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
107 |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
108 writing = False |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
109 mapfile = self.meta.__getattribute__(self.mapfilename) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
110 if path != mapfile: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
111 writing = open(mapfile, 'a') |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
112 |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
113 self.meta.ui.debug('reading %s from %s\n' % (self.mapname , path)) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
114 f = open(path, 'r') |
1401
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
115 syntax = '' |
1384
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
116 for number, line in enumerate(f): |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
117 |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
118 if writing: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
119 writing.write(line) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
120 |
1394
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
121 # strip out comments |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
122 if "#" in line: |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
123 # remove comments prefixed by an even number of escapes |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
124 line = self._commentre.sub(r'\1', line) |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
125 # fixup properly escaped comments that survived the above |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
126 line = line.replace("\\#", "#") |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
127 line = line.rstrip() |
c4055968f030
maps: use regex for better comment handling
Sean Farley <sean.michael.farley@gmail.com>
parents:
1393
diff
changeset
|
128 if not line: |
1384
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
129 continue |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
130 |
1401
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
131 if line.startswith('syntax:'): |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
132 s = line[7:].strip() |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
133 syntax = '' |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
134 if s in self.syntaxes: |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
135 syntax = s |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
136 continue |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
137 pat = syntax |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
138 for s in self.syntaxes: |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
139 if line.startswith(s + ':'): |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
140 pat = s |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
141 line = line[len(s) + 1:] |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
142 break |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
143 |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
144 # split on the first '=' |
1384
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
145 try: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
146 src, dst = line.split('=', 1) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
147 except (IndexError, ValueError): |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
148 msg = 'ignoring line %i in %s %s: %s\n' |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
149 self.meta.ui.status(msg % (number, self.mapname, path, |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
150 line.rstrip())) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
151 continue |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
152 |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
153 src = src.strip() |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
154 dst = dst.strip() |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
155 |
1401
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
156 if pat != 're': |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
157 src = re.escape(src) |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
158 if pat == 'glob': |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
159 src = src.replace('\\*', '.*') |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
160 src = re.compile(src) |
70cb6ba038fa
maps: add ability to parse a regex or glob
Sean Farley <sean.michael.farley@gmail.com>
parents:
1400
diff
changeset
|
161 |
1384
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
162 if src not in self: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
163 self.meta.ui.debug('adding %s to %s\n' % (src, self.mapname)) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
164 elif dst != self[src]: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
165 msg = 'overriding %s: "%s" to "%s" (%s)\n' |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
166 self.meta.ui.status(msg % (self.mapname, self[src], dst, src)) |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
167 self[src] = dst |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
168 |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
169 f.close() |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
170 if writing: |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
171 writing.close() |
2d1d05e6e46c
maps: add a load method to base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1383
diff
changeset
|
172 |
1385
9139d9295a36
maps: make author map inherit from base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1384
diff
changeset
|
173 class AuthorMap(BaseMap): |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
174 '''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
|
175 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
|
176 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
177 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
|
178 attempting to obtain an unknown author will fail with an Abort. |
1188
38dd8721fb0d
maps: remove trailing whitespace
Sean Farley <sean.michael.farley@gmail.com>
parents:
1187
diff
changeset
|
179 |
1097
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
180 If the 'hgsubversion.caseignoreauthors' configuration option is set to true, |
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
181 the userid from Subversion is always compared lowercase. |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
182 ''' |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
183 |
1194
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
184 def __init__(self, meta): |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
185 '''Initialise a new AuthorMap. |
322
05cd4a5138bf
Move some .warn() calls to noisy levels instead.
Augie Fackler <durin42@gmail.com>
parents:
310
diff
changeset
|
186 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
187 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
|
188 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
189 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
|
190 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
|
191 ''' |
1194
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
192 self.defaulthost = '' |
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
193 if meta.defaulthost: |
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
194 self.defaulthost = '@%s' % meta.defaulthost.lstrip('@') |
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
195 |
1386
8bd40916106f
maps: remove unneeded __init__ code from author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1385
diff
changeset
|
196 super(AuthorMap, self).__init__(meta) |
1193
a55339d35066
maps: load commandline authormap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1188
diff
changeset
|
197 |
1400
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
198 def _lowercase(self, key): |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
199 '''Determine whether or not to lowercase a str or regex using the |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
200 meta.caseignoreauthors.''' |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
201 k = key |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
202 if self.meta.caseignoreauthors: |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
203 if isinstance(key, str): |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
204 k = key.lower() |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
205 else: |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
206 k = re.compile(key.pattern.lower()) |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
207 return k |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
208 |
1379
367e65989b41
maps: add custom __setitem__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1375
diff
changeset
|
209 def __setitem__(self, key, value): |
367e65989b41
maps: add custom __setitem__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1375
diff
changeset
|
210 '''Similar to dict.__setitem__, except we check caseignoreauthors to |
367e65989b41
maps: add custom __setitem__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1375
diff
changeset
|
211 use lowercase string or not |
367e65989b41
maps: add custom __setitem__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1375
diff
changeset
|
212 ''' |
1400
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
213 super(AuthorMap, self).__setitem__(self._lowercase(key), value) |
1379
367e65989b41
maps: add custom __setitem__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1375
diff
changeset
|
214 |
1380
332ad9ea579b
maps: add custom __contains__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1379
diff
changeset
|
215 def __contains__(self, key): |
332ad9ea579b
maps: add custom __contains__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1379
diff
changeset
|
216 '''Similar to dict.__contains__, except we check caseignoreauthors to |
332ad9ea579b
maps: add custom __contains__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1379
diff
changeset
|
217 use lowercase string or not |
332ad9ea579b
maps: add custom __contains__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1379
diff
changeset
|
218 ''' |
1400
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
219 return super(AuthorMap, self).__contains__(self._lowercase(key)) |
1380
332ad9ea579b
maps: add custom __contains__ to author map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1379
diff
changeset
|
220 |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
221 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
|
222 ''' 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
|
223 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
|
224 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
|
225 if author is None: |
c2b9e08ecf10
maps: map a missing author to '(no author)'
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
729
diff
changeset
|
226 author = '(no author)' |
1097
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
227 |
1400
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
228 if not isinstance(author, str): |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
229 return super(AuthorMap, self).__getitem__(author) |
3e264851f879
maps: protect author map functions from regexes
Sean Farley <sean.michael.farley@gmail.com>
parents:
1399
diff
changeset
|
230 |
1196
878372849175
maps: use meta.caseignoreauthors intead of accessing ui directly
Sean Farley <sean.michael.farley@gmail.com>
parents:
1195
diff
changeset
|
231 search_author = author |
878372849175
maps: use meta.caseignoreauthors intead of accessing ui directly
Sean Farley <sean.michael.farley@gmail.com>
parents:
1195
diff
changeset
|
232 if self.meta.caseignoreauthors: |
1097
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
233 search_author = author.lower() |
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
234 |
1374
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
235 result = None |
1097
e015cd34168d
authormap: allow case-insensitive authormaps for easier conversions
maugustin
parents:
976
diff
changeset
|
236 if search_author in self: |
1382
d996850ac4e8
maps: call super directly instead of self.super
Sean Farley <sean.michael.farley@gmail.com>
parents:
1381
diff
changeset
|
237 result = super(AuthorMap, self).__getitem__(search_author) |
1374
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
238 elif self.meta.mapauthorscmd: |
1375
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
239 cmd = self.meta.mapauthorscmd % author |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
240 process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
241 output, err = process.communicate() |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
242 retcode = process.poll() |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
243 if retcode: |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
244 msg = 'map author command "%s" exited with error' |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
245 raise hgutil.Abort(msg % cmd) |
abc87a62ff51
maps: remove python2.7ism from dynamic author mapping
Mateusz Kwapich <mitrandir@fb.com>
parents:
1374
diff
changeset
|
246 self[author] = result = output.strip() |
1374
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
247 if not result: |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
248 if self.meta.defaultauthors: |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
249 self[author] = result = '%s%s' % (author, self.defaulthost) |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
250 msg = 'substituting author "%s" for default "%s"\n' |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
251 self.meta.ui.debug(msg % (author, result)) |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
252 else: |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
253 msg = 'author %s has no entry in the author map!' |
a17d8874a099
Added dynamic author mapping.
Jerome M. BERGER <jeberger@free.fr>
parents:
1356
diff
changeset
|
254 raise hgutil.Abort(msg % author) |
1194
49791c40a8a5
maps: change authormap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1193
diff
changeset
|
255 self.meta.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
|
256 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
|
257 |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 else: |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
diff
changeset
|
263 # 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
|
264 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
|
265 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
266 |
728
cfefeefad199
rename TagMap to Tags, to free up the TagMap name
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
725
diff
changeset
|
267 class Tags(dict): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
268 """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
|
269 |
729 | 270 tag names are non-empty strings. Tags are saved in a file |
271 called tagmap, for backwards compatibility reasons. | |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
272 """ |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
273 VERSION = 2 |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
274 |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
275 def __init__(self, meta, endrev=None): |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
276 dict.__init__(self) |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
277 self.meta = meta |
725 | 278 self.endrev = endrev |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
279 if os.path.isfile(self.meta.tagfile): |
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
280 self._load() |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
281 else: |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
282 self._write() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
283 |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
284 def _load(self): |
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
285 f = open(self.meta.tagfile) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
286 ver = int(f.readline()) |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
287 if ver < self.VERSION: |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
288 self.meta.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
|
289 f.close() |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
290 os.unlink(self.meta.tagfile) |
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
291 svncommands.rebuildmeta(self.meta.ui, self.meta.repo, ()) |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
292 return |
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
293 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
|
294 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
|
295 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
|
296 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
|
297 revision = int(revision) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
298 tag = tag[:-1] |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
299 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
|
300 break |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
301 if not tag: |
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
302 continue |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
303 dict.__setitem__(self, tag, bin(ha)) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
304 f.close() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
305 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
306 def _write(self): |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
307 assert self.endrev is None |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
308 f = open(self.meta.tagfile, 'w') |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
309 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
|
310 f.close() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
311 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
312 def update(self, other): |
725 | 313 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
|
314 self[k] = v |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
315 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
316 def __contains__(self, tag): |
593
eb16630bceb1
maps: fix a % formatting bug
Augie Fackler <durin42@gmail.com>
parents:
579
diff
changeset
|
317 return (tag and dict.__contains__(self, tag) |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
318 and dict.__getitem__(self, tag) != nullid) |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
319 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
320 def __getitem__(self, tag): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
321 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
|
322 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
|
323 raise KeyError() |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
324 |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
325 def __setitem__(self, tag, info): |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
326 if not tag: |
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
460
diff
changeset
|
327 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
|
328 ha, revision = info |
1187
30b2139c3931
maps: change tags init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1186
diff
changeset
|
329 f = open(self.meta.tagfile, 'a') |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
330 f.write('%s %s %s\n' % (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
|
331 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
|
332 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
|
333 |
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
430
diff
changeset
|
334 |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
335 class RevMap(dict): |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
336 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
337 VERSION = 1 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
338 |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
339 def __init__(self, meta): |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
340 dict.__init__(self) |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
341 self.meta = meta |
1294
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
342 self._hashes = None |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
343 |
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
344 if os.path.isfile(self.meta.revmap_file): |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
345 self._load() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
346 else: |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
347 self._write() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
348 |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
349 def hashes(self): |
1294
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
350 if self._hashes is None: |
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
351 self._hashes = dict((v, k) for (k, v) in self.iteritems()) |
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
352 return self._hashes |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
353 |
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
354 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
|
355 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
|
356 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
|
357 |
1419
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
358 @property |
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
359 def lasthash(self): |
1421
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
360 lines = list(self._readmapfile()) |
1419
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
361 if not lines: |
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
362 return None |
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
363 return bin(lines[-1].split(' ', 2)[1]) |
2e4145e452cd
maps: add "lasthash" property to RevMap
Jun Wu <quark@fb.com>
parents:
1414
diff
changeset
|
364 |
1413
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
365 def revhashes(self, revnum): |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
366 for key, value in self.iteritems(): |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
367 if key[0] == revnum: |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
368 yield value |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
369 |
1411
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
370 def clear(self): |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
371 self._write() |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
372 dict.clear(self) |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
373 self._hashes = None |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
374 |
1412
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
375 def batchset(self, items): |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
376 '''Set items in batches |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
377 |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
378 items is an array of (rev num, branch, binary hash) |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
379 |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
380 For performance reason, meta.lastpulled and meta.firstpulled |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
381 are not updated. |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
382 ''' |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
383 f = open(self.meta.revmap_file, 'a') |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
384 f.write(''.join('%s %s %s\n' % (revnum, hex(binhash), br or '') |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
385 for revnum, br, binhash in items)) |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
386 f.close() |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
387 |
1421
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
388 def _readmapfile(self): |
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
389 path = self.meta.revmap_file |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
390 try: |
1182
8f9619a67565
maps: change readmapfile to take a path instead of repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1144
diff
changeset
|
391 f = open(path) |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
392 except IOError, err: |
1421
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
393 if err.errno != errno.ENOENT: |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
394 raise |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
395 return iter([]) |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
396 ver = int(f.readline()) |
1421
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
397 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
|
398 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
|
399 return f |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
400 |
1414
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
401 @classmethod |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
402 def exists(cls, meta): |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
403 return os.path.exists(meta.revmap_file) |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
404 |
1251
46cec117dda2
maps.RevMap: disable GC while loading the revmap
Siddharth Agarwal <sid0@fb.com>
parents:
1217
diff
changeset
|
405 @util.gcdisable |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
406 def _load(self): |
1252
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
407 lastpulled = self.meta.lastpulled |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
408 firstpulled = self.meta.firstpulled |
1254
d07ccad28b1a
maps.RevMap: avoid O(revs) property lookups on dict
Siddharth Agarwal <sid0@fb.com>
parents:
1253
diff
changeset
|
409 setitem = dict.__setitem__ |
1421
0094f222c5dc
maps: make readmapfile of RevMap a private instance method
Jun Wu <quark@fb.com>
parents:
1419
diff
changeset
|
410 for l in self._readmapfile(): |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
411 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
|
412 if branch == '\n': |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
413 branch = None |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
414 else: |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
415 branch = branch[:-1] |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
416 revnum = int(revnum) |
1252
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
417 if revnum > lastpulled or not lastpulled: |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
418 lastpulled = revnum |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
419 if revnum < firstpulled or not firstpulled: |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
420 firstpulled = revnum |
1254
d07ccad28b1a
maps.RevMap: avoid O(revs) property lookups on dict
Siddharth Agarwal <sid0@fb.com>
parents:
1253
diff
changeset
|
421 setitem(self, (revnum, branch), bin(ha)) |
1252
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
422 self.meta.lastpulled = lastpulled |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
423 self.meta.firstpulled = firstpulled |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
424 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
425 def _write(self): |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
426 f = open(self.meta.revmap_file, 'w') |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
427 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
|
428 f.close() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
429 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
430 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
|
431 revnum, branch = key |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
432 f = open(self.meta.revmap_file, 'a') |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
433 b = branch or '' |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
434 f.write(str(revnum) + ' ' + 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
|
435 f.close() |
1184
43384d2782dc
svnmeta: move revmap.youngest to meta.lastpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1183
diff
changeset
|
436 if revnum > self.meta.lastpulled or not self.meta.lastpulled: |
43384d2782dc
svnmeta: move revmap.youngest to meta.lastpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1183
diff
changeset
|
437 self.meta.lastpulled = revnum |
1186
f9650d24464a
svnmeta: move revmap.oldest to meta.firstpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1184
diff
changeset
|
438 if revnum < self.meta.firstpulled or not self.meta.firstpulled: |
f9650d24464a
svnmeta: move revmap.oldest to meta.firstpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1184
diff
changeset
|
439 self.meta.firstpulled = 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
|
440 dict.__setitem__(self, (revnum, branch), ha) |
1294
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
441 if self._hashes is not None: |
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
442 self._hashes[ha] = (revnum, branch) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
443 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
444 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
445 class FileMap(object): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
446 |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
447 VERSION = 1 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
448 |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
449 def __init__(self, meta): |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
450 '''Initialise a new FileMap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
451 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
452 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
|
453 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
454 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
|
455 typically .hg/svn/filemap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
456 ''' |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
457 self.meta = meta |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
458 self.include = {} |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
459 self.exclude = {} |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
460 if os.path.isfile(self.meta.filemap_file): |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
461 self._load() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
462 else: |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
463 self._write() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
464 |
1214
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
465 # append file mapping specified from the commandline |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
466 clmap = util.configpath(self.meta.ui, 'filemap') |
1214
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
467 if clmap: |
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
468 self.load(clmap) |
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
469 |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
470 def _rpairs(self, name): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
471 e = len(name) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
472 while e != -1: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
473 yield name[:e], name[e+1:] |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
474 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
|
475 yield '.', name |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
476 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
477 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
|
478 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
|
479 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
|
480 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
|
481 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
|
482 return -1 |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
483 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 if len(self.include): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
488 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
|
489 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
|
490 return True |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
491 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
|
492 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
|
493 if len(self.exclude): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
494 exc = self.check('exclude', path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
495 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
|
496 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
|
497 # 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
|
498 return inc > exc |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
499 |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
500 # 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
|
501 def __len__(self): |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
502 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
|
503 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
504 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
|
505 mapping = getattr(self, m) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
506 if path in mapping: |
593
eb16630bceb1
maps: fix a % formatting bug
Augie Fackler <durin42@gmail.com>
parents:
579
diff
changeset
|
507 msg = 'duplicate %s entry in %s: "%s"\n' |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
508 self.meta.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
|
509 return |
956
24fbba02cb8f
maps: fix filemap loading --verbose message
Patrick Mezard <patrick@mezard.eu>
parents:
891
diff
changeset
|
510 bits = m.rstrip('e'), path |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
511 self.meta.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
|
512 # 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
|
513 mapping[path] = len(self) |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
514 if fn != self.meta.filemap_file: |
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
515 f = open(self.meta.filemap_file, 'a') |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
516 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
|
517 f.close() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
518 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
519 def load(self, fn): |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
520 self.meta.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
|
521 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
|
522 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
|
523 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
524 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
525 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
|
526 for line in f: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
527 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
|
528 continue |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
529 try: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
530 cmd, path = line.split(' ', 1) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
531 cmd = cmd.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
532 path = path.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
533 if cmd in ('include', 'exclude'): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
534 self.add(fn, cmd, path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
535 continue |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
536 self.meta.ui.warn('unknown filemap command %s\n' % cmd) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
537 except IndexError: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
538 msg = 'ignoring bad line in filemap %s: %s\n' |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
539 self.meta.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
|
540 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
541 def _load(self): |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
542 self.meta.ui.debug('reading in-repo file map from %s\n' % self.meta.filemap_file) |
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
543 f = open(self.meta.filemap_file) |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
544 ver = int(f.readline()) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
545 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
|
546 raise hgutil.Abort('filemap too new -- please upgrade') |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
547 self.load_fd(f, self.meta.filemap_file) |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
548 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
549 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
550 def _write(self): |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
551 f = open(self.meta.filemap_file, 'w') |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
552 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
|
553 f.close() |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
554 |
1388
130ced9e371d
maps: make branch map inherit from base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1387
diff
changeset
|
555 class BranchMap(BaseMap): |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
556 '''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
|
557 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
558 oldname = newname |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
559 other = default |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
560 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
561 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
|
562 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
|
563 ''' |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
564 |
1213
295d2f0cc275
maps: change branchmap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1211
diff
changeset
|
565 def __init__(self, meta): |
1389
44d0c5d73bfd
maps: remove unneeded __init__ code from branch map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1388
diff
changeset
|
566 super(BranchMap, self).__init__(meta) |
1211
56d6e0273733
maps: load commandline branchmap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1210
diff
changeset
|
567 |
1391
7a866bca15de
maps: make tag map inherit from base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1390
diff
changeset
|
568 class TagMap(BaseMap): |
729 | 569 '''Facility for controlled renaming of tags. Example: |
570 | |
571 oldname = newname | |
572 other = | |
573 | |
809
ab372e38fb6c
maps: clean up whitespace
Augie Fackler <durin42@gmail.com>
parents:
742
diff
changeset
|
574 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
|
575 the other tag will not be reflected in the hg repository. |
729 | 576 ''' |
577 | |
1210
a0c6dbd9afbb
maps: change tagmap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1208
diff
changeset
|
578 def __init__(self, meta): |
1392
ec01aa2d088e
maps: remove unneeded __init__ code from tag map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1391
diff
changeset
|
579 super(TagMap, self).__init__(meta) |