Class: Compare

Inherits:
Object
  • Object
show all
Includes:
ActsAsPaginatedDiff, Gitlab::Utils::StrongMemoize
Defined in:
app/models/compare.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActsAsPaginatedDiff

#diffs_in_batch

Constructor Details

#initialize(compare, project, base_sha: nil, straight: false) ⇒ Compare

Returns a new instance of Compare.



21
22
23
24
25
26
# File 'app/models/compare.rb', line 21

def initialize(compare, project, base_sha: nil, straight: false)
  @compare = compare
  @project = project
  @base_sha = base_sha
  @straight = straight
end

Instance Attribute Details

#projectObject (readonly)

Returns the value of attribute project.



11
12
13
# File 'app/models/compare.rb', line 11

def project
  @project
end

Class Method Details

.decorate(compare, project) ⇒ Object



13
14
15
16
17
18
19
# File 'app/models/compare.rb', line 13

def self.decorate(compare, project)
  if compare.is_a?(Compare)
    compare
  else
    self.new(compare, project)
  end
end

Instance Method Details

#base_commit_shaObject



70
71
72
73
74
75
76
# File 'app/models/compare.rb', line 70

def base_commit_sha
  strong_memoize(:base_commit) do
    next unless start_commit && head_commit

    @base_sha || project.merge_base_commit(start_commit.id, head_commit.id)&.sha
  end
end

#cache_keyObject



38
39
40
# File 'app/models/compare.rb', line 38

def cache_key
  [@project, :compare, diff_refs.hash]
end

#commitsObject



42
43
44
45
46
47
# File 'app/models/compare.rb', line 42

def commits
  @commits ||= begin
    decorated_commits = Commit.decorate(@compare.commits, project)
    CommitCollection.new(project, decorated_commits)
  end
end

#diff_refsObject



93
94
95
96
97
98
99
# File 'app/models/compare.rb', line 93

def diff_refs
  Gitlab::Diff::DiffRefs.new(
    base_sha: @straight ? start_commit_sha : base_commit_sha,
    start_sha: start_commit_sha,
    head_sha: head_commit_sha
  )
end

#diffs(diff_options = nil) ⇒ Object



86
87
88
89
90
91
# File 'app/models/compare.rb', line 86

def diffs(diff_options = nil)
  Gitlab::Diff::FileCollection::Compare.new(self,
    project: project,
    diff_options: diff_options,
    diff_refs: diff_refs)
end

#head_commitObject Also known as: commit



57
58
59
60
61
62
63
# File 'app/models/compare.rb', line 57

def head_commit
  strong_memoize(:head_commit) do
    commit = @compare.head

    ::Commit.new(commit, project) if commit
  end
end

#head_commit_shaObject



78
79
80
# File 'app/models/compare.rb', line 78

def head_commit_sha
  commit&.sha
end

#modified_pathsObject



101
102
103
104
105
106
107
108
# File 'app/models/compare.rb', line 101

def modified_paths
  paths = Set.new
  diffs.diff_files.each do |diff|
    paths.add diff.old_path
    paths.add diff.new_path
  end
  paths.to_a
end

#raw_diffsObject



82
83
84
# File 'app/models/compare.rb', line 82

def raw_diffs(...)
  @compare.diffs(...)
end

#start_commitObject



49
50
51
52
53
54
55
# File 'app/models/compare.rb', line 49

def start_commit
  strong_memoize(:start_commit) do
    commit = @compare.base

    ::Commit.new(commit, project) if commit
  end
end

#start_commit_shaObject



66
67
68
# File 'app/models/compare.rb', line 66

def start_commit_sha
  start_commit&.sha
end

#to_paramObject

Return a Hash of parameters for passing to a URL helper

See ‘namespace_project_compare_url`



31
32
33
34
35
36
# File 'app/models/compare.rb', line 31

def to_param
  {
    from: @straight ? start_commit_sha : (base_commit_sha || start_commit_sha),
    to: head_commit_sha
  }
end