annotate python/hgrc.py @ 475:efd50220556e

python/hgrc.py
author Jeff Hammel <jhammel@mozilla.com>
date Sat, 10 Aug 2013 19:14:14 -0700
parents 3326aea03a3b
children 9d81ec713f1b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
3 """
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
4 Script for modifying hgrc files.
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
6 If no arguments specified, the repository given by `hg root` is used.
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
7 """
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
8
351
971e7deca495 got --print working, maybe
Jeff Hammel <jhammel@mozilla.com>
parents: 350
diff changeset
9 # imports
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 import optparse
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 import os
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
12 import subprocess
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13 import sys
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
14 from ConfigParser import RawConfigParser as ConfigParser
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15
468
4853551536d6 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 467
diff changeset
16 #@parser # decorator makes this x-form path -> ConfigParser automagically
467
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
17 def set_default_push(parser, default_push):
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
18 """
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
19 set [paths]:default_push to `default_push`
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
20 """
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
21 pass
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
22
468
4853551536d6 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 467
diff changeset
23 def set_default_push_to_ssh(parser):
4853551536d6 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 467
diff changeset
24 """
474
3326aea03a3b python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 473
diff changeset
25 set `[path]:default_push` to that given by `[path]:default` but
3326aea03a3b python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 473
diff changeset
26 turn the protocol to 'ssh'
468
4853551536d6 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 467
diff changeset
27 """
467
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
28
475
efd50220556e python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 474
diff changeset
29 import pdb; pdb.set_trace()
efd50220556e python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 474
diff changeset
30
473
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
31 # get default path
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
32 default = ''
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
33
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 def main(args=sys.argv[1:]):
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
36 # parse command line arguments
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37 usage = '%prog [options] repository <repository> <...>'
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 parser = optparse.OptionParser(usage=usage, description=__doc__)
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
39 parser.add_option('-l', '--list', dest='list_hgrc',
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
40 action='store_true', default=False,
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
41 help="list full path to hgrc files")
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 parser.add_option('--ssh', dest='default_push_ssh',
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 action='store_true', default=False,
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
44 help="use `default` entries for `default-push`")
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
45 parser.add_option('--push', '--default-push', dest='default_push',
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
46 help="set [paths] default-push location")
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
47 options, args = parser.parse_args(args)
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
48
467
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
49 # sanitization
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
50 if options.default_push and options.default_push_ssh:
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
51 parser.error("Cannot set --push and --ssh")
980584d34134 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 466
diff changeset
52
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
53 # if not specified, use repo from `hg root`
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 if not args:
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
55 args = [subprocess.check_output(['hg', 'root']).strip()]
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
56
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
57 # if not specified, set a default action
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
58 default_action = 'default_push_ssh'
466
3ffcbffb6fb4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 465
diff changeset
59 available_actions = ('default_push',
465
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
60 'default_push_ssh',
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
61 'list_hgrc',
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
62 )
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
63 actions = dict([(name, getattr(options, name))
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
64 for name in available_actions
469
764535e1f991 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 468
diff changeset
65 if getattr(options, name)])
465
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
66 if not actions:
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
67 actions = {'default_push_ssh': True}
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
69 # find all hgrc files
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 hgrc = []
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 missing = []
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 not_hg = []
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 not_a_directory = []
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
74 errors = {'Missing path': missing,
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
75 'Not a mercurial directory': not_hg,
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
76 'Not a directory': not_a_directory,
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
77 }
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 for path in args:
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 if not os.path.exists(path):
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 missing.append(path)
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 path = os.path.abspath(os.path.normpath(path))
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 if os.path.isdir(path):
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 basename = os.path.basename(path)
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 subhgdir = os.path.join(path, '.hg') # hypothetical .hg subdirectory
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 if basename == '.hg':
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
86 hgrcpath = os.path.join(path, 'hgrc')
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
87 elif os.path.exists(subhgdir):
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
88 if not os.path.isdir(subhgdir):
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
89 not_a_directory.append(subhgdir)
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
90 continue
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
91 hgrcpath = os.path.join(subhgdir, 'hgrc')
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
92 else:
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
93 not_hg.append(path)
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
94 continue
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
95 hgrc.append(hgrcpath)
350
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
96 else:
52e718567731 minor improvements
Jeff Hammel <jhammel@mozilla.com>
parents: 348
diff changeset
97 assert os.path.isfile(path), "%s is not a file, exiting" % path
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
98 hgrc.append(path)
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
100 # raise errors if encountered
437
2588ca4ae849 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 435
diff changeset
101 if filter(None, errors.values()):
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
102 for key, value in errors.items():
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
103 if value:
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
104 print '%s: %s' % (key, ', '.join(value))
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
105 parser.exit(1)
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
106
352
eeff298cc922 more crap
Jeff Hammel <jhammel@mozilla.com>
parents: 351
diff changeset
107 # construct ConfigParser objects and
eeff298cc922 more crap
Jeff Hammel <jhammel@mozilla.com>
parents: 351
diff changeset
108 # ensure that all the files are parseable
eeff298cc922 more crap
Jeff Hammel <jhammel@mozilla.com>
parents: 351
diff changeset
109 config = {}
eeff298cc922 more crap
Jeff Hammel <jhammel@mozilla.com>
parents: 351
diff changeset
110 for path in hgrc:
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
111 config[path] = ConfigParser()
352
eeff298cc922 more crap
Jeff Hammel <jhammel@mozilla.com>
parents: 351
diff changeset
112 if isinstance(path, basestring):
353
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
113 if os.path.exists(path):
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
114 config[path].read(path)
ee8ab3de9c7f f-ing print
Jeff Hammel <jhammel@mozilla.com>
parents: 352
diff changeset
115
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
116 # print the chosen hgrc paths
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
117 if actions.pop('list_hgrc', None):
351
971e7deca495 got --print working, maybe
Jeff Hammel <jhammel@mozilla.com>
parents: 350
diff changeset
118 print '\n'.join(hgrc)
433
6797477f6a8f adding conky
Jeff Hammel <jhammel@mozilla.com>
parents: 353
diff changeset
119
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
120 # map of actions -> functions;
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
121 # XXX this is pretty improv; to be improved
471
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
122 action_map = {'default_push_ssh': set_default_push_to_ssh,
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
123 'default_push': set_default_push
471
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
124 }
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
125
465
ae2db9e613f1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 437
diff changeset
126 # alter .hgrc files
471
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
127 action_names = actions.keys()
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
128 while actions:
468
4853551536d6 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 467
diff changeset
129
471
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
130 # XXX crappy
472
57dfffa7e44a python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 471
diff changeset
131 action_name = action_names.pop()
57dfffa7e44a python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 471
diff changeset
132 parameter = actions.pop(action_name)
473
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
133 method = action_map[action_name]
471
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
134
dc179368b7d0 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 470
diff changeset
135 # apply to all files
470
949ca4b2f2d1 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 469
diff changeset
136 for path, ini in config.items():
473
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
137 if parameter is not None:
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
138 method(ini, parameter)
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
139 else:
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
140 method(ini)
da087c5724d4 python/hgrc.py
Jeff Hammel <jhammel@mozilla.com>
parents: 472
diff changeset
141
348
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
142
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
143 if __name__ == '__main__':
6004e00b602d new hg file; TODO: incorporate!
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
144 main()