diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index b0108d5318..3274b942ac 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -100,6 +100,11 @@ class RepositoriesController < ApplicationController alias_method :browse, :show + def fetch_changesets + @repository.fetch_changesets if @project.active? && @path.empty? && !Setting.autofetch_changesets? + show + end + def changes @entry = @repository.entry(@path, @rev) (show_error_not_found; return) unless @entry diff --git a/app/views/repositories/_navigation.html.erb b/app/views/repositories/_navigation.html.erb index 730cec42f1..275b8d4cc3 100644 --- a/app/views/repositories/_navigation.html.erb +++ b/app/views/repositories/_navigation.html.erb @@ -19,6 +19,9 @@ <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project, :tab => 'repositories'}, :class => 'icon icon-settings' if User.current.allowed_to?(:manage_repository, @project) %> + <%= link_to l(:label_fetch_changesets), + {:action => :fetch_changesets, :id => @project, :repository_id => @repository.identifier_param}, + :class => 'icon icon-reload', :method => :post if User.current.allowed_to?(:manage_repository, @project) && !Setting.autofetch_changesets? %> <% end %> <%= form_tag({:action => controller.action_name, diff --git a/config/locales/en.yml b/config/locales/en.yml index 142afa001c..2db3b427b2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -803,6 +803,7 @@ en: label_repository: Repository label_repository_new: New repository label_repository_plural: Repositories + label_fetch_changesets: Fetch changesets label_browse: Browse label_branch: Branch label_tag: Tag diff --git a/config/routes.rb b/config/routes.rb index acc3ca4651..8e091e8874 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -265,6 +265,7 @@ Rails.application.routes.draw do # repositories routes get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats' get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph' + post 'projects/:id/repository/:repository_id/fetch_changesets', :to => 'repositories#fetch_changesets' get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision' get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision' diff --git a/lib/redmine.rb b/lib/redmine.rb index 409da528a5..f0157e8cf1 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -178,7 +178,7 @@ Redmine::AccessControl.map do |map| map.permission :browse_repository, {:repositories => [:show, :browse, :entry, :raw, :annotate, :changes, :diff, :stats, :graph]}, :read => true map.permission :commit_access, {} map.permission :manage_related_issues, {:repositories => [:add_related_issue, :remove_related_issue]} - map.permission :manage_repository, {:projects => :settings, :repositories => [:new, :create, :edit, :update, :committers, :destroy]}, :require => :member + map.permission :manage_repository, {:projects => :settings, :repositories => [:new, :create, :edit, :update, :committers, :destroy, :fetch_changesets]}, :require => :member end map.project_module :boards do |map| diff --git a/test/functional/repositories_controller_test.rb b/test/functional/repositories_controller_test.rb index 0668cea43a..64613767b4 100644 --- a/test/functional/repositories_controller_test.rb +++ b/test/functional/repositories_controller_test.rb @@ -205,6 +205,23 @@ class RepositoriesControllerTest < Redmine::RepositoryControllerTest end end + def test_fetch_changesets_with_autofetch_changesets_disabled_and_manage_repository_permission_should_fetch_changesets + @request.session[:user_id] = 2 + role = Role.find(1) + + with_settings :autofetch_changesets => '0' do + role.add_permission! :manage_repository + Repository::Subversion.any_instance.expects(:fetch_changesets).once + post(:fetch_changesets, :params => {:id => 1, :repository_id => 10}) + assert_response :success + + role.remove_permission! :manage_repository + Repository::Subversion.any_instance.expects(:fetch_changesets).never + post(:fetch_changesets, :params => {:id => 1, :repository_id => 10}) + assert_response :forbidden + end + end + def test_revisions get( :revisions, diff --git a/test/integration/routing/repositories_test.rb b/test/integration/routing/repositories_test.rb index 74ecf4c1b6..6a9ffc84e8 100644 --- a/test/integration/routing/repositories_test.rb +++ b/test/integration/routing/repositories_test.rb @@ -70,6 +70,10 @@ class RoutingRepositoriesTest < Redmine::RoutingTest end end + def test_repositories_fetch_changesets_with_repository_id + should_route 'POST /projects/foo/repository/bar/fetch_changesets' => 'repositories#fetch_changesets', :id => 'foo', :repository_id => 'bar' + end + def test_repositories_non_revisions_path_with_repository_id should_route 'GET /projects/foo/repository/svn/changes' => 'repositories#changes', :id => 'foo', :repository_id => 'svn', :format => 'html'