Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit d92cfd2

Browse files
committed
Add spinner utility for asynchronous operations in commands
1 parent 0189a3d commit d92cfd2

4 files changed

Lines changed: 53 additions & 2 deletions

File tree

lib/git/pkgs.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
require_relative "pkgs/ecosystems"
1212
require_relative "pkgs/osv_client"
1313
require_relative "pkgs/ecosystems_client"
14+
require_relative "pkgs/spinner"
1415

1516
require_relative "pkgs/purl_helper"
1617
require_relative "pkgs/models/branch"

lib/git/pkgs/commands/licenses.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,9 @@ def enrich_packages(purls)
201201

202202
client = EcosystemsClient.new
203203
begin
204-
results = client.bulk_lookup(stale_purls)
204+
results = Spinner.with_spinner("Fetching package metadata...") do
205+
client.bulk_lookup(stale_purls)
206+
end
205207
results.each do |purl, data|
206208
packages_by_purl[purl]&.enrich_from_api(data)
207209
end

lib/git/pkgs/commands/outdated.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ def enrich_packages(purls)
158158

159159
client = EcosystemsClient.new
160160
begin
161-
results = client.bulk_lookup(stale_purls)
161+
results = Spinner.with_spinner("Fetching package metadata...") do
162+
client.bulk_lookup(stale_purls)
163+
end
162164
results.each do |purl, data|
163165
packages_by_purl[purl]&.enrich_from_api(data)
164166
end

lib/git/pkgs/spinner.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
3+
module Git
4+
module Pkgs
5+
class Spinner
6+
FRAMES = %w[ ].freeze
7+
INTERVAL = 0.08
8+
9+
def initialize(message)
10+
@message = message
11+
@running = false
12+
@thread = nil
13+
end
14+
15+
def start
16+
return unless $stdout.tty? && !Git::Pkgs.quiet
17+
18+
@running = true
19+
@frame_index = 0
20+
@thread = Thread.new do
21+
while @running
22+
print "\r#{FRAMES[@frame_index]} #{@message}"
23+
@frame_index = (@frame_index + 1) % FRAMES.length
24+
sleep INTERVAL
25+
end
26+
end
27+
end
28+
29+
def stop
30+
return unless @thread
31+
32+
@running = false
33+
@thread.join
34+
print "\r#{" " * (@message.length + 3)}\r"
35+
end
36+
37+
def self.with_spinner(message)
38+
spinner = new(message)
39+
spinner.start
40+
yield
41+
ensure
42+
spinner.stop
43+
end
44+
end
45+
end
46+
end

0 commit comments

Comments
 (0)