comparison mercurial/ui.py @ 19065:2c4cd1c42365

ui: add a configbytes method, for space configuration This accepts a floating point number, followed by optional whitespace, followed by an optional one- or two-letter unit specifier (for bytes, kilobytes, megabytes, or gigabytes).
author Bryan O'Sullivan <bryano@fb.com>
date Thu, 18 Apr 2013 12:58:28 -0700
parents 5572f688e0a9
children be207d9b7e4b
comparison
equal deleted inserted replaced
19064:743daa601445 19065:2c4cd1c42365
4 # 4 #
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from i18n import _ 8 from i18n import _
9 import errno, getpass, os, socket, sys, tempfile, traceback 9 import errno, getpass, os, re, socket, sys, tempfile, traceback
10 import config, scmutil, util, error, formatter 10 import config, scmutil, util, error, formatter
11 11
12 class ui(object): 12 class ui(object):
13 def __init__(self, src=None): 13 def __init__(self, src=None):
14 self._buffers = [] 14 self._buffers = []
259 try: 259 try:
260 return int(v) 260 return int(v)
261 except ValueError: 261 except ValueError:
262 raise error.ConfigError(_("%s.%s is not an integer ('%s')") 262 raise error.ConfigError(_("%s.%s is not an integer ('%s')")
263 % (section, name, v)) 263 % (section, name, v))
264
265 def configbytes(self, section, name, default=0, untrusted=False):
266 """parse a configuration element as a quantity in bytes
267
268 Units can be specified as b (bytes), k or kb (kilobytes), m or
269 mb (megabytes), g or gb (gigabytes).
270
271 >>> u = ui(); s = 'foo'
272 >>> u.setconfig(s, 'val1', '42')
273 >>> u.configbytes(s, 'val1')
274 42
275 >>> u.setconfig(s, 'val2', '42.5 kb')
276 >>> u.configbytes(s, 'val2')
277 43520
278 >>> u.configbytes(s, 'unknown', '7 MB')
279 7340032
280 >>> u.setconfig(s, 'invalid', 'somevalue')
281 >>> u.configbytes(s, 'invalid')
282 Traceback (most recent call last):
283 ...
284 ConfigError: foo.invalid is not a byte quantity ('somevalue')
285 """
286
287 orig = string = self.config(section, name)
288 if orig is None:
289 if not isinstance(default, str):
290 return default
291 orig = string = default
292 multiple = 1
293 m = re.match(r'([^kmbg]+?)\s*([kmg]?)b?$', string, re.I)
294 if m:
295 string, key = m.groups()
296 key = key.lower()
297 multiple = dict(k=1024, m=1048576, g=1073741824).get(key, 1)
298 try:
299 return int(float(string) * multiple)
300 except ValueError:
301 raise error.ConfigError(_("%s.%s is not a byte quantity ('%s')")
302 % (section, name, orig))
264 303
265 def configlist(self, section, name, default=None, untrusted=False): 304 def configlist(self, section, name, default=None, untrusted=False):
266 """parse a configuration element as a list of comma/space separated 305 """parse a configuration element as a list of comma/space separated
267 strings 306 strings
268 307