Re: [PATCH] Improve free drive letter detection for windows tests

2016-07-31 Thread Stefan
On 7/31/2016 14:17, Stefan wrote:
> Hi,
>
> the current test code causes two test failures on my machine (Windows,
> python 64-bit, drives G-J HDDs, drive K dvd drive - tested with SVN
> 1.9.4 and trunk).
> The issue seems to be that the fallback detection code incorrectly
> concludes that drive K is a free drive letter, if there's no disc in the
> drive. This then results in two test failures for me:
>
> - checkout #14
> - update #31
>
> Full details available here [1].
>
> The attached patch resolves the issue by replacing the current code
> detecting free drive letters by using the ctypes library instead of the
> win32api library.
>
> As far as I understand things, this is backwards compatible with Python
>> = 2.5 [2]. Since SVN 1.9/trunk require Python >= 2.7, I don't see any
> compatibility concern for this change.
>
> [[[
> Resolve test failures on Windows when running with Python 64-bit.
>
> * subversion/tests/cmdline/checkout_tests.py
>   (checkout_wc_from_drive): replace the win32api-dependent drive letter
> detection code with the an approach using
> the more
> portable ctypes library and direct call to the
> kernel32's GetLogicalDrives() function
> * subversion/tests/cmdline/update_tests.py
>   (update_wc_on_windows_drive): the same
> ]]]
>
> [1] http://www.luke1410.de:8090/browse/MAXSVN-65
> [2] http://python.net/crew/theller/ctypes/
>
> Regards,
> Stefan

Just verified the same issue exist in 1.8.16 and 1.7.22 as well. For 1.8
the patch should also work, since 1.8 requires Python 2.5.

Regards,
Stefan




smime.p7s
Description: S/MIME Cryptographic Signature


[PATCH] Improve free drive letter detection for windows tests

2016-07-31 Thread Stefan
Hi,

the current test code causes two test failures on my machine (Windows,
python 64-bit, drives G-J HDDs, drive K dvd drive - tested with SVN
1.9.4 and trunk).
The issue seems to be that the fallback detection code incorrectly
concludes that drive K is a free drive letter, if there's no disc in the
drive. This then results in two test failures for me:

- checkout #14
- update #31

Full details available here [1].

The attached patch resolves the issue by replacing the current code
detecting free drive letters by using the ctypes library instead of the
win32api library.

As far as I understand things, this is backwards compatible with Python
>= 2.5 [2]. Since SVN 1.9/trunk require Python >= 2.7, I don't see any
compatibility concern for this change.

[[[
Resolve test failures on Windows when running with Python 64-bit.

* subversion/tests/cmdline/checkout_tests.py
  (checkout_wc_from_drive): replace the win32api-dependent drive letter
detection code with the an approach using
the more
portable ctypes library and direct call to the
kernel32's GetLogicalDrives() function
* subversion/tests/cmdline/update_tests.py
  (update_wc_on_windows_drive): the same
]]]

[1] http://www.luke1410.de:8090/browse/MAXSVN-65
[2] http://python.net/crew/theller/ctypes/

Regards,
Stefan
Index: subversion/tests/cmdline/checkout_tests.py
===
--- subversion/tests/cmdline/checkout_tests.py	(revision 1743999)
+++ subversion/tests/cmdline/checkout_tests.py	(working copy)
@@ -1052,23 +1052,22 @@
 "find the first available drive"
 
 # get the list of used drive letters, use some Windows specific function.
-try:
-  import win32api
+import ctypes
+import string
+drives = []
+# compile a list of used drive letters
+drive_bitmask = ctypes.windll.kernel32.GetLogicalDrives()
+for drive in string.uppercase:
+  if drive_bitmask & 1:
+drives.append(drive)
+  drive_bitmask >>= 1
 
-  drives=win32api.GetLogicalDriveStrings()
-  drives=drives.split('\000')
+# find the first unused drive letter
+for d in range(ord('G'), ord('Z')+1):
+  drive = chr(d)
+  if not drive in drives:
+return drive
 
-  for d in range(ord('G'), ord('Z')+1):
-drive = chr(d)
-if not drive + ':\\' in drives:
-  return drive
-except ImportError:
-  # In ActiveState python x64 win32api is not available
-  for d in range(ord('G'), ord('Z')+1):
-drive = chr(d)
-if not os.path.isdir(drive + ':\\'):
-  return drive
-
 return None
 
   # just create an empty folder, we'll checkout later.
Index: subversion/tests/cmdline/update_tests.py
===
--- subversion/tests/cmdline/update_tests.py	(revision 1743999)
+++ subversion/tests/cmdline/update_tests.py	(working copy)
@@ -2245,23 +2245,22 @@
 "find the first available drive"
 
 # get the list of used drive letters, use some Windows specific function.
-try:
-  import win32api
+import ctypes
+import string
+drives = []
+# compile a list of used drive letters
+drive_bitmask = ctypes.windll.kernel32.GetLogicalDrives()
+for drive in string.uppercase:
+  if drive_bitmask & 1:
+drives.append(drive)
+  drive_bitmask >>= 1
 
-  drives=win32api.GetLogicalDriveStrings()
-  drives=drives.split('\000')
+# find the first unused drive letter
+for d in range(ord('G'), ord('Z')+1):
+  drive = chr(d)
+  if not drive in drives:
+return drive
 
-  for d in range(ord('G'), ord('Z')+1):
-drive = chr(d)
-if not drive + ':\\' in drives:
-  return drive
-except ImportError:
-  # In ActiveState python x64 win32api is not available
-  for d in range(ord('G'), ord('Z')+1):
-drive = chr(d)
-if not os.path.isdir(drive + ':\\'):
-  return drive
-
 return None
 
   # just create an empty folder, we'll checkout later.


smime.p7s
Description: S/MIME Cryptographic Signature