Read about our upcoming Code of Conduct on this issue

has_repository.rb 2.23 KB
Newer Older
1
2
# frozen_string_literal: true

3
4
5
6
7
8
9
# This concern is created to handle repository actions.
# It should be include inside any object capable
# of directly having a repository, like project or snippet.
#
# It also includes `Referable`, therefore the method
# `to_reference` should be overriden in case the object
# needs any special behavior.
10
11
12
module HasRepository
  extend ActiveSupport::Concern
  include AfterCommitQueue
13
  include Referable
14
15
16
17
  include Gitlab::Utils::StrongMemoize

  delegate :base_dir, :disk_path, to: :storage

18
19
20
21
22
23
24
25
26
  class_methods do
    def pick_repository_storage
      # We need to ensure application settings are fresh when we pick
      # a repository storage to use.
      Gitlab::CurrentSettings.expire_current_application_settings
      Gitlab::CurrentSettings.pick_repository_storage
    end
  end

27
28
29
  def valid_repo?
    repository.exists?
  rescue
30
    errors.add(:base, _('Invalid repository path'))
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
    false
  end

  def repo_exists?
    strong_memoize(:repo_exists) do
      repository.exists?
    rescue
      false
    end
  end

  def repository_exists?
    !!repository.exists?
  end

  def root_ref?(branch)
    repository.root_ref == branch
  end

  def commit(ref = 'HEAD')
    repository.commit(ref)
  end

  def commit_by(oid:)
    repository.commit_by(oid: oid)
  end

  def commits_by(oids:)
    repository.commits_by(oids: oids)
  end

  def repository
    raise NotImplementedError
  end

  def storage
    raise NotImplementedError
  end

  def full_path
    raise NotImplementedError
  end

  def empty_repo?
    repository.empty?
  end

  def default_branch
    @default_branch ||= repository.root_ref
  end

  def reload_default_branch
    @default_branch = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables

    default_branch
  end

  def url_to_repo
89
    Gitlab::Shell.url_to_repo(full_path)
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
  end

  def ssh_url_to_repo
    url_to_repo
  end

  def http_url_to_repo
    custom_root = Gitlab::CurrentSettings.custom_http_clone_url_root

    url = if custom_root.present?
            Gitlab::Utils.append_path(
              custom_root,
              web_url(only_path: true)
            )
          else
            web_url
          end

    "#{url}.git"
  end

  def web_url(only_path: nil)
    raise NotImplementedError
  end
end