annotate hgsubversion/layouts/standard.py @ 1319:43a365f5d13c

Allow changing the path to the trunk
author Francois Dinel <fdinel@gmail.com>
date Fri, 20 Feb 2015 13:13:03 -0500
parents a6d3692a5800
children
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
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
2
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
3 import base
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
4
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
5 class StandardLayout(base.BaseLayout):
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
6 """The standard trunk, branches, tags layout"""
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
7
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
8 def __init__(self, meta):
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
9 base.BaseLayout.__init__(self, meta)
1026
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
10
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
11 self._tag_locations = None
66395f232b7c layouts: pull tag location list management into layout module
David Schleimer <dschleimer@fb.com>
parents: 1014
diff changeset
12
1268
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
13 # branchdir is expected to be stripped of leading slashes but retain
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
14 # its last slash
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
15 meta._gen_cachedconfig('branchdir', 'branches',
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
16 pre=lambda x: '/'.join(p for p in x.split('/')
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
17 if p) + '/')
fadacedaf391 layouts: add cached branchdir property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1265
diff changeset
18
1274
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
19 # infix is expected to be stripped of trailing slashes but retain
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
20 # its first slash
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
21 def _infix_transform(x):
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
22 x = '/'.join(p for p in x.split('/') if p)
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
23 if x:
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
24 x = '/' + x
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
25 return x
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
26 meta._gen_cachedconfig('infix', '', pre=_infix_transform)
d21b7259724a layouts: add cached infix property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1273
diff changeset
27
1291
13f8e9cc90c6 layouts: generate cached taglocations property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1276
diff changeset
28 # the lambda is to ensure nested paths are handled properly
13f8e9cc90c6 layouts: generate cached taglocations property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1276
diff changeset
29 meta._gen_cachedconfig('taglocations', ['tags'], 'tag_locations',
13f8e9cc90c6 layouts: generate cached taglocations property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1276
diff changeset
30 'tagpaths', lambda x: list(reversed(sorted(x))))
1319
43a365f5d13c Allow changing the path to the trunk
Francois Dinel <fdinel@gmail.com>
parents: 1310
diff changeset
31 meta._gen_cachedconfig('trunkdir', 'trunk', 'trunk_dir')
1291
13f8e9cc90c6 layouts: generate cached taglocations property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1276
diff changeset
32
1310
a6d3692a5800 layouts: add a name property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1292
diff changeset
33 @property
a6d3692a5800 layouts: add a name property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1292
diff changeset
34 def name(self):
a6d3692a5800 layouts: add a name property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1292
diff changeset
35 return 'standard'
a6d3692a5800 layouts: add a name property to standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1292
diff changeset
36
1271
a1039f8e57d4 layouts: turn trunk into a property for standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1270
diff changeset
37 @property
a1039f8e57d4 layouts: turn trunk into a property for standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1270
diff changeset
38 def trunk(self):
1319
43a365f5d13c Allow changing the path to the trunk
Francois Dinel <fdinel@gmail.com>
parents: 1310
diff changeset
39 return self.meta.trunkdir + self.meta.infix
1271
a1039f8e57d4 layouts: turn trunk into a property for standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1270
diff changeset
40
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
41 def localname(self, path):
1272
38c154371240 layouts: use trunk property instead of internal variable
Sean Farley <sean.michael.farley@gmail.com>
parents: 1271
diff changeset
42 if path == self.trunk:
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
43 return None
1275
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
44 elif path.startswith(self.meta.branchdir) and path.endswith(self.meta.infix):
1269
738c685f893c layouts: use meta.branchdir in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1268
diff changeset
45 path = path[len(self.meta.branchdir):]
1275
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
46 if self.meta.infix:
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
47 path = path[:-len(self.meta.infix)]
1094
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
48 return path
1012
e8cd211684c4 layouts: refactor out svn path to mercurial branch logic
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
49 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
50
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
51 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
52 if branch == 'default' or branch is None:
1272
38c154371240 layouts: use trunk property instead of internal variable
Sean Farley <sean.michael.farley@gmail.com>
parents: 1271
diff changeset
53 path = self.trunk
1013
d507c1a12dcb layouts: refactor mercurial branch to svn path mapping out of svnmeta
David Schleimer <dschleimer@fb.com>
parents: 1012
diff changeset
54 elif branch.startswith('../'):
1094
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
55 path = branch[3:]
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
56 else:
1275
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
57 path = ''.join((self.meta.branchdir, branch, self.meta.infix))
1094
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
58
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
59 return path
1014
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
60
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
61 def remotepath(self, branch, subdir='/'):
1090
80a456b77ade layouts: fix remotepath for default branch in standard layout
David Schleimer <dschleimer@fb.com>
parents: 1029
diff changeset
62 if subdir == '/':
80a456b77ade layouts: fix remotepath for default branch in standard layout
David Schleimer <dschleimer@fb.com>
parents: 1029
diff changeset
63 subdir = ''
1272
38c154371240 layouts: use trunk property instead of internal variable
Sean Farley <sean.michael.farley@gmail.com>
parents: 1271
diff changeset
64 branchpath = self.trunk
1090
80a456b77ade layouts: fix remotepath for default branch in standard layout
David Schleimer <dschleimer@fb.com>
parents: 1029
diff changeset
65 if branch and branch != 'default':
1014
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
66 if branch.startswith('../'):
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
67 branchpath = branch[3:]
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
68 else:
1275
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
69 branchpath = ''.join((self.meta.branchdir, branch,
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
70 self.meta.infix))
1014
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
71
0ed7cf23e801 layouts: refactor path component of convinfo generation into layouts lib
David Schleimer <dschleimer@fb.com>
parents: 1013
diff changeset
72 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
73
1292
7bbe120be193 layouts: turn taglocations method into a property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1291
diff changeset
74 @property
7bbe120be193 layouts: turn taglocations method into a property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1291
diff changeset
75 def taglocations(self):
1291
13f8e9cc90c6 layouts: generate cached taglocations property
Sean Farley <sean.michael.farley@gmail.com>
parents: 1276
diff changeset
76 return self.meta.taglocations
1027
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
77
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
78 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
79 for tagspath in taglocations:
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
80 if path.startswith(tagspath + '/'):
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
81 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
82 if tag:
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
83 return tag
16045f6f3fef layouts: pull svn path -> potential tag name mapping into layouts
David Schleimer <dschleimer@fb.com>
parents: 1026
diff changeset
84 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
85
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
86 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
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 # 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
89 # 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
90 # 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
91
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
92 # 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
93 # 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
94
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
95 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
96 candidate = ''
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
97 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
98 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
99 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
100 else:
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
101 candidate += '/'
513f2b607b06 layouts: pull out logic for splitting svn paths into branch and local parts
David Schleimer <dschleimer@fb.com>
parents: 1027
diff changeset
102 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
103 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
104 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
105
1319
43a365f5d13c Allow changing the path to the trunk
Francois Dinel <fdinel@gmail.com>
parents: 1310
diff changeset
106 if path == self.meta.trunkdir or path.startswith(self.meta.trunkdir + '/'):
1272
38c154371240 layouts: use trunk property instead of internal variable
Sean Farley <sean.michael.farley@gmail.com>
parents: 1271
diff changeset
107 return self.trunk, path[len(self.trunk) + 1:]
1093
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
108
1269
738c685f893c layouts: use meta.branchdir in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1268
diff changeset
109 if path.startswith(self.meta.branchdir):
738c685f893c layouts: use meta.branchdir in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1268
diff changeset
110 path = path[len(self.meta.branchdir):]
1093
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
111 components = path.split('/', 1)
1269
738c685f893c layouts: use meta.branchdir in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1268
diff changeset
112 branch_path = ''.join((self.meta.branchdir, components[0]))
1093
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
113 if len(components) == 1:
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
114 local_path = ''
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
115 else:
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
116 local_path = components[1]
1094
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
117
9a7e3dbd0f6e layouts: add support for an infix between tbt and the hg root
David Schleimer <dschleimer@fb.com>
parents: 1093
diff changeset
118 if local_path == '':
1275
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
119 branch_path += self.meta.infix
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
120 elif local_path.startswith(self.meta.infix[1:] + '/'):
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
121 branch_path += self.meta.infix
ca771cbf69c6 layouts: use meta.infix in standard
Sean Farley <sean.michael.farley@gmail.com>
parents: 1274
diff changeset
122 local_path = local_path[len(self.meta.infix):]
1093
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
123 return branch_path, local_path
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
124
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
125 components = path.split('/')
791382a21cc4 layouts: add support for configuring branches directory
David Schleimer <dschleimer@fb.com>
parents: 1090
diff changeset
126 return '/'.join(components[:-1]), components[-1]