You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Philip Martin <ph...@codematters.co.uk> on 2006/04/05 21:34:24 UTC

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

"Lieven Govaerts" <lg...@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

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

Posted by Lieven Govaerts <lg...@mobsol.be>.
 

> -----Original Message-----
> From: Philip Martin [mailto:philip@codematters.co.uk] 
> Sent: woensdag 5 april 2006 23:34
> To: Lieven Govaerts
> Cc: julianfoad@btopenworld.com; dev@subversion.tigris.org
> Subject: Re: [PATCH] fix for issue 2475: ignore case for 
> hostnames (repost)
> 

> +====================================================================
> > +# Copyright (c) 2000-2006 CollabNet.  All rights reserved.
> 
> 2006 only?

Hmm, what do you mean?

> > +# General modules
> > +import os
> > +from urlparse import urlparse, urlunparse
> 
> Are these needed?

Nope, leftovers from an earlier try, removed them. 
 
> > +  # 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.

That doesn't make any sense here, because our url(repo_url2) is different
(uppercase) from the one in our working copy. 

> > +  
> > +  # 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.

Yup, added them. 
 
> > +  
> > +  # 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.

I added run_and_verify_status. Since directories are completely
self-contained I don't see a reason for this not to work!

> > +  
> > +  # 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.

Hm, I tend to prefer more but smaller unit tests, but with the overlap here
it makes sense to combine them. 

> > +  
> > +# 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?

Added that. 

> > +  
> > +# 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.

I've removed this test altogether.

> > +  
> > +  # 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.

Mostly copy paste from other tests, removed them. 

> > +
> > +### End of file.
> > \ No newline at end of file
> 
> You need to add path_tests.py to build.conf to get it to run.

That was new for me, so I applied that in the attached patch, and used it to
fix a patch for issue 2486 which was committed last week.

Lieven.

[[[
Fix for issue #2475: Make sure scheme and hostname in URI's are handled in a
case insenitive manner.

Patch by: Lieven Govaerts <lg...@mobsol.be> 

Found by: Andy Somerville

* subversion/libsvn_subr/path.c:
  (svn_path_canonicalize): convert scheme and hostname to lowercase.

* subversion/libsvn_wc/entries.c:
  (svn_wc__atts_to_entry): while reading from the entries file,
  canonicalize url and repos.

* subversion/include/svn_path.h:
  (svn_path_canonicalize): add comment

* subversion/tests/libsvn_subr/path-test.c:
  (test_canonicalize): add test for uppercase hostnames

* subversion/libsvn_ra_dav/session.c:
  (svn_ra_dav__open): cleaned up now obsolete tolower hack.

* subversion/tests/cmdline/path_tests.py:
  new file, contains tests for issue #2475.

* build.conf: 
  added path_tests.py to list of python tests.
]]]