Add fallback to support clipboard functions in EFL 1.7.
Uses pyperclip and which.
This commit is contained in:
parent
bd1774baa6
commit
827fd1ada4
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2002-2005 ActiveState Corp.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -401,6 +401,11 @@ class SessionStatus(Table):
|
|||
magnet.scrollable = True
|
||||
if hasattr(magnet, "cnp_selection_get"):
|
||||
magnet.cnp_selection_get(ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT)
|
||||
else:
|
||||
import pyperclip
|
||||
t = pyperclip.paste()
|
||||
if t is not None and t.startswith("magnet:"):
|
||||
magnet.entry = t
|
||||
magnet.show()
|
||||
mf = Frame(self.top_widget)
|
||||
mf.size_hint_weight_set(1.0, 0.0)
|
||||
|
|
|
@ -116,16 +116,19 @@ class TorrentInfo(InnerWindow):
|
|||
me.entry = magnet_uri
|
||||
me_box.pack_end(me)
|
||||
me.show()
|
||||
me_btn = Button(self)
|
||||
me_btn.text = "Copy"
|
||||
if hasattr(me, "cnp_selection_set"):
|
||||
me_btn = Button(self)
|
||||
me_btn.text = "Copy"
|
||||
me_btn.callback_clicked_add(
|
||||
lambda x: me.top_widget.cnp_selection_set(
|
||||
ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, me.text
|
||||
)
|
||||
)
|
||||
me_btn.show()
|
||||
me_box.pack_end(me_btn)
|
||||
else:
|
||||
import pyperclip
|
||||
me_btn.callback_clicked_add(lambda x: pyperclip.copy(magnet_uri))
|
||||
me_btn.show()
|
||||
me_box.pack_end(me_btn)
|
||||
me_box.show()
|
||||
f.content = me_box
|
||||
f.show()
|
||||
|
|
|
@ -0,0 +1,181 @@
|
|||
#!/usr/bin/env python
|
||||
from __future__ import print_function
|
||||
# Pyperclip v1.3
|
||||
# A cross-platform clipboard module for Python. (only handles plain text for now)
|
||||
# By Al Sweigart al@coffeeghost.net
|
||||
|
||||
# Usage:
|
||||
# import pyperclip
|
||||
# pyperclip.copy('The text to be copied to the clipboard.')
|
||||
# spam = pyperclip.paste()
|
||||
|
||||
# On Mac, this module makes use of the pbcopy and pbpaste commands, which should come with the os.
|
||||
# On Linux, this module makes use of the xclip command, which should come with the os. Otherwise run "sudo apt-get install xclip"
|
||||
|
||||
|
||||
# Copyright (c) 2010, Albert Sweigart
|
||||
# All rights reserved.
|
||||
#
|
||||
# BSD-style license:
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the pyperclip nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY Albert Sweigart "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL Albert Sweigart BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Change Log:
|
||||
# 1.2 Use the platform module to help determine OS.
|
||||
# 1.3 Changed ctypes.windll.user32.OpenClipboard(None) to ctypes.windll.user32.OpenClipboard(0), after some people ran into some TypeError
|
||||
# 1.4 Use python-which library instead of os.system, removing a bunch of noise
|
||||
# 1.5 add Cygwin support, command line interface & cleaned up command usage
|
||||
|
||||
import platform, os, subprocess, sys, re
|
||||
|
||||
def winGetClipboard():
|
||||
ctypes.windll.user32.OpenClipboard(0)
|
||||
pcontents = ctypes.windll.user32.GetClipboardData(1) # 1 is CF_TEXT
|
||||
data = ctypes.c_char_p(pcontents).value
|
||||
#ctypes.windll.kernel32.GlobalUnlock(pcontents)
|
||||
ctypes.windll.user32.CloseClipboard()
|
||||
return data
|
||||
|
||||
def winSetClipboard(text):
|
||||
GMEM_DDESHARE = 0x2000
|
||||
ctypes.windll.user32.OpenClipboard(0)
|
||||
ctypes.windll.user32.EmptyClipboard()
|
||||
try:
|
||||
# works on Python 2 (bytes() only takes one argument)
|
||||
hCd = ctypes.windll.kernel32.GlobalAlloc(GMEM_DDESHARE, len(bytes(text))+1)
|
||||
except TypeError:
|
||||
# works on Python 3 (bytes() requires an encoding)
|
||||
hCd = ctypes.windll.kernel32.GlobalAlloc(GMEM_DDESHARE, len(bytes(text, 'ascii'))+1)
|
||||
pchData = ctypes.windll.kernel32.GlobalLock(hCd)
|
||||
try:
|
||||
# works on Python 2 (bytes() only takes one argument)
|
||||
ctypes.cdll.msvcrt.strcpy(ctypes.c_char_p(pchData), bytes(text))
|
||||
except TypeError:
|
||||
# works on Python 3 (bytes() requires an encoding)
|
||||
ctypes.cdll.msvcrt.strcpy(ctypes.c_char_p(pchData), bytes(text, 'ascii'))
|
||||
ctypes.windll.kernel32.GlobalUnlock(hCd)
|
||||
ctypes.windll.user32.SetClipboardData(1,hCd)
|
||||
ctypes.windll.user32.CloseClipboard()
|
||||
|
||||
def gtkGetClipboard():
|
||||
return gtk.Clipboard().wait_for_text()
|
||||
|
||||
def gtkSetClipboard(text):
|
||||
cb = gtk.Clipboard()
|
||||
cb.set_text(text)
|
||||
cb.store()
|
||||
|
||||
def qtGetClipboard():
|
||||
return str(cb.text())
|
||||
|
||||
def qtSetClipboard(text):
|
||||
cb.setText(text)
|
||||
|
||||
def has_command(cmd):
|
||||
from which import which, WhichError
|
||||
try:
|
||||
which(cmd)
|
||||
return True
|
||||
except WhichError as e:
|
||||
return False
|
||||
|
||||
class CommandClipboard(object):
|
||||
def __init__(self, copy, paste):
|
||||
self._copy = copy
|
||||
self._paste = paste
|
||||
self.required_cmds = set([copy[0], paste[0]])
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
return all(map(has_command, self.required_cmds))
|
||||
|
||||
def copy(self, data):
|
||||
p = subprocess.Popen(self._copy, stdin=subprocess.PIPE)
|
||||
if sys.version_info > (3,):
|
||||
data = data.encode('utf-8')
|
||||
out, err = p.communicate(data)
|
||||
assert p.returncode == 0
|
||||
|
||||
def paste(self):
|
||||
p = subprocess.Popen(self._paste, stdout=subprocess.PIPE)
|
||||
out, err = p.communicate()
|
||||
assert p.returncode == 0
|
||||
if sys.version_info > (3,):
|
||||
out = out.decode('utf-8')
|
||||
return out
|
||||
|
||||
def use(self):
|
||||
global getcb, setcb
|
||||
getcb = self.paste
|
||||
setcb = self.copy
|
||||
|
||||
if os.name == 'nt' or platform.system() == 'Windows':
|
||||
import ctypes
|
||||
getcb = winGetClipboard
|
||||
setcb = winSetClipboard
|
||||
elif os.name == 'mac' or platform.system() == 'Darwin':
|
||||
CommandClipboard(copy=['pbcopy'],paste=['pbpaste']).use()
|
||||
else:
|
||||
possible_impls = [
|
||||
CommandClipboard(copy = ['putclip'], paste=['getclip']), # cygwin
|
||||
CommandClipboard(copy = ['xsel','-ib'], paste=['xsel','-b']),
|
||||
CommandClipboard(copy = ['xclip', '-selection', 'clipboard','-i'], paste=['xsel', '-selection', 'clipboard', '-o'])
|
||||
]
|
||||
|
||||
for impl in possible_impls:
|
||||
if impl.available:
|
||||
impl.use()
|
||||
break
|
||||
else:
|
||||
try:
|
||||
import gtk
|
||||
getcb = gtkGetClipboard
|
||||
setcb = gtkSetClipboard
|
||||
except ImportError:
|
||||
try:
|
||||
import PyQt4.QtCore
|
||||
import PyQt4.QtGui
|
||||
cb = PyQt4.QtGui.QApplication.clipboard()
|
||||
getcb = qtGetClipboard
|
||||
setcb = qtSetClipboard
|
||||
except ImportError:
|
||||
raise ImportError('Pyperclip requires the gtk or PyQt4 module installed, or some sort of xclip / xsel / getclip command.')
|
||||
|
||||
copy = setcb
|
||||
paste = getcb
|
||||
|
||||
if __name__ == '__main__':
|
||||
from optparse import OptionParser
|
||||
p = OptionParser()
|
||||
p.add_option('-i','--copy', action='store_const', const=copy, dest='action', default=paste)
|
||||
p.add_option('-o','--paste', action='store_const', const=paste, dest='action')
|
||||
opts, args = p.parse_args()
|
||||
assert len(args) == 0
|
||||
args = []
|
||||
if opts.action is copy:
|
||||
data = sys.stdin.read()
|
||||
data = re.sub('\r?\n?$', '', data) # trim trailing NL
|
||||
args.append(data)
|
||||
ret = opts.action(*args)
|
||||
if ret is not None:
|
||||
print(ret)
|
|
@ -0,0 +1,342 @@
|
|||
#!/usr/bin/env python
|
||||
# Copyright (c) 2002-2007 ActiveState Software Inc.
|
||||
# See LICENSE.txt for license details.
|
||||
# Author:
|
||||
# Trent Mick (TrentM@ActiveState.com)
|
||||
# Home:
|
||||
# http://trentm.com/projects/which/
|
||||
|
||||
r"""Find the full path to commands.
|
||||
|
||||
which(command, path=None, verbose=0, exts=None)
|
||||
Return the full path to the first match of the given command on the
|
||||
path.
|
||||
|
||||
whichall(command, path=None, verbose=0, exts=None)
|
||||
Return a list of full paths to all matches of the given command on
|
||||
the path.
|
||||
|
||||
whichgen(command, path=None, verbose=0, exts=None)
|
||||
Return a generator which will yield full paths to all matches of the
|
||||
given command on the path.
|
||||
|
||||
By default the PATH environment variable is searched (as well as, on
|
||||
Windows, the AppPaths key in the registry), but a specific 'path' list
|
||||
to search may be specified as well. On Windows, the PATHEXT environment
|
||||
variable is applied as appropriate.
|
||||
|
||||
If "verbose" is true then a tuple of the form
|
||||
(<fullpath>, <matched-where-description>)
|
||||
is returned for each match. The latter element is a textual description
|
||||
of where the match was found. For example:
|
||||
from PATH element 0
|
||||
from HKLM\SOFTWARE\...\perl.exe
|
||||
"""
|
||||
|
||||
_cmdlnUsage = """
|
||||
Show the full path of commands.
|
||||
|
||||
Usage:
|
||||
which [<options>...] [<command-name>...]
|
||||
|
||||
Options:
|
||||
-h, --help Print this help and exit.
|
||||
-V, --version Print the version info and exit.
|
||||
|
||||
-a, --all Print *all* matching paths.
|
||||
-v, --verbose Print out how matches were located and
|
||||
show near misses on stderr.
|
||||
-q, --quiet Just print out matches. I.e., do not print out
|
||||
near misses.
|
||||
|
||||
-p <altpath>, --path=<altpath>
|
||||
An alternative path (list of directories) may
|
||||
be specified for searching.
|
||||
-e <exts>, --exts=<exts>
|
||||
Specify a list of extensions to consider instead
|
||||
of the usual list (';'-separate list, Windows
|
||||
only).
|
||||
|
||||
Show the full path to the program that would be run for each given
|
||||
command name, if any. Which, like GNU's which, returns the number of
|
||||
failed arguments, or -1 when no <command-name> was given.
|
||||
|
||||
Near misses include duplicates, non-regular files and (on Un*x)
|
||||
files without executable access.
|
||||
"""
|
||||
|
||||
__revision__ = "$Id: which.py 1448 2007-02-28 19:13:06Z trentm $"
|
||||
__version_info__ = (1, 1, 3)
|
||||
__version__ = '.'.join(map(str, __version_info__))
|
||||
__all__ = ["which", "whichall", "whichgen", "WhichError"]
|
||||
|
||||
import os
|
||||
import sys
|
||||
import getopt
|
||||
import stat
|
||||
|
||||
|
||||
#---- exceptions
|
||||
|
||||
class WhichError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
|
||||
#---- internal support stuff
|
||||
|
||||
def _getRegisteredExecutable(exeName):
|
||||
"""Windows allow application paths to be registered in the registry."""
|
||||
registered = None
|
||||
if sys.platform.startswith('win'):
|
||||
if os.path.splitext(exeName)[1].lower() != '.exe':
|
||||
exeName += '.exe'
|
||||
import _winreg
|
||||
try:
|
||||
key = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\" +\
|
||||
exeName
|
||||
value = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE, key)
|
||||
registered = (value, "from HKLM\\"+key)
|
||||
except _winreg.error:
|
||||
pass
|
||||
if registered and not os.path.exists(registered[0]):
|
||||
registered = None
|
||||
return registered
|
||||
|
||||
def _samefile(fname1, fname2):
|
||||
if sys.platform.startswith('win'):
|
||||
return ( os.path.normpath(os.path.normcase(fname1)) ==\
|
||||
os.path.normpath(os.path.normcase(fname2)) )
|
||||
else:
|
||||
return os.path.samefile(fname1, fname2)
|
||||
|
||||
def _cull(potential, matches, verbose=0):
|
||||
"""Cull inappropriate matches. Possible reasons:
|
||||
- a duplicate of a previous match
|
||||
- not a disk file
|
||||
- not executable (non-Windows)
|
||||
If 'potential' is approved it is returned and added to 'matches'.
|
||||
Otherwise, None is returned.
|
||||
"""
|
||||
for match in matches: # don't yield duplicates
|
||||
if _samefile(potential[0], match[0]):
|
||||
if verbose:
|
||||
sys.stderr.write("duplicate: %s (%s)\n" % potential)
|
||||
return None
|
||||
else:
|
||||
if not stat.S_ISREG(os.stat(potential[0]).st_mode):
|
||||
if verbose:
|
||||
sys.stderr.write("not a regular file: %s (%s)\n" % potential)
|
||||
elif sys.platform != "win32" \
|
||||
and not os.access(potential[0], os.X_OK):
|
||||
if verbose:
|
||||
sys.stderr.write("no executable access: %s (%s)\n"\
|
||||
% potential)
|
||||
else:
|
||||
matches.append(potential)
|
||||
return potential
|
||||
|
||||
|
||||
#---- module API
|
||||
|
||||
def whichgen(command, path=None, verbose=0, exts=None):
|
||||
"""Return a generator of full paths to the given command.
|
||||
|
||||
"command" is a the name of the executable to search for.
|
||||
"path" is an optional alternate path list to search. The default it
|
||||
to use the PATH environment variable.
|
||||
"verbose", if true, will cause a 2-tuple to be returned for each
|
||||
match. The second element is a textual description of where the
|
||||
match was found.
|
||||
"exts" optionally allows one to specify a list of extensions to use
|
||||
instead of the standard list for this system. This can
|
||||
effectively be used as an optimization to, for example, avoid
|
||||
stat's of "foo.vbs" when searching for "foo" and you know it is
|
||||
not a VisualBasic script but ".vbs" is on PATHEXT. This option
|
||||
is only supported on Windows.
|
||||
|
||||
This method returns a generator which yields either full paths to
|
||||
the given command or, if verbose, tuples of the form (<path to
|
||||
command>, <where path found>).
|
||||
"""
|
||||
matches = []
|
||||
if path is None:
|
||||
usingGivenPath = 0
|
||||
path = os.environ.get("PATH", "").split(os.pathsep)
|
||||
if sys.platform.startswith("win"):
|
||||
path.insert(0, os.curdir) # implied by Windows shell
|
||||
else:
|
||||
usingGivenPath = 1
|
||||
|
||||
# Windows has the concept of a list of extensions (PATHEXT env var).
|
||||
if sys.platform.startswith("win"):
|
||||
if exts is None:
|
||||
exts = os.environ.get("PATHEXT", "").split(os.pathsep)
|
||||
# If '.exe' is not in exts then obviously this is Win9x and
|
||||
# or a bogus PATHEXT, then use a reasonable default.
|
||||
for ext in exts:
|
||||
if ext.lower() == ".exe":
|
||||
break
|
||||
else:
|
||||
exts = ['.COM', '.EXE', '.BAT']
|
||||
elif not isinstance(exts, list):
|
||||
raise TypeError("'exts' argument must be a list or None")
|
||||
else:
|
||||
if exts is not None:
|
||||
raise WhichError("'exts' argument is not supported on "\
|
||||
"platform '%s'" % sys.platform)
|
||||
exts = []
|
||||
|
||||
# File name cannot have path separators because PATH lookup does not
|
||||
# work that way.
|
||||
if os.sep in command or os.altsep and os.altsep in command:
|
||||
if os.path.exists(command):
|
||||
match = _cull((command, "explicit path given"), matches, verbose)
|
||||
if verbose:
|
||||
yield match
|
||||
else:
|
||||
yield match[0]
|
||||
else:
|
||||
for i in range(len(path)):
|
||||
dirName = path[i]
|
||||
# On windows the dirName *could* be quoted, drop the quotes
|
||||
if sys.platform.startswith("win") and len(dirName) >= 2\
|
||||
and dirName[0] == '"' and dirName[-1] == '"':
|
||||
dirName = dirName[1:-1]
|
||||
for ext in ['']+exts:
|
||||
absName = os.path.abspath(
|
||||
os.path.normpath(os.path.join(dirName, command+ext)))
|
||||
if os.path.isfile(absName):
|
||||
if usingGivenPath:
|
||||
fromWhere = "from given path element %d" % i
|
||||
elif not sys.platform.startswith("win"):
|
||||
fromWhere = "from PATH element %d" % i
|
||||
elif i == 0:
|
||||
fromWhere = "from current directory"
|
||||
else:
|
||||
fromWhere = "from PATH element %d" % (i-1)
|
||||
match = _cull((absName, fromWhere), matches, verbose)
|
||||
if match:
|
||||
if verbose:
|
||||
yield match
|
||||
else:
|
||||
yield match[0]
|
||||
match = _getRegisteredExecutable(command)
|
||||
if match is not None:
|
||||
match = _cull(match, matches, verbose)
|
||||
if match:
|
||||
if verbose:
|
||||
yield match
|
||||
else:
|
||||
yield match[0]
|
||||
|
||||
|
||||
def which(command, path=None, verbose=0, exts=None):
|
||||
"""Return the full path to the first match of the given command on
|
||||
the path.
|
||||
|
||||
"command" is a the name of the executable to search for.
|
||||
"path" is an optional alternate path list to search. The default it
|
||||
to use the PATH environment variable.
|
||||
"verbose", if true, will cause a 2-tuple to be returned. The second
|
||||
element is a textual description of where the match was found.
|
||||
"exts" optionally allows one to specify a list of extensions to use
|
||||
instead of the standard list for this system. This can
|
||||
effectively be used as an optimization to, for example, avoid
|
||||
stat's of "foo.vbs" when searching for "foo" and you know it is
|
||||
not a VisualBasic script but ".vbs" is on PATHEXT. This option
|
||||
is only supported on Windows.
|
||||
|
||||
If no match is found for the command, a WhichError is raised.
|
||||
"""
|
||||
try:
|
||||
match = whichgen(command, path, verbose, exts).next()
|
||||
except StopIteration:
|
||||
raise WhichError("Could not find '%s' on the path." % command)
|
||||
return match
|
||||
|
||||
|
||||
def whichall(command, path=None, verbose=0, exts=None):
|
||||
"""Return a list of full paths to all matches of the given command
|
||||
on the path.
|
||||
|
||||
"command" is a the name of the executable to search for.
|
||||
"path" is an optional alternate path list to search. The default it
|
||||
to use the PATH environment variable.
|
||||
"verbose", if true, will cause a 2-tuple to be returned for each
|
||||
match. The second element is a textual description of where the
|
||||
match was found.
|
||||
"exts" optionally allows one to specify a list of extensions to use
|
||||
instead of the standard list for this system. This can
|
||||
effectively be used as an optimization to, for example, avoid
|
||||
stat's of "foo.vbs" when searching for "foo" and you know it is
|
||||
not a VisualBasic script but ".vbs" is on PATHEXT. This option
|
||||
is only supported on Windows.
|
||||
"""
|
||||
return list( whichgen(command, path, verbose, exts) )
|
||||
|
||||
|
||||
|
||||
#---- mainline
|
||||
|
||||
def main(argv):
|
||||
all = 0
|
||||
verbose = 0
|
||||
altpath = None
|
||||
exts = None
|
||||
try:
|
||||
optlist, args = getopt.getopt(argv[1:], 'haVvqp:e:',
|
||||
['help', 'all', 'version', 'verbose', 'quiet', 'path=', 'exts='])
|
||||
except getopt.GetoptError, msg:
|
||||
sys.stderr.write("which: error: %s. Your invocation was: %s\n"\
|
||||
% (msg, argv))
|
||||
sys.stderr.write("Try 'which --help'.\n")
|
||||
return 1
|
||||
for opt, optarg in optlist:
|
||||
if opt in ('-h', '--help'):
|
||||
print _cmdlnUsage
|
||||
return 0
|
||||
elif opt in ('-V', '--version'):
|
||||
print "which %s" % __version__
|
||||
return 0
|
||||
elif opt in ('-a', '--all'):
|
||||
all = 1
|
||||
elif opt in ('-v', '--verbose'):
|
||||
verbose = 1
|
||||
elif opt in ('-q', '--quiet'):
|
||||
verbose = 0
|
||||
elif opt in ('-p', '--path'):
|
||||
if optarg:
|
||||
altpath = optarg.split(os.pathsep)
|
||||
else:
|
||||
altpath = []
|
||||
elif opt in ('-e', '--exts'):
|
||||
if optarg:
|
||||
exts = optarg.split(os.pathsep)
|
||||
else:
|
||||
exts = []
|
||||
|
||||
if len(args) == 0:
|
||||
return -1
|
||||
|
||||
failures = 0
|
||||
for arg in args:
|
||||
#print "debug: search for %r" % arg
|
||||
nmatches = 0
|
||||
for match in whichgen(arg, path=altpath, verbose=verbose, exts=exts):
|
||||
if verbose:
|
||||
print "%s (%s)" % match
|
||||
else:
|
||||
print match
|
||||
nmatches += 1
|
||||
if not all:
|
||||
break
|
||||
if not nmatches:
|
||||
failures += 1
|
||||
return failures
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit( main(sys.argv) )
|
||||
|
||||
|
Loading…
Reference in New Issue