2013-05-13 11 views
10

Sto cercando di utilizzare ruby-progressbar gioiello con ruby-git gemmaavvolgendo un metodo con rubino progressbar gioiello

Il mio obiettivo è quello di catturare la barra di avanzamento dinamica durante il clone git modo che io possa ottenere la barra di avanzamento per questo git clonare

sto cercando di usare in questo modo

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 

io non sono in grado di ottenere la barra di progresso come mi aspetto di esso.

Qualcosa non va nel modo in cui ho inizializzato la barra di avanzamento?

Grazie in anticipo!

risposta

4

Git.clone (https://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87) non prevede un blocco. Quindi il blocco che passi è semplicemente ignorato.

Non vedo come sia possibile, a meno di modificare la gemma ruby-git per abilitare le notifiche di avanzamento.

+0

hmm, va bene così Dimenticate se io uso rubino git gioiello e io uso normale 'git clone git: // github.com/ankit8898/rubymotion-inspect.git'. Come posso ancora trovare la barra di avanzamento del clone. Il mio obiettivo principale è quello di ottenere una barra di progresso usando la gemma ruby-git o il semplice clone git. – AnkitG

+0

Prova a leggere e interpretare l'output di questo comando shell. Forse sarai fortunato. –

+0

bene, questo è un piano di backup. :) Ma non c'è ancora nessun altro modo di usare git clone con la gem di progressbar. Poiché sono interessato a vedere la barra di avanzamento effettiva con clone git. – AnkitG

1

La libreria Git aggiunge 2>&1 a tutti i comandi. Quindi il tuo comando clone finisce per essere eseguito come:

git clone ... 2>&1 

Che finisce per sopprimere tutte le uscite. Tutto ciò che devi fare è sovrascrivere un singolo metodo chiamato run_command in Git::Lib e rimuovere quello 2>&1. Si può provare questo 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 

ho definito un extra verbose attributo. Quindi, ogni volta che hai bisogno delle uscite git, imposta Git::Lib.verbose = true ed esegui Git.clone o qualsiasi altro comando, e le uscite effettive verranno stampate.

Che cosa questo farà è, una volta impostato Git::Lib.verbose = true e quindi chiamare Git.clone, si visualizzerà la barra di avanzamento git come questo:

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 

Esso non può mostrare la barra di avanzamento nel formato specifico che ci si aspetta , ma mostrerà comunque gli aggiornamenti dinamici mentre avviene il download.

Edit: Aggiunto uscite campione

+0

Ha ancora bisogno di analizzare e interpretare l'output. Non penso che sia interessato all'output di 'git clone'. –

+0

Dalla domanda, ho pensato che l'obiettivo generale fosse solo quello di visualizzare la barra di avanzamento. Non vedo l'OP fare nulla con il progresso diverso dal mostrarlo. Quindi non sarebbe più semplice usare l'output della barra di avanzamento predefinito di git stesso? – Subhas

+0

Il comando stampa anche altri contenuti, non solo la barra di avanzamento. Anche l'OP vuole la barra in un formato specifico, come puoi vedere. –