commits_helper.rb 6.5 KB
Newer Older
1
# encoding: utf-8
gitlabhq's avatar
gitlabhq committed
2
module CommitsHelper
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
  # Returns a link to the commit author. If the author has a matching user and
  # is a member of the current @project it will link to the team member page.
  # Otherwise it will link to the author email as specified in the commit.
  #
  # options:
  #  avatar: true will prepend the avatar image
  #  size:   size of the avatar image in px
  def commit_author_link(commit, options = {})
    commit_person_link(commit, options.merge(source: :author))
  end

  # Just like #author_link but for the committer.
  def commit_committer_link(commit, options = {})
    commit_person_link(commit, options.merge(source: :committer))
  end

19 20
  def image_diff_class(diff)
    if diff.deleted_file
21
      "deleted"
22
    elsif diff.new_file
23
      "added"
24 25 26 27
    else
      nil
    end
  end
28

29 30 31
  def commit_to_html(commit, project, inline = true)
    template = inline ? "inline_commit" : "commit"
    escape_javascript(render "projects/commits/#{template}", commit: commit, project: project) unless commit.nil?
32
  end
33

34 35 36 37 38 39
  # Breadcrumb links for a Project and, if applicable, a tree path
  def commits_breadcrumbs
    return unless @project && @ref

    # Add the root project link and the arrow icon
    crumbs = content_tag(:li) do
Vinnie Okada's avatar
Vinnie Okada committed
40 41 42 43
      link_to(
        @project.path,
        namespace_project_commits_path(@project.namespace, @project, @ref)
      )
44 45 46 47 48 49
    end

    if @path
      parts = @path.split('/')

      parts.each_with_index do |part, i|
50
        crumbs << content_tag(:li) do
51
          # The text is just the individual part, but the link needs all the parts before it
Vinnie Okada's avatar
Vinnie Okada committed
52 53 54 55 56 57 58 59
          link_to(
            part,
            namespace_project_commits_path(
              @project.namespace,
              @project,
              tree_join(@ref, parts[0..i].join('/'))
            )
          )
60 61 62 63 64 65 66
        end
      end
    end

    crumbs.html_safe
  end

67 68 69 70 71 72 73 74
  # Return Project default branch, if it present in array
  # Else - first branch in array (mb last actual branch)
  def commit_default_branch(project, branches)
    branches.include?(project.default_branch) ? branches.delete(project.default_branch) : branches.pop
  end

  # Returns the sorted alphabetically links to branches, separated by a comma
  def commit_branches_links(project, branches)
75
    branches.sort.map do |branch|
Vinnie Okada's avatar
Vinnie Okada committed
76 77 78
      link_to(
        namespace_project_tree_path(project.namespace, project, branch)
      ) do
79
        content_tag :span, class: 'label label-gray' do
80
          icon('code-fork') + ' ' + branch
81 82 83
        end
      end
    end.join(" ").html_safe
84 85
  end

86 87 88
  # Returns the sorted links to tags, separated by a comma
  def commit_tags_links(project, tags)
    sorted = VersionSorter.rsort(tags)
89
    sorted.map do |tag|
Vinnie Okada's avatar
Vinnie Okada committed
90 91 92 93
      link_to(
        namespace_project_commits_path(project.namespace, project,
                                       project.repository.find_tag(tag).name)
      ) do
94
        content_tag :span, class: 'label label-gray' do
95
          icon('tag') + ' ' + tag
96 97 98
        end
      end
    end.join(" ").html_safe
99 100
  end

101 102 103
  def link_to_browse_code(project, commit)
    if current_controller?(:projects, :commits)
      if @repo.blob_at(commit.id, @path)
Vinnie Okada's avatar
Vinnie Okada committed
104 105 106 107 108 109
        return link_to(
          "Browse File »",
          namespace_project_blob_path(project.namespace, project,
                                      tree_join(commit.id, @path)),
          class: "pull-right"
        )
110
      elsif @path.present?
Vinnie Okada's avatar
Vinnie Okada committed
111
        return link_to(
112
          "Browse Directory »",
Vinnie Okada's avatar
Vinnie Okada committed
113 114 115 116
          namespace_project_tree_path(project.namespace, project,
                                      tree_join(commit.id, @path)),
          class: "pull-right"
        )
117 118
      end
    end
Vinnie Okada's avatar
Vinnie Okada committed
119
    link_to(
120
      "Browse Files »",
Vinnie Okada's avatar
Vinnie Okada committed
121 122 123
      namespace_project_tree_path(project.namespace, project, commit),
      class: "pull-right"
    )
124 125
  end

126
  def revert_commit_link(show_modal_condition, continue_to_path, btn_class: nil)
127 128
    return unless current_user

129 130 131 132
    if show_modal_condition
      link_to('Revert', '#modal-revert-commit',
        'data-target' => '#modal-revert-commit',
        'data-toggle' => 'modal',
133
        class: "btn btn-close btn-#{btn_class}",
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
        title: 'Create merge request to revert commit'
      )
    else
      continue_params = {
        to: continue_to_path,
        notice: edit_in_new_fork_notice + ' Try to revert this commit again.',
        notice_now: edit_in_new_fork_notice_now
      }
      fork_path = namespace_project_forks_path(@project.namespace, @project,
                    namespace_key: current_user.namespace.id,
                    continue: continue_params
                  )

      link_to 'Revert', fork_path, class: 'btn btn-grouped btn-close', method: :post,
        title: 'Create merge request to revert commit'
    end
150 151
  end

152 153 154 155 156 157 158 159 160 161 162
  protected

  # Private: Returns a link to a person. If the person has a matching user and
  # is a member of the current @project it will link to the team member page.
  # Otherwise it will link to the person email as specified in the commit.
  #
  # options:
  #  source: one of :author or :committer
  #  avatar: true will prepend the avatar image
  #  size:   size of the avatar image in px
  def commit_person_link(commit, options = {})
163
    user = commit.send(options[:source])
164

165 166
    source_name = clean(commit.send "#{options[:source]}_name".to_sym)
    source_email = clean(commit.send "#{options[:source]}_email".to_sym)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
167

168 169
    person_name = user.try(:name) || source_name
    person_email = user.try(:email) || source_email
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
170

171 172 173 174 175 176 177
    text =
      if options[:avatar]
        avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "")
        %Q{#{avatar} <span class="commit-#{options[:source]}-name">#{person_name}</span>}
      else
        person_name
      end
178

179 180
    options = {
      class: "commit-#{options[:source]}-link has_tooltip",
181
      data: { 'original-title'.to_sym => sanitize(source_email) }
182 183
    }

184
    if user.nil?
185
      mail_to(source_email, text.html_safe, options)
186
    else
187
      link_to(text.html_safe, user_path(user), options)
188 189
    end
  end
190

skv's avatar
skv committed
191
  def view_file_btn(commit_sha, diff, project)
Vinnie Okada's avatar
Vinnie Okada committed
192 193 194
    link_to(
      namespace_project_blob_path(project.namespace, project,
                                  tree_join(commit_sha, diff.new_path)),
Douwe Maan's avatar
Douwe Maan committed
195
      class: 'btn view-file js-view-file'
Vinnie Okada's avatar
Vinnie Okada committed
196
    ) do
skv's avatar
skv committed
197 198 199 200
      raw('View file @') + content_tag(:span, commit_sha[0..6],
                                       class: 'commit-short-id')
    end
  end
201 202 203 204

  def truncate_sha(sha)
    Commit.truncate_sha(sha)
  end
205 206 207 208

  def clean(string)
    Sanitize.clean(string, remove_contents: true)
  end
gitlabhq's avatar
gitlabhq committed
209
end