Mercurial > hgsubversion
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 |
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' |