##// END OF EJS Templates
dispatch: generalize signature checking for extension command wrapping
Matt Mackall -
r7388:57516312 default
parent child Browse files
Show More
@@ -7,7 +7,7 b''
7 7
8 8 from i18n import _
9 9 from repo import RepoError
10 import os, sys, atexit, signal, pdb, traceback, socket, errno, shlex, time
10 import os, sys, atexit, signal, pdb, socket, errno, shlex, time
11 11 import util, commands, hg, lock, fancyopts, revlog, version, extensions, hook
12 12 import cmdutil
13 13 import ui as _ui
@@ -356,9 +356,9 b' def _dispatch(ui, args):'
356 356 raise RepoError(_("There is no Mercurial repository here"
357 357 " (.hg not found)"))
358 358 raise
359 d = lambda: func(ui, repo, *args, **cmdoptions)
360 else:
361 d = lambda: func(ui, *args, **cmdoptions)
359 args.insert(0, repo)
360
361 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
362 362
363 363 # run pre-hook, and abort if it fails
364 364 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs))
@@ -374,11 +374,7 b' def _runcommand(ui, options, cmd, cmdfun'
374 374 def checkargs():
375 375 try:
376 376 return cmdfunc()
377 except TypeError:
378 # was this an argument error?
379 tb = traceback.extract_tb(sys.exc_info()[2])
380 if len(tb) != 2: # no
381 raise
377 except util.SignatureError:
382 378 raise ParseError(cmd, _("invalid arguments"))
383 379
384 380 if options['profile']:
@@ -96,7 +96,8 b' def wrapcommand(table, command, wrapper)'
96 96
97 97 origfn = entry[0]
98 98 def wrap(*args, **kwargs):
99 return wrapper(origfn, *args, **kwargs)
99 return util.checksignature(wrapper)(
100 util.checksignature(origfn), *args, **kwargs)
100 101
101 102 wrap.__doc__ = getattr(origfn, '__doc__')
102 103 wrap.__module__ = getattr(origfn, '__module__')
@@ -13,7 +13,7 b' platform-specific details from the core.'
13 13 """
14 14
15 15 from i18n import _
16 import cStringIO, errno, getpass, re, shutil, sys, tempfile
16 import cStringIO, errno, getpass, re, shutil, sys, tempfile, traceback
17 17 import os, stat, threading, time, calendar, ConfigParser, locale, glob, osutil
18 18 import imp
19 19
@@ -671,6 +671,21 b' def system(cmd, environ={}, cwd=None, on'
671 671 if cwd is not None and oldcwd != cwd:
672 672 os.chdir(oldcwd)
673 673
674 class SignatureError:
675 pass
676
677 def checksignature(func):
678 '''wrap a function with code to check for calling errors'''
679 def check(*args, **kwargs):
680 try:
681 return func(*args, **kwargs)
682 except TypeError:
683 if len(traceback.extract_tb(sys.exc_info()[2])) == 1:
684 raise SignatureError
685 raise
686
687 return check
688
674 689 # os.path.lexists is not available on python2.3
675 690 def lexists(filename):
676 691 "test whether a file with this name exists. does not follow symlinks"
General Comments 0
You need to be logged in to leave comments. Login now