88 lines
2.4 KiB
Ruby
88 lines
2.4 KiB
Ruby
namespace :gitlab do
|
|
namespace :git do
|
|
desc "GitLab | Git | Repack"
|
|
task repack: :gitlab_environment do
|
|
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} repack -a --quiet), "Repacking repo")
|
|
if failures.empty?
|
|
puts "Done".color(:green)
|
|
else
|
|
output_failures(failures)
|
|
end
|
|
end
|
|
|
|
desc "GitLab | Git | Run garbage collection on all repos"
|
|
task gc: :gitlab_environment do
|
|
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} gc --auto --quiet), "Garbage Collecting")
|
|
if failures.empty?
|
|
puts "Done".color(:green)
|
|
else
|
|
output_failures(failures)
|
|
end
|
|
end
|
|
|
|
desc "GitLab | Git | Prune all repos"
|
|
task prune: :gitlab_environment do
|
|
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} prune), "Git Prune")
|
|
if failures.empty?
|
|
puts "Done".color(:green)
|
|
else
|
|
output_failures(failures)
|
|
end
|
|
end
|
|
|
|
desc 'GitLab | Git | Check all repos integrity'
|
|
task fsck: :gitlab_environment do
|
|
failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} fsck --name-objects --no-progress), "Checking integrity") do |repo|
|
|
check_config_lock(repo)
|
|
check_ref_locks(repo)
|
|
end
|
|
|
|
if failures.empty?
|
|
puts "Done".color(:green)
|
|
else
|
|
output_failures(failures)
|
|
end
|
|
end
|
|
|
|
def perform_git_cmd(cmd, message)
|
|
puts "Starting #{message} on all repositories"
|
|
|
|
failures = []
|
|
all_repos do |repo|
|
|
if system(*cmd, chdir: repo)
|
|
puts "Performed #{message} at #{repo}"
|
|
else
|
|
failures << repo
|
|
end
|
|
|
|
yield(repo) if block_given?
|
|
end
|
|
|
|
failures
|
|
end
|
|
|
|
def output_failures(failures)
|
|
puts "The following repositories reported errors:".color(:red)
|
|
failures.each { |f| puts "- #{f}" }
|
|
end
|
|
|
|
def check_config_lock(repo_dir)
|
|
config_exists = File.exist?(File.join(repo_dir, 'config.lock'))
|
|
config_output = config_exists ? 'yes'.color(:red) : 'no'.color(:green)
|
|
|
|
puts "'config.lock' file exists?".color(:yellow) + " ... #{config_output}"
|
|
end
|
|
|
|
def check_ref_locks(repo_dir)
|
|
lock_files = Dir.glob(File.join(repo_dir, 'refs/heads/*.lock'))
|
|
|
|
if lock_files.present?
|
|
puts "Ref lock files exist:".color(:red)
|
|
|
|
lock_files.each { |lock_file| puts " #{lock_file}" }
|
|
else
|
|
puts "No ref lock files exist".color(:green)
|
|
end
|
|
end
|
|
end
|
|
end
|