From f1ef8013a5df79286c88c4198fbc6d725f3c1faf Mon Sep 17 00:00:00 2001 From: Jorge Morante Date: Tue, 12 Sep 2023 15:01:30 +0200 Subject: [PATCH] fix compatibility issues from 3.0 onwards --- src/fingers/action_runner.cr | 2 +- src/fingers/commands/load_config.cr | 5 +++- src/fingers/commands/start.cr | 2 +- src/fingers/config.cr | 4 ++- src/tmux.cr | 40 ++++++++++++++++++++++++----- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/fingers/action_runner.cr b/src/fingers/action_runner.cr index 61450e1..35de505 100644 --- a/src/fingers/action_runner.cr +++ b/src/fingers/action_runner.cr @@ -119,7 +119,7 @@ module Fingers end def tmux - Tmux.new + Tmux.new(Fingers.config.tmux_version) end # This takes care of some path expansion weirdness when opening paths that start with ~ in MacOS diff --git a/src/fingers/commands/load_config.cr b/src/fingers/commands/load_config.cr index 7d1ddf7..fd3fd1a 100644 --- a/src/fingers/commands/load_config.cr +++ b/src/fingers/commands/load_config.cr @@ -26,6 +26,8 @@ class Fingers::Commands::LoadConfig < Fingers::Commands::Base config = Fingers::Config.new + config.tmux_version = `tmux -V`.chomp.split(" ").last + options.each do |option, value| # TODO generate an enum somehow and use an exhaustive case case option @@ -66,6 +68,7 @@ class Fingers::Commands::LoadConfig < Fingers::Commands::Base config.alphabet = ::Fingers::Config::ALPHABET_MAP[Fingers.config.keyboard_layout].split("").reject do |char| char.match(DISALLOWED_CHARS) end + config.save Fingers.reset_config @@ -169,6 +172,6 @@ class Fingers::Commands::LoadConfig < Fingers::Commands::Base end def tmux - Tmux.new + Tmux.new(`tmux -V`.chomp.split(" ").last) end end diff --git a/src/fingers/commands/start.cr b/src/fingers/commands/start.cr index ff2f27b..e19d42a 100644 --- a/src/fingers/commands/start.cr +++ b/src/fingers/commands/start.cr @@ -122,7 +122,7 @@ module Fingers::Commands end private getter tmux : Tmux do - Tmux.new + Tmux.new(Fingers.config.tmux_version) end end end diff --git a/src/fingers/config.cr b/src/fingers/config.cr index f2e683d..d4334b4 100644 --- a/src/fingers/config.cr +++ b/src/fingers/config.cr @@ -18,6 +18,7 @@ module Fingers property highlight_style : String property selected_highlight_style : String property backdrop_style : String + property tmux_version : String FORMAT_PRINTER = TmuxStylePrinter.new @@ -67,7 +68,8 @@ module Fingers @selected_hint_style = FORMAT_PRINTER.print("fg=green,bold"), @selected_highlight_style = FORMAT_PRINTER.print("fg=green,dim"), @highlight_style = FORMAT_PRINTER.print("fg=yellow,dim"), - @backdrop_style = FORMAT_PRINTER.print("bg=black,fg=color250") + @backdrop_style = FORMAT_PRINTER.print("bg=black,fg=color250"), + @tmux_version = "" ) end diff --git a/src/tmux.cr b/src/tmux.cr index ad43dcb..45c8e47 100644 --- a/src/tmux.cr +++ b/src/tmux.cr @@ -1,4 +1,5 @@ require "json" +require "semantic_version" require "./tmux_style_printer" def to_tmux_string(value) @@ -38,7 +39,6 @@ end # rubocop:disable Metrics/ClassLength class Tmux - class Shell def initialize @sh = Process.new("/bin/sh", input: :pipe, output: :pipe, error: :close) @@ -109,11 +109,29 @@ class Tmux }) @panes : Array(Pane) | Nil + @version : SemanticVersion - #@sh : Shell + def self.tmux_version_to_semver(version_string) + match = version_string.match(/(?[1-9]+[0-9]*)\.(?[0-9]+)(?[a-z]+)?/) - def initialize + raise "Invalid tmux version #{version_string}" unless match + + major = match["major"].not_nil! + minor = match["minor"].not_nil! + patch_letter = match["patch_letter"]? + + if patch_letter.nil? + patch = 0 + else + patch = patch_letter[0].ord - 'a'.ord + 1 + end + + SemanticVersion.parse("#{major}.#{minor}.#{patch}") + end + + def initialize(version_string) @sh = Shell.new + @version = Tmux.tmux_version_to_semver(version_string) end def panes : Array(Pane) @@ -149,9 +167,13 @@ class Tmux end def swap_panes(src_id, dst_id) - # TODO: -Z not supported on all tmux versions + args = ["swap-pane", "-d", "-s", src_id, "-t", dst_id] - system(tmux, ["swap-pane", "-d", "-s", src_id, "-t", dst_id, "-Z"]) + if @version >= Tmux.tmux_version_to_semver("3.1") + args << "-Z" + end + + system(tmux, args) end def kill_pane(id) @@ -197,10 +219,16 @@ class Tmux def set_buffer(value) return unless value + if @version >= Tmux.tmux_version_to_semver("3.2") + args = ["load-buffer", "-w", "-"] + else + args = ["load-buffer", "-"] + end + # To avoid shell escaping nightmares, we'll use Process and write directly to stdin cmd = Process.new( tmux, - ["load-buffer", "-w", "-"], + args, input: :pipe, output: :pipe, error: :pipe,