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?
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
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
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)
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)
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
})
--- /dev/null
+# 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
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
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
# 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
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
# 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
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
# 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
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