From 93c2aebb614340d6b2607545378569c5c5d967ef Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 9 Mar 2008 10:00:51 +0000 Subject: [PATCH] Make Darcs adapter work with stringified revisions (test added). git-svn-id: http://redmine.rubyforge.org/svn/branches/work@1213 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- git/app/models/repository/darcs.rb | 9 +- git/lib/redmine/scm/adapters/darcs_adapter.rb | 8 +- .../repositories/darcs_repository.tar.gz | Bin 0 -> 8075 bytes .../repositories_darcs_controller_test.rb | 94 ++++++++++++++++++ git/test/unit/repository_darcs_test.rb | 55 ++++++++++ 5 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 git/test/fixtures/repositories/darcs_repository.tar.gz create mode 100644 git/test/functional/repositories_darcs_controller_test.rb create mode 100644 git/test/unit/repository_darcs_test.rb diff --git a/git/app/models/repository/darcs.rb b/git/app/models/repository/darcs.rb index 48cc246fb..cc608d370 100644 --- a/git/app/models/repository/darcs.rb +++ b/git/app/models/repository/darcs.rb @@ -47,18 +47,19 @@ class Repository::Darcs < Repository def diff(path, rev, rev_to, type) patch_from = changesets.find_by_revision(rev) + return nil if patch_from.nil? patch_to = changesets.find_by_revision(rev_to) if rev_to if path.blank? path = patch_from.changes.collect{|change| change.path}.join(' ') end - scm.diff(path, patch_from.scmid, patch_to.scmid, type) + patch_from ? scm.diff(path, patch_from.scmid, patch_to ? patch_to.scmid : nil, type) : nil end def fetch_changesets scm_info = scm.info if scm_info db_last_id = latest_changeset ? latest_changeset.scmid : nil - next_rev = latest_changeset ? latest_changeset.revision + 1 : 1 + next_rev = latest_changeset ? latest_changeset.revision.to_i + 1 : 1 # latest revision in the repository scm_revision = scm_info.lastrev.scmid unless changesets.find_by_scmid(scm_revision) @@ -71,9 +72,7 @@ class Repository::Darcs < Repository :committer => revision.author, :committed_on => revision.time, :comments => revision.message) - - next if changeset.new_record? - + revision.paths.each do |change| Change.create(:changeset => changeset, :action => change[:action], diff --git a/git/lib/redmine/scm/adapters/darcs_adapter.rb b/git/lib/redmine/scm/adapters/darcs_adapter.rb index 2955b26dc..cd8610121 100644 --- a/git/lib/redmine/scm/adapters/darcs_adapter.rb +++ b/git/lib/redmine/scm/adapters/darcs_adapter.rb @@ -102,8 +102,12 @@ module Redmine def diff(path, identifier_from, identifier_to=nil, type="inline") path = '*' if path.blank? cmd = "#{DARCS_BIN} diff --repodir #{@url}" - cmd << " --to-match \"hash #{identifier_from}\"" - cmd << " --from-match \"hash #{identifier_to}\"" if identifier_to + if identifier_to.nil? + cmd << " --match \"hash #{identifier_from}\"" + else + cmd << " --to-match \"hash #{identifier_from}\"" + cmd << " --from-match \"hash #{identifier_to}\"" + end cmd << " -u #{path}" diff = [] shellout(cmd) do |io| diff --git a/git/test/fixtures/repositories/darcs_repository.tar.gz b/git/test/fixtures/repositories/darcs_repository.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba4d8d04c466eab54f26fa7fffd2927a44b15fb1 GIT binary patch literal 8075 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 Z3=9km3=9km42-`w{{;gOQ;h(i006{M#a;ja literal 0 HcmV?d00001 diff --git a/git/test/functional/repositories_darcs_controller_test.rb b/git/test/functional/repositories_darcs_controller_test.rb new file mode 100644 index 000000000..fc77b8747 --- /dev/null +++ b/git/test/functional/repositories_darcs_controller_test.rb @@ -0,0 +1,94 @@ +# redMine - project management software +# Copyright (C) 2006-2008 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.dirname(__FILE__) + '/../test_helper' +require 'repositories_controller' + +# Re-raise errors caught by the controller. +class RepositoriesController; def rescue_action(e) raise e end; end + +class RepositoriesDarcsControllerTest < Test::Unit::TestCase + fixtures :projects, :users, :roles, :members, :repositories, :enabled_modules + + # No '..' in the repository path + REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository' + + def setup + @controller = RepositoriesController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + User.current = nil + Repository::Darcs.create(:project => Project.find(3), :url => REPOSITORY_PATH) + end + + if File.directory?(REPOSITORY_PATH) + def test_show + get :show, :id => 3 + assert_response :success + assert_template 'show' + assert_not_nil assigns(:entries) + assert_not_nil assigns(:changesets) + end + + def test_browse_root + get :browse, :id => 3 + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entries) + assert_equal 3, assigns(:entries).size + assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} + assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} + assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} + end + + def test_browse_directory + get :browse, :id => 3, :path => ['images'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entries) + assert_equal 2, assigns(:entries).size + entry = assigns(:entries).detect {|e| e.name == 'edit.png'} + assert_not_nil entry + assert_equal 'file', entry.kind + assert_equal 'images/edit.png', entry.path + end + + def test_changes + get :changes, :id => 3, :path => ['images', 'edit.png'] + assert_response :success + assert_template 'changes' + assert_tag :tag => 'h2', :content => 'edit.png' + end + + def test_diff + Project.find(3).repository.fetch_changesets + # Full diff of changeset 5 + get :diff, :id => 3, :rev => 5 + assert_response :success + assert_template 'diff' + # Line 22 removed + assert_tag :tag => 'th', + :content => /22/, + :sibling => { :tag => 'td', + :attributes => { :class => /diff_out/ }, + :content => /def remove/ } + end + else + puts "Darcs test repository NOT FOUND. Skipping functional tests !!!" + def test_fake; assert true end + end +end diff --git a/git/test/unit/repository_darcs_test.rb b/git/test/unit/repository_darcs_test.rb new file mode 100644 index 000000000..1228976f1 --- /dev/null +++ b/git/test/unit/repository_darcs_test.rb @@ -0,0 +1,55 @@ +# redMine - project management software +# Copyright (C) 2006-2008 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.dirname(__FILE__) + '/../test_helper' + +class RepositoryDarcsTest < Test::Unit::TestCase + fixtures :projects + + # No '..' in the repository path + REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository' + + def setup + @project = Project.find(1) + assert @repository = Repository::Darcs.create(:project => @project, :url => REPOSITORY_PATH) + end + + if File.directory?(REPOSITORY_PATH) + def test_fetch_changesets_from_scratch + @repository.fetch_changesets + @repository.reload + + assert_equal 6, @repository.changesets.count + assert_equal 13, @repository.changes.count + assert_equal "Initial commit.", @repository.changesets.find_by_revision(1).comments + end + + def test_fetch_changesets_incremental + @repository.fetch_changesets + # Remove changesets with revision > 3 + @repository.changesets.find(:all, :conditions => 'revision > 3').each(&:destroy) + @repository.reload + assert_equal 3, @repository.changesets.count + + @repository.fetch_changesets + assert_equal 6, @repository.changesets.count + end + else + puts "Darcs test repository NOT FOUND. Skipping unit tests !!!" + def test_fake; assert true end + end +end