annotate hgsubversion/layouts/standard.py @ 1029:513f2b607b06

layouts: pull out logic for splitting svn paths into branch and local parts There is a single method on svnmeta that is responsible for both splitting a subversion path into a local component, which specifies a path relative to the mercurial root, and a branch component, which specifies the path to the root of a subversion branch, and translating that branch path into a mercurial branch name. This pulls the logic for doing the path splitting into a layout object method that *only* splits the path, and changes the svnmeta to call the layout objects's localname method to do the subversion branch path to mercurial branch name translation.
author David Schleimer <dschleimer@fb.com>
date Wed, 05 Jun 2013 11:06:34 -0700
parents 16045f6f3fef
children 80a456b77ade
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1026
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
1 import os.path
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
2 import pickle
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
3
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
4 import base
1026
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
5 import hgsubversion.util as util
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
6
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
7 class StandardLayout(base.BaseLayout):
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
8 """The standard trunk, branches, tags layout"""
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
9
1026
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
10 def __init__(self, ui):
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
11 base.BaseLayout.__init__(self, ui)
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
12
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
13 self._tag_locations = None
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
14
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
15 def localname(self, path):
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
16 if path == 'trunk':
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
17 return None
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
18 elif path.startswith('branches/'):
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
19 return path[len('branches/'):]
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
20 return '../%s' % path
1013
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
21
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
22 def remotename(self, branch):
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
23 if branch == 'default' or branch is None:
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
24 return 'trunk'
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
25 elif branch.startswith('../'):
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
26 return branch[3:]
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
27 return 'branches/%s' % branch
1014
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
28
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
29 def remotepath(self, branch, subdir='/'):
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
30 branchpath = 'trunk'
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
31 if branch:
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
32 if branch.startswith('../'):
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
33 branchpath = branch[3:]
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
34 else:
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
35 branchpath = 'branches/%s' % branch
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
36
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
37 return '%s/%s' % (subdir or '', branchpath)
1026
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
38
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
39 def taglocations(self, meta_data_dir):
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
40 if self._tag_locations is None:
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
41
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
42 tag_locations_file = os.path.join(meta_data_dir, 'tag_locations')
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
43
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
44 if os.path.exists(tag_locations_file):
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
45 f = open(tag_locations_file)
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
46 self._tag_locations = pickle.load(f)
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
47 f.close()
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
48 else:
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
49 self._tag_locations = self.ui.configlist('hgsubversion',
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
50 'tagpaths',
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
51 ['tags'])
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
52 util.pickle_atomic(self._tag_locations, tag_locations_file)
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
53
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
54 # ensure nested paths are handled properly
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
55 self._tag_locations.sort()
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
56 self._tag_locations.reverse()
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
57
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
58 return self._tag_locations
1027
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
59
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
60 def get_path_tag(self, path, taglocations):
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
61 for tagspath in taglocations:
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
62 if path.startswith(tagspath + '/'):
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
63 tag = path[len(tagspath) + 1:]
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
64 if tag:
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
65 return tag
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
66 return None
1029
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
67
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
68 def split_remote_name(self, path, known_branches):
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
69
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
70 # this odd evolution is how we deal with people doing things like
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
71 # creating brances (note the typo), committing to a branch under it,
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
72 # and then moving it to branches
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
73
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
74 # we need to find the ../foo branch names, if they exist, before
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
75 # trying to create a normally-named branch
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
76
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
77 components = path.split('/')
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
78 candidate = ''
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
79 while self.localname(candidate) not in known_branches and components:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
80 if not candidate:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
81 candidate = components.pop(0)
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
82 else:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
83 candidate += '/'
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
84 candidate += components.pop(0)
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
85 if self.localname(candidate) in known_branches:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
86 return candidate, '/'.join(components)
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
87
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
88 if path == 'trunk' or path.startswith('trunk/'):
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
89 branch_path = 'trunk'
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
90 local_path = '/'.join(path.split('/')[1:])
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
91 elif path.startswith('branches/'):
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
92 components = path.split('/')
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
93 branch_path = '/'.join(components[:2])
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
94 local_path = '/'.join(components[2:])
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
95 else:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
96 components = path.split('/')
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
97 branch_path = '/'.join(components[:-1])
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
98 local_path = components[-1]
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
99 return branch_path, local_path