feat: Support non-mapped network drives on Windows.
Adds support for tracking files on network drives that are not mapped to a specific drive letter (e.g. X:\), but rather using a UNC path directly to the share, e.g. \\Mac\Home\Documents.
This commit is contained in:
parent
1252973086
commit
4fded99f98
2 changed files with 18 additions and 0 deletions
|
@ -27,6 +27,18 @@ class UtilsTestCase(TestCase):
|
||||||
result = format_file_path(path)
|
result = format_file_path(path)
|
||||||
self.assertPathsEqual(expected, result)
|
self.assertPathsEqual(expected, result)
|
||||||
|
|
||||||
|
def test_format_file_path_windows_network_mount(self):
|
||||||
|
path = '\\\\some\\path////to\\\\\\a\\file.txt'
|
||||||
|
expected = '//some/path/to/a/file.txt'
|
||||||
|
|
||||||
|
with mock.patch('os.path.realpath') as mock_realpath:
|
||||||
|
mock_realpath.return_value = path
|
||||||
|
with mock.patch('os.path.abspath') as mock_abspath:
|
||||||
|
mock_abspath.return_value = path
|
||||||
|
|
||||||
|
result = format_file_path(path)
|
||||||
|
self.assertPathsEqual(expected, result)
|
||||||
|
|
||||||
def test_format_file_path_handles_exceptions(self):
|
def test_format_file_path_handles_exceptions(self):
|
||||||
path = 'c:\\some\\path////to\\\\\\a\\file.txt'
|
path = 'c:\\some\\path////to\\\\\\a\\file.txt'
|
||||||
expected = path
|
expected = path
|
||||||
|
|
|
@ -26,6 +26,7 @@ log = logging.getLogger('WakaTime')
|
||||||
|
|
||||||
BACKSLASH_REPLACE_PATTERN = re.compile(r'[\\/]+')
|
BACKSLASH_REPLACE_PATTERN = re.compile(r'[\\/]+')
|
||||||
WINDOWS_DRIVE_PATTERN = re.compile(r'^[a-z]:/')
|
WINDOWS_DRIVE_PATTERN = re.compile(r'^[a-z]:/')
|
||||||
|
WINDOWS_NETWORK_MOUNT_PATTERN = re.compile(r'^\\{2}[a-z]+')
|
||||||
|
|
||||||
|
|
||||||
def should_exclude(entity, include, exclude):
|
def should_exclude(entity, include, exclude):
|
||||||
|
@ -77,10 +78,15 @@ def format_file_path(filepath):
|
||||||
"""Formats a path as absolute and with the correct platform separator."""
|
"""Formats a path as absolute and with the correct platform separator."""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
is_windows_network_mount = WINDOWS_NETWORK_MOUNT_PATTERN.match(filepath)
|
||||||
filepath = os.path.realpath(os.path.abspath(filepath))
|
filepath = os.path.realpath(os.path.abspath(filepath))
|
||||||
filepath = re.sub(BACKSLASH_REPLACE_PATTERN, '/', filepath)
|
filepath = re.sub(BACKSLASH_REPLACE_PATTERN, '/', filepath)
|
||||||
if WINDOWS_DRIVE_PATTERN.match(filepath):
|
if WINDOWS_DRIVE_PATTERN.match(filepath):
|
||||||
filepath = filepath.capitalize()
|
filepath = filepath.capitalize()
|
||||||
|
if is_windows_network_mount:
|
||||||
|
# Add back a / to the front, since the previous modifications
|
||||||
|
# will have replaced any double slashes with single
|
||||||
|
filepath = '/' + filepath
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return filepath
|
return filepath
|
||||||
|
|
Loading…
Reference in a new issue