]> source.dussan.org Git - redmine.git/commitdiff
Fix repository browsing at given revision for various scm and add tests for this.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 Apr 2008 10:35:55 +0000 (10:35 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 Apr 2008 10:35:55 +0000 (10:35 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1329 e93f8b46-1217-0410-a6f0-8f06a7374b81

12 files changed:
app/controllers/repositories_controller.rb
app/models/repository/cvs.rb
app/models/repository/darcs.rb
lib/redmine/scm/adapters/cvs_adapter.rb
lib/redmine/scm/adapters/darcs_adapter.rb
lib/redmine/scm/adapters/git_adapter.rb
test/functional/repositories_bazaar_controller_test.rb [new file with mode: 0644]
test/functional/repositories_cvs_controller_test.rb
test/functional/repositories_darcs_controller_test.rb
test/functional/repositories_git_controller_test.rb
test/functional/repositories_mercurial_controller_test.rb
test/functional/repositories_subversion_controller_test.rb

index 9b59b51ec1eeb26383d81a24ab0fb0fa89fcdec1..79fb49c860a6f044f294b61c4899ab10f58c68bd 100644 (file)
@@ -51,8 +51,8 @@ class RepositoriesController < ApplicationController
   def show
     # check if new revisions have been committed in the repository
     @repository.fetch_changesets if Setting.autofetch_changesets?
-    # get entries for the browse frame
-    @entries = @repository.entries('')    
+    # root entries
+    @entries = @repository.entries('', @rev)    
     # latest changesets
     @changesets = @repository.changesets.find(:all, :limit => 10, :order => "committed_on DESC")
     show_error_not_found unless @entries || @changesets.any?
index a78b60806a4e58af40da82a6714032a82ad58274..7c01a27ee34d52c7ac51e9776da3ee40f7861440 100644 (file)
@@ -35,7 +35,8 @@ class Repository::Cvs < Repository
   end
   
   def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
+    rev = identifier.nil? ? nil : changesets.find_by_revision(identifier)
+    entries = scm.entries(path, rev.nil? ? nil : rev.committed_on)
     if entries
       entries.each() do |entry|
         unless entry.lastrev.nil? || entry.lastrev.identifier
index cc608d3701e6c24ccd0a845c77a48909565ba434..c7c14a397934053be491e43e502d301769fe462f 100644 (file)
@@ -29,7 +29,8 @@ class Repository::Darcs < Repository
   end
   
   def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
+    patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
+    entries = scm.entries(path, patch.nil? ? nil : patch.scmid)
     if entries
       entries.each do |entry|
         # Search the DB for the entry's last change
index c0f60c02aaa88ad3a7efd00e9a8cb3f2fd7ba265..6085bfdbe3a8461194b662fda538c5fb5d0165bf 100644 (file)
@@ -72,7 +72,9 @@ module Redmine
           logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'"
           path_with_project="#{url}#{with_leading_slash(path)}"
           entries = Entries.new
-          cmd = "#{CVS_BIN} -d #{root_url} rls -ed #{path_with_project}"
+          cmd = "#{CVS_BIN} -d #{root_url} rls -ed"
+          cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
+          cmd << " #{path_with_project}"
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)
index cd8610121629ddabdd285265048327238da5954c..660b6cf8f979057a5e25fa89a0ee037b02548bad 100644 (file)
@@ -53,7 +53,9 @@ module Redmine
           path_prefix = (path.blank? ? '' : "#{path}/")
           path = '.' if path.blank?
           entries = Entries.new          
-          cmd = "#{DARCS_BIN} annotate --repodir #{@url} --xml-output #{path}"
+          cmd = "#{DARCS_BIN} annotate --repodir #{@url} --xml-output"
+          cmd << " --match \"hash #{identifier}\"" if identifier
+          cmd << " #{path}"
           shellout(cmd) do |io|
             begin
               doc = REXML::Document.new(io)
index f1d076360fed39671ba8fa850e25ed4534cfe5b9..5d315b0cc2486b6d03cdfefb9d753eff3eae7f12 100644 (file)
@@ -79,7 +79,7 @@ module Redmine
             rev = Revision.new({:identifier => changeset[:commit],
                                 :scmid => changeset[:commit],
                                 :author => changeset[:author],
-                                :time => Time.parse(changeset[:date]),
+                                :time => (changeset[:date] ? Time.parse(changeset[:date]) : nil),
                                 :message => changeset[:description],
                                 :paths => files
                                })
diff --git a/test/functional/repositories_bazaar_controller_test.rb b/test/functional/repositories_bazaar_controller_test.rb
new file mode 100644 (file)
index 0000000..5a473ba
--- /dev/null
@@ -0,0 +1,129 @@
+# 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 RepositoriesBazaarControllerTest < 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/bazaar_repository'
+
+  def setup
+    @controller = RepositoriesController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+    User.current = nil
+    Repository::Bazaar.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 2, assigns(:entries).size
+      assert assigns(:entries).detect {|e| e.name == 'directory' && e.kind == 'dir'}
+      assert assigns(:entries).detect {|e| e.name == 'doc-mkdir.txt' && e.kind == 'file'}
+    end
+    
+    def test_browse_directory
+      get :browse, :id => 3, :path => ['directory']
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['doc-ls.txt', 'document.txt', 'edit.png'], assigns(:entries).collect(&:name)
+      entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
+      assert_not_nil entry
+      assert_equal 'file', entry.kind
+      assert_equal 'directory/edit.png', entry.path
+    end
+    
+    def test_browse_at_given_revision
+      get :browse, :id => 3, :path => [], :rev => 3
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['directory', 'doc-deleted.txt', 'doc-ls.txt', 'doc-mkdir.txt'], assigns(:entries).collect(&:name)
+    end
+    
+    def test_changes
+      get :changes, :id => 3, :path => ['doc-mkdir.txt']
+      assert_response :success
+      assert_template 'changes'
+      assert_tag :tag => 'h2', :content => 'doc-mkdir.txt'
+    end
+    
+    def test_entry_show
+      get :entry, :id => 3, :path => ['directory', 'doc-ls.txt']
+      assert_response :success
+      assert_template 'entry'
+      # Line 19
+      assert_tag :tag => 'th',
+                 :content => /29/,
+                 :attributes => { :class => /line-num/ },
+                 :sibling => { :tag => 'td', :content => /Show help message/ }
+    end
+    
+    def test_entry_download
+      get :entry, :id => 3, :path => ['directory', 'doc-ls.txt'], :format => 'raw'
+      assert_response :success
+      # File content
+      assert @response.body.include?('Show help message')
+    end
+  
+    def test_diff
+      # Full diff of changeset 3
+      get :diff, :id => 3, :rev => 3
+      assert_response :success
+      assert_template 'diff'
+      # Line 22 removed
+      assert_tag :tag => 'th',
+                 :content => /2/,
+                 :sibling => { :tag => 'td', 
+                               :attributes => { :class => /diff_in/ },
+                               :content => /Main purpose/ }
+    end
+    
+    def test_annotate
+      get :annotate, :id => 3, :path => ['doc-mkdir.txt']
+      assert_response :success
+      assert_template 'annotate'
+      # Line 2, revision 3
+      assert_tag :tag => 'th', :content => /2/,
+                 :sibling => { :tag => 'td', :child => { :tag => 'a', :content => /3/ } },
+                 :sibling => { :tag => 'td', :content => /jsmith/ },
+                 :sibling => { :tag => 'td', :content => /Main purpose/ }
+    end
+  else
+    puts "Bazaar test repository NOT FOUND. Skipping functional tests !!!"
+    def test_fake; assert true end
+  end
+end
index 1e101f59abf724a19e076c3e1ea05aefae92f7c7..d6181ad36c0f483b4dfd6949511d4905291c3dc2 100644 (file)
@@ -65,13 +65,24 @@ class RepositoriesCvsControllerTest < Test::Unit::TestCase
     end
     
     def test_browse_directory
-      get :browse, :id => 1, :path => ['sources']
+      get :browse, :id => 1, :path => ['images']
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      entry = assigns(:entries).detect {|e| e.name == 'watchers_controller.rb'}
+      assert_equal ['add.png', 'delete.png', 'edit.png'], assigns(:entries).collect(&:name)
+      entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
+      assert_not_nil entry
       assert_equal 'file', entry.kind
-      assert_equal 'sources/watchers_controller.rb', entry.path
+      assert_equal 'images/edit.png', entry.path
+    end
+    
+    def test_browse_at_given_revision
+      Project.find(1).repository.fetch_changesets
+      get :browse, :id => 1, :path => ['images'], :rev => 1
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
     end
   
     def test_entry
index fc77b8747f7c798f2755c19413fad807a9c4cc7e..43c715924307da12f70f747daf894a66a511e6a4 100644 (file)
@@ -60,13 +60,22 @@ class RepositoriesDarcsControllerTest < Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
       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_browse_at_given_revision
+      Project.find(3).repository.fetch_changesets
+      get :browse, :id => 3, :path => ['images'], :rev => 1
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&:name)
+    end
+    
     def test_changes
       get :changes, :id => 3, :path => ['images', 'edit.png']
       assert_response :success
index f8b3cb2bb45d3b262221b098bb5eed90a2911092..10a4950f3abc74939ae6253606058ba8db78c6b0 100644 (file)
@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# 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
@@ -61,13 +61,21 @@ class RepositoriesGitControllerTest < Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
       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_browse_at_given_revision
+      get :browse, :id => 3, :path => ['images'], :rev => '7234cb2750b63f47bff735edc50a1c0a433c2518'
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&:name)
+    end
+
     def test_changes
       get :changes, :id => 3, :path => ['images', 'edit.png']
       assert_response :success
index 736e38c83b1f4ab96431d77164efe170fb614590..b09265d133127d5443cac6f83502bef261e74440 100644 (file)
@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# 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
@@ -60,13 +60,21 @@ class RepositoriesMercurialControllerTest < Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
-      assert_equal 2, assigns(:entries).size
+      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
       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_browse_at_given_revision
+      get :browse, :id => 3, :path => ['images'], :rev => 0
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['delete.png'], assigns(:entries).collect(&:name)
+    end
+    
     def test_changes
       get :changes, :id => 3, :path => ['images', 'edit.png']
       assert_response :success
index 9b21a13e8cb584b8db39931f4eacf97a281faa50..adb69c8e9c41fb88e57965dadee8bbd75d985a9e 100644 (file)
@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# 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
@@ -58,11 +58,20 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase
       assert_response :success
       assert_template 'browse'
       assert_not_nil assigns(:entries)
+      assert_equal ['folder', '.project', 'helloworld.c', 'textfile.txt'], assigns(:entries).collect(&:name)
       entry = assigns(:entries).detect {|e| e.name == 'helloworld.c'}
       assert_equal 'file', entry.kind
       assert_equal 'subversion_test/helloworld.c', entry.path
     end
-  
+
+    def test_browse_at_given_revision
+      get :browse, :id => 1, :path => ['subversion_test'], :rev => 4
+      assert_response :success
+      assert_template 'browse'
+      assert_not_nil assigns(:entries)
+      assert_equal ['folder', '.project', 'helloworld.c', 'helloworld.rb', 'textfile.txt'], assigns(:entries).collect(&:name)
+    end
+      
     def test_entry
       get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c']
       assert_response :success