annotate hgsubversion/layouts/standard.py @ 1026:66395f232b7c

layouts: pull tag location list management into layout module We keep a list of locations within subversion where we look for tags that persists across runs. This pulls the logic for constructiong that list from config on first clone, and for mainting the list afterwards out of svnmeta and into layouts.
author David Schleimer <dschleimer@fb.com>
date Tue, 21 May 2013 16:29:18 -0700
parents 0ed7cf23e801
children 16045f6f3fef
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