blob: 0e7381882b5a4476a23e9945e34f1a497c63b801 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
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
121
122
123
124
125
126
127
128
129
130
|
# frozen_string_literal: true
# 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 overridden in case the object
# needs any special behavior.
module HasRepository
extend ActiveSupport::Concern
include Referable
include Gitlab::ShellAdapter
include Gitlab::Utils::StrongMemoize
delegate :base_dir, :disk_path, to: :storage
delegate :change_head, to: :repository
def valid_repo?
repository.exists?
rescue StandardError
errors.add(:base, _('Invalid repository path'))
false
end
def repo_exists?
strong_memoize(:repo_exists) do
repository.exists?
rescue StandardError
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 lfs_enabled?
false
end
def empty_repo?
repository.empty?
end
def default_branch
@default_branch ||= repository.empty? ? default_branch_from_preferences : repository.root_ref
end
def default_branch_from_preferences
(default_branch_from_group_preferences || Gitlab::CurrentSettings.default_branch_name).presence
end
def default_branch_from_group_preferences
return unless respond_to?(:group)
return unless group
group.default_branch_name || group.root_ancestor.default_branch_name
end
def reload_default_branch
@default_branch = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables
default_branch
end
def url_to_repo
ssh_url_to_repo
end
def ssh_url_to_repo
Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :ssh)
end
def http_url_to_repo
Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :http)
end
# Is overridden in EE::Project for Geo support
def lfs_http_url_to_repo(_operation = nil)
http_url_to_repo
end
def web_url(only_path: nil)
Gitlab::UrlBuilder.build(self, only_path: only_path)
end
def repository_size_checker
raise NotImplementedError
end
def after_repository_change_head
reload_default_branch
Gitlab::EventStore.publish(
Repositories::DefaultBranchChangedEvent.new(data: { container_id: id, container_type: self.class.name }))
end
def after_change_head_branch_does_not_exist(branch)
# No-op (by default)
end
end
|