#
# SPDX-License-Identifier: AGPL-3.0
+require 'request_error'
+
class Commit < ActiveRecord::Base
extend CurrentApiClient
- class GitError < StandardError
+ class GitError < RequestError
def http_status
422
end
dst_gitdir = Rails.configuration.git_internal_dir
begin
- commit_in_dst = must_git(dst_gitdir, "rev-parse --verify #{sha1.shellescape}^{commit}").strip
+ commit_in_dst = must_git(dst_gitdir, "log -n1 --format=%H #{sha1.shellescape}^{commit}").strip
rescue GitError
commit_in_dst = false
end
# is no such branch, or the branch we choose changes under us in
# race), we fall back to pack|unpack.
begin
- branches = must_git("branch --contains #{sha1.shellescape}^{commit}")
+ branches = must_git(src_gitdir,
+ "branch --contains #{sha1.shellescape}")
m = branches.match(/^. (\w+)\n/)
if !m
raise GitError.new "commit is not on any branch"
branch = m[1]
must_git(dst_gitdir,
"fetch file://#{src_gitdir.shellescape} #{branch.shellescape}")
+ # Even if all of the above steps succeeded, we might still not
+ # have the right commit due to a race, in which case tag_cmd
+ # will fail, and we'll need to fall back to pack|unpack. So
+ # don't be tempted to condense this tag_cmd and the one in the
+ # rescue block into a single attempt.
must_git(dst_gitdir, tag_cmd)
rescue GitError
must_pipe("echo #{sha1.shellescape}",
end
def self.cache_dir_base
- Rails.root.join 'tmp', 'git'
+ Rails.root.join 'tmp', 'git-cache'
end
def self.fetch_remote_repository gitdir, git_url