63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/mass_git_clone.rb', line 63
def self.mass_clone(repo_base_dir:, repo_list:)
use_ssh =
begin
run "git", "ls-remote", "[email protected]:discourse/discourse", "main"
prefixed_puts "Using SSH for GitHub..."
true
rescue => e
prefixed_puts "SSH failed. Using https for GitHub..."
false
end
all_repos = repo_list.map(&:strip).filter { |l| l.length > 0 }
if all_repos.size === 0
prefixed_puts "No plugin URLs supplied"
exit 1
end
all_repos =
all_repos.map do |repo|
if !repo.match?(%r{\A[\w-]+/[\w-]+\z})
repo
elsif use_ssh
"[email protected]:#{repo}"
else
"https://github.com/#{repo}"
end
end
Dir.mkdir(repo_base_dir) if !Dir.exist?(repo_base_dir)
Dir.chdir(repo_base_dir) do
failures =
Parallel
.map(all_repos, in_threads: ENV["PARALLEL"]&.to_i || 10) do |repo_url|
update_repo(repo_url)
end
.reject(&:nil?)
final_dirs = Dir.glob("*")
expected_dirs = Set.new(all_repos.map { |r| File.basename(r, ".git") })
to_delete = final_dirs.reject { |dir| expected_dirs.include?(dir) }
if to_delete.any?
puts
prefixed_puts "Deleting #{to_delete.size} stale directories"
to_delete.each { |dir| FileUtils.rm_rf(dir) }
end
puts
if failures.any?
prefixed_puts "#{failures.count} repo(s) failed to update"
prefixed_puts failures.map { |url| " #{url}" }.join("\n")
exit 1
else
prefixed_puts "Done - all repositories are up-to-date 🚀"
end
end
end
|