# HG changeset patch # User Dirkjan Ochtman # Date 1245074967 -7200 # Node ID 2851b81c65ce71140113258b6c7397e382eaf46d # Parent a5a475dced59f74a041bb5eff3171601c4c2b832 maps: make sure AuthorMaps don't overwrite themselves, fix overriding Author maps for the Python repo got truncated because of the author map stupidly writing upon itself. This patch implements a better and faster scenario, where entries will only be written to the saved author map if they're not coming from that file. They're also now streamed into the file directly, instead of having to re-open the file on every entry, and formatting is preserved. diff --git a/hgsubversion/maps.py b/hgsubversion/maps.py --- a/hgsubversion/maps.py +++ b/hgsubversion/maps.py @@ -34,10 +34,18 @@ class AuthorMap(dict): ''' Load mappings from a file at the specified path. ''' if not os.path.exists(path): return + + writing = False + if path != self.path: + writing = open(self.path, 'a') + self.ui.note('reading authormap from %s\n' % path) f = open(path, 'r') for number, line in enumerate(f): + if writing: + writing.write(line) + line = line.split('#')[0] if not line.strip(): continue @@ -51,23 +59,16 @@ class AuthorMap(dict): src = src.strip() dst = dst.strip() + self.ui.debug('adding author %s to author map\n' % src) if src in self and dst != self[src]: msg = 'overriding author: "%s" to "%s" (%s)\n' self.ui.warn(msg % (self[src], dst, src)) - else: - self[src] = dst - - f.close() + self[src] = dst - def __setitem__(self, key, value): - ''' Similar to dict.__setitem__, but also updates the new mapping in the - backing store. ''' - self.super.__setitem__(key, value) - self.ui.debug('adding author %s to author map\n' % self.path) - f = open(self.path, 'w+') - for k, v in self.iteritems(): - f.write("%s=%s\n" % (k, v)) f.close() + if writing: + writing.flush() + writing.close() def __getitem__(self, author): ''' Similar to dict.__getitem__, except in case of an unknown author. diff --git a/tests/fixtures/author-map-test.txt b/tests/fixtures/author-map-test.txt new file mode 100644 --- /dev/null +++ b/tests/fixtures/author-map-test.txt @@ -0,0 +1,397 @@ +alpha01 = Alpha +alpha02 = Alpha +alpha03 = Alpha +alpha04 = Alpha +alpha05 = Alpha +alpha06 = Alpha +alpha07 = Alpha +alpha08 = Alpha +alpha09 = Alpha +alpha10 = Alpha +alpha11 = Alpha +alpha12 = Alpha +alpha13 = Alpha +alpha14 = Alpha +alpha15 = Alpha +alpha16 = Alpha +alpha17 = Alpha +alpha18 = Alpha +alpha19 = Alpha +alpha20 = Alpha +alpha21 = Alpha +alpha22 = Alph5 +alpha23 = Alpha +alpha24 = Alpha +alpha25 = Alpha +alpha26 = Alpha +alpha27 = Alpha +alpha28 = Alpha +alpha29 = Alpha +alpha30 = Alpha +alpha31 = Alpha +alpha32 = Alpha +alpha33 = Alpha +alpha34 = Alpha +alpha35 = Alpha +alpha36 = Alpha +alpha37 = Alph6 +alpha38 = Alpha +alpha39 = Alpha +alpha40 = Alpha +alpha41 = Alpha +alpha42 = Alpha +alpha43 = Alpha +alpha44 = Alph8 +alpha45 = Alpha +alpha46 = Alpha +alpha47 = Alpha +alpha48 = Alpha +alpha49 = Alpha +alpha50 = Alpha +alpha51 = Alpha +alpha52 = Alpha +alpha53 = Alpha +alpha54 = Alpha +alpha55 = Alpha +alpha56 = Alpha +alpha57 = Alph6 +alpha58 = Alpha +alpha59 = Alpha +alpha60 = Alpha +alpha61 = Alpha +alpha62 = Alpha +alpha63 = Alpha +alpha64 = Alpha +alpha65 = Alpha +alpha66 = Alpha +alpha67 = Alph6 +alpha68 = Alpha +alpha69 = Alpha +alpha70 = Alpha +alpha71 = Alpha +alpha72 = Alpha +alpha73 = Alpha +alpha74 = Alpha +alpha75 = Alpha +alpha76 = Alpha +alpha77 = Alph6 +alpha78 = Alpha +alpha79 = Alpha +alpha80 = Alpha +alpha81 = Alpha +alpha82 = Alpha +alpha83 = Alpha +alpha84 = Alpha +alpha85 = Alpha +alpha86 = Alpha +alpha87 = Alpha +alpha88 = Alpha +alpha89 = Alpha +alpha90 = Alpha +alpha91 = Alpha +alpha92 = Alpha +alpha93 = Alpha +alpha94 = Alpha +alpha95 = Alpha +alpha96 = Alpha +alpha97 = Alpha +alpha98 = Alpha +alpha99 = Alpha +alpha101 = Alpha +alpha102 = Alpha +alpha103 = Alpha +alpha104 = Alpha +alpha105 = Alpha +alpha106 = Alpha +alpha107 = Alpha +alpha108 = Alpha +alpha109 = Alpha +alpha110 = Alpha +alpha111 = Alpha +alpha112 = Alpha +alpha113 = Alpha +alpha114 = Alpha +alpha115 = Alpha +alpha116 = Alpha +alpha117 = Alpha +alpha118 = Alpha +alpha119 = Alpha +alpha120 = Alpha +alpha121 = Alpha +alpha122 = Alph5 +alpha123 = Alpha +alpha124 = Alpha +alpha125 = Alpha +alpha126 = Alpha +alpha127 = Alpha +alpha128 = Alpha +alpha129 = Alpha +alpha130 = Alpha +alpha131 = Alpha +alpha132 = Alpha +alpha133 = Alpha +alpha134 = Alpha +alpha135 = Alpha +alpha136 = Alpha +alpha137 = Alph6 +alpha138 = Alpha +alpha139 = Alpha +alpha140 = Alpha +alpha141 = Alpha +alpha142 = Alpha +alpha143 = Alpha +alpha144 = Alph8 +alpha145 = Alpha +alpha146 = Alpha +alpha147 = Alpha +alpha148 = Alpha +alpha149 = Alpha +alpha150 = Alpha +alpha151 = Alpha +alpha152 = Alpha +alpha153 = Alpha +alpha154 = Alpha +alpha155 = Alpha +alpha156 = Alpha +alpha157 = Alph6 +alpha158 = Alpha +alpha159 = Alpha +alpha160 = Alpha +alpha161 = Alpha +alpha162 = Alpha +alpha163 = Alpha +alpha164 = Alpha +alpha165 = Alpha +alpha166 = Alpha +alpha167 = Alph6 +alpha168 = Alpha +alpha169 = Alpha +alpha170 = Alpha +alpha171 = Alpha +alpha172 = Alpha +alpha173 = Alpha +alpha174 = Alpha +alpha175 = Alpha +alpha176 = Alpha +alpha177 = Alph6 +alpha178 = Alpha +alpha179 = Alpha +alpha180 = Alpha +alpha181 = Alpha +alpha182 = Alpha +alpha183 = Alpha +alpha184 = Alpha +alpha185 = Alpha +alpha186 = Alpha +alpha187 = Alpha +alpha188 = Alpha +alpha189 = Alpha +alpha190 = Alpha +alpha191 = Alpha +alpha192 = Alpha +alpha193 = Alpha +alpha194 = Alpha +alpha195 = Alpha +alpha196 = Alpha +alpha197 = Alpha +alpha198 = Alpha +alpha199 = Alpha +alpha201 = Alpha +alpha202 = Alpha +alpha203 = Alpha +alpha204 = Alpha +alpha205 = Alpha +alpha206 = Alpha +alpha207 = Alpha +alpha208 = Alpha +alpha209 = Alpha +alpha210 = Alpha +alpha211 = Alpha +alpha212 = Alpha +alpha213 = Alpha +alpha214 = Alpha +alpha215 = Alpha +alpha216 = Alpha +alpha217 = Alpha +alpha218 = Alpha +alpha219 = Alpha +alpha220 = Alpha +alpha221 = Alpha +alpha222 = Alph5 +alpha223 = Alpha +alpha224 = Alpha +alpha225 = Alpha +alpha226 = Alpha +alpha227 = Alpha +alpha228 = Alpha +alpha229 = Alpha +alpha230 = Alpha +alpha231 = Alpha +alpha232 = Alpha +alpha233 = Alpha +alpha234 = Alpha +alpha235 = Alpha +alpha236 = Alpha +alpha237 = Alph6 +alpha238 = Alpha +alpha239 = Alpha +alpha240 = Alpha +alpha241 = Alpha +alpha242 = Alpha +alpha243 = Alpha +alpha244 = Alph8 +alpha245 = Alpha +alpha246 = Alpha +alpha247 = Alpha +alpha248 = Alpha +alpha249 = Alpha +alpha250 = Alpha +alpha251 = Alpha +alpha252 = Alpha +alpha253 = Alpha +alpha254 = Alpha +alpha255 = Alpha +alpha256 = Alpha +alpha257 = Alph6 +alpha258 = Alpha +alpha259 = Alpha +alpha260 = Alpha +alpha261 = Alpha +alpha262 = Alpha +alpha263 = Alpha +alpha264 = Alpha +alpha265 = Alpha +alpha266 = Alpha +alpha267 = Alph6 +alpha268 = Alpha +alpha269 = Alpha +alpha270 = Alpha +alpha271 = Alpha +alpha272 = Alpha +alpha273 = Alpha +alpha274 = Alpha +alpha275 = Alpha +alpha276 = Alpha +alpha277 = Alph6 +alpha278 = Alpha +alpha279 = Alpha +alpha280 = Alpha +alpha281 = Alpha +alpha282 = Alpha +alpha283 = Alpha +alpha284 = Alpha +alpha285 = Alpha +alpha286 = Alpha +alpha287 = Alpha +alpha288 = Alpha +alpha289 = Alpha +alpha290 = Alpha +alpha291 = Alpha +alpha292 = Alpha +alpha293 = Alpha +alpha294 = Alpha +alpha295 = Alpha +alpha296 = Alpha +alpha297 = Alpha +alpha298 = Alpha +alpha299 = Alpha +alpha301 = Alpha +alpha302 = Alpha +alpha303 = Alpha +alpha304 = Alpha +alpha305 = Alpha +alpha306 = Alpha +alpha307 = Alpha +alpha308 = Alpha +alpha309 = Alpha +alpha310 = Alpha +alpha311 = Alpha +alpha312 = Alpha +alpha313 = Alpha +alpha314 = Alpha +alpha315 = Alpha +alpha316 = Alpha +alpha317 = Alpha +alpha318 = Alpha +alpha319 = Alpha +alpha320 = Alpha +alpha321 = Alpha +alpha322 = Alph5 +alpha323 = Alpha +alpha324 = Alpha +alpha325 = Alpha +alpha326 = Alpha +alpha327 = Alpha +alpha328 = Alpha +alpha329 = Alpha +alpha330 = Alpha +alpha331 = Alpha +alpha332 = Alpha +alpha333 = Alpha +alpha334 = Alpha +alpha335 = Alpha +alpha336 = Alpha +alpha337 = Alph6 +alpha338 = Alpha +alpha339 = Alpha +alpha340 = Alpha +alpha341 = Alpha +alpha342 = Alpha +alpha343 = Alpha +alpha344 = Alph8 +alpha345 = Alpha +alpha346 = Alpha +alpha347 = Alpha +alpha348 = Alpha +alpha349 = Alpha +alpha350 = Alpha +alpha351 = Alpha +alpha352 = Alpha +alpha353 = Alpha +alpha354 = Alpha +alpha355 = Alpha +alpha356 = Alpha +alpha357 = Alph6 +alpha358 = Alpha +alpha359 = Alpha +alpha360 = Alpha +alpha361 = Alpha +alpha362 = Alpha +alpha363 = Alpha +alpha364 = Alpha +alpha365 = Alpha +alpha366 = Alpha +alpha367 = Alph6 +alpha368 = Alpha +alpha639 = Alpha +alpha370 = Alpha +alpha371 = Alpha +alpha372 = Alpha +alpha373 = Alpha +alpha374 = Alpha +alpha375 = Alpha +alpha376 = Alpha +alpha377 = Alph6 +alpha738 = Alpha +alpha379 = Alpha +alpha380 = Alpha +alpha381 = Alpha +alpha382 = Alpha +alpha383 = Alpha +alpha384 = Alpha +alpha385 = Alpha +alpha386 = Alpha +alpha387 = Alpha +alpha388 = Alpha +alpha389 = Alpha +alpha390 = Alpha +alpha91 = Alpha +alph3a92 = Alpha +alph3a93 = Alpha +alph3a94 = Alpha +alph3a95 = Alpha +alph3a96 = Alpha +alph3a97 = Alpha +alph3a98 = Alpha +alpha99 = Alpha +dsadsakdoa = dksadosakfa diff --git a/tests/test_fetch_mappings.py b/tests/test_fetch_mappings.py --- a/tests/test_fetch_mappings.py +++ b/tests/test_fetch_mappings.py @@ -9,6 +9,8 @@ from mercurial import node import test_util +from hgsubversion import maps + class MapTests(test_util.TestBase): @property def authors(self): @@ -55,6 +57,18 @@ class MapTests(test_util.TestBase): def test_author_map_closing_author_stupid(self): self.test_author_map_closing_author(True) + def test_author_map_no_overwrite(self): + cwd = os.path.dirname(__file__) + orig = os.path.join(cwd, 'fixtures', 'author-map-test.txt') + new = open(self.authors, 'w') + new.write(open(orig).read()) + new.close() + test = maps.AuthorMap(ui.ui(), self.authors) + fromself = set(test) + test.load(orig) + all = set(test) + self.assertEqual(fromself.symmetric_difference(all), set()) + def test_file_map(self, stupid=False): test_util.load_svndump_fixture(self.repo_path, 'replace_trunk_with_branch.svndump') filemap = open(self.filemap, 'w')