2013-05-13 11 views
10

Próbuję użyć ruby-progressbar gem z ruby-git gemowijania metoda z ruby-Progressbar gem

Moim celem jest, aby uchwycić dynamiczne pasek postępu podczas clone git tak, że mogę dostać pasek postępu dla tego git sklonować

staram się wykorzystywać w ten sposób

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 

nie jestem w stanie dostać się pasek postępu, jak ja go spodziewać.

Coś nie tak ze sposobem inicjalizacji Pasek postępu?

Z góry dziękuję!

Odpowiedz

4

Git.clone (https://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87) nie oczekuje bloku. Tak więc blok, który mijasz, jest po prostu ignorowany.

Nie widzę sposobu, w jaki jest to możliwe, bez modyfikowania klejnotu ruby-git, aby włączyć powiadomienia o postępach.

+0

hmm, dobrze więc zapomnij o tym, czy mogę używać ruby-git gem i używam normalnej 'git clone git: // github.com/ankit8898/rubymotion-inspect.git'. Jak mogę znaleźć pasek postępu klonowania? Moim głównym celem jest złapanie paska postępu za pomocą ruby-git gem lub prostego klonu git. – AnkitG

+0

Spróbuj odczytać i interpretować dane wyjściowe tego polecenia powłoki. Może będziesz miał szczęście. –

+0

cóż, to jest plan awaryjny. :) Ale nadal nie ma innego sposobu na użycie git clone z gem gem. Ponieważ jestem zainteresowany widzeniem paska postępu z klonem git. – AnkitG

1

Biblioteka Git dodaje 2>&1 do wszystkich poleceń. Tak więc polecenie twojego klonu kończy się w następujący sposób:

git clone ... 2>&1 

Który kończy tłumienie wszystkich wyników. Wszystko, co musisz zrobić, to zastąpić pojedynczą metodę o nazwie run_command w Git::Lib i usunąć tę 2>&1. Można spróbować to w 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 

Mam zdefiniowane dodatkowe verbose atrybut. Tak więc, gdy potrzebujesz rzeczywistych wyjść git, ustaw Git::Lib.verbose = true i uruchom Git.clone lub dowolne inne polecenie, a rzeczywiste wydruki zostaną wydrukowane.

Co to będzie zrobić, to po ustawieniu Git::Lib.verbose = true a następnie zadzwonić Git.clone, wyświetli się pasek postępu git tak:

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 

Nie może pokazać pasek postępu w określonym formacie, który można oczekiwać , ale nadal będzie wyświetlać dynamiczne aktualizacje podczas pobierania.

EDIT: Dodano wyjścia Przykładowe

+0

Nadal musi przeanalizować i zinterpretować wynik. Nie sądzę, że interesuje go surowy wynik 'git clone'. –

+0

Od pytania, myślałem, że ogólnym celem było tylko wyświetlenie paska postępu. Nie widzę, żeby OP robiło coś z postępem innym niż jego wyświetlanie. Czy nie byłoby łatwiej użyć domyślnego paska postępu samego Gita? – Subhas

+0

Polecenie drukuje również inną zawartość, nie tylko pasek postępu. Również OP chce mieć pasek w określonym formacie, jak widać. –

Powiązane problemy