2013-05-13 31 views
10

Tôi cố gắng để sử dụng ruby-progressbar đá quý với ruby-git đá quýWrapping lập một phương pháp với ruby-progressbar đá quý

Mục đích của tôi là để nắm bắt các thanh tiến trình năng động trong clone git để tôi có thể nhận được các thanh tiến trình cho git này sao chép

tôi cố gắng để sử dụng theo cách này

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 

tôi không thể nhận được thanh tiến trình như tôi mong đợi nó.

Bất cứ điều gì sai với cách tôi đã khởi tạo thanh tiến trình?

Cảm ơn trước!

Trả lời

4

Git.clone (https://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87) không mong đợi một khối. Vì vậy, khối bạn vượt qua chỉ đơn giản là bỏ qua.

Tôi không thấy làm thế nào điều này là có thể, thiếu sửa đổi ruby-git đá quý để bật thông báo tiến độ.

+0

hmm, được không nên quên về nếu tôi sử dụng ruby-git đá quý và tôi sử dụng bình thường 'git clone git: // github.com/ankit8898/rubymotion-inspect.git'. Làm thế nào tôi vẫn có thể tìm thấy thanh tiến trình của bản sao. Mục đích chính của tôi là bắt thanh tiến trình bằng cách sử dụng đá quý ruby-git hoặc bản sao git đơn giản. – AnkitG

+0

Thử đọc và diễn giải đầu ra của lệnh shell này. Có thể bạn sẽ may mắn. –

+0

tốt, đó là một kế hoạch dự phòng. :) Nhưng vẫn không có cách nào khác để sử dụng git clone với gem thanh tiến trình. Vì tôi quan tâm đến việc nhìn thấy thanh tiến trình thực sự với bản sao git. – AnkitG

1

Thư viện Git thêm 2>&1 vào tất cả các lệnh. Vì vậy, lệnh clone của bạn sẽ được thực thi như sau:

git clone ... 2>&1 

Điều này sẽ triệt tiêu tất cả đầu ra. Tất cả những gì bạn cần làm là ghi đè một phương thức được gọi là run_command trong Git::Lib và xóa số 2>&1 đó. Bạn có thể thử điều này trong 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 

tôi đã xác định thêm một verbose thuộc tính. Vì vậy, bất cứ khi nào bạn cần đầu ra git thực tế, chỉ cần thiết lập Git::Lib.verbose = true và chạy Git.clone hoặc bất kỳ lệnh nào khác và kết quả đầu ra thực tế sẽ được in.

Điều này sẽ làm là, một khi bạn thiết lập Git::Lib.verbose = true và sau đó gọi Git.clone, nó sẽ hiển thị thanh tiến trình git như thế này:

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 

Nó có thể không hiển thị thanh tiến trình trong các định dạng cụ thể mà bạn mong đợi , nhưng nó vẫn sẽ hiển thị các cập nhật động khi quá trình tải xuống diễn ra.

Edit: thêm kết quả đầu ra mẫu

+0

Ông vẫn cần phải phân tích và giải thích đầu ra. Tôi không nghĩ rằng anh ấy quan tâm đến đầu ra 'git clone' thô. –

+0

Từ câu hỏi, tôi nghĩ mục tiêu tổng thể là chỉ để hiển thị thanh tiến trình. Tôi không thấy OP làm bất cứ điều gì với sự tiến bộ khác hơn là hiển thị nó. Vì vậy, nó sẽ không được dễ dàng hơn để sử dụng đầu ra thanh tiến trình mặc định của git chính nó? – Subhas

+0

Lệnh cũng in nội dung khác, không chỉ thanh tiến trình. Ngoài ra, OP muốn thanh ở một định dạng cụ thể, như bạn có thể thấy. –

Các vấn đề liên quan