Blob of app/helpers/application_helper.rb (raw blob data)

1 # Methods added to this helper will be available to all templates in the application.
2 module ApplicationHelper
3 include TagsHelper
4
5 def feed_icon(url, alt_title = "Atom feed", size = :small)
6 link_to image_tag("feed_12.png", :class => "feed_icon"), url,
7 :alt => alt_title, :title => alt_title
8 end
9
10 def default_css_tag_sizes
11 %w(tag_size_1 tag_size_2 tag_size_3 tag_size_4)
12 end
13
14 def linked_tag_list_as_sentence(tags)
15 tags.map do |tag|
16 link_to(h(tag.name), search_path(:q => "category:#{h(tag.name)}"))
17 end.to_sentence
18 end
19
20 def build_notice_for(object)
21 out = %Q{<div class="being_constructed">}
22 out << %Q{ <p>This #{object.class.name.humanize.downcase} is being created,<br />}
23 out << %Q{ it will be ready pretty soon&hellip;</p>}
24 out << %Q{</div>}
25 out
26 end
27
28 def render_if_ready(object, &blk)
29 if object.respond_to?(:ready?) && object.ready?
30 yield
31 else
32 concat(build_notice_for(object), blk.binding)
33 end
34 end
35
36 def selected_if_current_page(url_options, slack = false)
37 if slack
38 if controller.request.request_uri.index(CGI.escapeHTML(url_for(url_options))) == 0
39 "selected"
40 end
41 else
42 "selected" if current_page?(url_options)
43 end
44 end
45
46 def submenu_selected_class_if_current?(section)
47 case section
48 when :overview
49 if %w[projects].include?(controller.controller_name )
50 return "selected"
51 end
52 when :repositories
53 if %w[repositories trees logs commits comitters comments merge_requests
54 blobs committers].include?(controller.controller_name )
55 return "selected"
56 end
57 end
58 end
59
60 def link_to_with_selected(name, options = {}, html_options = nil)
61 html_options = current_page?(options) ? {:class => "selected"} : nil
62 link_to(name, options = {}, html_options)
63 end
64
65 def syntax_themes_css
66 out = []
67 if @load_syntax_themes
68 # %w[ active4d all_hallows_eve amy blackboard brilliance_black brilliance_dull
69 # cobalt dawn eiffel espresso_libre idle iplastic lazy mac_classic
70 # magicwb_amiga pastels_on_dark slush_poppies spacecadet sunburst
71 # twilight zenburnesque
72 # ].each do |syntax|
73 # out << stylesheet_link_tag("syntax_themes/#{syntax}")
74 # end
75 return stylesheet_link_tag("syntax_themes/idle")
76 end
77 out.join("\n")
78 end
79
80 def base_url(full_url)
81 URI.parse(full_url).host
82 end
83
84 def gravatar_url_for(email, options = {})
85 "http://www.gravatar.com/avatar.php?gravatar_id=" <<
86 Digest::MD5.hexdigest(email) <<
87 "&amp;default=" <<
88 u("http://#{request.host}:#{request.port}/images/default_face.gif") <<
89 options.map { |k,v| "&amp;#{k}=#{v}" }.join
90 end
91
92 def gravatar(email, options = {})
93 size = options[:size]
94 image_options = { :alt => "avatar" }
95 if size
96 image_options.merge!(:width => size, :height => size)
97 end
98 image_tag(gravatar_url_for(email, options), image_options)
99 end
100
101 def gravatar_frame(email, options = {})
102 extra_css_class = options[:style] ? " gravatar_#{options[:style]}" : ""
103 %{<div class="gravatar#{extra_css_class}">#{gravatar(email, options)}</div>}
104 end
105
106 def flashes
107 flash.map { |type, content| content_tag(:div, content_tag(:p, content), :class => "flash_message #{type}")}
108 end
109
110 def commit_graph_tag(repository, ref = "master")
111 filename = Gitorious::Graphs::CommitsBuilder.filename(repository, ref)
112 if File.exist?(File.join(Gitorious::Graphs::Builder.graph_dir, filename))
113 image_tag("graphs/#{filename}")
114 end
115 end
116
117 def commit_graph_by_author_tag(repository, ref = "master")
118 filename = Gitorious::Graphs::CommitsByAuthorBuilder.filename(repository, ref)
119 if File.exist?(File.join(Gitorious::Graphs::Builder.graph_dir, filename))
120 image_tag("graphs/#{filename}")
121 end
122 end
123
124 def action_and_body_for_event(event)
125 target = event.target
126 action = ""
127 body = ""
128 category = ""
129 case event.action
130 when Action::CREATE_PROJECT
131 action = "<strong>created project</strong> #{link_to h(target.title), project_path(target)}"
132 body = truncate(target.stripped_description, 100)
133 category = "project"
134 when Action::DELETE_PROJECT
135 action = "<strong>deleted project</strong> #{h(event.data)}"
136 category = "project"
137 when Action::UPDATE_PROJECT
138 action = "<strong>updated project</strong> #{link_to h(target.title), project_path(target)}"
139 category = "project"
140 when Action::CLONE_REPOSITORY
141 original_repo = Repository.find_by_id(event.data.to_i)
142 next if original_repo.nil?
143
144 project = target.project
145
146 action = "<strong>cloned</strong> #{link_to h(project.slug), project_path(project)}/#{link_to h(original_repo.name), project_repository_url(project, original_repo)} in #{link_to h(target.name), project_repository_url(project, target)}"
147 category = "repository"
148 when Action::DELETE_REPOSITORY
149 action = "<strong>deleted repository</strong> #{link_to h(target.title), project_path(target)}/#{event.data}"
150 category = "project"
151 when Action::COMMIT
152 project = event.project
153 action = "<strong>committed</strong> #{link_to event.data[0,8], project_repository_commit_path(project, target, event.data)} to #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
154 body = link_to(h(truncate(event.body, 150)), project_repository_commit_path(project, target, event.data))
155 category = "commit"
156 when Action::CREATE_BRANCH
157 project = target.project
158 if event.data == "master"
159 action = "<strong>started development</strong> of #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
160 body = event.body
161 else
162 action = "<strong>created branch</strong> #{link_to h(event.data), project_repository_tree_path(project, target, event.data)} on #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
163 end
164 category = "commit"
165 when Action::DELETE_BRANCH
166 project = target.project
167 action = "<strong>deleted branch</strong> #{event.data} on #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
168 category = "commit"
169 when Action::CREATE_TAG
170 project = target.project
171 action = "<strong>tagged</strong> #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
172 body = "#{link_to event.data, project_repository_commit_path(project, target, event.data)}<br/>#{event.body}"
173 category = "commit"
174 when Action::DELETE_TAG
175 project = target.project
176 action = "<strong>deleted tag</strong> #{event.data} on #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
177 category = "commit"
178 when Action::ADD_COMMITTER
179 user = target.user
180 repo = target.repository
181 action = "<strong>added committer</strong> #{link_to user.login, user_path(user)} to #{link_to h(repo.project.slug), project_path(repo.project)}/#{link_to h(repo.name), project_repository_url(repo.project, repo)}"
182 category = "repository"
183 when Action::REMOVE_COMMITTER
184 user = User.find_by_id(event.data.to_i)
185 next unless user
186
187 project = target.project
188 action = "<strong>removed committer</strong> #{link_to user.login, user_path(user)} from #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
189 category = "repository"
190 when Action::COMMENT
191 project = target.project
192 repo = target.repository
193
194 action = "<strong>commented</strong> on #{link_to h(project.slug), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
195 body = truncate(h(target.body), 150)
196 category = "comment"
197 when Action::REQUEST_MERGE
198 source_repository = target.source_repository
199 project = source_repository.project
200 target_repository = target.target_repository
201
202 action = "<strong>requested a merge of</strong> #{link_to h(project.slug), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)} with #{link_to h(project.slug), project_path(project)}/#{link_to h(target_repository.name)}"
203 body = "#{link_to truncate(h(target.proposal), 100), [project, target_repository, target]}"
204 category = "merge_request"
205 when Action::RESOLVE_MERGE_REQUEST
206 source_repository = target.source_repository
207 project = source_repository.project
208 target_repository = target.target_repository
209
210 action = "<strong>resolved merge request</strong> as [#{target.status_string}] from #{link_to h(project.slug), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)}"
211 body = "#{link_to truncate(h(target.proposal), 100), [project, target_repository, target]}"
212 category = "merge_request"
213 when Action::UPDATE_MERGE_REQUEST
214 source_repository = target.source_repository
215 project = source_repository.project
216 target_repository = target.target_repository
217
218 action = "<strong>updated merge request</strong> from #{link_to h(project.title), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)}"
219 category = "merge_request"
220 when Action::DELETE_MERGE_REQUEST
221 project = target.project
222
223 action = "<strong>deleted merge request</strong> from #{link_to h(project.slug), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
224 category = "merge_request"
225 end
226
227 [action, body, category]
228 end
229
230 def sidebar_content?
231 !@content_for_sidebar.blank?
232 end
233
234 def render_readme(repository)
235 possibilities = []
236 repository.git.git.ls_tree({:name_only => true}, "master").each do |line|
237 possibilities << line[0, line.length-1] if line =~ /README.*/
238 end
239
240 return "" if possibilities.empty?
241 text = repository.git.git.show({}, "master:#{possibilities.first}")
242 markdown(text) rescue simple_format(sanitize(text))
243 end
244
245 def file_path(repository, filename, head = "master")
246 project_repository_blob_path(repository.project, repository, head, filename)
247 end
248 end