1111import re
1212import sys
1313import subprocess
14- from distutils .version import StrictVersion , LooseVersion
14+ from distutils .version import LooseVersion
1515
1616from . import exc
1717from ._compat import console_to_str
@@ -395,67 +395,93 @@ def _is_executable_file_or_link(exe):
395395 return None
396396
397397
398- def is_version (version ):
398+ def get_version ():
399+ """Return tmux version.
400+
401+ :returns: tmux version
402+ :rtype: :class:`distutils.version.LooseVersion`
403+ """
404+ proc = tmux_cmd ('-V' )
405+ if proc .stderr :
406+ if proc .stderr [0 ] == 'tmux: unknown option -- V' :
407+ if sys .platform .startswith ("openbsd" ): # openbsd has no tmux -V
408+ return LooseVersion ('2.3' )
409+ raise exc .LibTmuxException (
410+ 'libtmux supports tmux 1.8 and greater. This system'
411+ ' is running tmux 1.3 or earlier.' )
412+ raise exc .VersionTooLow (proc .stderr )
413+
414+ version = proc .stdout [0 ].split ('tmux ' )[1 ]
415+
416+ # Allow latest tmux HEAD
417+ if version == 'master' :
418+ return LooseVersion ('master' )
419+
420+ version = re .sub (r'[a-z]' , '' , version )
421+
422+ return LooseVersion (version )
423+
424+
425+ def has_version (version ):
399426 """Return True if tmux version installed.
400427
401428 :param version: version, '1.8'
402- :param type: string
429+ :type version: string
430+ :returns: True if version matches
403431 :rtype: bool
404-
405432 """
406- if sys .platform .startswith ("openbsd" ):
407- if LooseVersion (version ) > LooseVersion ('2.1' ):
408- return 'openbsd'
409- else :
410- return False
433+ return get_version () == LooseVersion (version )
411434
412- proc = tmux_cmd ('-V' )
413435
414- if proc .stderr :
415- raise exc .LibTmuxException (proc .stderr )
436+ def has_gt_version (min_version ):
437+ """Return True if tmux version greater than minimum.
438+
439+ :param min_version: version, e.g. '1.8'
440+ :type min_version: string
441+ :returns: True if version above min_version
442+ :rtype: bool
443+ """
444+ return get_version () >= LooseVersion (min_version )
416445
417- installed_version = proc .stdout [0 ].split ('tmux ' )[1 ]
418446
419- return LooseVersion (installed_version ) == LooseVersion (version )
447+ def has_lt_version (max_version ):
448+ """Return True if tmux version less than minimum.
449+
450+ :param max_version: version, e.g. '1.8'
451+ :type max_version: string
452+ :returns: True if version below max_version
453+ :rtype: bool
454+ """
455+ return get_version () <= LooseVersion (max_version )
420456
421457
422- def has_required_tmux_version ( version = None ):
458+ def has_minimum_tmux_version ( raises = True ):
423459 """Return if tmux meets version requirement. Version >1.8 or above.
424460
461+ :param raises: Will raise exception if version too low, default ``True``
462+ :type raises: bool
463+ :returns: True if tmux meets minimum required version
464+ :rtype: bool
465+
466+ :versionchanged: 0.7.0
467+ No longer returns version, returns True or False
425468 :versionchanged: 0.1.7
426469 Versions will now remove trailing letters per `Issue 55`_.
427470
428471 .. _Issue 55: https://github.com/tony/tmuxp/issues/55.
429472
430473 """
431474
432- if not version :
433- if sys .platform .startswith ("openbsd" ): # openbsd has no tmux -V
434- return '2.3'
435-
436- proc = tmux_cmd ('-V' )
437-
438- if proc .stderr :
439- if proc .stderr [0 ] == 'tmux: unknown option -- V' :
440- raise exc .LibTmuxException (
441- 'libtmux supports tmux 1.8 and greater. This system'
442- ' is running tmux 1.3 or earlier.' )
443- raise exc .LibTmuxException (proc .stderr )
444-
445- version = proc .stdout [0 ].split ('tmux ' )[1 ]
446-
447- # Allow latest tmux HEAD
448- if version == 'master' :
449- return version
450-
451- version = re .sub (r'[a-z]' , '' , version )
452-
453- if StrictVersion (version ) <= StrictVersion ("1.7" ):
454- raise exc .LibTmuxException (
455- 'libtmux only supports tmux 1.8 and greater. This system'
456- ' has %s installed. Upgrade your tmux to use libtmux.' % version
457- )
458- return version
475+ if get_version () <= LooseVersion ("1.7" ):
476+ if raises :
477+ raise exc .VersionTooLow (
478+ 'libtmux only supports tmux 1.8 and greater. This system'
479+ ' has %s installed. Upgrade your tmux to use libtmux.' %
480+ get_version ()
481+ )
482+ else :
483+ return False
484+ return True
459485
460486
461487def session_check_name (session_name ):
@@ -477,3 +503,32 @@ def session_check_name(session_name):
477503 elif ':' in session_name :
478504 raise exc .BadSessionName (
479505 "tmux session name \" %s\" may not contain colons." , session_name )
506+
507+
508+ def handle_option_error (error ):
509+ """Raises exception if error in option command found.
510+
511+ Purpose: As of tmux 2.4, there are now 3 different types of option errors:
512+
513+ - unknown option
514+ - invalid option
515+ - ambiguous option
516+
517+ Before 2.4, unknown option was the user.
518+
519+ All errors raised will have the base error of :exc:`exc.OptionError`. So to
520+ catch any option error, use ``except exc.OptionError``.
521+
522+ :param error: error response from subprocess call
523+ :type error: str
524+ :raises: :exc:`exc.OptionError`, :exc:`exc.UnknownOption`,
525+ :exc:`exc.InvalidOption`, :exc:`excAmbiguousOption`
526+ """
527+ if 'unknown option' in error :
528+ raise exc .UnknownOption (error )
529+ elif 'invalid option' in error :
530+ raise exc .InvalidOption (error )
531+ elif 'ambiguous option' in error :
532+ raise exc .AmbiguousOption (error )
533+ else :
534+ raise exc .OptionError (error ) # Raise generic option error
0 commit comments