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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
270 tag names are non-empty strings. Tags are saved in a file
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
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
c787147fa3b7 fix some style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 647
diff changeset
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
c787147fa3b7 fix some style nits
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 647
diff changeset
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
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
562 '''Facility for controlled renaming of tags. Example:
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
563
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
564 oldname = newname
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
565 other =
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
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
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
569 '''
467b95348e6a implement tag renames
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 728
diff changeset
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)