diff options
Diffstat (limited to 'app/workers/repository_check/single_repository_worker.rb')
-rw-r--r-- | app/workers/repository_check/single_repository_worker.rb | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb new file mode 100644 index 00000000000..98ddf5d0688 --- /dev/null +++ b/app/workers/repository_check/single_repository_worker.rb @@ -0,0 +1,52 @@ +module RepositoryCheck + class SingleRepositoryWorker + include Sidekiq::Worker + + sidekiq_options retry: false + + def perform(project_id) + project = Project.find(project_id) + project.update_columns( + last_repository_check_failed: !check(project), + last_repository_check_at: Time.now, + ) + end + + private + + def check(project) + if has_pushes?(project) && !git_fsck(project.repository) + false + elsif project.wiki_enabled? + # Historically some projects never had their wiki repos initialized; + # this happens on project creation now. Let's initialize an empty repo + # if it is not already there. + begin + project.create_wiki + rescue Rugged::RepositoryError + end + + git_fsck(project.wiki.repository) + else + true + end + end + + def git_fsck(repository) + path = repository.path_to_repo + cmd = %W(nice git --git-dir=#{path} fsck) + output, status = Gitlab::Popen.popen(cmd) + + if status.zero? + true + else + Gitlab::RepositoryCheckLogger.error("command failed: #{cmd.join(' ')}\n#{output}") + false + end + end + + def has_pushes?(project) + Project.with_push.exists?(project.id) + end + end +end |