Class: RepositoriesController

Inherits:
ApplicationController show all
Defined in:
app/controllers/repositories_controller.rb

Instance Method Summary collapse

Methods inherited from ApplicationController

#_include_layout?, accept_api_auth, #accept_api_auth?, accept_rss_auth, #accept_rss_auth?, #api_key_from_request, #api_offset_and_limit, #api_request?, #api_switch_user_from_request, #authorize, #authorize_global, #autologin_cookie_name, #back_url, #check_if_login_required, #check_password_change, #check_project_privacy, #deny_access, #filename_for_content_disposition, #find_attachments, #find_current_user, #find_issue, #find_issues, #find_model_object, #find_optional_project, #find_project, #find_project_by_project_id, #find_project_from_association, #force_logout_if_password_changed, #handle_unverified_request, #logged_user=, #logout_user, #missing_template, model_object, #parse_qvalues, #per_page_option, #query_statement_invalid, #redirect_back_or_default, #redirect_to_referer_or, #render_403, #render_404, #render_api_head, #render_api_ok, #render_attachment_warning_if_needed, #render_error, #render_feed, #render_validation_errors, #require_admin, #require_admin_or_api_request, #require_login, #session_expiration, #session_expired?, #set_localization, #start_user_session, #try_to_autologin, #use_layout, #user_setup, #verify_authenticity_token

Methods included from Redmine::MenuManager::MenuController

#current_menu_item, included, #menu_items, #redirect_to_project_menu_item

Methods included from Redmine::Search::Controller

#default_search_scope, #default_search_scopes, included

Methods included from RoutesHelper

#_new_time_entry_path, #_project_calendar_path, #_project_gantt_path, #_project_issues_path, #_report_time_entries_path, #_time_entries_path

Methods included from Redmine::Pagination

#deprecated_paginate, #paginate, #paginator

Methods included from Redmine::I18n

#current_language, #day_letter, #day_name, #find_language, #format_date, #format_time, included, #l, #l_hours, #l_or_humanize, #languages_options, #ll, #month_name, #set_language_if_valid, #valid_languages

Instance Method Details

Adds a related issue to a changeset POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues


231
232
233
234
235
236
237
238
239
240
241
# File 'app/controllers/repositories_controller.rb', line 231

def add_related_issue
  issue_id = params[:issue_id].to_s.sub(/^#/,'')
  @issue = @changeset.find_referenced_issue_by_id(issue_id)
  if @issue && (!@issue.visible? || @changeset.issues.include?(@issue))
    @issue = nil
  end

  if @issue
    @changeset.issues << @issue
  end
end

#annotateObject


204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'app/controllers/repositories_controller.rb', line 204

def annotate
  @entry = @repository.entry(@path, @rev)
  (show_error_not_found; return) unless @entry

  @annotate = @repository.scm.annotate(@path, @rev)
  if @annotate.nil? || @annotate.empty?
    (render_error l(:error_scm_annotate); return)
  end
  ann_buf_size = 0
  @annotate.lines.each do |buf|
    ann_buf_size += buf.size
  end
  if ann_buf_size > Setting.file_max_size_displayed.to_i.kilobyte
    (render_error l(:error_scm_annotate_big_text_file); return)
  end
  @changeset = @repository.find_changeset_by_name(@rev)
end

#changesObject


131
132
133
134
135
136
137
# File 'app/controllers/repositories_controller.rb', line 131

def changes
  @entry = @repository.entry(@path, @rev)
  (show_error_not_found; return) unless @entry
  @changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
  @properties = @repository.properties(@path, @rev)
  @changeset = @repository.find_changeset_by_name(@rev)
end

#committersObject


93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/controllers/repositories_controller.rb', line 93

def committers
  @committers = @repository.committers
  @users = @project.users
  additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id)
  @users += User.where(:id => additional_user_ids).to_a unless additional_user_ids.empty?
  @users.compact!
  @users.sort!
  if request.post? && params[:committers].is_a?(Hash)
    # Build a hash with repository usernames as keys and corresponding user ids as values
    @repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h}
    flash[:notice] = l(:notice_successful_update)
    redirect_to settings_project_path(@project, :tab => 'repositories')
  end
end

#createObject


47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/controllers/repositories_controller.rb', line 47

def create
  attrs = pickup_extra_info
  @repository = Repository.factory(params[:repository_scm])
  @repository.safe_attributes = params[:repository]
  if attrs[:attrs_extra].keys.any?
    @repository.merge_extra_info(attrs[:attrs_extra])
  end
  @repository.project = @project
  if request.post? && @repository.save
    redirect_to settings_project_path(@project, :tab => 'repositories')
  else
    render :action => 'new'
  end
end

#destroyObject


108
109
110
111
# File 'app/controllers/repositories_controller.rb', line 108

def destroy
  @repository.destroy if request.delete?
  redirect_to settings_project_path(@project, :tab => 'repositories')
end

#diffObject


252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# File 'app/controllers/repositories_controller.rb', line 252

def diff
  if params[:format] == 'diff'
    @diff = @repository.diff(@path, @rev, @rev_to)
    (show_error_not_found; return) unless @diff
    filename = "changeset_r#{@rev}"
    filename << "_r#{@rev_to}" if @rev_to
    send_data @diff.join, :filename => "#{filename}.diff",
                          :type => 'text/x-patch',
                          :disposition => 'attachment'
  else
    @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
    @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)

    # Save diff type as user preference
    if User.current.logged? && @diff_type != User.current.pref[:diff_type]
      User.current.pref[:diff_type] = @diff_type
      User.current.preference.save
    end
    @cache_key = "repositories/diff/#{@repository.id}/" +
                    Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}")
    unless read_fragment(@cache_key)
      @diff = @repository.diff(@path, @rev, @rev_to)
      show_error_not_found unless @diff
    end

    @changeset = @repository.find_changeset_by_name(@rev)
    @changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil
    @diff_format_revisions = @repository.diff_format_revisions(@changeset, @changeset_to)
  end
end

#editObject


62
63
# File 'app/controllers/repositories_controller.rb', line 62

def edit
end

#entryObject


160
161
162
# File 'app/controllers/repositories_controller.rb', line 160

def entry
  entry_and_raw(false)
end

#graphObject


286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'app/controllers/repositories_controller.rb', line 286

def graph
  data = nil
  case params[:graph]
  when "commits_per_month"
    data = graph_commits_per_month(@repository)
  when "commits_per_author"
    data = graph_commits_per_author(@repository)
  end
  if data
    headers["Content-Type"] = "image/svg+xml"
    send_data(data, :type => "image/svg+xml", :disposition => "inline")
  else
    render_404
  end
end

#newObject


40
41
42
43
44
45
# File 'app/controllers/repositories_controller.rb', line 40

def new
  scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first
  @repository = Repository.factory(scm)
  @repository.is_default = @project.repository.nil?
  @repository.project = @project
end

#rawObject


156
157
158
# File 'app/controllers/repositories_controller.rb', line 156

def raw
  entry_and_raw(true)
end

Removes a related issue from a changeset DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id


245
246
247
248
249
250
# File 'app/controllers/repositories_controller.rb', line 245

def remove_related_issue
  @issue = Issue.visible.find_by_id(params[:issue_id])
  if @issue
    @changeset.issues.delete(@issue)
  end
end

#revisionObject


222
223
224
225
226
227
# File 'app/controllers/repositories_controller.rb', line 222

def revision
  respond_to do |format|
    format.html
    format.js {render :layout => false}
  end
end

#revisionsObject


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'app/controllers/repositories_controller.rb', line 139

def revisions
  @changeset_count = @repository.changesets.count
  @changeset_pages = Paginator.new @changeset_count,
                                   per_page_option,
                                   params['page']
  @changesets = @repository.changesets.
    limit(@changeset_pages.per_page).
    offset(@changeset_pages.offset).
    includes(:user, :repository, :parents).
    to_a

  respond_to do |format|
    format.html { render :layout => false if request.xhr? }
    format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") }
  end
end

#showObject Also known as: browse


113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'app/controllers/repositories_controller.rb', line 113

def show
  @repository.fetch_changesets if @project.active? && Setting.autofetch_changesets? && @path.empty?

  @entries = @repository.entries(@path, @rev)
  @changeset = @repository.find_changeset_by_name(@rev)
  if request.xhr?
    @entries ? render(:partial => 'dir_list_content') : render(:nothing => true)
  else
    (show_error_not_found; return) unless @entries
    @changesets = @repository.latest_changesets(@path, @rev)
    @properties = @repository.properties(@path, @rev)
    @repositories = @project.repositories
    render :action => 'show'
  end
end

#statsObject


283
284
# File 'app/controllers/repositories_controller.rb', line 283

def stats
end

#updateObject


65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/controllers/repositories_controller.rb', line 65

def update
  attrs = pickup_extra_info
  @repository.safe_attributes = attrs[:attrs]
  if attrs[:attrs_extra].keys.any?
    @repository.merge_extra_info(attrs[:attrs_extra])
  end
  @repository.project = @project
  if @repository.save
    redirect_to settings_project_path(@project, :tab => 'repositories')
  else
    render :action => 'edit'
  end
end