Defect #5548 » patch.diff
| 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 |