mercurial/util.py
changeset 1882 c0320567931f
parent 1880 05c7d75be925
child 1920 b7cc0f323a4c
equal deleted inserted replaced
1880:05c7d75be925 1882:c0320567931f
   313                          (not pats and not files) or
   313                          (not pats and not files) or
   314                          (pats and patmatch(fn)) or
   314                          (pats and patmatch(fn)) or
   315                          (files and filematch(fn)))),
   315                          (files and filematch(fn)))),
   316             (inc or exc or (pats and pats != [('glob', '**')])) and True)
   316             (inc or exc or (pats and pats != [('glob', '**')])) and True)
   317 
   317 
   318 def system(cmd, errprefix=None):
   318 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
   319     """execute a shell command that must succeed"""
       
   320     rc = os.system(cmd)
       
   321     if rc:
       
   322         errmsg = "%s %s" % (os.path.basename(cmd.split(None, 1)[0]),
       
   323                             explain_exit(rc)[0])
       
   324         if errprefix:
       
   325             errmsg = "%s: %s" % (errprefix, errmsg)
       
   326         raise Abort(errmsg)
       
   327 
       
   328 def esystem(cmd, environ={}, cwd=None):
       
   329     '''enhanced shell command execution.
   319     '''enhanced shell command execution.
   330     run with environment maybe modified, maybe in different dir.'''
   320     run with environment maybe modified, maybe in different dir.
       
   321 
       
   322     if command fails and onerr is None, return status.  if ui object,
       
   323     print error message and return status, else raise onerr object as
       
   324     exception.'''
   331     oldenv = {}
   325     oldenv = {}
   332     for k in environ:
   326     for k in environ:
   333         oldenv[k] = os.environ.get(k)
   327         oldenv[k] = os.environ.get(k)
   334     if cwd is not None:
   328     if cwd is not None:
   335         oldcwd = os.getcwd()
   329         oldcwd = os.getcwd()
   336     try:
   330     try:
   337         for k, v in environ.iteritems():
   331         for k, v in environ.iteritems():
   338             os.environ[k] = str(v)
   332             os.environ[k] = str(v)
   339         if cwd is not None and oldcwd != cwd:
   333         if cwd is not None and oldcwd != cwd:
   340             os.chdir(cwd)
   334             os.chdir(cwd)
   341         return os.system(cmd)
   335         rc = os.system(cmd)
       
   336         if rc and onerr:
       
   337             errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]),
       
   338                                 explain_exit(rc)[0])
       
   339             if errprefix:
       
   340                 errmsg = '%s: %s' % (errprefix, errmsg)
       
   341             try:
       
   342                 onerr.warn(errmsg + '\n')
       
   343             except AttributeError:
       
   344                 raise onerr(errmsg)
       
   345         return rc
   342     finally:
   346     finally:
   343         for k, v in oldenv.iteritems():
   347         for k, v in oldenv.iteritems():
   344             if v is None:
   348             if v is None:
   345                 del os.environ[k]
   349                 del os.environ[k]
   346             else:
   350             else: