Mercurial > hg > config
comparison python/hgrc.py @ 506:2a5eee9418ba
hgrc
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Sat, 31 Aug 2013 21:17:16 -0700 |
| parents | ab405b339112 |
| children | bb6e21338c5c |
comparison
equal
deleted
inserted
replaced
| 505:ab405b339112 | 506:2a5eee9418ba |
|---|---|
| 17 from collections import OrderedDict | 17 from collections import OrderedDict |
| 18 from ConfigParser import RawConfigParser as ConfigParser | 18 from ConfigParser import RawConfigParser as ConfigParser |
| 19 from StringIO import StringIO | 19 from StringIO import StringIO |
| 20 | 20 |
| 21 ### global methods | 21 ### global methods |
| 22 | |
| 23 def isHTTP(path): | |
| 24 """is path an {http,https}:// URL?""" | |
| 25 return urlparse.urlsplit(path)[0] in ('http', 'https') | |
| 22 | 26 |
| 23 class section(object): | 27 class section(object): |
| 24 def __init__(self, section_name, *section_names): | 28 def __init__(self, section_name, *section_names): |
| 25 self.sections = [section_name] | 29 self.sections = [section_name] |
| 26 self.sections.extend(section_names) | 30 self.sections.extend(section_names) |
| 30 if section not in parser.sections(): | 34 if section not in parser.sections(): |
| 31 parser.add_section(section) | 35 parser.add_section(section) |
| 32 function(parser, *args, **kwargs) | 36 function(parser, *args, **kwargs) |
| 33 return wrapped | 37 return wrapped |
| 34 | 38 |
| 35 #@parser # decorator makes this x-form path -> ConfigParser automagically | 39 |
| 36 @section('paths') | 40 @section('paths') |
| 37 def set_default(parser, default): | 41 def set_default(parser, default): |
| 38 """set [paths]:default""" | 42 """set [paths]:default""" |
| 39 parser.set('paths', 'default', default) | 43 parser.set('paths', 'default', default) |
| 40 | 44 |
| 41 | |
| 42 @section('paths') | 45 @section('paths') |
| 43 def set_default_push(parser, default_push): | 46 def set_default_push(parser, default_push): |
| 44 """ | 47 """ |
| 45 set [paths]:default-push to `default_push` | 48 set [paths]:default-push to `default_push` |
| 46 """ | 49 """ |
| 47 parser.set('paths', 'default-push', default_push) | 50 parser.set('paths', 'default-push', default_push) |
| 48 | |
| 49 | 51 |
| 50 def set_default_push_to_ssh(parser): | 52 def set_default_push_to_ssh(parser): |
| 51 """ | 53 """ |
| 52 set `[paths]:default-push` to that given by `[paths]:default` but | 54 set `[paths]:default-push` to that given by `[paths]:default` but |
| 53 turn the protocol to 'ssh' | 55 turn the protocol to 'ssh' |
| 118 actions = [('default_push_ssh', True)] | 120 actions = [('default_push_ssh', True)] |
| 119 actions = OrderedDict(actions) | 121 actions = OrderedDict(actions) |
| 120 if not actions: | 122 if not actions: |
| 121 parser.error("Please specify an action") | 123 parser.error("Please specify an action") |
| 122 | 124 |
| 123 # find all hgrc files | 125 # find all hgrc files and URLs |
| 124 hgrc = [] | 126 hgrc = [] |
| 125 missing = [] | 127 missing = [] |
| 126 not_hg = [] | 128 not_hg = [] |
| 127 not_a_directory = [] | 129 not_a_directory = [] |
| 130 urls = [] | |
| 128 errors = {'Missing path': missing, | 131 errors = {'Missing path': missing, |
| 129 'Not a mercurial directory': not_hg, | 132 'Not a mercurial directory': not_hg, |
| 130 'Not a directory': not_a_directory, | 133 'Not a directory': not_a_directory, |
| 131 } | 134 } |
| 132 for path in args: | 135 for path in args: |
| 133 if not os.path.exists(path): | 136 if not os.path.exists(path): |
| 137 if isHTTP(path): | |
| 138 hgrc.append(path) | |
| 139 urls.append(path) | |
| 140 continue | |
| 134 missing.append(path) | 141 missing.append(path) |
| 135 path = os.path.abspath(os.path.normpath(path)) | 142 path = os.path.abspath(os.path.normpath(path)) |
| 136 if os.path.isdir(path): | 143 if os.path.isdir(path): |
| 137 basename = os.path.basename(path) | 144 basename = os.path.basename(path) |
| 138 subhgdir = os.path.join(path, '.hg') # hypothetical .hg subdirectory | 145 subhgdir = os.path.join(path, '.hg') # hypothetical .hg subdirectory |
| 164 for path in hgrc: | 171 for path in hgrc: |
| 165 config[path] = ConfigParser() | 172 config[path] = ConfigParser() |
| 166 if isinstance(path, basestring): | 173 if isinstance(path, basestring): |
| 167 if os.path.exists(path): | 174 if os.path.exists(path): |
| 168 config[path].read(path) | 175 config[path].read(path) |
| 176 elif path in urls: | |
| 177 if 'default' not in actions: | |
| 178 set_default(config[path], path) | |
| 169 | 179 |
| 170 # print the chosen hgrc paths | 180 # print the chosen hgrc paths |
| 171 if 'list_hgrc' in actions: | 181 if 'list_hgrc' in actions: |
| 172 print '\n'.join(hgrc) | 182 print '\n'.join(hgrc) |
| 173 | 183 |
| 180 'default_push': set_default_push, | 190 'default_push': set_default_push, |
| 181 'default': set_default | 191 'default': set_default |
| 182 } | 192 } |
| 183 | 193 |
| 184 # cache for later (XXX) | 194 # cache for later (XXX) |
| 185 print_ini = actions.pop('print_ini', None) | 195 print_ini = actions.pop('print_ini', bool(urls)) |
| 186 | 196 |
| 187 # alter .hgrc files | 197 # alter .hgrc files |
| 188 for action_name, parameter in actions.items(): | 198 for action_name, parameter in actions.items(): |
| 189 | 199 |
| 190 # XXX crappy | 200 # XXX crappy |
| 205 if print_ini: | 215 if print_ini: |
| 206 values = [] | 216 values = [] |
| 207 for path, ini in config.items(): | 217 for path, ini in config.items(): |
| 208 _buffer = StringIO() | 218 _buffer = StringIO() |
| 209 ini.write(_buffer) | 219 ini.write(_buffer) |
| 210 values.append('+++ %s\n%s' % (path, _buffer.getvalue())) | 220 value = _buffer.getvalue().strip() |
| 221 if len(config) == 1: | |
| 222 values = [value] | |
| 223 else: | |
| 224 values.append('+++ %s\n%s' % (path, value)) | |
| 211 print '\n'.join(values) | 225 print '\n'.join(values) |
| 212 | 226 |
| 213 # write .ini files | 227 # write .ini files |
| 214 for path, ini in config.items(): | 228 for path, ini in config.items(): |
| 229 if path in urls: | |
| 230 continue | |
| 215 with file(path, 'w') as f: | 231 with file(path, 'w') as f: |
| 216 ini.write(f) | 232 ini.write(f) |
| 217 | 233 |
| 218 if __name__ == '__main__': | 234 if __name__ == '__main__': |
| 219 main() | 235 main() |
