Fix for unrar path detection.

This commit is contained in:
Louis Vézina 2019-01-31 17:22:12 -05:00
parent 8b9f252842
commit 50ff0137a1
2 changed files with 80 additions and 1 deletions

View File

@ -9,6 +9,7 @@ import rarfile
from cork import Cork from cork import Cork
from ConfigParser2 import ConfigParser from ConfigParser2 import ConfigParser
from whichcraft import which
from config import settings from config import settings
from check_update import check_releases from check_update import check_releases
from get_args import args from get_args import args
@ -153,8 +154,9 @@ def init_binaries():
unrar_exe = None unrar_exe = None
exe = None exe = None
installed_unrar = which('unrar')
if os.path.isfile("unrar"): if installed_unrar and os.path.isfile(installed_unrar):
unrar_exe = "unrar" unrar_exe = "unrar"
else: else:
if platform.system() == "Windows": # Windows if platform.system() == "Windows": # Windows

77
libs/whichcraft.py Normal file
View File

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
__author__ = "Daniel Roy Greenfeld"
__email__ = "pydanny@gmail.com"
__version__ = "0.5.2"
import os
import sys
try: # Forced testing
from shutil import which
except ImportError: # Forced testing
# Versions prior to Python 3.3 don't have shutil.which
def which(cmd, mode=os.F_OK | os.X_OK, path=None):
"""Given a command, mode, and a PATH string, return the path which
conforms to the given mode on the PATH, or None if there is no such
file.
`mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
of os.environ.get("PATH"), or can be overridden with a custom search
path.
Note: This function was backported from the Python 3 source code.
"""
# Check that a given file can be accessed with the correct mode.
# Additionally check that `file` is not a directory, as on Windows
# directories pass the os.access check.
def _access_check(fn, mode):
return os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn)
# If we're given a path with a directory part, look it up directly
# rather than referring to PATH directories. This includes checking
# relative to the current directory, e.g. ./script
if os.path.dirname(cmd):
if _access_check(cmd, mode):
return cmd
return None
if path is None:
path = os.environ.get("PATH", os.defpath)
if not path:
return None
path = path.split(os.pathsep)
if sys.platform == "win32":
# The current directory takes precedence on Windows.
if os.curdir not in path:
path.insert(0, os.curdir)
# PATHEXT is necessary to check on Windows.
pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
# See if the given file matches any of the expected path
# extensions. This will allow us to short circuit when given
# "python.exe". If it does match, only test that one, otherwise we
# have to try others.
if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
files = [cmd]
else:
files = [cmd + ext for ext in pathext]
else:
# On other platforms you don't have things like PATHEXT to tell you
# what file suffixes are executable, so just pass on cmd as-is.
files = [cmd]
seen = set()
for dir in path:
normdir = os.path.normcase(dir)
if normdir not in seen:
seen.add(normdir)
for thefile in files:
name = os.path.join(dir, thefile)
if _access_check(name, mode):
return name
return None