[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] fix for issue 2475: ignore case for hostnames (repost)

From: Philip Martin <philip_at_codematters.co.uk>
Date: 2006-04-05 23:34:24 CEST

"Lieven Govaerts" <lgo@mobsol.be> writes:

> Index: subversion/tests/cmdline/path_tests.py
> ===================================================================
> --- subversion/tests/cmdline/path_tests.py (revision 0)
> +++ subversion/tests/cmdline/path_tests.py (revision 0)
> @@ -0,0 +1,187 @@
> +#!/usr/bin/env python
> +#
> +# path_tests.py: testing case insensitive hostname handling.
> +#
> +# Subversion is a tool for revision control.
> +# See http://subversion.tigris.org for more information.
> +#
> +# ====================================================================
> +# Copyright (c) 2000-2006 CollabNet. All rights reserved.

2006 only?

> +#
> +# This software is licensed as described in the file COPYING, which
> +# you should have received as part of this distribution. The terms
> +# are also available at http://subversion.tigris.org/license-1.html.
> +# If newer versions of this license are posted there, you may use a
> +# newer version instead, at your option.
> +#
> +######################################################################
> +
> +# General modules
> +import os
> +from urlparse import urlparse, urlunparse

Are these needed?

> +from string import lower, upper
> +
> +# Our testing module
> +import svntest
> +
> +import re
> +
> +######################################################################
> +# Utilities
> +#
> +
> +def change_case_of_hostname(input):
> + "Change the case of the hostname, try uppercase first"
> +
> + m = re.match(r"^(.*://)([^/]*)(.*)", input)
> + if m:
> + scheme = m.group(1)
> + host = upper(m.group(2))
> + if host == m.group(2):
> + host = lower(m.group(2))
> +
> + path = m.group(3)
> +
> + return scheme + host + path
> +
> +######################################################################
> +# Tests
> +#
> +# Each test must return on success or raise on failure.
> +
> +
> +#----------------------------------------------------------------------
> +
> +# regression test for issue #2475 - move file and folder
> +def path_move_between_wcs(sbox):
> + "case issue #2475 - move file and folder"
> + sbox.build()
> +
> + # checkout a second working copy, use repository url with different case
> + wc_dir2 = sbox.wc_dir + '2'
> + repo_url2 = change_case_of_hostname(svntest.main.current_repo_url)
> +
> + # Generate the expected output tree.
> + expected_output = svntest.main.greek_state.copy()
> + expected_output.wc_dir = wc_dir2
> + expected_output.tweak(status='A ', contents=None)
> +
> + # Generate an expected wc tree.
> + expected_wc = svntest.main.greek_state
> +
> + # Do a checkout, and verify the resulting output and disk contents.
> + svntest.actions.run_and_verify_checkout(repo_url2,
> + wc_dir2,
> + expected_output,
> + expected_wc)

I've not done it in a python test, but it might be simpler and quicker
to do an OS copy of sbox.wc_dir rather than a separate checkout.

> +
> + # Move a file from wc to wc2
> + mu_path = os.path.join(sbox.wc_dir, 'A', 'mu')
> + E_path = os.path.join(wc_dir2, 'A', 'B', 'E')
> +
> + svntest.main.run_svn(None, 'mv', mu_path, E_path)

run_svn on it's own isn't much of a test, add run_and_verify_status
calls to check what has happend.

> +
> + # Move a folder from wc to wc2
> + E_path = os.path.join(sbox.wc_dir, 'A', 'B', 'E')
> + A_path = os.path.join(wc_dir2, 'A')
> +
> + svntest.main.run_svn(None, 'mv', E_path, A_path)

So "move between working copies" works, I didn't know that! It's not
clear to me whether this was intentional or accidental. This also
needs run_and_verify_status, maybe even run_and_verify_commit.

> +
> +# regression test for issue #2475 - move file and folder
> +def path_copy_between_wcs(sbox):
> + "case issue #2475 - copy file and folder"
> + sbox.build()
> +
> + # checkout a second working copy, use repository url with different case
> + wc_dir2 = sbox.wc_dir + '2'
> + repo_url2 = change_case_of_hostname(svntest.main.current_repo_url)
> +
> + # Generate the expected output tree.
> + expected_output = svntest.main.greek_state.copy()
> + expected_output.wc_dir = wc_dir2
> + expected_output.tweak(status='A ', contents=None)
> +
> + # Generate an expected wc tree.
> + expected_wc = svntest.main.greek_state
> +
> + # Do a checkout, and verify the resulting output and disk contents.
> + svntest.actions.run_and_verify_checkout(repo_url2,
> + wc_dir2,
> + expected_output,
> + expected_wc)
> +
> + # Copy a file from wc to wc2
> + mu_path = os.path.join(sbox.wc_dir, 'A', 'mu')
> + E_path = os.path.join(wc_dir2, 'A', 'B', 'E')
> +
> + svntest.main.run_svn(None, 'cp', mu_path, E_path)
> +
> + # Copy a folder from wc to wc2
> + E_path = os.path.join(sbox.wc_dir, 'A', 'B', 'E')
> + A_path = os.path.join(wc_dir2, 'A')
> +
> + svntest.main.run_svn(None, 'cp', E_path, A_path)

Rather than duplicate the whole test, I'd just put the copies into the
previous test along with the moves.

> +
> +# regression test for issue #2475 - direct copy in the repository
> +# this test handles the 'direct move' case too, that uses the same code.
> +def path_copy_in_repo(sbox):
> + "case issue #2475 - direct copy in the repository"
> + sbox.build()
> +
> + repo_url2 = change_case_of_hostname(svntest.main.current_repo_url)
> +
> + # Copy a file from repo to repo2
> + mu_url = svntest.main.current_repo_url + '/A/mu'
> + E_url = repo_url2 + '/A/B/E'
> +
> + svntest.main.run_svn(None, 'cp', mu_url, E_url, '-m', 'copy mu to /A/B/E')

Again run_svn isn't much of a test, how about a run_and_verify_update?

> +
> +# regression test for issue #2475 - checkout in a working copy
> +def path_checkout(sbox):
> + "case issue #2475 - checkout in wc"
> + sbox.build()
> +
> + # checkout a working copy non-recursively
> + wc_dir2 = sbox.wc_dir + '2'
> +
> + output, errput = svntest.main.run_svn (None, 'co',
> + '--username', svntest.main.wc_author,
> + '--password', svntest.main.wc_passwd,
> + '-N',
> + svntest.main.current_repo_url, wc_dir2)

Why is this using a separate, non-recursive, working copy? Your
comment tells me what you are doing, something that is obvious from
the code, but it doesn't tell me why you are doing it.

> +
> + # checkout in the same working copy, use repository url with different case
> + repo_url2 = change_case_of_hostname(svntest.main.current_repo_url)
> +
> + # Generate the expected output tree.
> + expected_output = svntest.main.greek_state.copy()
> + expected_output.wc_dir = wc_dir2
> + expected_output.tweak(status='A ', contents=None)
> +
> + # Generate an expected wc tree.

You have put in lots of "trivial" comments like that one, they don't
make the code easier to understand they just make it longer.

> + expected_wc = svntest.main.greek_state
> +
> + # Do a checkout, and verify the resulting output and disk contents.
> + svntest.actions.run_and_verify_checkout(repo_url2,
> + wc_dir2,
> + expected_output,
> + expected_wc)
> +
> +########################################################################
> +# Run the tests
> +
> +
> +# list all tests here, starting with None:
> +test_list = [ None,
> + path_move_between_wcs,
> + path_copy_between_wcs,
> + path_copy_in_repo,
> + path_checkout
> + ]
> +
> +if __name__ == '__main__':
> + svntest.main.run_tests(test_list)
> + # NOTREACHED
> +
> +
> +### End of file.
> \ No newline at end of file

You need to add path_tests.py to build.conf to get it to run.

-- 
Philip Martin
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Apr 5 23:34:59 2006

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.