Module: HasRepository

Extended by:
ActiveSupport::Concern
Includes:
Gitlab::ShellAdapter, Gitlab::Utils::StrongMemoize, Referable
Included in:
DesignManagement::Repository, Project, Snippet, Wiki
Defined in:
app/models/concerns/has_repository.rb

Overview

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.

Instance Method Summary collapse

Methods included from Gitlab::ShellAdapter

#gitlab_shell

Methods included from Referable

#referable_inspect, #reference_link_text, #to_reference, #to_reference_base

Instance Method Details

#after_change_head_branch_does_not_exist(branch) ⇒ Object



180
181
182
# File 'app/models/concerns/has_repository.rb', line 180

def after_change_head_branch_does_not_exist(branch)
  # No-op (by default)
end

#after_create_repositoryObject



169
170
171
172
173
174
175
176
177
178
# File 'app/models/concerns/has_repository.rb', line 169

def after_create_repository
  container_type = self.class.name
  container_id = id

  run_after_commit_or_now do
    Gitlab::EventStore.publish(
      ::Repositories::RepositoryCreatedEvent.new(data: { container_id: container_id,
                                                         container_type: container_type }))
  end
end

#after_repository_change_headObject



158
159
160
161
162
163
164
165
166
167
# File 'app/models/concerns/has_repository.rb', line 158

def after_repository_change_head
  reload_default_branch

  container_type = self.class.name

  run_after_commit_or_now do
    Gitlab::EventStore.publish(
      ::Repositories::DefaultBranchChangedEvent.new(data: { container_id: id, container_type: container_type }))
  end
end

#apply_desired_default_branchObject

rubocop:disable Gitlab/ModuleWithInstanceVariables – no alternative without disabling cop



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/models/concerns/has_repository.rb', line 99

def apply_desired_default_branch
  return unless @desired_default_branch
  return if repository.empty?
  return if repository.root_ref == @desired_default_branch

  # Only change HEAD if the branch exists
  if repository.branch_exists?(@desired_default_branch)
    repository.change_head(@desired_default_branch)
    reload_default_branch
    @desired_default_branch = nil
  end
rescue StandardError => e
  # Log the error but don't fail the import
  Import::Framework::Logger.warn("Failed to set default branch to #{@desired_default_branch}: #{e.message}")
end

#branch_exists?(branch) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'app/models/concerns/has_repository.rb', line 45

def branch_exists?(branch)
  repository.branch_exists?(branch)
end

#commit(ref = 'HEAD') ⇒ Object



41
42
43
# File 'app/models/concerns/has_repository.rb', line 41

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

#commit_by(oid:) ⇒ Object



53
54
55
# File 'app/models/concerns/has_repository.rb', line 53

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

#commits_by(oids:) ⇒ Object



57
58
59
# File 'app/models/concerns/has_repository.rb', line 57

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

#default_branchObject



81
82
83
# File 'app/models/concerns/has_repository.rb', line 81

def default_branch
  @default_branch ||= repository.empty? ? default_branch_from_preferences : repository.root_ref
end

#default_branch=(branch_name) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
# File 'app/models/concerns/has_repository.rb', line 85

def default_branch=(branch_name)
  return if branch_name.blank?

  return unless instance_of?(Project) && importing?

  # Store the desired default branch for later application
  # This is used during project import to restore the default branch
  @desired_default_branch = branch_name # rubocop:disable Gitlab/ModuleWithInstanceVariables -- no alternative without disabling cop

  # Try to apply it immediately if the repository is ready
  apply_desired_default_branch
end

#default_branch_from_group_preferencesObject



120
121
122
123
124
125
# File 'app/models/concerns/has_repository.rb', line 120

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

#default_branch_from_preferencesObject

rubocop:enable Gitlab/ModuleWithInstanceVariables



116
117
118
# File 'app/models/concerns/has_repository.rb', line 116

def default_branch_from_preferences
  (default_branch_from_group_preferences || Gitlab::CurrentSettings.default_branch_name).presence
end

#empty_repo?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'app/models/concerns/has_repository.rb', line 77

def empty_repo?
  repository.empty?
end

#full_pathObject

Raises:

  • (NotImplementedError)


69
70
71
# File 'app/models/concerns/has_repository.rb', line 69

def full_path
  raise NotImplementedError
end

#http_url_to_repoObject



141
142
143
# File 'app/models/concerns/has_repository.rb', line 141

def http_url_to_repo
  Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :http)
end

#lfs_enabled?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'app/models/concerns/has_repository.rb', line 73

def lfs_enabled?
  false
end

#lfs_http_url_to_repo(_operation = nil) ⇒ Object

Is overridden in EE::Project for Geo support



146
147
148
# File 'app/models/concerns/has_repository.rb', line 146

def lfs_http_url_to_repo(_operation = nil)
  http_url_to_repo
end

#ref_exists?(ref) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
# File 'app/models/concerns/has_repository.rb', line 49

def ref_exists?(ref)
  repository.ref_exists?(ref)
end

#reload_default_branchObject



127
128
129
130
131
# File 'app/models/concerns/has_repository.rb', line 127

def reload_default_branch
  @default_branch = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables -- no alternative without disabling cop

  default_branch
end

#repo_exists?Boolean

Returns:

  • (Boolean)


26
27
28
29
30
# File 'app/models/concerns/has_repository.rb', line 26

def repo_exists?
  repository.exists?
rescue StandardError
  false
end

#repositoryObject

Raises:

  • (NotImplementedError)


61
62
63
# File 'app/models/concerns/has_repository.rb', line 61

def repository
  raise NotImplementedError
end

#repository_exists?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'app/models/concerns/has_repository.rb', line 33

def repository_exists?
  !!repository.exists?
end

#repository_size_checkerObject

Raises:

  • (NotImplementedError)


154
155
156
# File 'app/models/concerns/has_repository.rb', line 154

def repository_size_checker
  raise NotImplementedError
end

#root_ref?(branch) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
# File 'app/models/concerns/has_repository.rb', line 37

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

#ssh_url_to_repoObject



137
138
139
# File 'app/models/concerns/has_repository.rb', line 137

def ssh_url_to_repo
  Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :ssh)
end

#storageObject

Raises:

  • (NotImplementedError)


65
66
67
# File 'app/models/concerns/has_repository.rb', line 65

def storage
  raise NotImplementedError
end

#url_to_repoObject



133
134
135
# File 'app/models/concerns/has_repository.rb', line 133

def url_to_repo
  ssh_url_to_repo
end

#valid_repo?Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
# File 'app/models/concerns/has_repository.rb', line 19

def valid_repo?
  repository.exists?
rescue StandardError
  errors.add(:base, _('Invalid repository path'))
  false
end

#web_url(only_path: nil) ⇒ Object



150
151
152
# File 'app/models/concerns/has_repository.rb', line 150

def web_url(only_path: nil)
  Gitlab::UrlBuilder.build(self, only_path: only_path)
end