mercurial/util.py
changeset 4059 431f3c1d3a37
parent 4017 ea6174c96ae1
parent 4057 3600b84656d3
child 4068 5b1f663ef86d
equal deleted inserted replaced
4051:022056263354 4059:431f3c1d3a37
    12 platform-specific details from the core.
    12 platform-specific details from the core.
    13 """
    13 """
    14 
    14 
    15 from i18n import _
    15 from i18n import _
    16 import cStringIO, errno, getpass, popen2, re, shutil, sys, tempfile
    16 import cStringIO, errno, getpass, popen2, re, shutil, sys, tempfile
    17 import os, threading, time, calendar, ConfigParser, locale
    17 import os, threading, time, calendar, ConfigParser, locale, glob
    18 
    18 
    19 _encoding = os.environ.get("HGENCODING") or locale.getpreferredencoding() \
    19 try:
    20             or "ascii"
    20     _encoding = os.environ.get("HGENCODING") or locale.getpreferredencoding() \
       
    21                 or "ascii"
       
    22 except locale.Error:
       
    23     _encoding = 'ascii'
    21 _encodingmode = os.environ.get("HGENCODINGMODE", "strict")
    24 _encodingmode = os.environ.get("HGENCODINGMODE", "strict")
    22 _fallbackencoding = 'ISO-8859-1'
    25 _fallbackencoding = 'ISO-8859-1'
    23 
    26 
    24 def tolocal(s):
    27 def tolocal(s):
    25     """
    28     """
   230 class UnexpectedOutput(Abort):
   233 class UnexpectedOutput(Abort):
   231     """Raised to print an error with part of output and exit."""
   234     """Raised to print an error with part of output and exit."""
   232 
   235 
   233 def always(fn): return True
   236 def always(fn): return True
   234 def never(fn): return False
   237 def never(fn): return False
       
   238 
       
   239 def expand_glob(pats):
       
   240     '''On Windows, expand the implicit globs in a list of patterns'''
       
   241     if os.name != 'nt':
       
   242         return list(pats)
       
   243     ret = []
       
   244     for p in pats:
       
   245         kind, name = patkind(p, None)
       
   246         if kind is None:
       
   247             globbed = glob.glob(name)
       
   248             if globbed:
       
   249                 ret.extend(globbed)
       
   250                 continue
       
   251             # if we couldn't expand the glob, just keep it around
       
   252         ret.append(p)
       
   253     return ret
   235 
   254 
   236 def patkind(name, dflt_pat='glob'):
   255 def patkind(name, dflt_pat='glob'):
   237     """Split a string into an optional pattern kind prefix and the
   256     """Split a string into an optional pattern kind prefix and the
   238     actual pattern."""
   257     actual pattern."""
   239     for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre':
   258     for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre':
   356         raise Abort('%s not under root' % myname)
   375         raise Abort('%s not under root' % myname)
   357 
   376 
   358 def matcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', src=None):
   377 def matcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', src=None):
   359     return _matcher(canonroot, cwd, names, inc, exc, head, 'glob', src)
   378     return _matcher(canonroot, cwd, names, inc, exc, head, 'glob', src)
   360 
   379 
   361 def cmdmatcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', src=None):
   380 def cmdmatcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='',
   362     if os.name == 'nt':
   381                src=None, globbed=False):
   363         dflt_pat = 'glob'
   382     if not globbed:
   364     else:
   383         names = expand_glob(names)
   365         dflt_pat = 'relpath'
   384     return _matcher(canonroot, cwd, names, inc, exc, head, 'relpath', src)
   366     return _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src)
       
   367 
   385 
   368 def _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src):
   386 def _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src):
   369     """build a function to match a set of file patterns
   387     """build a function to match a set of file patterns
   370 
   388 
   371     arguments:
   389     arguments: