# encoding: utf-8 #-- # Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #++ module EventRenderingHelper def render_event_create_project(event) action = action_for_event(:event_status_created) do link_to h(event.target.title), project_path(event.target) end body = truncate(event.target.stripped_description, :length => 100) category = "project" [action, body, category] end def render_event_delete_project(event) action = action_for_event(:event_status_deleted){ h(event.data) } category = "project" [action, "", category] end def render_event_update_project(event) action = action_for_event(:event_status_updated) do link_to h(event.target.title), project_path(event.target) end category = "project" [action, "", category] end def render_event_update_repository(event) action = action_for_event(:event_updated_repository) do link_to(h(event.target.url_path), repo_owner_path(event.target, :project_repository_path, event.target.project, event.target)) end category = 'repository' [action, event.body, category] end def render_event_clone_repository(event) original_repo = Repository.find_by_id(event.data.to_i) return ["", "", ""] if original_repo.nil? project = event.target.project action = action_for_event(:event_status_cloned) do link_to(h(original_repo.url_path), repo_owner_path(original_repo, [project, original_repo])) end body = "New repository is in " + link_to(h(event.target.name), repo_owner_path(event.target, [project, event.target])) category = "repository" [action, body, category] end def render_event_delete_repository(event) action = action_for_event(:event_status_deleted) do link_to(h(event.target.title), event.target) + "/" + h(event.data) end category = "project" [action, "", category] end def render_event_commit(event) project = event.project repo = event.target case repo.kind when Repository::KIND_WIKI action = action_for_event(:event_status_push_wiki) do "to " + link_to(h(project.slug), project_path(project)) + "/" + link_to(h(t("views.layout.pages")), project_pages_url(project)) end body = h(truncate(event.body, :length => 150)) category = "wiki" when 'commit' action = action_for_event(:event_status_committed) do link_to(event.data[0,8], project_repository_commit_path(project, repo, event.data)) + " to " + link_to(h(project.slug), project) end body = link_to(h(truncate(event.body, :length => 150)), project_repository_commit_path(project, repo, event.data)) category = "commit" else action = action_for_event(:event_status_committed) do link_to(h(event.data[0,8]), repo_owner_path(repo, :project_repository_commit_path, project, repo, event.data)) + " to " + link_to(h(project.slug), project) end body = link_to(h(truncate(event.body, :length => 150)), project_repository_commit_path(project, repo, event.data)) category = "commit" end [action, body, category] end def render_event_create_branch(event) project = event.target.project if event.data == "master" action = action_for_event(:event_status_started) do "of " + link_to(h(project.slug), project_path(project)) + "/" + link_to(h(event.target.name), project_repository_url(project, event.target)) end body = h(event.body) else action = action_for_event(:event_branch_created) do link_to(h(event.data), repo_owner_path(event.target, :project_repository_commits_in_ref_path, project, event.target, ensplat_path(event.data))) + " on " + link_to(h(project.slug), project_path(project)) + "/" + link_to(h(event.target.name), repo_owner_path(event.target, :project_repository_url, project, event.target)) end end category = "commit" [action, "", category] end def render_event_delete_branch(event) project = event.target.project action = action_for_event(:event_branch_deleted) do h(event.data) + " on " + link_to(h(project.slug), project_path(project)) + "/" + link_to(h(event.target.name), repo_owner_path(event.target, :project_repository_url, project, event.target)) end category = "commit" [action, "", category] end def render_event_create_tag(event) project = event.target.project action = action_for_event(:event_tagged) do link_to(h(project.slug), project_path(project)) + "/" + link_to(h(event.target.name), project_repository_url(project, event.target)) end body = link_to(h(event.data) + ": " + h(event.body), repo_owner_path(event.target, :project_repository_commits_in_ref_path, project, event.target, ensplat_path(event.data))) category = "commit" [action, body, category] end def render_event_delete_tag(event) action = action_for_event(:event_tag_deleted) do h(event.data) + " on " + link_to(h(event.project.slug), project_path(event.project)) + "/" + link_to(h(event.target.name), @template.project_repository_url(event.project, event.target)) end category = "commit" [action, "", category] end def render_event_add_committer(event) repo = event.target.is_a?(Repository) ? event.target : event.target.repository action = action_for_event(:event_committer_added, :collaborator => h(event.data)) do " to " + link_to(repo_title(repo, event.project), repo_owner_path(repo, [repo.project, repo])) end category = "repository" [action, "", category] end def render_event_remove_committer(event) repo = event.target action = action_for_event(:event_committer_removed, :collaborator => h(event.data)) do " from " + link_to(repo_title(repo, event.project), repo_owner_path(repo, [repo.project, repo])) end category = "repository" [action, "", category] end def render_event_comment(event) comment = Comment.find(event.data) if event.body == "MergeRequest" repo = event.target.target_repository project = repo.project else project = event.target.project repo = event.target end if comment.applies_to_merge_request? || MergeRequestVersion === comment.target if event.body == "MergeRequest" action = action_for_event(:event_commented) do " on merge request " + link_to(h(repo.url_path) + " " + h("##{event.target.to_param}"), repo_owner_path(repo, :project_repository_merge_request_path, project, repo, event.target)+"##{dom_id(comment)}") end else action = action_for_event(:event_commented) do " on " + link_to(h(repo.url_path), repo_owner_path(repo, [project, repo])) end end else if comment.sha1.blank? # old-world repo comments action = action_for_event(:event_commented) do " on " + link_to(h(repo.url_path), repo_owner_path(repo, :project_repository_comments_path, project, repo) + "##{dom_id(comment)}") end else action = action_for_event(:event_commented) do " on " + link_to(h(repo.url_path + '/' + comment.sha1[0,7]), repo_owner_path(repo, :project_repository_commit_path, project, repo, comment.sha1)+"##{dom_id(comment)}") end end end body = truncate(h(comment.body), :length => 150) category = "comment" [action, body, category] end def render_event_request_merge(event) source_repository = event.target.source_repository project = source_repository.project target_repository = event.target.target_repository action = action_for_event(:event_requested_merge_of) do link_to(repo_title(source_repository, project), repo_owner_path(source_repository, [project, source_repository])) + " with " + link_to(h(target_repository.name), repo_owner_path(target_repository, [project, target_repository])) end body = link_to truncate(h(event.target.proposal), :length => 100), [project, target_repository, event.target] category = "merge_request" [action, body, category] end def render_event_resolve_merge_request(event) source_repository = event.target.source_repository project = source_repository.project target_repository = event.target.target_repository action = action_for_event(:event_resolved_merge_request) do "as " + "#{event.target.status_string} from " + link_to(repo_title(source_repository, project), repo_owner_path(source_repository, [project, source_repository])) end body = link_to truncate(h(event.target.proposal), :length => 100), [project, target_repository, event.target] category = "merge_request" [action, body, category] end def render_event_update_merge_request(event) source_repository = event.target.source_repository project = source_repository.project target_repository = event.target.target_repository action = action_for_event(:event_updated_merge_request) do link_to(h(target_repository.url_path) + " " + h("##{event.target.to_param}"), repo_owner_path(target_repository, :project_repository_merge_request_path, project, target_repository, event.target)) + "
→ " + sanitize(event.data.to_s) + "
" end body = truncate(h(event.body), :length => 100) category = "merge_request" [action, body, category] end def render_event_reopen_merge_request(event) source_repository = event.target.source_repository project = source_repository.project target_repository = event.target.target_repository action = action_for_event(:event_reopened_merge_request) do "in " + link_to(h(project.title), project_path(project)) + "/" + link_to(h(source_repository.name), project_repository_url(project, source_repository)) end body = link_to(truncate(h(event.target.proposal), :length => 100), [project, target_repository, event.target]) category = "merge_request" [action, body, category] end def render_event_delete_merge_request(event) project = event.target.project action = action_for_event(:event_deleted_merge_request) do "from " + link_to(h(project.slug), project_path(project)) + "/" + link_to(h(target.name), project_repository_url(project, event.target)) end category = "merge_request" [action, "", category] end def render_event_edit_wiki_page(event) project = event.target action = action_for_event(:event_updated_wiki_page) do link_to(h(project.slug), project_path(project)) + "/" + link_to(h(event.data), project_page_path(project, event.data)) end category = "wiki" [action, "", category] end def render_event_push(event) event.single_commit? ? render_single_commit_push(event) : render_several_commit_push(event) end def render_single_commit_push(event) project = event.target.project commit = event.events.first repo = event.target commit_link = link_to(commit.data[0,8], project_repository_commit_path(project, repo, commit.data) ) repo_link = link_to("#{repo_title(repo, project)}:#{event.data}", [project, repo]) action = action_for_event(:event_pushed_n, :commit_link => commit_link) do "to #{repo_link}" end [action,"","push"] end def render_several_commit_push(event) project = event.target.project commit_link = link_to_if(event.has_commits?, pluralize(event.events.size, 'commit')+'', repo_owner_path(event.target, :project_repository_commits_in_ref_path, project, event.target, ensplat_path(event.data)), :id => "commits_in_event_#{event.to_param}_toggler", :class => "commit_event_toggler", "gts:url" => commits_event_path(event.to_param), "gts:id" => event.to_param) action = action_for_event(:event_pushed_n, :commit_link => commit_link) do title = repo_title(event.target, project) " to " + link_to(h(title+':'+event.data), repo_owner_path(event.target, :project_repository_commits_in_ref_path, project, event.target, ensplat_path(event.data))) end body = h(event.body) category = 'push' [action, body, category] end # Push events need to include information about their commits # - either a container for their commits (for Ajax loading) # - or the single commit included def render_commit_details_for_push_event(event) if event.single_commit? commit = event.events.first icon = avatar_from_email(commit.email, :size => 16) if commit.user actor = link_to(h(commit.actor_display), commit.user) else actor = h(commit.actor_display) end meta = content_tag(:span, %Q{#{actor} } + %Q{on #{commit.created_at.to_s(:long)}}) message = content_tag(:div, [icon, meta].join("\n")) commit_msg = link_to(simple_format(h(commit.body)), repo_owner_path(commit.target.target.target, :project_repository_commit_path, commit.project, commit.target.target.target, commit.data)) body = content_tag(:div, commit_msg, :class => "commit_message") content_tag(:div, [message, body].join("\n"), :class => "event_instance") else img = image_tag("spinner.gif") content_tag(:div, img, :id => "commits_in_event_#{event.to_param}", :style => "display: none") end end def render_event_add_project_repository(event) action = action_for_event(:event_status_add_project_repository) do link_to(h(event.target.name), project_repository_path(event.project, event.target)) + " in " + link_to(h(event.project.title), project_path(event.project)) end body = truncate(sanitize(event.target.description, :tags => %w[a em i strong b]), :length => 100) category = "repository" [action, body, category] end def render_event_add_favorite(event) favorite_class = event.body.constantize repo = favorite_class.find(event.data) action = action_for_event(:event_added_favorite) do link_to_watchable(repo) end body = event.body category = "favorite" [action, "", category] end protected def action_for_event(i18n_key, opts = {}, &block) header = "" + I18n.t("application_helper.#{i18n_key}", opts) + " " header + capture(&block) end def repo_title(repo, project) if repo.project_repo? h(File.join(project.to_param_with_prefix, repo.name)) else h(File.join(repo.owner.to_param_with_prefix, project.slug, repo.name)) end end end