Project

General

Profile

Defect #5548 » patch.diff

test case and fix - Gregor Schmidt, 2010-06-20 15:14

View differences:

lib/redmine/scm/adapters/subversion_adapter.rb
47 47
        
48 48
        # Get info about the svn repository
49 49
        def info
50
          cmd = "#{SVN_BIN} info --xml #{target('')}"
50
          cmd = "#{SVN_BIN} info --xml #{target}"
51 51
          cmd << credentials_string
52 52
          info = nil
53 53
          shellout(cmd) do |io|
......
77 77
          path ||= ''
78 78
          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
79 79
          entries = Entries.new
80
          cmd = "#{SVN_BIN} list --xml #{target(URI.escape(path))}@#{identifier}"
80
          cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}"
81 81
          cmd << credentials_string
82 82
          shellout(cmd) do |io|
83 83
            output = io.read
......
116 116
          return nil unless self.class.client_version_above?([1, 5, 0])
117 117
          
118 118
          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
119
          cmd = "#{SVN_BIN} proplist --verbose --xml #{target(URI.escape(path))}@#{identifier}"
119
          cmd = "#{SVN_BIN} proplist --verbose --xml #{target(path)}@#{identifier}"
120 120
          cmd << credentials_string
121 121
          properties = {}
122 122
          shellout(cmd) do |io|
......
142 142
          cmd << credentials_string
143 143
          cmd << " --verbose " if  options[:with_paths]
144 144
          cmd << " --limit #{options[:limit].to_i}" if options[:limit]
145
          cmd << ' ' + target(URI.escape(path))
145
          cmd << ' ' + target(path)
146 146
          shellout(cmd) do |io|
147 147
            output = io.read
148 148
            begin
......
180 180
          cmd = "#{SVN_BIN} diff -r "
181 181
          cmd << "#{identifier_to}:"
182 182
          cmd << "#{identifier_from}"
183
          cmd << " #{target(URI.escape(path))}@#{identifier_from}"
183
          cmd << " #{target(path)}@#{identifier_from}"
184 184
          cmd << credentials_string
185 185
          diff = []
186 186
          shellout(cmd) do |io|
......
194 194
        
195 195
        def cat(path, identifier=nil)
196 196
          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
197
          cmd = "#{SVN_BIN} cat #{target(URI.escape(path))}@#{identifier}"
197
          cmd = "#{SVN_BIN} cat #{target(path)}@#{identifier}"
198 198
          cmd << credentials_string
199 199
          cat = nil
200 200
          shellout(cmd) do |io|
......
207 207
        
208 208
        def annotate(path, identifier=nil)
209 209
          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
210
          cmd = "#{SVN_BIN} blame #{target(URI.escape(path))}@#{identifier}"
210
          cmd = "#{SVN_BIN} blame #{target(path)}@#{identifier}"
211 211
          cmd << credentials_string
212 212
          blame = Annotate.new
213 213
          shellout(cmd) do |io|
......
243 243
            end
244 244
          end
245 245
        end
246

  
247
        def target(path = '')
248
          base = path.match(/^\//) ? root_url : url
249
          uri = "#{base}/#{path}"
250
          uri = URI.escape(URI.escape(uri), '[]')
251
          shell_quote(uri.gsub(/[?<>\*]/, ''))
252
        end
246 253
      end
247 254
    end
248 255
  end
test/unit/repository_subversion_test.rb
18 18
require File.dirname(__FILE__) + '/../test_helper'
19 19

  
20 20
class RepositorySubversionTest < ActiveSupport::TestCase
21
  fixtures :projects
21
  fixtures :projects, :repositories
22 22
  
23 23
  def setup
24 24
    @project = Project.find(1)
......
30 30
      @repository.fetch_changesets
31 31
      @repository.reload
32 32
      
33
      assert_equal 10, @repository.changesets.count
34
      assert_equal 18, @repository.changes.count
33
      assert_equal 11, @repository.changesets.count
34
      assert_equal 20, @repository.changes.count
35 35
      assert_equal 'Initial import.', @repository.changesets.find_by_revision('1').comments
36 36
    end
37 37
    
......
43 43
      assert_equal 5, @repository.changesets.count
44 44
      
45 45
      @repository.fetch_changesets
46
      assert_equal 10, @repository.changesets.count
46
      assert_equal 11, @repository.changesets.count
47 47
    end
48 48
    
49 49
    def test_latest_changesets
......
62 62
      changesets = @repository.latest_changesets('subversion_test/folder', 8)
63 63
      assert_equal ["7", "6", "5", "2"], changesets.collect(&:revision)
64 64
    end
65

  
66
    def test_directory_listing_with_square_brackets_in_path
67
      @repository.fetch_changesets
68
      @repository.reload
69
      
70
      entries = @repository.entries('subversion_test/[folder_with_brackets]')
71
      assert_not_nil entries, 'Expect to find entries in folder_with_brackets'
72
      assert_equal 1, entries.size, 'Expect one entry in folder_with_brackets'
73
      assert_equal 'README.txt', entries.first.name
74
    end
75

  
76
    def test_directory_listing_with_square_brackets_in_base
77
      @project = Project.find(1)
78
      @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}/subversion_test/[folder_with_brackets]")
79

  
80
      @repository.fetch_changesets
81
      @repository.reload
82

  
83
      assert_equal 1, @repository.changesets.count, 'Expected to see 1 revision'
84
      assert_equal 2, @repository.changes.count, 'Expected to see 2 changes, dir add and file add'
85

  
86
      entries = @repository.entries('')
87
      assert_not_nil entries, 'Expect to find entries'
88
      assert_equal 1, entries.size, 'Expect a single entry'
89
      assert_equal 'README.txt', entries.first.name
90
    end
65 91
  else
66 92
    puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
67 93
    def test_fake; assert true end
(1-1/5)