Mercurial > hgsubversion
annotate hgsubversion/svnmeta.py @ 746:174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Previously, not passing a UUID when instantiating an SVNMeta instance
would cause it to succeed even if no UUID was previously known. First
when the UUID was actually read would an exception be raised.
This slight refactoring of _set_uuid() makes it so an exception is
raised immediately. While at it, the exception message is changed to
be slightly more accurate and helpful.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Thu, 11 Nov 2010 21:32:22 +0100 |
parents | 6252f0cc7b7a |
children | 34b25f6bc4ef |
rev | line source |
---|---|
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
1 import cPickle as pickle |
551
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
2 import posixpath |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
3 import os |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
4 import tempfile |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
5 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
6 from mercurial import context |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
237
diff
changeset
|
7 from mercurial import util as hgutil |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
8 from mercurial import revlog |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
9 from mercurial import node |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
10 |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
237
diff
changeset
|
11 import util |
317 | 12 import maps |
421
8277113036f1
editor: rename hg_delta_editor.HgChangeReceiver to editor.HgEditor
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
420
diff
changeset
|
13 import editor |
34
50d55c3e0d85
Some refactors of the previous change, including transparent upgrade of old-style pickled dictionaries.
Augie Fackler <durin42@gmail.com>
parents:
33
diff
changeset
|
14 |
363
ccef78b91ac9
Move exception classes in hg_delta_editor up top.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
362
diff
changeset
|
15 |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
16 def pickle_atomic(data, file_path, dir=None): |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
17 """pickle some data to a path atomically. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
18 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
19 This is present because I kept corrupting my revmap by managing to hit ^C |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
20 during the pickle of that file. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
21 """ |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
22 try: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
23 f, path = tempfile.mkstemp(prefix='pickling', dir=dir) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
24 f = os.fdopen(f, 'w') |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
25 pickle.dump(data, f) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
26 f.close() |
146
4da9f20aef01
Add some more coverage directives.
Augie Fackler <durin42@gmail.com>
parents:
145
diff
changeset
|
27 except: #pragma: no cover |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
28 raise |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
29 else: |
250
79349fd04836
utils: standardizing imported name to hgutil, our_util to util
Daniel Tang <dytang@cs.purdue.edu>
parents:
237
diff
changeset
|
30 hgutil.rename(path, file_path) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
31 |
411
d71972428fce
editor: move current revision state into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
410
diff
changeset
|
32 |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
33 class SVNMeta(object): |
33
a9c15cae50e5
Faster append-only revmap implementation.
Andreas Hartmetz <ahartmetz@gmail.com>
parents:
23
diff
changeset
|
34 |
405
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
35 def __init__(self, repo, uuid=None, subdir=''): |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
36 """path is the path to the target hg repo. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
37 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
38 subdir is the subdirectory of the edits *on the svn server*. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
39 It is needed for stripping paths off in certain cases. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
40 """ |
405
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
41 self.ui = repo.ui |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
42 self.repo = repo |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
43 self.path = os.path.normpath(repo.join('..')) |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
44 |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
45 if not os.path.isdir(self.meta_data_dir): |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
46 os.makedirs(self.meta_data_dir) |
745
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
47 self.uuid = uuid |
405
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
48 # TODO: validate subdir too |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
407
diff
changeset
|
49 self.revmap = maps.RevMap(repo) |
405
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
50 |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
51 author_host = self.ui.config('hgsubversion', 'defaulthost', uuid) |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
52 authors = self.ui.config('hgsubversion', 'authormap') |
a98b8d424221
editor: simplify HgChangeReceiver constructor signature
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
400
diff
changeset
|
53 tag_locations = self.ui.configlist('hgsubversion', 'tagpaths', ['tags']) |
331
75f082b5897e
Switch to using url scheme wrappers instead of duplicating each command we wrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
330
diff
changeset
|
54 self.usebranchnames = self.ui.configbool('hgsubversion', |
594
3dbd3af0ffaf
svnmeta: minor cosmetics whitespace cleanup.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
584
diff
changeset
|
55 'usebranchnames', True) |
693
03dca55abec9
clone: add --singlebranch option
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
671
diff
changeset
|
56 branchmap = self.ui.config('hgsubversion', 'branchmap') |
729 | 57 tagmap = self.ui.config('hgsubversion', 'tagmap') |
124
291925677a9f
tag_repo: remove gentags command, extend repo.tags(), HgChangeEditor now takes either repo or repo_path
Luke Opperman <luke@loppear.com>
parents:
123
diff
changeset
|
58 |
347
537de0300510
Remove the 'outgoing' wrapper, and use the Mercurial infrastructure instead.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
342
diff
changeset
|
59 # FIXME: test that this hasn't changed! defer & compare? |
671
e910e3ebd23b
svnmeta: strip all repeated slashes from subdir
Peter Arrenbrecht <peter.arrenbre...@gmail.com>
parents:
669
diff
changeset
|
60 if subdir: |
e910e3ebd23b
svnmeta: strip all repeated slashes from subdir
Peter Arrenbrecht <peter.arrenbre...@gmail.com>
parents:
669
diff
changeset
|
61 # strip leading and trailing slashes |
e910e3ebd23b
svnmeta: strip all repeated slashes from subdir
Peter Arrenbrecht <peter.arrenbre...@gmail.com>
parents:
669
diff
changeset
|
62 # collapse all repeated slashes to a single one |
e910e3ebd23b
svnmeta: strip all repeated slashes from subdir
Peter Arrenbrecht <peter.arrenbre...@gmail.com>
parents:
669
diff
changeset
|
63 subdir = '/'.join(p for p in subdir.split('/') if p) |
669
a8101fc49663
Backed out changeset d0692ce98ea6
Augie Fackler <durin42@gmail.com>
parents:
661
diff
changeset
|
64 self.subdir = subdir |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
65 self.branches = {} |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
66 if os.path.exists(self.branch_info_file): |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
67 f = open(self.branch_info_file) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
68 self.branches = pickle.load(f) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
69 f.close() |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
70 self.prevbranches = dict(self.branches) |
728
cfefeefad199
rename TagMap to Tags, to free up the TagMap name
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
726
diff
changeset
|
71 self.tags = maps.Tags(repo) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
72 if os.path.exists(self.tag_locations_file): |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
73 f = open(self.tag_locations_file) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
74 self.tag_locations = pickle.load(f) |
8
c89f53103502
Another fix for Win32 compat.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
6
diff
changeset
|
75 f.close() |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
76 else: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
77 self.tag_locations = tag_locations |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
78 if os.path.exists(self.layoutfile): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
79 f = open(self.layoutfile) |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
80 self._layout = f.read().strip() |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
81 f.close() |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
82 self.repo.ui.setconfig('hgsubversion', 'layout', self._layout) |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
83 else: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
84 self._layout = None |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
85 pickle_atomic(self.tag_locations, self.tag_locations_file, |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
86 self.meta_data_dir) |
295
aacc8cf83e13
Ensure proper handling of nested tag paths by sorting and reversing them.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
224
diff
changeset
|
87 # ensure nested paths are handled properly |
aacc8cf83e13
Ensure proper handling of nested tag paths by sorting and reversing them.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
224
diff
changeset
|
88 self.tag_locations.sort() |
aacc8cf83e13
Ensure proper handling of nested tag paths by sorting and reversing them.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
224
diff
changeset
|
89 self.tag_locations.reverse() |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
90 |
317 | 91 self.authors = maps.AuthorMap(self.ui, self.authors_file, |
307
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
306
diff
changeset
|
92 defaulthost=author_host) |
1d48d9a34c19
Put authormap into a separate file, and make it much better too.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
306
diff
changeset
|
93 if authors: self.authors.load(authors) |
729 | 94 |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
95 self.branchmap = maps.BranchMap(self.ui, self.branchmapfile) |
693
03dca55abec9
clone: add --singlebranch option
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
671
diff
changeset
|
96 if branchmap: |
03dca55abec9
clone: add --singlebranch option
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
671
diff
changeset
|
97 self.branchmap.load(branchmap) |
237
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
98 |
729 | 99 self.tagmap = maps.TagMap(self.ui, self.tagmapfile) |
100 if tagmap: | |
101 self.tagmap.load(tagmap) | |
102 | |
290
153266401676
hg_delta_editor: add timezone to default date to avoid DST issues
Patrick Mezard <pmezard@gmail.com>
parents:
279
diff
changeset
|
103 self.lastdate = '1970-01-01 00:00:00 -0000' |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
104 self.filemap = maps.FileMap(repo) |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
105 self.addedtags = {} |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
106 self.deletedtags = {} |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
107 |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
108 @property |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
109 def layout(self): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
110 # this method can't determine the layout, but it needs to be |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
111 # resolved into something other than auto before this ever |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
112 # gets called |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
113 if not self._layout or self._layout == 'auto': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
114 lo = self.repo.ui.config('hgsubversion', 'layout', default='auto') |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
115 if lo == 'auto': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
116 raise hgutil.Abort('layout not yet determined') |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
117 self._layout = lo |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
118 f = open(self.layoutfile, 'w') |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
119 f.write(self._layout) |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
120 f.close() |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
121 return self._layout |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
122 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
123 @property |
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
124 def editor(self): |
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
125 if not hasattr(self, '_editor'): |
421
8277113036f1
editor: rename hg_delta_editor.HgChangeReceiver to editor.HgEditor
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
420
diff
changeset
|
126 self._editor = editor.HgEditor(self) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
127 return self._editor |
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
128 |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
129 def _get_uuid(self): |
745
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
130 try: |
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
131 return self.__uuid |
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
132 except AttributeError: |
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
133 self.__uuid = open(os.path.join(self.meta_data_dir, 'uuid')).read() |
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
134 return self.__uuid |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
135 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
136 def _set_uuid(self, uuid): |
746
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
137 if os.path.isfile(os.path.join(self.meta_data_dir, 'uuid')): |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
138 stored_uuid = self._get_uuid() |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
139 assert stored_uuid |
746
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
140 if uuid and uuid != stored_uuid: |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
141 raise hgutil.Abort('unable to operate on unrelated repository') |
746
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
142 elif uuid: |
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
143 f = open(os.path.join(self.meta_data_dir, 'uuid'), 'w') |
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
144 f.write(uuid) |
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
145 f.close() |
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
146 self.__uuid = uuid |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
147 else: |
746
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
148 raise hgutil.Abort("hgsubversion metadata unavailable; " |
174f03c288d4
svnmeta: abort when no UUID given and none is stored on disk.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
745
diff
changeset
|
149 "please run 'hg svn rebuildmeta'") |
745
6252f0cc7b7a
svnmeta: cache the UUID in an attribute.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
742
diff
changeset
|
150 |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
151 uuid = property(_get_uuid, _set_uuid, None, |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
152 'Error-checked UUID of source Subversion repository.') |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
153 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
154 @property |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
155 def meta_data_dir(self): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
156 return os.path.join(self.path, '.hg', 'svn') |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
157 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
158 @property |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
159 def branch_info_file(self): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
160 return os.path.join(self.meta_data_dir, 'branch_info') |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
161 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
162 @property |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
163 def tag_locations_file(self): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
164 return os.path.join(self.meta_data_dir, 'tag_locations') |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
165 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
166 @property |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
167 def authors_file(self): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
168 return os.path.join(self.meta_data_dir, 'authors') |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
169 |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
170 @property |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
171 def branchmapfile(self): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
172 return os.path.join(self.meta_data_dir, 'branchmap') |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
173 |
729 | 174 @property |
175 def tagmapfile(self): | |
176 # called tag-renames for backwards compatibility | |
177 return os.path.join(self.meta_data_dir, 'tag-renames') | |
178 | |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
179 @property |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
180 def layoutfile(self): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
181 return os.path.join(self.meta_data_dir, 'layout') |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
182 |
237
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
183 def fixdate(self, date): |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
184 if date is not None: |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
185 date = date.replace('T', ' ').replace('Z', '').split('.')[0] |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
186 date += ' -0000' |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
187 self.lastdate = date |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
188 else: |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
189 date = self.lastdate |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
190 return date |
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
232
diff
changeset
|
191 |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
192 def save(self): |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
193 '''Save the Subversion metadata. This should really be called after |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
194 every revision is created. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
195 ''' |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
196 pickle_atomic(self.branches, self.branch_info_file, self.meta_data_dir) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
197 |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
198 def localname(self, path): |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
199 """Compute the local name for a branch located at path. |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
200 """ |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
201 if self.layout == 'single': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
202 return 'default' |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
203 if path == 'trunk': |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
204 return None |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
205 elif path.startswith('branches/'): |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
206 return path[len('branches/'):] |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
207 return '../%s' % path |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
208 |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
209 def remotename(self, branch): |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
210 if self.layout == 'single': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
211 return '' |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
212 if branch == 'default' or branch is None: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
213 return 'trunk' |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
214 elif branch.startswith('../'): |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
215 return branch[3:] |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
216 return 'branches/%s' % branch |
72
9ec2a12c12ae
hg_delta_editor: make branches_in_paths() return the branch svn path too
Patrick Mezard <pmezard@gmail.com>
parents:
69
diff
changeset
|
217 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
218 def genextra(self, revnum, branch): |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
219 extra = {} |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
220 subdir = self.subdir |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
221 if subdir and subdir[-1] == '/': |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
222 subdir = subdir[:-1] |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
223 if subdir and subdir[0] != '/': |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
224 subdir = '/' + subdir |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
225 |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
226 if self.layout == 'single': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
227 path = subdir or '/' |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
228 else: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
229 branchpath = 'trunk' |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
230 if branch: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
231 extra['branch'] = branch |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
232 if branch.startswith('../'): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
233 branchpath = branch[3:] |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
234 else: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
235 branchpath = 'branches/%s' % branch |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
236 path = '%s/%s' % (subdir , branchpath) |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
237 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
238 extra['convert_revision'] = 'svn:%(uuid)s%(path)s@%(rev)s' % { |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
239 'uuid': self.uuid, |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
240 'path': path, |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
241 'rev': revnum, |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
242 } |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
243 return extra |
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
244 |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
245 def mapbranch(self, extra, close=False): |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
246 if close: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
247 extra['close'] = 1 |
634
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
248 mapped = self.branchmap.get(extra.get('branch', 'default')) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
249 if not self.usebranchnames or mapped == 'default': |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
250 extra.pop('branch', None) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
251 elif mapped: |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
252 extra['branch'] = mapped |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
253 |
634
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
254 if extra.get('branch') == 'default': |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
255 extra.pop('branch', None) |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
256 |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
257 def normalize(self, path): |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
258 '''Normalize a path to strip of leading slashes and our subdir if we |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
259 have one. |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
260 ''' |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
261 if self.subdir and path == self.subdir[:-1]: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
262 return '' |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
263 if path and path[0] == '/': |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
264 path = path[1:] |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
265 if path and path.startswith(self.subdir): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
266 path = path[len(self.subdir):] |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
267 if path and path[0] == '/': |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
268 path = path[1:] |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
269 return path |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
270 |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
271 def get_path_tag(self, path): |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
272 """If path could represent the path to a tag, returns the |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
273 potential (non-empty) tag name. Otherwise, returns None |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
274 |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
275 Note that it's only a tag if it was copied from the path '' in a branch |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
276 (or tag) we have, for our purposes. |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
277 """ |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
278 if self.layout != 'single': |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
279 path = self.normalize(path) |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
280 for tagspath in self.tag_locations: |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
281 if path.startswith(tagspath + '/'): |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
282 tag = path[len(tagspath) + 1:] |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
283 if tag: |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
284 return tag |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
285 return None |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
286 |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
287 def split_branch_path(self, path, existing=True): |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
288 """Figure out which branch inside our repo this path represents, and |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
289 also figure out which path inside that branch it is. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
290 |
724 | 291 Returns a tuple of (path within branch, local branch name, server-side |
292 branch path). | |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
293 |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
294 Note that tag paths can also be matched: assuming tags/tag-1.1 |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
295 is a tag then: |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
296 tags/tag-1.1 => ('', '../tags/tag-1.1', 'tags/tag-1.1') |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
297 tags/tag-1.1/file => ('file', '../tags/tag-1.1', 'tags/tag-1.1') |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
298 tags/tag-1.2 => (None, None, None) |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
299 |
724 | 300 If existing=True, will return None, None, None if the file isn't on |
301 some known branch. If existing=False, then it will guess what the | |
302 branch would be if it were known. Server-side branch path should be | |
303 relative to our subdirectory. | |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
304 """ |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
305 path = self.normalize(path) |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
306 if self.layout == 'single': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
307 return (path, None, '') |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
308 tag = self.get_path_tag(path) |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
309 if tag: |
521
839734dfb5c7
Handle tag subdirectory as tag in replay mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
520
diff
changeset
|
310 # consider the new tags when dispatching entries |
839734dfb5c7
Handle tag subdirectory as tag in replay mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
520
diff
changeset
|
311 matched = [] |
839734dfb5c7
Handle tag subdirectory as tag in replay mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
520
diff
changeset
|
312 for tags in (self.tags, self.addedtags): |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
313 matched += [t for t in tags |
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
314 if (tag == t or tag.startswith(t + '/'))] |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
315 if not matched: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
316 return None, None, None |
521
839734dfb5c7
Handle tag subdirectory as tag in replay mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
520
diff
changeset
|
317 matched.sort(key=len, reverse=True) |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
318 if tag == matched[0]: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
319 brpath = '' |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
320 svrpath = path |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
321 else: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
322 brpath = tag[len(matched[0])+1:] |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
534
diff
changeset
|
323 svrpath = path[:-(len(brpath)+1)] |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
324 ln = self.localname(svrpath) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
325 return brpath, ln, svrpath |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
326 test = '' |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
327 path_comps = path.split('/') |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
328 while self.localname(test) not in self.branches and len(path_comps): |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
329 if not test: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
330 test = path_comps.pop(0) |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
331 else: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
332 test += '/%s' % path_comps.pop(0) |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
333 if self.localname(test) in self.branches: |
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
334 return path[len(test)+1:], self.localname(test), test |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
335 if existing: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
336 return None, None, None |
313
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
337 if path == 'trunk' or path.startswith('trunk/'): |
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
338 path = path.split('/')[1:] |
207
b20a6c149021
fetch: Fix a bogus case where no files in the root level of trunk caused breakage in the branch detection.
Augie Fackler <durin42@gmail.com>
parents:
203
diff
changeset
|
339 test = 'trunk' |
218
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
340 elif path.startswith('branches/'): |
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
341 elts = path.split('/') |
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
342 test = '/'.join(elts[:2]) |
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
343 path = '/'.join(elts[2:]) |
207
b20a6c149021
fetch: Fix a bogus case where no files in the root level of trunk caused breakage in the branch detection.
Augie Fackler <durin42@gmail.com>
parents:
203
diff
changeset
|
344 else: |
b20a6c149021
fetch: Fix a bogus case where no files in the root level of trunk caused breakage in the branch detection.
Augie Fackler <durin42@gmail.com>
parents:
203
diff
changeset
|
345 path = test.split('/')[-1] |
b20a6c149021
fetch: Fix a bogus case where no files in the root level of trunk caused breakage in the branch detection.
Augie Fackler <durin42@gmail.com>
parents:
203
diff
changeset
|
346 test = '/'.join(test.split('/')[:-1]) |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
347 ln = self.localname(test) |
218
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
348 if ln and ln.startswith('../'): |
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
349 return None, None, None |
a360ddc97719
branches: change handling again, but this time a little less magic.
Augie Fackler <durin42@gmail.com>
parents:
217
diff
changeset
|
350 return path, ln, test |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
351 |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
352 def _determine_parent_branch(self, p, src_path, src_rev, revnum): |
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
353 if src_path is not None: |
420
59e19c73b0df
svnmeta: eliminate unneeded path_and_branch_for_path() method
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
417
diff
changeset
|
354 src_file, src_branch = self.split_branch_path(src_path)[:2] |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
355 src_tag = self.get_path_tag(src_path) |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
356 if src_tag or src_file == '': |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
357 ln = self.localname(p) |
519
247110c633f7
maps: TagMap tags are non-empty strings
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
358 if src_tag in self.tags: |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
359 changeid = self.tags[src_tag] |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
360 src_rev, src_branch = self.get_source_rev(changeid)[:2] |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
361 return {ln: (src_branch, src_rev, revnum)} |
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
362 return {} |
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
363 |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
364 def is_path_valid(self, path): |
217
6eb691a163cd
hg_delta_editor: stop using foobaz as a bogus filename.
Augie Fackler <durin42@gmail.com>
parents:
214
diff
changeset
|
365 if path is None: |
6eb691a163cd
hg_delta_editor: stop using foobaz as a bogus filename.
Augie Fackler <durin42@gmail.com>
parents:
214
diff
changeset
|
366 return False |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
367 subpath = self.split_branch_path(path)[0] |
179
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
368 if subpath is None: |
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
369 return False |
409
d4615986e1db
extract the filemap support into a separate class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
408
diff
changeset
|
370 return subpath in self.filemap |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
371 |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
372 def get_parent_svn_branch_and_rev(self, number, branch, exact=False): |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
373 """Return the parent revision of branch at number as a tuple |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
374 (parentnum, parentbranch) or (None, None) if undefined. |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
375 |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
376 By default, current revision copy records will be used to resolve |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
377 the parent. For instance, if branch1 is replaced by branch2 in |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
378 current revision, then the parent of current revision on branch1 |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
379 will be branch2. In this case, use exact=True to select the |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
380 existing branch before looking at the copy records. |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
381 """ |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
382 if (number, branch) in self.revmap: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
383 return number, branch |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
384 real_num = 0 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
385 for num, br in self.revmap.iterkeys(): |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
386 if br != branch: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
387 continue |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
388 if num <= number and num > real_num: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
389 real_num = num |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
390 if branch in self.branches: |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
391 parent_branch = self.branches[branch][0] |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
392 parent_branch_rev = self.branches[branch][1] |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
393 # check to see if this branch already existed and is the same |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
394 if parent_branch_rev < real_num: |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
395 return real_num, branch |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
396 # if that wasn't true, then this is the a new branch with the |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
397 # same name as some old deleted branch |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
398 if parent_branch_rev <= 0 and real_num == 0: |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
399 return None, None |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
400 branch_created_rev = self.branches[branch][2] |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
401 if parent_branch == 'trunk': |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
402 parent_branch = None |
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
403 if branch_created_rev <= number+1 and branch != parent_branch: |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
404 # did the branch exist in previous run |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
405 if exact and branch in self.prevbranches: |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
406 if self.prevbranches[branch][1] < real_num: |
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
407 return real_num, branch |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
131
diff
changeset
|
408 return self.get_parent_svn_branch_and_rev( |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
409 parent_branch_rev, parent_branch) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
410 if real_num != 0: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
411 return real_num, branch |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
412 return None, None |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
413 |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
414 def get_parent_revision(self, number, branch, exact=False): |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
415 '''Get the parent revision hash for a commit on a specific branch. |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
416 ''' |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
417 tag = self.get_path_tag(self.remotename(branch)) |
533
7b330c576920
svnmeta: speedup get_parent_revision() in common case
Patrick Mezard <pmezard@gmail.com>
parents:
521
diff
changeset
|
418 if tag: |
537
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
419 # Reference a tag being created |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
420 if tag in self.addedtags: |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
421 tbranch, trev = self.addedtags[tag] |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
422 fromtag = self.get_path_tag(self.remotename(tbranch)) |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
423 if not fromtag: |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
424 # Created from a regular branch, not another tag |
575
c278a225b750
svnmeta: reverse parameter calculation to lessen complexity
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
425 tagged = self.get_parent_svn_branch_and_rev(trev, tbranch) |
537
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
426 return node.hex(self.revmap[tagged]) |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
427 tag = fromtag |
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
428 # Reference an existing tag |
728
cfefeefad199
rename TagMap to Tags, to free up the TagMap name
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
726
diff
changeset
|
429 limitedtags = maps.Tags(self.repo, endrev=number-1) |
533
7b330c576920
svnmeta: speedup get_parent_revision() in common case
Patrick Mezard <pmezard@gmail.com>
parents:
521
diff
changeset
|
430 if tag in limitedtags: |
537
3c8b86949072
svnmeta: make get_parent_revision() handle added tags
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
431 return limitedtags[tag] |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
432 r, br = self.get_parent_svn_branch_and_rev(number - 1, branch, exact) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
433 if r is not None: |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
434 return self.revmap[r, br] |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
435 return revlog.nullid |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
436 |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
437 def get_source_rev(self, changeid=None, ctx=None): |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
438 """Return the source svn revision, the branch name and the svn |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
439 branch path or a converted changeset. If supplied revision |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
440 has no conversion record, raise KeyError. |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
441 |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
442 If ctx is None, build one from supplied changeid |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
443 """ |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
444 if ctx is None: |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
445 ctx = self.repo[changeid] |
632
eea224fa1156
svnmeta: improve error message in get_source_rev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
594
diff
changeset
|
446 extra = ctx.extra() |
eea224fa1156
svnmeta: improve error message in get_source_rev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
594
diff
changeset
|
447 if 'convert_revision' not in extra: |
eea224fa1156
svnmeta: improve error message in get_source_rev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
594
diff
changeset
|
448 raise KeyError('%s has no conversion record' % ctx) |
eea224fa1156
svnmeta: improve error message in get_source_rev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
594
diff
changeset
|
449 branchpath, revnum = extra['convert_revision'][40:].rsplit('@', 1) |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
450 branch = self.localname(self.normalize(branchpath)) |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
451 if self.layout == 'single': |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
452 branchpath = '' |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
453 if branchpath and branchpath[0] == '/': |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
454 branchpath = branchpath[1:] |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
455 return int(revnum), branch, branchpath |
448
fbc7cf4fd701
tags: reinstate a tag map file in a better way
Augie Fackler <durin42@gmail.com>
parents:
447
diff
changeset
|
456 |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
457 def update_branch_tag_map_for_rev(self, revision): |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
458 """Given a revision object, determine changes to branches. |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
459 |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
460 Returns: a dict of { |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
461 'branches': (added_branches, self.closebranches), |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
462 } where adds are dicts where the keys are branch names and |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
463 values are the place the branch came from. The deletions are |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
464 sets of the deleted branches. |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
465 """ |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
466 if self.layout == 'single': |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
467 return {'branches': ({None: (None, 0, -1), }, set()), |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
474
diff
changeset
|
468 } |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
469 paths = revision.paths |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
470 added_branches = {} |
538
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
471 # Reset the tags delta before detecting the new one, and take |
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
472 # care not to fill them until done since split_branch_path() |
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
473 # use them. |
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
474 self.addedtags, self.deletedtags = {}, {} |
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
475 addedtags, deletedtags = {}, {} |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
476 self.closebranches = set() |
131
4d42dbbb5127
hg_delta_editor: fix parent revision detection on branch copy
Patrick Mezard <pmezard@gmail.com>
parents:
124
diff
changeset
|
477 for p in sorted(paths): |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
478 t_name = self.get_path_tag(p) |
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
499
diff
changeset
|
479 if t_name: |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
480 src_p, src_rev = paths[p].copyfrom_path, paths[p].copyfrom_rev |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
481 if src_p is not None and src_rev is not None: |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
482 file, branch = self.split_branch_path(src_p)[:2] |
539
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
483 from_tag = self.get_path_tag(src_p) |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
484 if file is None and not from_tag: |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
485 continue |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
486 if from_tag and from_tag not in self.tags: |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
487 # Ignore copies from unknown tags |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
488 continue |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
489 if not file: |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
490 # Direct branch or tag copy |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
491 if from_tag: |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
492 changeid = self.tags[from_tag] |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
493 src_rev, branch = self.get_source_rev(changeid)[:2] |
539
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
494 if t_name not in addedtags: |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
495 addedtags[t_name] = branch, src_rev |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
496 else: |
36eb608b831b
svnmeta: make tag detection code more explicity
Patrick Mezard <pmezard@gmail.com>
parents:
538
diff
changeset
|
497 # Subbranch or subtag copy |
381
a441ba143ac8
tags: fix handling for certain nonstandard tag layouts.
Augie Fackler <durin42@gmail.com>
parents:
380
diff
changeset
|
498 t_name = t_name[:-(len(file)+1)] |
538
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
499 found = t_name in addedtags |
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
500 if found and src_rev > addedtags[t_name][1]: |
545
ebd8fb1a05e4
clean up trailing whitespace
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
501 addedtags[t_name] = branch, src_rev |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
502 elif (paths[p].action == 'D' and p.endswith(t_name) |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
503 and t_name in self.tags): |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
504 branch = self.get_source_rev(self.tags[t_name])[1] |
538
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
505 deletedtags[t_name] = branch, None |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
506 continue |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
507 |
312
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
508 # At this point we know the path is not a tag. In that |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
509 # case, we only care if it is the root of a new branch (in |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
510 # this function). This is determined by the following |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
511 # checks: |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
512 # 1. Is the file located inside any currently known |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
513 # branch? If yes, then we're done with it, this isn't |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
514 # interesting. |
313
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
515 # 2. Does the file have copyfrom information? If yes, then |
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
516 # we're done: this is a new branch, and we record the |
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
517 # copyfrom in added_branches if it comes from the root |
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
518 # of another branch, or create it from scratch. |
312
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
519 # 3. Neither of the above. This could be a branch, but it |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
520 # might never work out for us. It's only ever a branch |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
521 # (as far as we're concerned) if it gets committed to, |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
522 # which we have to detect at file-write time anyway. So |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
523 # we do nothing here. |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
524 # 4. It's the root of an already-known branch, with an |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
525 # action of 'D'. We mark the branch as deleted. |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
526 # 5. It's the parent directory of one or more |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
527 # already-known branches, so we mark them as deleted. |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
528 # 6. It's a branch being replaced by another branch - the |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
529 # action will be 'R'. |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
530 fi, br = self.split_branch_path(p)[:2] |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
531 if fi is not None: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
532 if fi == '': |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
533 if paths[p].action == 'D': |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
534 self.closebranches.add(br) # case 4 |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
535 elif paths[p].action == 'R': |
312
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
536 parent = self._determine_parent_branch( |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
537 p, paths[p].copyfrom_path, paths[p].copyfrom_rev, |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
538 revision.revnum) |
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
539 added_branches.update(parent) |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
540 continue # case 1 |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
541 if paths[p].action == 'D': |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
542 for known in self.branches: |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
543 if self.remotename(known).startswith(p): |
473
45df4d9320fa
Fix 'parent dir of a branch is deleted' refactoring from 343da84.
Max Bowsher <maxb@f2s.com>
parents:
459
diff
changeset
|
544 self.closebranches.add(known) # case 5 |
312
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
545 parent = self._determine_parent_branch( |
724 | 546 p, paths[p].copyfrom_path, paths[p].copyfrom_rev, |
547 revision.revnum) | |
313
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
548 if not parent and paths[p].copyfrom_path: |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
539
diff
changeset
|
549 bpath, branch = self.split_branch_path(p, False)[:2] |
352
cc7a10efddc9
Fix a bug in branch ancestry calculation.
Augie Fackler <durin42@gmail.com>
parents:
350
diff
changeset
|
550 if (bpath is not None |
cc7a10efddc9
Fix a bug in branch ancestry calculation.
Augie Fackler <durin42@gmail.com>
parents:
350
diff
changeset
|
551 and branch not in self.branches |
cc7a10efddc9
Fix a bug in branch ancestry calculation.
Augie Fackler <durin42@gmail.com>
parents:
350
diff
changeset
|
552 and branch not in added_branches): |
313
942f198b8ff5
hg_delta_editor: detect new branches issued from non-branch directories
Patrick Mezard <pmezard@gmail.com>
parents:
312
diff
changeset
|
553 parent = {branch: (None, 0, revision.revnum)} |
551
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
554 elif bpath is None: |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
555 srcpath = paths[p].copyfrom_path |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
556 srcrev = paths[p].copyfrom_rev |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
557 parent = {} |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
558 for br in self.branches: |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
559 rn = self.remotename(br) |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
560 if rn.startswith(srcpath[1:] + '/'): |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
561 bname = posixpath.basename(rn) |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
562 newbr = posixpath.join(p, bname) |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
563 parent.update( |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
564 self._determine_parent_branch( |
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
565 newbr, rn, srcrev, revision.revnum)) |
312
4dc197f533c1
hg_delta_editor: reformat huge comment, rename __determine_parent_branch()
Patrick Mezard <pmezard@gmail.com>
parents:
290
diff
changeset
|
566 added_branches.update(parent) |
538
93bb37e38675
svnmeta: do not change added/deletedtags while detecting them
Patrick Mezard <pmezard@gmail.com>
parents:
537
diff
changeset
|
567 self.addedtags, self.deletedtags = addedtags, deletedtags |
367
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
568 return { |
414
343da842dbe6
split parts of HgChangeReceiver out into an SVNMeta class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
413
diff
changeset
|
569 'branches': (added_branches, self.closebranches), |
367
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
570 } |
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
571 |
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
572 def save_tbdelta(self, tbdelta): |
584
d000b9a361e4
svnmeta: add exact arg to get_parent_revision() to handle 'R'
Patrick Mezard <pmezard@gmail.com>
parents:
575
diff
changeset
|
573 self.prevbranches = dict(self.branches) |
367
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
574 for br in tbdelta['branches'][1]: |
59
430af23bef4a
Performance fix for branches-from-tags in real replay, which is tied up with
Augie Fackler <durin42@gmail.com>
parents:
55
diff
changeset
|
575 del self.branches[br] |
367
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
365
diff
changeset
|
576 self.branches.update(tbdelta['branches'][0]) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
577 |
634
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
578 def movetag(self, tag, hash, rev, date): |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
545
diff
changeset
|
579 if tag in self.tags and self.tags[tag] == hash: |
474
63cb630d667d
tags: handle the most recent commit being an edit to an svn tag properly
Augie Fackler <durin42@gmail.com>
parents:
473
diff
changeset
|
580 return |
634
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
581 |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
582 # determine branch from earliest unclosed ancestor |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
583 branchparent = self.repo[hash] |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
584 while branchparent.extra().get('close'): |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
585 branchparent = branchparent.parents()[0] |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
586 branch = self.get_source_rev(ctx=branchparent)[1] |
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
632
diff
changeset
|
587 |
449
bda5b47ad2a2
tags: handle editing a tag and its source branch simultaneously
Augie Fackler <durin42@gmail.com>
parents:
448
diff
changeset
|
588 parentctx = self.repo[self.get_parent_revision(rev.revnum+1, branch)] |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
589 if '.hgtags' in parentctx: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
590 tagdata = parentctx.filectx('.hgtags').data() |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
591 else: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
592 tagdata = '' |
729 | 593 tagdata += '%s %s\n' % (node.hex(hash), self.tagmap.get(tag, tag)) |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
594 def hgtagsfn(repo, memctx, path): |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
595 assert path == '.hgtags' |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
596 return context.memfilectx(path=path, |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
597 data=tagdata, |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
598 islink=False, |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
599 isexec=False, |
545
ebd8fb1a05e4
clean up trailing whitespace
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
600 copied=False) |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
601 revnum, branch = self.get_source_rev(ctx=parentctx)[:2] |
452
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
602 newparent = None |
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
603 for child in parentctx.children(): |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
604 if (self.get_source_rev(ctx=child)[1] == branch |
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
605 and child.extra().get('close', False)): |
452
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
606 newparent = child |
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
607 if newparent: |
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
608 parentctx = newparent |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
609 revnum, branch = self.get_source_rev(ctx=parentctx)[:2] |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
610 ctx = context.memctx(self.repo, |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
611 (parentctx.node(), node.nullid), |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
612 rev.message or '...', |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
613 ['.hgtags', ], |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
614 hgtagsfn, |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
615 self.authors[rev.author], |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
616 date, |
534
e38f110e7088
svnmeta: make it easier to get converted revision info
Patrick Mezard <pmezard@gmail.com>
parents:
533
diff
changeset
|
617 parentctx.extra()) |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
618 new_hash = self.repo.commitctx(ctx) |
452
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
619 if not newparent: |
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
620 assert self.revmap[revnum, branch] == parentctx.node() |
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
451
diff
changeset
|
621 self.revmap[revnum, branch] = new_hash |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
452
diff
changeset
|
622 self.tags[tag] = hash, rev.revnum |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
623 util.describe_commit(self.ui, new_hash, branch) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
423
diff
changeset
|
624 |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
625 def committags(self, rev, endbranches): |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
626 if not self.addedtags and not self.deletedtags: |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
627 return |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
628 date = self.fixdate(rev.date) |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
629 # determine additions/deletions per branch |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
630 branches = {} |
520
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
631 for tags in (self.addedtags, self.deletedtags): |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
632 for tag, (branch, srcrev) in tags.iteritems(): |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
633 op = srcrev is None and 'rm' or 'add' |
5a5b90a6d522
svnmeta: internalize tags delta
Patrick Mezard <pmezard@gmail.com>
parents:
519
diff
changeset
|
634 branches.setdefault(branch, []).append((op, tag, srcrev)) |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
635 |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
636 for b, tags in branches.iteritems(): |
726
8d36054b04ed
keep variables more local, add some whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
724
diff
changeset
|
637 |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
638 # modify parent's .hgtags source |
726
8d36054b04ed
keep variables more local, add some whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
724
diff
changeset
|
639 |
389
a8811c84e3ee
tags: Fix an improper parent calculation.
Augie Fackler <durin42@gmail.com>
parents:
386
diff
changeset
|
640 parent = self.repo[self.get_parent_revision(rev.revnum, b)] |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
641 if '.hgtags' not in parent: |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
642 src = '' |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
643 else: |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
644 src = parent['.hgtags'].data() |
726
8d36054b04ed
keep variables more local, add some whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
724
diff
changeset
|
645 |
8d36054b04ed
keep variables more local, add some whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
724
diff
changeset
|
646 fromtag = self.get_path_tag(self.remotename(b)) |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
647 for op, tag, r in sorted(tags, reverse=True): |
729 | 648 |
649 if tag in self.tagmap and not self.tagmap[tag]: | |
650 continue | |
651 | |
652 tagged = node.hex(node.nullid) # op != 'add' | |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
653 if op == 'add': |
451
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
654 if fromtag: |
455
54e57da61c1a
This patch fixes, partially, an issue with tagpaths.
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
452
diff
changeset
|
655 if fromtag in self.tags: |
54e57da61c1a
This patch fixes, partially, an issue with tagpaths.
Michael J. Pedersen <mpedersen@datapipe.com>
parents:
452
diff
changeset
|
656 tagged = node.hex(self.tags[fromtag]) |
451
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
657 else: |
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
658 tagged = node.hex(self.revmap[ |
575
c278a225b750
svnmeta: reverse parameter calculation to lessen complexity
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
574
diff
changeset
|
659 self.get_parent_svn_branch_and_rev(r, b)]) |
729 | 660 |
661 src += '%s %s\n' % (tagged, self.tagmap.get(tag, tag)) | |
453
bb612e625be6
tags: handle copyfrom old versions of tags more correctly
Augie Fackler <durin42@gmail.com>
parents:
452
diff
changeset
|
662 self.tags[tag] = node.bin(tagged), rev.revnum |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
663 |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
664 # add new changeset containing updated .hgtags |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
665 def fctxfun(repo, memctx, path): |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
666 return context.memfilectx(path='.hgtags', data=src, |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
667 islink=False, isexec=False, |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
668 copied=None) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
669 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
421
diff
changeset
|
670 extra = self.genextra(rev.revnum, b) |
451
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
671 if fromtag: |
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
672 extra['branch'] = parent.extra().get('branch', 'default') |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
673 self.mapbranch(extra, b in endbranches or fromtag) |
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
674 |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
675 ctx = context.memctx(self.repo, |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
676 (parent.node(), node.nullid), |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
677 rev.message or ' ', |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
678 ['.hgtags'], |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
679 fctxfun, |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
680 self.authors[rev.author], |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
681 date, |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
682 extra) |
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
683 new = self.repo.commitctx(ctx) |
451
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
684 |
e533e78f1b2f
tags: handle tags from edited tags.
Augie Fackler <durin42@gmail.com>
parents:
450
diff
changeset
|
685 if not fromtag and (rev.revnum, b) not in self.revmap: |
408
f137231f9d30
extract the revmap support into a separate dict-like class
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
407
diff
changeset
|
686 self.revmap[rev.revnum, b] = new |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
687 if b in endbranches: |
399
94f7e8c53c36
tags: end branch while tagging instead of creating extra changeset
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
398
diff
changeset
|
688 endbranches.pop(b) |
94f7e8c53c36
tags: end branch while tagging instead of creating extra changeset
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
398
diff
changeset
|
689 bname = b or 'default' |
94f7e8c53c36
tags: end branch while tagging instead of creating extra changeset
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
398
diff
changeset
|
690 self.ui.status('Marked branch %s as closed.\n' % bname) |
376
9327e9325645
Use tbdelta to push added tags into .hgtags.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
375
diff
changeset
|
691 |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
692 def delbranch(self, branch, node, rev): |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
693 pctx = self.repo[node] |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
694 files = pctx.manifest().keys() |
423
021bdbf391bb
put convert_revision in branch-closing csets
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
422
diff
changeset
|
695 extra = self.genextra(rev.revnum, branch) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
551
diff
changeset
|
696 self.mapbranch(extra, True) |
413
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
697 ctx = context.memctx(self.repo, |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
698 (node, revlog.nullid), |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
699 rev.message or util.default_commit_msg, |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
700 [], |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
701 lambda x, y, z: None, |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
702 self.authors[rev.author], |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
703 self.fixdate(rev.date), |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
704 extra) |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
705 new = self.repo.commitctx(ctx) |
ac0cc3c9ea63
sort HgChangeReceiver methods and properties
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
706 self.ui.status('Marked branch %s as closed.\n' % (branch or 'default')) |