2013-05-13 6 views
10

ich ruby-progressbar Juwel mit ruby-git gemWrapping ein Verfahren mit rubin progressbar gem up

Mein Ziel zu verwenden versuche ist die dynamische Fortschrittsbalken während des git clone zu erfassen, so dass ich den Fortschrittsbalken für dieses git erhalten können klonen

ich auf diese Weise

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 

ich bin nicht in der Lage zu verwenden, ich versuche, den Fortschrittsbalken zu bekommen, wie ich es erwartet.

Alles falsch mit der Art, wie ich Progress Bar initialisiert habe?

Vielen Dank im Voraus!

Antwort

4

Git.clone (https://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87) erwartet keinen Block. Der Block, den Sie passieren, wird einfach ignoriert.

Ich sehe nicht, wie dies möglich ist, kurz ruby-git gem zu ändern, um Fortschrittsbenachrichtigungen zu ermöglichen.

+0

hmm, okay so vergessen, wenn ich rubin git gem verwenden und ich verwende normalen 'git clone git: // github.com/ankit8898/rubymotion-inspect.git'. Wie kann ich immer noch die Fortschrittsleiste von Klon finden. Mein Hauptziel ist es, den Fortschrittsbalken entweder mit dem Ruby-Git-Juwel oder dem einfachen Git-Klon zu erfassen. – AnkitG

+0

Versuchen Sie, die Ausgabe dieses Shell-Befehls zu lesen und zu interpretieren. Vielleicht wirst du Glück haben. –

+0

Nun, das ist ein Backup-Plan. :) Aber noch gibt es keine andere Möglichkeit, Git-Klon mit Progressbar-Juwel zu verwenden. Da bin ich daran interessiert, die tatsächlich progressbar mit git clone zu sehen. – AnkitG

1

Die Bibliothek Git fügt allen Befehlen 2>&1 hinzu. So wird Ihr Klonbefehl wie folgt ausgeführt:

Was endet die Unterdrückung aller Ausgabe. Alles, was Sie tun müssen, ist eine einzige Methode namens run_command in Git::Lib zu überschreiben, und entfernen Sie diese 2>&1. Sie können versuchen, diese in 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 

I definiert haben ein zusätzliches verbose Attribut. Wann immer Sie also die tatsächlichen git-Ausgänge benötigen, setzen Sie einfach Git::Lib.verbose = true und führen Sie Git.clone oder einen anderen Befehl aus, und die tatsächlichen Ausgaben werden gedruckt.

Was wird dies zu tun ist, wenn Sie Git::Lib.verbose = true gesetzt und dann Git.clone nennen, wird es den git Fortschrittsbalken wie folgt angezeigt:

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's progress bar, it will keep updating 

Es kann nicht den Fortschrittsbalken im bestimmten Format zeigen, die Sie erwarten , aber es werden immer noch dynamische Updates angezeigt, wenn der Download stattfindet.

Edit: Hinzugefügt Probe Ausgänge

+0

Er muss immer noch die Ausgabe analysieren und interpretieren. Ich glaube nicht, dass er an der Roh-Git-Klon-Ausgabe interessiert ist. –

+0

Von der Frage, ich dachte, das Gesamtziel war nur, um den Fortschrittsbalken anzuzeigen. Ich sehe nicht, dass das OP irgendetwas mit dem Fortschritt macht, außer es anzuzeigen. Wäre es also nicht einfacher, die Standard-Fortschrittsanzeige von git selbst zu verwenden? – Subhas

+0

Der Befehl druckt auch andere Inhalte, nicht nur den Fortschrittsbalken. Auch das OP möchte die Leiste in einem bestimmten Format haben, wie Sie sehen können. –

Verwandte Themen