Mercurial > hgsubversion
annotate hgsubversion/maps.py @ 1414:99bc6003ac56
maps: add the "exists" method to RevMap
This is a part of the bigger plan to get rid of reading or writing rev_map
directly without going through the RevMap class.
Before this patch, there is no easy way to know if the RevMap file exists
or not, so the revset functions "fromsvn" and "svnrev" choose to read the
rev_map file directly, and throw an exception if the file does not exist.
This patch adds the "exists" method that will be used in svnmeta next patch,
so these revset functions can test if the file exists without reading the
rev_map file directly.
author | Jun Wu <quark@fb.com> |
---|---|
date | Fri, 13 May 2016 23:19:15 +0100 |
parents | 951a87f2f2bd |
children | 2e4145e452cd |
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 |
1413
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
358 def revhashes(self, revnum): |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
359 for key, value in self.iteritems(): |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
360 if key[0] == revnum: |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
361 yield value |
951a87f2f2bd
maps: add the "revhashes" method to RevMap
Jun Wu <quark@fb.com>
parents:
1412
diff
changeset
|
362 |
1411
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
363 def clear(self): |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
364 self._write() |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
365 dict.clear(self) |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
366 self._hashes = None |
025e849d22f0
maps: add the "clear" method to RevMap
Jun Wu <quark@fb.com>
parents:
1401
diff
changeset
|
367 |
1412
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
368 def batchset(self, items): |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
369 '''Set items in batches |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
370 |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
371 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
|
372 |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
373 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
|
374 are not updated. |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
375 ''' |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
376 f = open(self.meta.revmap_file, 'a') |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
377 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
|
378 for revnum, br, binhash in items)) |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
379 f.close() |
7e98352a37db
maps: add the "batchset" method to RevMap
Jun Wu <quark@fb.com>
parents:
1411
diff
changeset
|
380 |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
381 @classmethod |
1182
8f9619a67565
maps: change readmapfile to take a path instead of repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1144
diff
changeset
|
382 def readmapfile(cls, path, missingok=True): |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
383 try: |
1182
8f9619a67565
maps: change readmapfile to take a path instead of repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1144
diff
changeset
|
384 f = open(path) |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
385 except IOError, err: |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
386 if not missingok or err.errno != errno.ENOENT: |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
387 raise |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
388 return iter([]) |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
389 ver = int(f.readline()) |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
390 if ver != cls.VERSION: |
891
83cc6e9e8425
kill all 'print' statements in the extension proper
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
889
diff
changeset
|
391 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
|
392 return f |
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
393 |
1414
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
394 @classmethod |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
395 def exists(cls, meta): |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
396 return os.path.exists(meta.revmap_file) |
99bc6003ac56
maps: add the "exists" method to RevMap
Jun Wu <quark@fb.com>
parents:
1413
diff
changeset
|
397 |
1251
46cec117dda2
maps.RevMap: disable GC while loading the revmap
Siddharth Agarwal <sid0@fb.com>
parents:
1217
diff
changeset
|
398 @util.gcdisable |
889
7a98fbadcae9
revsets: huge speedups for fromsvn and svnrev
Bryan O'Sullivan <bryano@fb.com>
parents:
847
diff
changeset
|
399 def _load(self): |
1252
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
400 lastpulled = self.meta.lastpulled |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
401 firstpulled = self.meta.firstpulled |
1254
d07ccad28b1a
maps.RevMap: avoid O(revs) property lookups on dict
Siddharth Agarwal <sid0@fb.com>
parents:
1253
diff
changeset
|
402 setitem = dict.__setitem__ |
1183
09b20039192c
maps: change revmap init to accept svnmeta not a repo
Sean Farley <sean.michael.farley@gmail.com>
parents:
1182
diff
changeset
|
403 for l in self.readmapfile(self.meta.revmap_file): |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
404 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
|
405 if branch == '\n': |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
406 branch = None |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
407 else: |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
408 branch = branch[:-1] |
415
b17b2969861c
svnmeta: move revmap methods, make last_known_revision() more efficient
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
409
diff
changeset
|
409 revnum = int(revnum) |
1252
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
410 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
|
411 lastpulled = revnum |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
412 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
|
413 firstpulled = revnum |
1254
d07ccad28b1a
maps.RevMap: avoid O(revs) property lookups on dict
Siddharth Agarwal <sid0@fb.com>
parents:
1253
diff
changeset
|
414 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
|
415 self.meta.lastpulled = lastpulled |
a321afbc3479
maps.RevMap: while loading, read lastpulled and firstpulled once
Siddharth Agarwal <sid0@fb.com>
parents:
1251
diff
changeset
|
416 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
|
417 |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
418 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
|
419 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
|
420 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
|
421 f.close() |
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
360
diff
changeset
|
422 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
423 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
|
424 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
|
425 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
|
426 b = branch or '' |
1253
c54214bb6c4e
maps: avoid O(n) property lookups on the node module
Siddharth Agarwal <sid0@fb.com>
parents:
1252
diff
changeset
|
427 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
|
428 f.close() |
1184
43384d2782dc
svnmeta: move revmap.youngest to meta.lastpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1183
diff
changeset
|
429 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
|
430 self.meta.lastpulled = revnum |
1186
f9650d24464a
svnmeta: move revmap.oldest to meta.firstpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1184
diff
changeset
|
431 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
|
432 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
|
433 dict.__setitem__(self, (revnum, branch), ha) |
1294
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
434 if self._hashes is not None: |
9a722b5246df
maps: cache hashes() for the revmap
Mateusz Kwapich <mitrandir@fb.com>
parents:
1254
diff
changeset
|
435 self._hashes[ha] = (revnum, branch) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
436 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
437 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
438 class FileMap(object): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
439 |
846
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
440 VERSION = 1 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
441 |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
442 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
|
443 '''Initialise a new FileMap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
444 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
445 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
|
446 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
447 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
|
448 typically .hg/svn/filemap. |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
449 ''' |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
450 self.meta = meta |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
451 self.include = {} |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
452 self.exclude = {} |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
453 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
|
454 self._load() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
455 else: |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
456 self._write() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
457 |
1214
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
458 # 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
|
459 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
|
460 if clmap: |
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
461 self.load(clmap) |
2c793092862b
maps: load commandline filemap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1213
diff
changeset
|
462 |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
463 def _rpairs(self, name): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
464 e = len(name) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
465 while e != -1: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
466 yield name[:e], name[e+1:] |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
467 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
|
468 yield '.', name |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
469 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
470 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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 return -1 |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
476 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
477 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
|
478 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
|
479 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
|
480 if len(self.include): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
481 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
|
482 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
|
483 return True |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
484 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
|
485 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
|
486 if len(self.exclude): |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
487 exc = self.check('exclude', path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
488 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
|
489 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
|
490 # 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
|
491 return inc > exc |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
492 |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
493 # 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
|
494 def __len__(self): |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
821
diff
changeset
|
495 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
|
496 |
826
8794302f3614
maps: s/hash/ha/ and s/map/m/ to avoid hiding Python builtins
Yonggang Luo <luoyonggang@gmail.com>
parents:
822
diff
changeset
|
497 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
|
498 mapping = getattr(self, m) |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
499 if path in mapping: |
593
eb16630bceb1
maps: fix a % formatting bug
Augie Fackler <durin42@gmail.com>
parents:
579
diff
changeset
|
500 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
|
501 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
|
502 return |
956
24fbba02cb8f
maps: fix filemap loading --verbose message
Patrick Mezard <patrick@mezard.eu>
parents:
891
diff
changeset
|
503 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
|
504 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
|
505 # 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
|
506 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
|
507 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
|
508 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
|
509 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
|
510 f.close() |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
511 |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
512 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
|
513 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
|
514 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
|
515 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
|
516 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
517 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
518 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
|
519 for line in f: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
520 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
|
521 continue |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
522 try: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
523 cmd, path = line.split(' ', 1) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
524 cmd = cmd.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
525 path = path.strip() |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
526 if cmd in ('include', 'exclude'): |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
527 self.add(fn, cmd, path) |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
528 continue |
1217
a10a4fc69364
maps: change filemap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1216
diff
changeset
|
529 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
|
530 except IndexError: |
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
531 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
|
532 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
|
533 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
534 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
|
535 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
|
536 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
|
537 ver = int(f.readline()) |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
538 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
|
539 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
|
540 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
|
541 f.close() |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
542 |
7ca3d1b08d67
Save filemap into .hg/svn/filemap just like other maps
Vitaliy Filippov <vitalif@yourcmc.ru>
parents:
829
diff
changeset
|
543 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
|
544 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
|
545 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
|
546 f.close() |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
547 |
1388
130ced9e371d
maps: make branch map inherit from base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1387
diff
changeset
|
548 class BranchMap(BaseMap): |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
549 '''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
|
550 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
551 oldname = newname |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
552 other = default |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
553 |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
554 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
|
555 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
|
556 ''' |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
573
diff
changeset
|
557 |
1213
295d2f0cc275
maps: change branchmap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1211
diff
changeset
|
558 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
|
559 super(BranchMap, self).__init__(meta) |
1211
56d6e0273733
maps: load commandline branchmap in __init__
Sean Farley <sean.michael.farley@gmail.com>
parents:
1210
diff
changeset
|
560 |
1391
7a866bca15de
maps: make tag map inherit from base map
Sean Farley <sean.michael.farley@gmail.com>
parents:
1390
diff
changeset
|
561 class TagMap(BaseMap): |
729 | 562 '''Facility for controlled renaming of tags. Example: |
563 | |
564 oldname = newname | |
565 other = | |
566 | |
809
ab372e38fb6c
maps: clean up whitespace
Augie Fackler <durin42@gmail.com>
parents:
742
diff
changeset
|
567 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
|
568 the other tag will not be reflected in the hg repository. |
729 | 569 ''' |
570 | |
1210
a0c6dbd9afbb
maps: change tagmap to initialize with an svnmeta object
Sean Farley <sean.michael.farley@gmail.com>
parents:
1208
diff
changeset
|
571 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
|
572 super(TagMap, self).__init__(meta) |