mercurial/localrepo.py
changeset 1718 c1996b84d4f5
parent 1717 7a4a16a7d21f
child 1719 98072468ffde
equal deleted inserted replaced
1717:7a4a16a7d21f 1718:c1996b84d4f5
    46         try:
    46         try:
    47             self.ui.readconfig(self.join("hgrc"))
    47             self.ui.readconfig(self.join("hgrc"))
    48         except IOError:
    48         except IOError:
    49             pass
    49             pass
    50 
    50 
    51     def hook(self, name, **args):
    51     def hook(self, name, throw=False, **args):
    52         def runhook(name, cmd):
    52         def runhook(name, cmd):
    53             self.ui.note(_("running hook %s: %s\n") % (name, cmd))
    53             self.ui.note(_("running hook %s: %s\n") % (name, cmd))
    54             old = {}
    54             old = {}
    55             for k, v in args.items():
    55             for k, v in args.items():
    56                 k = k.upper()
    56                 k = k.upper()
    57                 old[k] = os.environ.get(k, None)
    57                 old[k] = os.environ.get(k, None)
    58                 os.environ[k] = v
    58                 os.environ[k] = v
    59 
    59 
    60             # Hooks run in the repository root
    60             try:
    61             olddir = os.getcwd()
    61                 # Hooks run in the repository root
    62             os.chdir(self.root)
    62                 olddir = os.getcwd()
    63             r = os.system(cmd)
    63                 os.chdir(self.root)
    64             os.chdir(olddir)
    64                 r = os.system(cmd)
    65 
    65             finally:
    66             for k, v in old.items():
    66                 for k, v in old.items():
    67                 if v != None:
    67                     if v != None:
    68                     os.environ[k] = v
    68                         os.environ[k] = v
    69                 else:
    69                     else:
    70                     del os.environ[k]
    70                         del os.environ[k]
       
    71 
       
    72                 os.chdir(olddir)
    71 
    73 
    72             if r:
    74             if r:
    73                 self.ui.warn(_("abort: %s hook failed with status %d!\n") %
    75                 desc, r = util.explain_exit(r)
    74                              (name, r))
    76                 if throw:
       
    77                     raise util.Abort(_('%s hook %s') % (name, desc))
       
    78                 self.ui.warn(_('error: %s hook %s\n') % (name, desc))
    75                 return False
    79                 return False
    76             return True
    80             return True
    77 
    81 
    78         r = True
    82         r = True
    79         for hname, cmd in self.ui.configitems("hooks"):
    83         for hname, cmd in self.ui.configitems("hooks"):
   370 
   374 
   371         if not commit and not remove and not force and p2 == nullid:
   375         if not commit and not remove and not force and p2 == nullid:
   372             self.ui.status(_("nothing changed\n"))
   376             self.ui.status(_("nothing changed\n"))
   373             return None
   377             return None
   374 
   378 
   375         if not self.hook("precommit"):
   379         self.hook("precommit", throw=True)
   376             return None
       
   377 
   380 
   378         if not wlock:
   381         if not wlock:
   379             wlock = self.wlock()
   382             wlock = self.wlock()
   380         lock = self.lock()
   383         lock = self.lock()
   381         tr = self.transaction()
   384         tr = self.transaction()