Завершение метода с драгоценным камнем ruby-progressbar

Я пытаюсь использовать ruby-progressbar gem с ruby-git gem

Моя цель - захватить динамический индикатор выполнения во время клонирования git, чтобы я мог получить индикатор выполнения для этого git clone

Я пытаюсь использовать таким образом

 def my_method
  p = ProgressBar.create(:format => '%a %B %p%% %t')
  Git.clone('git://github.com/ankit8898/rubymotion-inspect.git','my_repo',:path => '.') do
    p.increment
   end
 end

Я не могу получить индикатор выполнения, как я ожидаю.

Что-то не так с тем, как я инициализировал индикатор выполнения?

Спасибо заранее!

Ответ 1

Git.clone (https://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87) не ожидает блока. Таким образом, блок, который вы передаете, просто игнорируется.

Я не вижу, как это возможно, вместо модификации ruby-git gem для включения уведомлений о ходе выполнения.

Ответ 2

Библиотека Git добавляет 2>&1 ко всем командам. Итак, ваша команда clone запускается как:

git clone ... 2>&1

Конец заканчивается подавлением всего вывода. Все, что вам нужно сделать, это переопределить один метод под названием run_command в Git::Lib и удалить его 2>&1. Вы можете попробовать это в irb:

class Git::Lib
  class << self
    attr_accessor :verbose
  end

  def run_command(git_cmd, &block)
    git_cmd = git_cmd.gsub("2>&1", "").chomp if self.class.verbose
    if block_given?
      IO.popen(git_cmd, &block)
    else
      `#{git_cmd}`.chomp
    end
  end
end

Я определил дополнительный атрибут verbose. Поэтому всякий раз, когда вам нужны фактические выходы git, просто установите Git::Lib.verbose = true и запустите Git.clone или любую другую команду, и будут выведены фактические выходы.

Что это будет делать, как только вы установите Git::Lib.verbose = true, а затем вызовите Git.clone, он отобразит индикатор выполнения git следующим образом:

Cloning into 'rapidftr-addon-cpims'...
remote: Counting objects: 207, done.
remote: Compressing objects: 100% (108/108), done.
remote: Total 207 (delta 95), reused 201 (delta 90)
Receiving objects: 50% (105/207), 83.10 KiB | 112 KiB/s...
# ^^ The above line is git progress bar, it will keep updating

Он может не показывать индикатор выполнения в определенном формате, который вы ожидаете, но он все равно будет показывать динамические обновления при загрузке.

Изменить: Добавлены выходные данные