externals_tests.py [plain text]
import os
import warnings
import svntest
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = svntest.wc.StateItem
def externals_test_setup(sbox):
"""Set up a repository in which some directories have the externals property,
and set up another repository, referred to by some of those externals.
Both repositories contain greek trees with five revisions worth of
random changes, then in the sixth revision the first repository --
and only the first -- has some externals properties set. ### Later,
test putting externals on the second repository. ###
The arrangement of the externals in the first repository is:
/A/B/ ==> ^/A/D/gamma gamma
/A/C/ ==> exdir_G <scheme>:///<other_repos>/A/D/G
../../../<other_repos_basename>/A/D/H@1 exdir_H
/A/D/ ==> ^/../<other_repos_basename>/A exdir_A
//<other_repos>/A/D/G/ exdir_A/G/
exdir_A/H -r 1 <scheme>:///<other_repos>/A/D/H
/<some_paths>/A/B x/y/z/blah
A dictionary is returned keyed by the directory created by the
external whose value is the URL of the external.
"""
sbox.build(create_wc = False)
svntest.main.safe_rmtree(sbox.wc_dir)
wc_init_dir = sbox.add_wc_path('init') repo_dir = sbox.repo_dir
repo_url = sbox.repo_url
other_repo_dir, other_repo_url = sbox.add_repo_path('other')
other_repo_basename = os.path.basename(other_repo_dir)
scheme_relative_other_repo_url = other_repo_url[other_repo_url.find(':')+1:]
server_relative_other_repo_url = other_repo_url
for i in range(3):
j = server_relative_other_repo_url.find('/') + 1
server_relative_other_repo_url = server_relative_other_repo_url[j:]
server_relative_other_repo_url = '/' + server_relative_other_repo_url
mu_path = os.path.join(wc_init_dir, "A/mu")
pi_path = os.path.join(wc_init_dir, "A/D/G/pi")
lambda_path = os.path.join(wc_init_dir, "A/B/lambda")
omega_path = os.path.join(wc_init_dir, "A/D/H/omega")
B_path = os.path.join(wc_init_dir, "A/B")
C_path = os.path.join(wc_init_dir, "A/C")
D_path = os.path.join(wc_init_dir, "A/D")
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_init_dir)
svntest.main.file_append(mu_path, "Added to mu in revision 2.\n")
svntest.actions.run_and_verify_svn(None, None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(pi_path, "Added to pi in revision 3.\n")
svntest.actions.run_and_verify_svn(None, None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(lambda_path, "Added to lambda in revision 4.\n")
svntest.actions.run_and_verify_svn(None, None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.main.file_append(omega_path, "Added to omega in revision 5.\n")
svntest.actions.run_and_verify_svn(None, None, [],
'ci', '-m', 'log msg',
'--quiet', wc_init_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'up', wc_init_dir)
svntest.main.copy_repos(repo_dir, other_repo_dir, 5)
external_url_for = { }
external_url_for["A/B/gamma"] = "^/A/D/gamma"
external_url_for["A/C/exdir_G"] = other_repo_url + "/A/D/G"
external_url_for["A/C/exdir_H"] = "../../../" + \
other_repo_basename + \
"/A/D/H@1"
externals_desc = \
external_url_for["A/B/gamma"] + " gamma\n"
tmp_f = os.tempnam(wc_init_dir, 'tmp')
svntest.main.file_append(tmp_f, externals_desc)
svntest.actions.run_and_verify_svn(None, None, [],
'pset',
'-F', tmp_f, 'svn:externals', B_path)
os.remove(tmp_f)
externals_desc = \
"exdir_G " + external_url_for["A/C/exdir_G"] + "\n" + \
external_url_for["A/C/exdir_H"] + " exdir_H\n"
tmp_f = os.tempnam(wc_init_dir, 'tmp')
svntest.main.file_append(tmp_f, externals_desc)
svntest.actions.run_and_verify_svn(None, None, [],
'pset',
'-F', tmp_f, 'svn:externals', C_path)
os.remove(tmp_f)
external_url_for["A/D/exdir_A"] = "^/../" + other_repo_basename + "/A"
external_url_for["A/D/exdir_A/G/"] = scheme_relative_other_repo_url + \
"/A/D/G/"
external_url_for["A/D/exdir_A/H"] = other_repo_url + "/A/D/H"
external_url_for["A/D/x/y/z/blah"] = server_relative_other_repo_url + "/A/B"
externals_desc = \
external_url_for["A/D/exdir_A"] + " exdir_A" + \
"\n" + \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G/" + \
"\n" + \
"exdir_A/H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
external_url_for["A/D/x/y/z/blah"] + " x/y/z/blah" + \
"\n"
svntest.main.file_append(tmp_f, externals_desc)
svntest.actions.run_and_verify_svn(None, None, [], 'pset',
'-F', tmp_f, 'svn:externals', D_path)
os.remove(tmp_f)
expected_output = svntest.wc.State(wc_init_dir, {
'A/B' : Item(verb='Sending'),
'A/C' : Item(verb='Sending'),
'A/D' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(wc_init_dir, 5)
expected_status.tweak('A/B', 'A/C', 'A/D', wc_rev=6, status=' ')
svntest.actions.run_and_verify_commit(wc_init_dir,
expected_output,
expected_status,
None, wc_init_dir)
return external_url_for
def change_external(path, new_val):
"""Change the value of the externals property on PATH to NEW_VAL,
and commit the change."""
tmp_f = os.tempnam(svntest.main.temp_dir, 'tmp')
svntest.main.file_append(tmp_f, new_val)
svntest.actions.run_and_verify_svn(None, None, [], 'pset',
'-F', tmp_f, 'svn:externals', path)
svntest.actions.run_and_verify_svn(None, None, [], 'ci',
'-m', 'log msg', '--quiet', path)
os.remove(tmp_f)
def probe_paths_exist(paths):
""" Probe each one of PATHS to see if it exists, otherwise throw a
Failure exception. """
for path in paths:
if not os.path.exists(path):
raise svntest.Failure("Probing for " + path + " failed.")
def probe_paths_missing(paths):
""" Probe each one of PATHS to see if does not exist, otherwise throw a
Failure exception. """
for path in paths:
if os.path.exists(path):
raise svntest.Failure(path + " unexpectedly still exists.")
def checkout_with_externals(sbox):
"test checkouts with externals"
externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
expected_existing_paths = [
os.path.join(wc_dir, "A", "B", "gamma"),
os.path.join(wc_dir, "A", "C", "exdir_G"),
os.path.join(wc_dir, "A", "C", "exdir_G", "pi"),
os.path.join(wc_dir, "A", "C", "exdir_H"),
os.path.join(wc_dir, "A", "C", "exdir_H", "omega"),
os.path.join(wc_dir, "A", "D", "x"),
os.path.join(wc_dir, "A", "D", "x", "y"),
os.path.join(wc_dir, "A", "D", "x", "y", "z"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah", "E", "alpha"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah", "E", "beta"),
]
probe_paths_exist(expected_existing_paths)
for path, contents in ((os.path.join(wc_dir, "A", "C", "exdir_H", "omega"),
"This is the file 'omega'.\n"),
(os.path.join(wc_dir, "A", "B", "gamma"),
"This is the file 'gamma'.\n")):
fp = open(path, 'r')
lines = fp.readlines()
if not ((len(lines) == 1) and (lines[0] == contents)):
raise svntest.Failure("Unexpected contents for rev 1 of " + path)
def update_receive_new_external(sbox):
"update to receive a new external module"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
other_wc_dir = sbox.add_wc_path('other')
repo_url = sbox.repo_url
other_repo_url = repo_url + ".other"
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, other_wc_dir)
new_externals_desc = \
external_url_for["A/D/exdir_A"] + " exdir_A" + \
"\n" + \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G/" + \
"\n" + \
"exdir_E " + other_repo_url + "/A/B/E" + \
"\n" + \
"exdir_A/H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
external_url_for["A/D/x/y/z/blah"] + " x/y/z/blah" + \
"\n"
change_external(os.path.join(wc_dir, "A/D"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [], 'up', other_wc_dir)
probe_paths_exist([os.path.join(other_wc_dir, "A", "D", "exdir_E")])
def update_lose_external(sbox):
"update to lose an external module"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
other_wc_dir = sbox.add_wc_path('other')
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, other_wc_dir)
new_externals_desc = \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G" + \
"\n" + \
"exdir_A/H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
external_url_for["A/D/x/y/z/blah"] + " x/y/z/blah" + \
"\n"
change_external(os.path.join(wc_dir, "A/D"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [], 'up', other_wc_dir)
expected_existing_paths = [
os.path.join(other_wc_dir, "A", "D", "exdir_A"),
os.path.join(other_wc_dir, "A", "D", "exdir_A", "G"),
os.path.join(other_wc_dir, "A", "D", "exdir_A", "H"),
]
probe_paths_exist(expected_existing_paths)
expected_missing_paths = [
os.path.join(other_wc_dir, "A", "D", "exdir_A", "mu"),
os.path.join(other_wc_dir, "A", "D", "exdir_A", "B"),
os.path.join(other_wc_dir, "A", "D", "exdir_A", "C"),
os.path.join(other_wc_dir, "A", "D", "exdir_A", "D"),
]
probe_paths_missing(expected_missing_paths)
def update_change_pristine_external(sbox):
"update change to an unmodified external module"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
other_wc_dir = sbox.add_wc_path('other')
repo_url = sbox.repo_url
other_repo_url = repo_url + ".other"
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, other_wc_dir)
new_externals_desc = \
external_url_for["A/D/exdir_A"] + " exdir_A" + \
"\n" + \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G" + \
"\n" + \
"exdir_A/H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
"x/y/z/blah " + other_repo_url + "/A/B/F" + \
"\n"
change_external(os.path.join(wc_dir, "A/D"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [], 'up', other_wc_dir)
xyzb_path = os.path.join(other_wc_dir, "x", "y", "z", "blah")
expected_missing_paths = [
os.path.join(xyzb_path, "alpha"),
os.path.join(xyzb_path, "beta"),
]
probe_paths_missing(expected_missing_paths)
def update_change_modified_external(sbox):
"update changes to a modified external module"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
other_wc_dir = sbox.add_wc_path('other')
repo_url = sbox.repo_url
other_repo_url = repo_url + ".other"
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, other_wc_dir)
alpha_path = os.path.join(other_wc_dir, "A", "D",
"x", "y", "z", "blah", "alpha")
svntest.main.file_append(alpha_path, "Some new text in alpha.\n")
new_file = os.path.join(other_wc_dir, "A", "D",
"x", "y", "z", "blah", "fish.txt")
svntest.main.file_append(new_file, "This is an unversioned file.\n")
new_externals_desc = \
external_url_for["A/D/exdir_A"] + " exdir_A" + \
"\n" + \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G/" + \
"\n" + \
"exdir_A/H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
"x/y/z/blah " + other_repo_url + "/A/B/F" + \
"\n"
change_external(os.path.join(wc_dir, "A/D"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [], 'up', other_wc_dir)
xyzb_path = os.path.join(other_wc_dir, "x", "y", "z", "blah")
expected_missing_paths = [
os.path.join(xyzb_path, "alpha"),
os.path.join(xyzb_path, "beta"),
]
probe_paths_missing(expected_missing_paths)
def update_receive_change_under_external(sbox):
"update changes under an external module"
externals_test_setup(sbox)
wc_dir = sbox.wc_dir
other_wc_dir = sbox.add_wc_path('other')
repo_url = sbox.repo_url
other_repo_url = repo_url + ".other"
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
other_repo_url, other_wc_dir)
other_gamma_path = os.path.join(other_wc_dir, 'A', 'D', 'gamma')
svntest.main.file_append(other_gamma_path, "New text in other gamma.\n")
expected_output = svntest.wc.State(other_wc_dir, {
'A/D/gamma' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(other_wc_dir, 5)
expected_status.tweak('A/D/gamma', wc_rev=6)
svntest.actions.run_and_verify_commit(other_wc_dir,
expected_output,
expected_status,
None, other_wc_dir)
svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
external_gamma_path = os.path.join(wc_dir, 'A', 'D', 'exdir_A', 'D', 'gamma')
fp = open(external_gamma_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 2)
and (lines[0] == "This is the file 'gamma'.\n")
and (lines[1] == "New text in other gamma.\n")):
raise svntest.Failure("Unexpected contents for externally modified " +
external_gamma_path)
fp.close()
other_rho_path = os.path.join(other_wc_dir, 'A', 'D', 'G', 'rho')
svntest.main.file_append(other_rho_path, "New text in other rho.\n")
expected_output = svntest.wc.State(other_wc_dir, {
'A/D/G/rho' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(other_wc_dir, 5)
expected_status.tweak('A/D/gamma', wc_rev=6)
expected_status.tweak('A/D/G/rho', wc_rev=7)
svntest.actions.run_and_verify_commit(other_wc_dir,
expected_output,
expected_status,
None, other_wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'up', os.path.join(wc_dir, "A", "C"))
external_rho_path = os.path.join(wc_dir, 'A', 'C', 'exdir_G', 'rho')
fp = open(external_rho_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 2)
and (lines[0] == "This is the file 'rho'.\n")
and (lines[1] == "New text in other rho.\n")):
raise svntest.Failure("Unexpected contents for externally modified " +
external_rho_path)
fp.close()
def modify_and_update_receive_new_external(sbox):
"commit and update additional externals"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
B_path = os.path.join(wc_dir, "A/B")
externals_desc = \
external_url_for["A/D/exdir_A/G/"] + " exdir_G" + \
"\n" + \
"exdir_H -r 1 " + external_url_for["A/D/exdir_A/H"] + \
"\n" + \
"exdir_Z " + external_url_for["A/D/exdir_A/H"] + \
"\n"
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, externals_desc)
svntest.actions.run_and_verify_svn(None, None, [],
'pset', '-F', tmp_f,
'svn:externals', B_path)
os.remove(tmp_f)
was_cwd = os.getcwd()
os.chdir(B_path)
svntest.actions.run_and_verify_svn("update failed",
svntest.verify.AnyOutput, [], 'up' )
os.chdir(was_cwd)
probe_paths_exist([os.path.join(B_path, "exdir_Z")])
def disallow_dot_or_dotdot_directory_reference(sbox):
"error if external target dir involves '.' or '..'"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
def set_externals_for_path_expect_error(path, val):
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, val)
svntest.actions.run_and_verify_svn(None, None, svntest.verify.AnyOutput,
'pset', '-F', tmp_f,
'svn:externals', path)
os.remove(tmp_f)
B_path = os.path.join(wc_dir, 'A', 'B')
G_path = os.path.join(wc_dir, 'A', 'D', 'G')
H_path = os.path.join(wc_dir, 'A', 'D', 'H')
C_path = os.path.join(wc_dir, 'A', 'C')
F_path = os.path.join(wc_dir, 'A', 'C', 'F')
external_urls = list(external_url_for.values())
externals_value_1 = "../foo" + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_2 = "foo/bar/../baz" + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_3 = "foo/.." + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_4 = "." + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_5 = "./" + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_6 = ".." + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_7 = "././/.///." + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
externals_value_8 = "/foo" + " " + external_urls.pop() + "\n"
if not external_urls: external_urls = list(external_url_for.values())
set_externals_for_path_expect_error(B_path, externals_value_1)
set_externals_for_path_expect_error(G_path, externals_value_2)
set_externals_for_path_expect_error(H_path, externals_value_3)
set_externals_for_path_expect_error(C_path, externals_value_4)
set_externals_for_path_expect_error(F_path, externals_value_5)
set_externals_for_path_expect_error(B_path, externals_value_6)
set_externals_for_path_expect_error(G_path, externals_value_7)
set_externals_for_path_expect_error(H_path, externals_value_8)
def export_with_externals(sbox):
"test exports with externals"
externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'export',
repo_url, wc_dir)
expected_existing_paths = [
os.path.join(wc_dir, "A", "C", "exdir_G"),
os.path.join(wc_dir, "A", "C", "exdir_G", "pi"),
os.path.join(wc_dir, "A", "C", "exdir_H"),
os.path.join(wc_dir, "A", "C", "exdir_H", "omega"),
os.path.join(wc_dir, "A", "D", "x"),
os.path.join(wc_dir, "A", "D", "x", "y"),
os.path.join(wc_dir, "A", "D", "x", "y", "z"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah", "E", "alpha"),
os.path.join(wc_dir, "A", "D", "x", "y", "z", "blah", "E", "beta"),
]
probe_paths_exist(expected_existing_paths)
exdir_G_pi_path = os.path.join(wc_dir, "A", "C", "exdir_G", "pi")
fp = open(exdir_G_pi_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 2) \
and (lines[0] == "This is the file 'pi'.\n") \
and (lines[1] == "Added to pi in revision 3.\n")):
raise svntest.Failure("Unexpected contents for rev 1 of " +
exdir_G_pi_path)
exdir_H_omega_path = os.path.join(wc_dir, "A", "C", "exdir_H", "omega")
fp = open(exdir_H_omega_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 1) and (lines[0] == "This is the file 'omega'.\n")):
raise svntest.Failure("Unexpected contents for rev 1 of " +
exdir_H_omega_path)
def export_wc_with_externals(sbox):
"test exports from working copies with externals"
externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
export_target = sbox.add_wc_path('export')
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'export', wc_dir, export_target)
paths = [
os.path.join(export_target, "A", "C", "exdir_G"),
os.path.join(export_target, "A", "C", "exdir_G", "pi"),
os.path.join(export_target, "A", "C", "exdir_H"),
os.path.join(export_target, "A", "C", "exdir_H", "omega"),
os.path.join(export_target, "A", "D", "x"),
os.path.join(export_target, "A", "D", "x", "y"),
os.path.join(export_target, "A", "D", "x", "y", "z"),
os.path.join(export_target, "A", "D", "x", "y", "z", "blah"),
os.path.join(export_target, "A", "D", "x", "y", "z", "blah", "E", "alpha"),
os.path.join(export_target, "A", "D", "x", "y", "z", "blah", "E", "beta"),
]
probe_paths_exist(paths)
svntest.main.safe_rmtree(export_target)
svntest.actions.run_and_verify_svn(None, None, [],
'export', '--ignore-externals',
wc_dir, export_target)
probe_paths_missing(paths)
def external_with_peg_and_op_revision(sbox):
"use a peg revision to specify an external module"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'rm',
external_url_for["A/D/exdir_A/H"],
'-m', 'remove original A/D/H')
new_externals_desc = \
external_url_for["A/D/exdir_A/H"] + "@4 exdir_A/H" + \
"\n" + \
external_url_for["A/D/exdir_A/G/"] + " exdir_A/G" + \
"\n"
change_external(os.path.join(wc_dir, "A/D"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [],
'up', wc_dir)
external_chi_path = os.path.join(wc_dir, 'A', 'D', 'exdir_A', 'H', 'chi')
fp = open(external_chi_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 1)
and (lines[0] == "This is the file 'chi'.\n")):
raise svntest.Failure("Unexpected contents for externally modified " +
external_chi_path)
fp.close()
def new_style_externals(sbox):
"check the new '-rN URL PATH' syntax"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
new_externals_desc = \
external_url_for["A/C/exdir_G"] + " exdir_G" + \
"\n" + \
"-r 1 " + external_url_for["A/C/exdir_H"] + " exdir_H" + \
"\n" + \
"-r1 " + external_url_for["A/C/exdir_H"] + " exdir_I" + \
"\n"
change_external(os.path.join(wc_dir, "A/C"), new_externals_desc)
svntest.actions.run_and_verify_svn(None, None, [],
'up', wc_dir)
for dir_name in ["exdir_H", "exdir_I"]:
exdir_X_omega_path = os.path.join(wc_dir, "A", "C", dir_name, "omega")
fp = open(exdir_X_omega_path, 'r')
lines = fp.readlines()
if not ((len(lines) == 1) and (lines[0] == "This is the file 'omega'.\n")):
raise svntest.Failure("Unexpected contents for rev 1 of " +
exdir_X_omega_path)
def disallow_propset_invalid_formatted_externals(sbox):
"error if propset'ing external with invalid format"
sbox.build()
wc_dir = sbox.wc_dir
A_path = os.path.join(wc_dir, 'A')
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
for ext in [ 'arg1',
'arg1 arg2 arg3',
'arg1 arg2 arg3 arg4',
'arg1 arg2 arg3 arg4 arg5',
'-r',
'-r1',
'-r 1',
'-r1 arg1',
'-r 1 arg1',
'arg1 -r',
'arg1 -r1',
'arg1 -r 1',
]:
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, ext)
svntest.actions.run_and_verify_svn("No error for externals '%s'" % ext,
None,
'.*Error parsing svn:externals.*',
'propset',
'-F',
tmp_f,
'svn:externals',
A_path)
os.remove(tmp_f)
for ext in [ '-r abc arg1 arg2',
'-rabc arg1 arg2',
'arg1 -r abc arg2',
'arg1 -rabc arg2',
]:
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, ext)
svntest.actions.run_and_verify_svn("No error for externals '%s'" % ext,
None,
'.*Error parsing svn:externals.*',
'propset',
'-F',
tmp_f,
'svn:externals',
A_path)
os.remove(tmp_f)
for ext in [ 'http://example.com/ http://example.com/',
'-r1 http://example.com/ http://example.com/',
'-r 1 http://example.com/ http://example.com/',
'http://example.com/ -r1 http://example.com/',
'http://example.com/ -r 1 http://example.com/',
]:
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, ext)
svntest.actions.run_and_verify_svn("No error for externals '%s'" % ext,
None,
'.*cannot use two absolute URLs.*',
'propset',
'-F',
tmp_f,
'svn:externals',
A_path)
os.remove(tmp_f)
for ext in [ 'http://example.com/ -r1 foo',
'http://example.com/ -r 1 foo',
'-r1 foo http://example.com/',
'-r 1 foo http://example.com/'
]:
tmp_f = os.tempnam()
svntest.main.file_append(tmp_f, ext)
svntest.actions.run_and_verify_svn("No error for externals '%s'" % ext,
None,
'.*cannot use a URL \'.*\' as the ' \
'target directory for an external ' \
'definition.*',
'propset',
'-F',
tmp_f,
'svn:externals',
A_path)
os.remove(tmp_f)
def old_style_externals_ignore_peg_reg(sbox):
"old 'PATH URL' format should ignore peg revisions"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'up', wc_dir)
ext = "exdir_G " + external_url_for["A/C/exdir_G"] + "@HEAD\n"
change_external(os.path.join(wc_dir, "A"), ext)
expected_error = "|".join([".*Error handling externals definition.*",
".*URL .*/A/D/G@HEAD' .* doesn't exist.*",
])
svntest.actions.run_and_verify_svn2("External '%s' used pegs" % ext.strip(),
None,
expected_error,
0,
'up',
wc_dir)
def cannot_move_or_remove_file_externals(sbox):
"should not be able to mv or rm a file external"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
svntest.actions.run_and_verify_svn("Able to delete file external",
None,
".*Cannot remove the file external at "
".*gamma.*; please propedit or propdel "
"the svn:externals description",
'rm',
os.path.join(wc_dir, 'A', 'B', 'gamma'))
svntest.actions.run_and_verify_svn("Able to move file external",
None,
".*Cannot move the file external at "
".*gamma.*; please propedit the "
"svn:externals description",
'mv',
os.path.join(wc_dir, 'A', 'B', 'gamma'),
os.path.join(wc_dir, 'A', 'B', 'gamma1'))
expected_status = svntest.actions.get_virginal_state(wc_dir, 6)
svntest.actions.run_and_verify_svn(None, None, [],
'rm',
os.path.join(wc_dir, "A", "B"))
expected_status.tweak('A/B', status='D ')
expected_output = svntest.wc.State(wc_dir, {
'A/B' : Item(verb='Deleting'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 6)
expected_status.remove('A/B', 'A/B/E', 'A/B/E/alpha', 'A/B/E/beta',
'A/B/F', 'A/B/lambda')
svntest.actions.run_and_verify_commit(wc_dir,
expected_output, expected_status,
None, wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'up',
repo_url, wc_dir)
file(os.path.join(wc_dir, 'A', 'D', 'gamma')).close()
def can_place_file_external_into_dir_external(sbox):
"place a file external into a directory external"
external_url_for = externals_test_setup(sbox)
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
other_repo_url = repo_url + ".other"
svntest.actions.run_and_verify_svn(None, None, [],
'checkout',
repo_url, wc_dir)
ext = "^/A/D A/D-copy\n" + \
"^/A/B/E/beta A/D-copy/G/beta\n"
change_external(wc_dir, ext)
svntest.actions.run_and_verify_svn(None, None, [],
'up',
repo_url, wc_dir)
beta1_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
f = file(beta1_path)
beta1_contents = f.read()
f.close()
beta2_path = os.path.join(wc_dir, 'A', 'D-copy', 'G', 'beta')
f = file(beta2_path)
beta2_contents = f.read()
f.close()
if beta1_contents != beta2_contents:
raise svntest.Failure("Contents of '%s' and '%s' do not match" %
(beta1_path, beta2_path))
ext = other_repo_url + "/A/B C/exdir_B\n" + \
"^/A/B/E/beta C/exdir_B/beta\n"
change_external(os.path.join(wc_dir, 'A'), ext)
expected_error = "|".join([".*Error handling externals definition.*",
".*Cannot insert a file external from " \
+ ".*/beta' into a working copy " \
+ ".*" + other_repo_url,
])
svntest.actions.run_and_verify_svn2("Able to put file external in foreign wc",
None,
expected_error,
0,
'up',
repo_url, wc_dir)
def external_into_path_with_spaces(sbox):
"allow spaces in external local paths"
sbox.build()
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
ext = '^/A/D "A/copy of D"\n' +\
'^/A/D A/another\ copy\ of\ D'
change_external(wc_dir, ext)
svntest.actions.run_and_verify_svn(None, None, [],
'up',
repo_url, wc_dir)
probe_paths_exist([
os.path.join(wc_dir, 'A', 'copy of D'),
os.path.join(wc_dir, 'A', 'another copy of D'),
])
test_list = [ None,
checkout_with_externals,
update_receive_new_external,
update_lose_external,
update_change_pristine_external,
update_change_modified_external,
update_receive_change_under_external,
modify_and_update_receive_new_external,
disallow_dot_or_dotdot_directory_reference,
export_with_externals,
export_wc_with_externals,
external_with_peg_and_op_revision,
new_style_externals,
disallow_propset_invalid_formatted_externals,
old_style_externals_ignore_peg_reg,
cannot_move_or_remove_file_externals,
can_place_file_external_into_dir_external,
external_into_path_with_spaces,
]
if __name__ == '__main__':
warnings.filterwarnings('ignore', 'tempnam', RuntimeWarning)
svntest.main.run_tests(test_list)