require "my-assertions"
require "util"
require "svn/core"
require "svn/wc"
class SvnWcTest < Test::Unit::TestCase
include SvnTestUtil
def setup
setup_basic
end
def teardown
teardown_basic
end
def test_version
assert_equal(Svn::Core.subr_version, Svn::Wc.version)
end
def test_status
file1 = "a"
file1_path = File.join(@wc_path, file1)
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 0) do |adm|
status = adm.status(file1_path)
assert_equal(Svn::Wc::STATUS_NONE, status.text_status)
assert_nil(status.entry)
end
non_exist_child_path = File.join(@wc_path, "NOT-EXIST")
assert_nothing_raised do
Svn::Wc::AdmAccess.probe_open(nil, non_exist_child_path, false, 0){}
end
FileUtils.touch(file1_path)
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 0) do |adm|
status = adm.status(file1_path)
assert_equal(Svn::Wc::STATUS_UNVERSIONED, status.text_status)
assert_nil(status.entry)
end
log = "sample log"
ctx = make_context(log)
ctx.add(file1_path)
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 0) do |adm|
status = adm.status(file1_path)
assert_equal(Svn::Wc::STATUS_ADDED, status.text_status)
end
commit_info = ctx.commit(@wc_path)
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 0) do |adm|
status = adm.status(file1_path)
assert_equal(Svn::Wc::STATUS_NORMAL, status.text_status)
assert_equal(commit_info.revision, status.entry.revision)
end
end
def test_wc
assert_not_equal(0, Svn::Wc.check_wc(@wc_path))
assert(Svn::Wc.normal_prop?("name"))
assert(Svn::Wc.wc_prop?("#{Svn::Core::PROP_WC_PREFIX}name"))
assert(Svn::Wc.entry_prop?("#{Svn::Core::PROP_ENTRY_PREFIX}name"))
end
def test_adm_access
log = "sample log"
source = "sample source"
dir = "dir"
file = "file"
prop_name = "name"
prop_value = "value"
dir_path = File.join(@wc_path, dir)
path = File.join(dir_path, file)
ctx = make_context(log)
ctx.mkdir(dir_path)
File.open(path, "w") {|f| f.print(source)}
ctx.add(path)
rev = ctx.ci(@wc_path).revision
result = Svn::Wc::AdmAccess.open_anchor(path, true, 5)
anchor_access, target_access, target = result
assert_equal(file, target)
assert_equal(dir_path, anchor_access.path)
assert_equal(dir_path, target_access.path)
assert(anchor_access.locked?)
assert(target_access.locked?)
assert(!target_access.has_binary_prop?(path))
assert(!target_access.text_modified?(path))
assert(!target_access.props_modified?(path))
File.open(path, "w") {|f| f.print(source * 2)}
target_access.set_prop(prop_name, prop_value, path)
assert_equal(prop_value, target_access.prop(prop_name, path))
assert_equal({prop_name => prop_value},
target_access.prop_list(path))
assert(target_access.text_modified?(path))
assert(target_access.props_modified?(path))
target_access.set_prop("name", nil, path)
assert(!target_access.props_modified?(path))
target_access.revert(path)
assert(!target_access.text_modified?(path))
assert(!target_access.props_modified?(path))
anchor_access.close
target_access.close
access = Svn::Wc::AdmAccess.probe_open(nil, path, false, 5)
assert(!Svn::Wc.default_ignores({}).empty?)
assert_equal(Svn::Wc.default_ignores({}), access.ignores({}))
assert(access.wc_root?(@wc_path))
access = Svn::Wc::AdmAccess.probe_open(nil, @wc_path, false, 5)
assert_equal(@wc_path, access.path)
assert_equal(dir_path, access.retrieve(dir_path).path)
assert_equal(dir_path, access.probe_retrieve(dir_path).path)
assert_equal(dir_path, access.probe_try(dir_path, false, 5).path)
Svn::Wc::AdmAccess.probe_open(nil, @wc_path, false, 5) do |access|
assert(!access.locked?)
end
Svn::Wc::AdmAccess.probe_open(nil, @wc_path, true, 5) do |access|
assert(access.locked?)
end
end
def test_traversal_info
info = Svn::Wc::TraversalInfo.new
assert_equal([{}, {}], info.edited_externals)
end
def test_externals
dir = "dir"
url = "http://svn.example.com/trunk"
description = "#{dir} #{url}"
items = Svn::Wc.parse_externals_description(@wc_path, description)
assert_equal([[dir, url]],
items.collect {|item| [item.target_dir, item.url]})
end
def test_notify
path = @wc_path
action = Svn::Wc::NOTIFY_SKIP
notify = Svn::Wc::Notify.new(path, action)
assert_equal(path, notify.path)
assert_equal(action, notify.action)
notify2 = notify.dup
assert_equal(path, notify2.path)
assert_equal(action, notify2.action)
end
def test_entry
log = "sample log"
source1 = "source"
source2 = "SOURCE"
source3 = "SHOYU"
file = "file"
path = File.join(@wc_path, file)
ctx = make_context(log)
File.open(path, "w") {|f| f.print(source1)}
ctx.add(path)
rev1 = ctx.ci(@wc_path).revision
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 5) do |access|
show = true
entry = Svn::Wc::Entry.new(path, access, show)
assert_equal(file, entry.name)
assert_equal(file, entry.dup.name)
entries = access.read_entries
assert_equal(["", file].sort, entries.keys.sort)
entry = entries[file]
assert_equal(file, entry.name)
assert(!entry.conflicted?(@wc_path))
end
File.open(path, "w") {|f| f.print(source2)}
rev2 = ctx.ci(@wc_path).revision
ctx.up(@wc_path, rev1)
File.open(path, "w") {|f| f.print(source3)}
ctx.up(@wc_path, rev2)
Svn::Wc::AdmAccess.open(nil, @wc_path, true, 5) do |access|
entry = access.read_entries[file]
assert(entry.conflicted?(@wc_path))
assert(entry.text_conflicted?(@wc_path))
assert(!entry.prop_conflicted?(@wc_path))
access.resolved_conflict(path)
assert(!entry.conflicted?(@wc_path))
access.process_committed(@wc_path, rev2 + 1)
end
end
def test_ancestry
file1 = "file1"
file2 = "file2"
path1 = File.join(@wc_path, file1)
path2 = File.join(@wc_path, file2)
log = "sample log"
ctx = make_context(log)
FileUtils.touch(path1)
ctx.add(path1)
rev1 = ctx.ci(@wc_path).revision
ctx.cp(path1, path2)
rev2 = ctx.ci(@wc_path).revision
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 5) do |access|
assert_equal(["#{@repos_uri}/#{file2}", rev2],
access.ancestry(path2))
result = []
callbacks = Proc.new do |path, entry|
result << [path, entry]
end
def callbacks.found_entry(path, entry)
call(path, entry)
end
access.walk_entries(@wc_path, callbacks)
assert_equal([@wc_path, path1, path2].sort,
result.collect{|path, entry| path}.sort)
entry = result.assoc(path2)[1]
assert_equal(file2, entry.name)
end
Svn::Wc::AdmAccess.open(nil, @wc_path, true, 5) do |access|
assert_raises(Svn::Error::WC_PATH_FOUND) do
access.mark_missing_deleted(path1)
end
FileUtils.rm(path1)
access.mark_missing_deleted(path1)
access.maybe_set_repos_root(path2, @repos_uri)
end
Svn::Wc.ensure_adm(@wc_path, nil, @repos_uri, nil, 0)
end
def test_merge
left = <<-EOL
a
b
c
d
e
EOL
right = <<-EOR
A
b
c
d
E
EOR
merge_target = <<-EOM
a
b
C
d
e
EOM
expect = <<-EOE
A
b
C
d
E
EOE
left_label = "left"
right_label = "right"
merge_target_label = "merge_target"
left_file = "left"
right_file = "right"
merge_target_file = "merge_target"
left_path = File.join(@wc_path, left_file)
right_path = File.join(@wc_path, right_file)
merge_target_path = File.join(@wc_path, merge_target_file)
log = "sample log"
ctx = make_context(log)
File.open(left_path, "w") {|f| f.print(left)}
File.open(right_path, "w") {|f| f.print(right)}
File.open(merge_target_path, "w") {|f| f.print(merge_target)}
ctx.add(left_path)
ctx.add(right_path)
ctx.add(merge_target_path)
ctx.ci(@wc_path)
Svn::Wc::AdmAccess.open(nil, @wc_path, true, 5) do |access|
assert_equal(Svn::Wc::MERGE_MERGED,
access.merge(left_path, right_path, merge_target_path,
left_label, right_label, merge_target_label))
assert_equal(expect, File.read(merge_target_path))
end
end
def test_status
source = "source"
file1 = "file1"
file2 = "file2"
file3 = "file3"
file4 = "file4"
file5 = "file5"
path1 = File.join(@wc_path, file1)
path2 = File.join(@wc_path, file2)
path3 = File.join(@wc_path, file3)
path4 = File.join(@wc_path, file4)
path5 = File.join(@wc_path, file5)
log = "sample log"
ctx = make_context(log)
File.open(path1, "w") {|f| f.print(source)}
ctx.add(path1)
rev1 = ctx.ci(@wc_path).revision
ctx.cp(path1, path2)
rev2 = ctx.ci(@wc_path).revision
FileUtils.rm(path1)
Svn::Wc::AdmAccess.open(nil, @wc_path, false, 5) do |access|
status = access.status(path1)
assert_equal(Svn::Wc::STATUS_MISSING, status.text_status)
assert_equal(Svn::Wc::STATUS_MISSING, status.dup.text_status)
end
ctx.revert(path1)
Svn::Wc::AdmAccess.open(nil, @wc_path, true, 5) do |access|
access.copy(path1, file3)
assert(File.exist?(path3))
access.delete(path1)
assert(!File.exist?(path1))
FileUtils.touch(path4)
access.add(path4)
assert(File.exist?(path4))
access.add_repos_file2(path5, path2, {})
assert_equal(source, File.open(path5) {|f| f.read})
status = access.status(path2)
assert_equal(Svn::Wc::STATUS_MISSING, status.text_status)
access.remove_from_revision_control(file2)
status = access.status(path2)
assert_equal(Svn::Wc::STATUS_NONE, status.text_status)
end
end
def test_locked
log = "sample log"
assert(!Svn::Wc.locked?(@wc_path))
ctx = make_context(log)
gc_disable do
assert_raise(Svn::Error::FS_NO_SUCH_REVISION) do
ctx.update(@wc_path, youngest_rev + 1)
end
assert(Svn::Wc.locked?(@wc_path))
end
gc_enable do
GC.start
assert(!Svn::Wc.locked?(@wc_path))
end
gc_disable do
assert_raise(Svn::Error::FS_NO_SUCH_REVISION) do
ctx.update(@wc_path, youngest_rev + 1)
end
assert(Svn::Wc.locked?(@wc_path))
ctx.cleanup(@wc_path)
assert(!Svn::Wc.locked?(@wc_path))
end
end
def test_translated_file
src_file = "src"
crlf_file = "crlf"
cr_file = "cr"
lf_file = "lf"
src_path = File.join(@wc_path, src_file)
crlf_path = File.join(@wc_path, crlf_file)
cr_path = File.join(@wc_path, cr_file)
lf_path = File.join(@wc_path, lf_file)
source = "a\n"
crlf_source = source.gsub(/\n/, "\r\n")
cr_source = source.gsub(/\n/, "\r")
lf_source = source.gsub(/\n/, "\n")
File.open(crlf_path, "w") {}
File.open(cr_path, "w") {}
File.open(lf_path, "w") {}
log = "log"
ctx = make_context(log)
ctx.add(crlf_path)
ctx.add(cr_path)
ctx.add(lf_path)
ctx.prop_set("svn:eol-style", "CRLF", crlf_path)
ctx.prop_set("svn:eol-style", "CR", cr_path)
ctx.prop_set("svn:eol-style", "LF", lf_path)
ctx.ci(crlf_path)
ctx.ci(cr_path)
ctx.ci(lf_path)
Svn::Wc::AdmAccess.open(nil, @wc_path, true, 5) do |access|
File.open(src_path, "wb") {|f| f.print(source)}
translated_file = access.translated_file(src_path, lf_path,
Svn::Wc::TRANSLATE_TO_NF)
File.open(src_path, "wb") {|f| f.print(File.read(translated_file))}
translated_file = access.translated_file(src_path, crlf_path,
Svn::Wc::TRANSLATE_FROM_NF)
assert_equal(crlf_source, File.read(translated_file))
translated_file = access.translated_file(src_path, cr_path,
Svn::Wc::TRANSLATE_FROM_NF)
assert_equal(cr_source, File.read(translated_file))
translated_file = access.translated_file(src_path, lf_path,
Svn::Wc::TRANSLATE_FROM_NF)
assert_equal(lf_source, File.read(translated_file))
end
end
def test_revision_status
log = "log"
file = "file"
path = File.join(@wc_path, file)
File.open(path, "w") {|f| f.print("a")}
ctx = make_context(log)
ctx.add(path)
ctx.ci(path)
File.open(path, "w") {|f| f.print("b")}
ctx.ci(path)
File.open(path, "w") {|f| f.print("c")}
rev = ctx.ci(path).revision
status = Svn::Wc::RevisionStatus.new(path, nil, true)
assert_equal(rev, status.min_rev)
assert_equal(rev, status.max_rev)
end
end
syntax highlighted by Code2HTML, v. 0.9.1