annotate hgsubversion/layouts/detect.py @ 1265:4744b7bfa476

layouts: change constructor to take a meta object This change is another step forward to centralize subversion configuration options and help refactor. I couldn't find an easier way to split up this change since there are many interdependent function calls. There is no functionality change in this patch, only renaming ui -> meta.
author Sean Farley <sean.michael.farley@gmail.com>
date Mon, 24 Mar 2014 11:20:49 -0500
parents 7993379b9956
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1004
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
1 """ Layout detection for subversion repos.
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
2
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
3 Figure out what layout we should be using, based on config, command
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
4 line flags, subversion contents, and anything else we decide to base
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
5 it on.
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
6
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
7 """
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
8
1006
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
9 import os.path
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
10
1004
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
11 from mercurial import util as hgutil
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
12
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
13 import __init__ as layouts
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
14
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
15 def layout_from_subversion(svn, revision=None, meta=None):
1004
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
16 """ Guess what layout to use based on directories under the svn root.
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
17
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
18 This is intended for use during bootstrapping. It guesses which
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
19 layout to use based on the presence or absence of the conventional
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
20 trunk, branches, tags dirs immediately under the path your are
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
21 cloning.
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
22
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
23 Additionally, this will write the layout in use to the ui object
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
24 passed, if any.
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
25
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
26 """
1101
4a92eb1484ba layouts: fix crash when importing hgsubversion itself (issue #402)
Greg Ward <greg@gerg.ca>
parents: 1091
diff changeset
27 # import late to avoid trouble when running the test suite
1102
7635d30effa7 layouts: add importerror ladder so hgsubversion works as an installed module
Augie Fackler <raf@durin42.com>
parents: 1101
diff changeset
28 try:
7635d30effa7 layouts: add importerror ladder so hgsubversion works as an installed module
Augie Fackler <raf@durin42.com>
parents: 1101
diff changeset
29 from hgext_hgsubversion import svnwrap
7635d30effa7 layouts: add importerror ladder so hgsubversion works as an installed module
Augie Fackler <raf@durin42.com>
parents: 1101
diff changeset
30 except ImportError:
7635d30effa7 layouts: add importerror ladder so hgsubversion works as an installed module
Augie Fackler <raf@durin42.com>
parents: 1101
diff changeset
31 from hgsubversion import svnwrap
1004
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
32
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
33 try:
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
34 rootlist = svn.list_dir('', revision=revision)
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
35 except svnwrap.SubversionException, e:
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
36 err = "%s (subversion error: %d)" % (e.args[0], e.args[1])
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
37 raise hgutil.Abort(err)
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
38 if sum(map(lambda x: x in rootlist, ('branches', 'tags', 'trunk'))):
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
39 layout = 'standard'
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
40 else:
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
41 layout = 'single'
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
42 meta.ui.setconfig('hgsubversion', 'layout', layout)
1004
b2d89ba6b871 layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff changeset
43 return layout
1005
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
44
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
45 def layout_from_config(meta, allow_auto=False):
1005
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
46 """ Load the layout we are using based on config
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
47
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
48 We will read the config from the ui object. Pass allow_auto=True
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
49 if you are doing bootstrapping and can detect the layout in
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
50 another manner if you get auto. Otherwise, we will abort if we
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
51 detect the layout as auto.
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
52 """
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
53
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
54 layout = meta.ui.config('hgsubversion', 'layout', default='auto')
1005
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
55 if layout == 'auto' and not allow_auto:
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
56 raise hgutil.Abort('layout not yet determined')
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
57 elif layout not in layouts.NAME_TO_CLASS and layout != 'auto':
1005
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
58 raise hgutil.Abort("unknown layout '%s'" % layout)
5bba4d1becde layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents: 1004
diff changeset
59 return layout
1006
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
60
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
61 def layout_from_file(meta):
1006
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
62 """ Load the layout in use from the metadata file.
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
63 """
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
64
1260
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
65 # import late to avoid trouble when running the test suite
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
66 try:
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
67 from hgext_hgsubversion import util
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
68 except ImportError:
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
69 from hgsubversion import util
7993379b9956 layouts: use util.load in layout_from_config
Sean Farley <sean.michael.farley@gmail.com>
parents: 1153
diff changeset
70
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
71 layout = util.load(meta.layout_file)
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
72 if layout:
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
73 meta.ui.setconfig('hgsubversion', 'layout', layout)
1006
7a3b938825cd layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents: 1005
diff changeset
74 return layout
1007
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
75
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
76 def layout_from_commit(subdir, revpath, branch, meta):
1007
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
77 """ Guess what the layout is based existing commit info
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
78
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
79 Specifically, this compares the subdir for the repository and the
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
80 revpath as extracted from the convinfo in the commit. If they
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
81 match, the layout is assumed to be single. Otherwise, it tries
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
82 the available layouts and selects the first one that would
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
83 translate the given branch to the given revpath.
1007
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
84
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
85 """
e95f4de8709a layouts: refactor buildmeta layout reading and writing
David Schleimer <dschleimer@fb.com>
parents: 1006
diff changeset
86
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
87 subdir = subdir or '/'
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
88 if subdir == revpath:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
89 return 'single'
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
90
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
91 candidates = set()
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
92 for layout in layouts.NAME_TO_CLASS:
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
93 layoutobj = layouts.layout_from_name(layout, meta)
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
94 try:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
95 remotepath = layoutobj.remotepath(branch, subdir)
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
96 except KeyError:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
97 continue
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
98 if remotepath == revpath:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
99 candidates.add(layout)
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
100
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
101 if len(candidates) == 1:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
102 return candidates.pop()
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
103 elif candidates:
1265
4744b7bfa476 layouts: change constructor to take a meta object
Sean Farley <sean.michael.farley@gmail.com>
parents: 1260
diff changeset
104 config_layout = layout_from_config(meta, allow_auto=True)
1091
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
105 if config_layout in candidates:
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
106 return config_layout
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
107
384eb7e05b61 layouts: teach layout detection from file about alternate layouts
David Schleimer <dschleimer@fb.com>
parents: 1022
diff changeset
108 return 'standard'