comparison mercurial_all_paths.py @ 13:8cca585b11cc

Module renamed to mercurial_all_paths for possible pypi installation. Extended README.
author Marcin Kasperski <Marcin.Kasperski@mekk.waw.pl>
date Sun, 15 Nov 2015 10:16:21 +0100
parents allpaths.py@bed42905e871
children 9d595bda6f2f
comparison
equal deleted inserted replaced
12:bed42905e871 13:8cca585b11cc
1 # allpaths.py - execute commands on multiple paths
2 #
3 # This software may be used and distributed according to the terms of
4 # the GNU General Public License version 2 or any later version.
5
6 '''execute commands on multiple paths'''
7
8 import mercurial.util
9 import mercurial.commands
10 import mercurial.cmdutil
11 from mercurial.i18n import _
12
13 #pylint:disable=invalid-name,broad-except,line-too-long
14
15
16 def _iter_over_paths(command, ui, repo, **opts):
17 """execute given command on multiple paths"""
18 # Extract our options and filter them out
19 group = opts.pop('group', None) or 'paths'
20 ignore_errors = opts.pop('ignore_errors', None)
21
22 # Get the paths to push to.
23 paths = ui.configitems(group)
24 if not paths:
25 raise mercurial.util.Abort(_('No paths defined in section %s') % group)
26
27 # Used to avoid handling duplicate paths twice
28 handled = {}
29
30 # Act!
31 for alias, path in paths:
32 if path in handled:
33 ui.note(_("Skipping %s as it aliases already handled %s\n") % (alias, handled[path]))
34 else:
35 handled[path] = alias
36 try:
37 command(ui, repo, path, **opts)
38 except Exception as e:
39 if not ignore_errors:
40 raise
41 ui.warn(_('error handling %s: %s') % (path[1], e))
42
43
44 def pushall(ui, repo, **opts):
45 """execute pull on multiple paths"""
46 _iter_over_paths(mercurial.commands.push, ui, repo, **opts)
47
48
49 def pullall(ui, repo, **opts):
50 """execute push on multiple paths"""
51 _iter_over_paths(mercurial.commands.pull, ui, repo, **opts)
52
53
54 def incomingall(ui, repo, **opts):
55 """execute incoming on multiple paths"""
56 _iter_over_paths(mercurial.commands.incoming, ui, repo, **opts)
57
58
59 def outgoingall(ui, repo, **opts):
60 """execute outgoing on multiple paths"""
61 _iter_over_paths(mercurial.commands.outgoing, ui, repo, **opts)
62
63
64 def _original_options(cmdname):
65 """Gets list of given command options as specified in Mercurial core"""
66 _, spec = mercurial.cmdutil.findcmd(cmdname, mercurial.commands.table)
67 return spec[1]
68
69
70 EXT_OPTS = [
71 ('g', 'group', 'paths', _('use a named group of paths')),
72 ('', 'ignore-errors', None, _('continue execution despite errors')),
73 ]
74
75 cmdtable = {
76 "pushall": (
77 pushall,
78 EXT_OPTS + _original_options('push'),
79 _('[-g GROUP] [--ignore-errors] <push options>')),
80 "pullall": (
81 pullall,
82 EXT_OPTS + _original_options('pull'),
83 _('[-g GROUP] [--ignore-errors] <pull options>')),
84 "incomingall": (
85 incomingall,
86 EXT_OPTS + _original_options('incoming'),
87 _('[-g GROUP] [--ignore-errors] <incoming options>')),
88 "outgoingall": (
89 outgoingall,
90 EXT_OPTS + _original_options('outgoing'),
91 _('[-g GROUP] [--ignore-errors] <outgoing options>')),
92 }