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
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
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