commits_helper.rb 5.57 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 112 113 114 115 116
        return link_to(
          "Browse Dir »",
          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 120 121 122 123
    link_to(
      "Browse Code »",
      namespace_project_tree_path(project.namespace, project, commit),
      class: "pull-right"
    )
124 125
  end

126 127 128 129 130 131 132 133 134 135 136
  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 = {})
137
    user = commit.send(options[:source])
138

139 140
    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
141

142 143
    person_name = user.try(:name) || source_name
    person_email = user.try(:email) || source_email
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
144

145 146 147 148 149 150 151
    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
152

153 154 155 156 157
    options = {
      class: "commit-#{options[:source]}-link has_tooltip",
      data: { :'original-title' => sanitize(source_email) }
    }

158
    if user.nil?
159
      mail_to(source_email, text.html_safe, options)
160
    else
161
      link_to(text.html_safe, user_path(user), options)
162 163
    end
  end
164

skv's avatar
skv committed
165
  def view_file_btn(commit_sha, diff, project)
Vinnie Okada's avatar
Vinnie Okada committed
166 167 168 169 170
    link_to(
      namespace_project_blob_path(project.namespace, project,
                                  tree_join(commit_sha, diff.new_path)),
      class: 'btn btn-small view-file js-view-file'
    ) do
skv's avatar
skv committed
171 172 173 174
      raw('View file @') + content_tag(:span, commit_sha[0..6],
                                       class: 'commit-short-id')
    end
  end
175 176 177 178

  def truncate_sha(sha)
    Commit.truncate_sha(sha)
  end
179 180 181 182

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