comparison mercurial/commands.py @ 1071:8f0ac653f85e

Add support for extension modules This adds support for an [extensions] section to hgrc. This has the form of: [extensions] mod=[path] If a path is specified, the python module found at that path is load. Otherwise, __import__ is used to find the module. Each module must implement a dict called cmdtable where the command line options for that module live. Each module must also implement a reposetup function: cmdtable = {} def reposetup(ui, repo): pass Index: hg/mercurial/ui.py ===================================================================
author mason@suse.com
date Fri, 26 Aug 2005 14:05:52 -0700
parents 498456c2e8e5
children 8b7d63489db3
comparison
equal deleted inserted replaced
1070:b55c6685c953 1071:8f0ac653f85e
4 # 4 #
5 # This software may be used and distributed according to the terms 5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference. 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 from demandload import demandload 8 from demandload import demandload
9 demandload(globals(), "os re sys signal shutil") 9 demandload(globals(), "os re sys signal shutil imp")
10 demandload(globals(), "fancyopts ui hg util lock") 10 demandload(globals(), "fancyopts ui hg util lock")
11 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback") 11 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
12 demandload(globals(), "errno socket version struct atexit sets") 12 demandload(globals(), "errno socket version struct atexit sets")
13 13
14 class UnknownCommand(Exception): 14 class UnknownCommand(Exception):
1727 try: 1727 try:
1728 signal.signal(signal.SIGHUP, catchterm) 1728 signal.signal(signal.SIGHUP, catchterm)
1729 except AttributeError: 1729 except AttributeError:
1730 pass 1730 pass
1731 1731
1732 u = ui.ui()
1733 external = []
1734 for x in u.extensions():
1735 if x[1]:
1736 mod = imp.load_source(x[0], x[1])
1737 else:
1738 def importh(name):
1739 mod = __import__(name)
1740 components = name.split('.')
1741 for comp in components[1:]:
1742 mod = getattr(mod, comp)
1743 return mod
1744 mod = importh(x[0])
1745 external.append(mod)
1746 for x in external:
1747 for t in x.cmdtable:
1748 if t in table:
1749 u.warn("module %s override %s\n" % (x.__name__, t))
1750 table.update(x.cmdtable)
1751
1732 try: 1752 try:
1733 cmd, func, args, options, cmdoptions = parse(args) 1753 cmd, func, args, options, cmdoptions = parse(args)
1734 except ParseError, inst: 1754 except ParseError, inst:
1735 u = ui.ui()
1736 if inst.args[0]: 1755 if inst.args[0]:
1737 u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1])) 1756 u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1]))
1738 help_(u, inst.args[0]) 1757 help_(u, inst.args[0])
1739 else: 1758 else:
1740 u.warn("hg: %s\n" % inst.args[1]) 1759 u.warn("hg: %s\n" % inst.args[1])
1741 help_(u, 'shortlist') 1760 help_(u, 'shortlist')
1742 sys.exit(-1) 1761 sys.exit(-1)
1743 except UnknownCommand, inst: 1762 except UnknownCommand, inst:
1744 u = ui.ui()
1745 u.warn("hg: unknown command '%s'\n" % inst.args[0]) 1763 u.warn("hg: unknown command '%s'\n" % inst.args[0])
1746 help_(u, 'shortlist') 1764 help_(u, 'shortlist')
1747 sys.exit(1) 1765 sys.exit(1)
1748 1766
1749 if options["time"]: 1767 if options["time"]:
1753 t = (t[0], t[1], t[2], t[3], time.clock()) 1771 t = (t[0], t[1], t[2], t[3], time.clock())
1754 return t 1772 return t
1755 s = get_times() 1773 s = get_times()
1756 def print_time(): 1774 def print_time():
1757 t = get_times() 1775 t = get_times()
1758 u = ui.ui()
1759 u.warn("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n" % 1776 u.warn("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n" %
1760 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3])) 1777 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
1761 atexit.register(print_time) 1778 atexit.register(print_time)
1762 1779
1763 u = ui.ui(options["verbose"], options["debug"], options["quiet"], 1780 u.updateopts(options["verbose"], options["debug"], options["quiet"],
1764 not options["noninteractive"]) 1781 not options["noninteractive"])
1765 1782
1766 try: 1783 try:
1767 try: 1784 try:
1768 if options['help']: 1785 if options['help']:
1783 sys.exit(1) 1800 sys.exit(1)
1784 1801
1785 if cmd not in norepo.split(): 1802 if cmd not in norepo.split():
1786 path = options["repository"] or "" 1803 path = options["repository"] or ""
1787 repo = hg.repository(ui=u, path=path) 1804 repo = hg.repository(ui=u, path=path)
1805 for x in external:
1806 x.reposetup(u, repo)
1788 d = lambda: func(u, repo, *args, **cmdoptions) 1807 d = lambda: func(u, repo, *args, **cmdoptions)
1789 else: 1808 else:
1790 d = lambda: func(u, *args, **cmdoptions) 1809 d = lambda: func(u, *args, **cmdoptions)
1791 1810
1792 if options['profile']: 1811 if options['profile']: