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"): |