~bzr-pqm/bzr/bzr.dev

1163 by Martin Pool
- split ExternalCommand class into its own file
1
# Copyright (C) 2004, 2005 by Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1164 by Martin Pool
- doc
17
# TODO: Perhaps rather than mapping options and arguments back and
18
# forth, we should just pass in the whole argv, and allow
19
# ExternalCommands to handle it differently to internal commands?
20
1163 by Martin Pool
- split ExternalCommand class into its own file
21
1170 by Martin Pool
- make external commands work again
22
import os
23
import sys
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
24
1163 by Martin Pool
- split ExternalCommand class into its own file
25
from bzrlib.commands import Command
1185.31.32 by John Arbash Meinel
Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \
26
from bzrlib.osutils import pathjoin
1163 by Martin Pool
- split ExternalCommand class into its own file
27
28
29
class ExternalCommand(Command):
1170 by Martin Pool
- make external commands work again
30
    """Class to wrap external commands."""
1163 by Martin Pool
- split ExternalCommand class into its own file
31
1164 by Martin Pool
- doc
32
    @classmethod
1163 by Martin Pool
- split ExternalCommand class into its own file
33
    def find_command(cls, cmd):
34
        import os.path
35
        bzrpath = os.environ.get('BZRPATH', '')
36
37
        for dir in bzrpath.split(os.pathsep):
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
38
            ## Empty directories are not real paths
39
            if not dir:
40
                continue
1185.31.49 by John Arbash Meinel
Some corrections using the new osutils.rename. **ALL TESTS PASS**
41
            # This needs to be os.path.join() or windows cannot
42
            # find the batch file that you are wanting to execute
43
            path = os.path.join(dir, cmd)
1163 by Martin Pool
- split ExternalCommand class into its own file
44
            if os.path.isfile(path):
45
                return ExternalCommand(path)
46
47
        return None
48
49
50
    def __init__(self, path):
51
        self.path = path
52
53
    def name(self):
1185.31.34 by John Arbash Meinel
Removing instances of os.sep
54
        return os.path.basename(self.path)
1170 by Martin Pool
- make external commands work again
55
56
    def run(self, *args, **kwargs):
57
        raise NotImplementedError('should not be called on %r' % self)
58
1553.6.11 by Erik Bågfors
small bugfixes, all tests pass now
59
    def run_argv(self, argv, alias_argv=None):
1534.7.154 by Aaron Bentley
Removed changes from bzr.ab 1529..1536
60
        return os.spawnv(os.P_WAIT, self.path, [self.path] + argv)
1170 by Martin Pool
- make external commands work again
61
62
    def help(self):
63
        m = 'external command from %s\n\n' % self.path
64
        pipe = os.popen('%s --help' % self.path)
65
        return m + pipe.read()
1185.31.34 by John Arbash Meinel
Removing instances of os.sep
66