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.



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

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.



9
10
11
# File 'app/models/compare.rb', line 9

def project
  @project
end

Class Method Details

.decorate(compare, project) ⇒ Object



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

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

Instance Method Details

#base_commit_shaObject



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

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



36
37
38
# File 'app/models/compare.rb', line 36

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

#changed_pathsObject



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

def changed_paths
  project
    .repository
    .find_changed_paths(
      [Gitlab::Git::DiffTree.new(diff_refs.base_sha, diff_refs.head_sha)],
      find_renames: true
    )
end

#commitsObject



40
41
42
43
44
45
# File 'app/models/compare.rb', line 40

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 Also known as: diffs_for_streaming



84
85
86
87
88
89
# File 'app/models/compare.rb', line 84

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



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

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

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

#head_commit_shaObject



76
77
78
# File 'app/models/compare.rb', line 76

def head_commit_sha
  commit&.sha
end

#modified_pathsObject



110
111
112
113
114
115
116
117
# File 'app/models/compare.rb', line 110

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



80
81
82
# File 'app/models/compare.rb', line 80

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

#start_commitObject



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

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

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

#start_commit_shaObject



64
65
66
# File 'app/models/compare.rb', line 64

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`



29
30
31
32
33
34
# File 'app/models/compare.rb', line 29

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