Mercurial > hgsubversion
annotate hgsubversion/layouts/detect.py @ 1006:7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
author | David Schleimer <dschleimer@fb.com> |
---|---|
date | Wed, 17 Apr 2013 16:14:15 -0700 |
parents | 5bba4d1becde |
children | e95f4de8709a |
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 |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
13 import hgsubversion.svnwrap |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
14 |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
15 def layout_from_subversion(svn, revision=None, ui=None): |
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 """ |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
27 |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
28 try: |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
29 rootlist = svn.list_dir('', revision=revision) |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
30 except svnwrap.SubversionException, e: |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
31 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
|
32 raise hgutil.Abort(err) |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
33 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
|
34 layout = 'standard' |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
35 else: |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
36 layout = 'single' |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
37 ui.setconfig('hgsubversion', 'layout', layout) |
b2d89ba6b871
layouts: pull out code for detecting layout from subversion
David Schleimer <dschleimer@fb.com>
parents:
diff
changeset
|
38 return layout |
1005
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
39 |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
40 def layout_from_config(ui, allow_auto=False): |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
41 """ 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
|
42 |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
43 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
|
44 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
|
45 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
|
46 detect the layout as auto. |
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 |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
49 layout = ui.config('hgsubversion', 'layout', default='auto') |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
50 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
|
51 raise hgutil.Abort('layout not yet determined') |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
52 elif layout not in ('auto', 'single', 'standard'): |
5bba4d1becde
layouts: refactor layout loading based on config into function
David Schleimer <dschleimer@fb.com>
parents:
1004
diff
changeset
|
53 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
|
54 return layout |
1006
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
55 |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
56 def layout_from_file(meta_data_dir, ui=None): |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
57 """ 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
|
58 |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
59 If you pass the ui arg, we will also write the layout to the |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
60 config for that ui. |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
61 |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
62 """ |
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 layout = None |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
65 layoutfile = os.path.join(meta_data_dir, 'layout') |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
66 if os.path.exists(layoutfile): |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
67 f = open(layoutfile) |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
68 layout = f.read().strip() |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
69 f.close() |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
70 if ui: |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
71 ui.setconfig('hgsubversion', 'layout', layout) |
7a3b938825cd
layouts: refactor layout loading and persisting out of svnmeta.py
David Schleimer <dschleimer@fb.com>
parents:
1005
diff
changeset
|
72 return layout |