* [edk2-staging/EdkRepo] [PATCH V3 0/2] EdkRepo: Add support for SUBST drives
@ 2020-09-26 1:28 Nate DeSimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Nate DeSimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for " Nate DeSimone
0 siblings, 2 replies; 7+ messages in thread
From: Nate DeSimone @ 2020-09-26 1:28 UTC (permalink / raw)
To: devel
Cc: Ashley E Desimone, Puja Pandya, Bret Barkelew, Prince Agyeman,
Erik Bjorge
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 1385 bytes --]
Changes in V3:
- Changed loop for finding subst drive to single if statement
Changes in V2:
- Changed get_subst_drive_list() to get_subst_drive_dict()
EdkRepo currently does not handle virtual drives created using the SUBST command.
Specifically, when cloning or syncing a project to a subst drive the includeIf statements
that redirect submodule fetches to mirror servers will be generated with the
subst drive information. This causes git to not activate the includeif since
it specifies the subst path and not the actual path.
To resolve this, EdkRepo will now enumerate the virtual drives created by SUBST and if
the current workspace is on a SUBST virtual drive EdkRepo will convert the workspace
path to the path on the real volume.
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
Nate DeSimone (2):
EdkRepo: Add function to enumerate subst drives
EdkRepo: Add support for subst drives
edkrepo/commands/clone_command.py | 8 +++++
edkrepo/common/pathfix.py | 50 ++++++++++++++++++++++++++++++-
edkrepo/config/config_factory.py | 10 ++++++-
3 files changed, 66 insertions(+), 2 deletions(-)
--
2.27.0.windows.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives
2020-09-26 1:28 [edk2-staging/EdkRepo] [PATCH V3 0/2] EdkRepo: Add support for SUBST drives Nate DeSimone
@ 2020-09-26 1:28 ` Nate DeSimone
2020-09-28 21:16 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for " Nate DeSimone
1 sibling, 2 replies; 7+ messages in thread
From: Nate DeSimone @ 2020-09-26 1:28 UTC (permalink / raw)
To: devel
Cc: Ashley E Desimone, Puja Pandya, Bret Barkelew, Prince Agyeman,
Erik Bjorge
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/common/pathfix.py | 50 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/edkrepo/common/pathfix.py b/edkrepo/common/pathfix.py
index 1a9c20f..2775442 100644
--- a/edkrepo/common/pathfix.py
+++ b/edkrepo/common/pathfix.py
@@ -3,7 +3,7 @@
## @file
# checkout_command.py
#
-# Copyright (c) 2018- 2020, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2018 - 2020, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
import os
@@ -11,6 +11,7 @@ import sys
if sys.platform == "win32":
from ctypes import windll, POINTER, byref, GetLastError, Structure, WinError
from ctypes import c_void_p, c_ushort, c_int, c_ulong, c_wchar, c_wchar_p
+ from ctypes import create_unicode_buffer
def _is_wow64_process():
kernel32 = windll.kernel32
@@ -211,3 +212,50 @@ def expanduser(path):
userhome = os.path.join(os.path.dirname(userhome), path[1:i])
return userhome + path[i:]
+
+def get_subst_drive_dict():
+ if sys.platform != "win32":
+ return {}
+ def _query_subst_drive(drive_letter):
+ kernel32 = windll.kernel32
+ QueryDosDevice = kernel32.QueryDosDeviceW
+ QueryDosDevice.argtypes = [c_wchar_p, c_wchar_p, c_ulong]
+ QueryDosDevice.restype = c_ulong
+ MAX_PATH = 260
+
+ if len(drive_letter) > 1 or len(drive_letter) == 0:
+ raise ValueError("Bad drive letter")
+ drive = '{}:'.format(drive_letter.upper())
+ drive_buffer = create_unicode_buffer(drive)
+ target_path_buffer_size = c_ulong(MAX_PATH)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ while True:
+ count = QueryDosDevice(drive_buffer, target_path_buffer, target_path_buffer_size)
+ if count == 0:
+ last_error = GetLastError()
+ if last_error == 122: #ERROR_INSUFFICIENT_BUFFER
+ #Increase the buffer size and try again
+ target_path_buffer_size = c_ulong((target_path_buffer_size.value * 161) / 100)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ elif last_error == 2: #ERROR_FILE_NOT_FOUND
+ #This is an invalid drive, return an empty string
+ return ''
+ else:
+ raise WinError(last_error)
+ else:
+ break
+ target_path = target_path_buffer.value
+ if len(target_path) > 4 and target_path[0:4] == '\\??\\':
+ if (ord(target_path[4]) >= ord('A') and ord(target_path[4]) <= ord('Z')) or \
+ (ord(target_path[4]) >= ord('a') and ord(target_path[4]) <= ord('z')):
+ #This is a SUBST'd drive, return the path
+ return target_path[4:].strip()
+ #This is a non-SUBST'd (aka real) drive, return an empty string
+ return ''
+ subst_dict = {}
+ for index in range(26):
+ drive_letter = chr(ord('A') + index)
+ target_path = _query_subst_drive(drive_letter)
+ if target_path != '':
+ subst_dict[drive_letter] = target_path
+ return subst_dict
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for subst drives
2020-09-26 1:28 [edk2-staging/EdkRepo] [PATCH V3 0/2] EdkRepo: Add support for SUBST drives Nate DeSimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Nate DeSimone
@ 2020-09-26 1:28 ` Nate DeSimone
2020-09-28 21:17 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
1 sibling, 2 replies; 7+ messages in thread
From: Nate DeSimone @ 2020-09-26 1:28 UTC (permalink / raw)
To: devel
Cc: Ashley E Desimone, Puja Pandya, Bret Barkelew, Prince Agyeman,
Erik Bjorge
get_workspace_path() now converts a virtual drive path
to a real path before any git repo operations are done.
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/commands/clone_command.py | 8 ++++++++
edkrepo/config/config_factory.py | 10 +++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/edkrepo/commands/clone_command.py b/edkrepo/commands/clone_command.py
index f638090..8769102 100644
--- a/edkrepo/commands/clone_command.py
+++ b/edkrepo/commands/clone_command.py
@@ -9,6 +9,7 @@
import os
import shutil
+import sys
from edkrepo.commands.edkrepo_command import EdkrepoCommand
from edkrepo.commands.edkrepo_command import SubmoduleSkipArgument, SourceManifestRepoArgument
@@ -20,6 +21,7 @@ from edkrepo.common.edkrepo_exception import EdkrepoInvalidParametersException,
from edkrepo.common.edkrepo_exception import EdkrepoManifestNotFoundException
from edkrepo.common.humble import CLONE_INVALID_WORKSPACE, CLONE_INVALID_PROJECT_ARG, CLONE_INVALID_COMBO_ARG
from edkrepo.common.humble import SPARSE_CHECKOUT, CLONE_INVALID_LOCAL_ROOTS
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo.common.workspace_maintenance.workspace_maintenance import case_insensitive_single_match
from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import pull_all_manifest_repos, find_project_in_all_indices
from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import list_available_manifest_repos
@@ -77,6 +79,12 @@ class CloneCommand(EdkrepoCommand):
workspace_dir = os.getcwd()
else:
workspace_dir = os.path.abspath(workspace_dir)
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(workspace_dir)[0][0].upper()
+ if drive in subst:
+ workspace_dir = os.path.join(subst[drive], os.path.splitdrive(workspace_dir)[1][1:])
+ workspace_dir = os.path.normpath(workspace_dir)
if os.path.isdir(workspace_dir) and os.listdir(workspace_dir):
raise EdkrepoInvalidParametersException(CLONE_INVALID_WORKSPACE)
if not os.path.isdir(workspace_dir):
diff --git a/edkrepo/config/config_factory.py b/edkrepo/config/config_factory.py
index a82a438..fe69460 100644
--- a/edkrepo/config/config_factory.py
+++ b/edkrepo/config/config_factory.py
@@ -11,13 +11,16 @@ import os
import sys
import configparser
import collections
-from ctypes import *
+if sys.platform == "win32":
+ from ctypes import oledll, c_void_p, c_uint32, c_wchar_p
+ from ctypes import create_unicode_buffer
import edkrepo.config.humble.config_factory_humble as humble
from edkrepo.common.edkrepo_exception import EdkrepoGlobalConfigNotFoundException, EdkrepoConfigFileInvalidException
from edkrepo.common.edkrepo_exception import EdkrepoWorkspaceInvalidException, EdkrepoGlobalDataDirectoryNotFoundException
from edkrepo.common.edkrepo_exception import EdkrepoConfigFileReadOnlyException
from edkrepo.common.humble import MIRROR_PRIMARY_REPOS_MISSING, MIRROR_DECODE_WARNING, MAX_PATCH_SET_INVALID
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo_manifest_parser import edk_manifest
from edkrepo.common.pathfix import expanduser
@@ -238,6 +241,11 @@ def get_workspace_path():
while True:
if os.path.isdir(os.path.join(path, "repo")):
if os.path.isfile(os.path.join(os.path.join(path, "repo"), "Manifest.xml")):
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(path)[0][0].upper()
+ if drive in subst:
+ path = os.path.join(subst[drive], os.path.splitdrive(path)[1][1:])
return path
if os.path.dirname(path) == path:
break
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Nate DeSimone
@ 2020-09-28 21:16 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
1 sibling, 0 replies; 7+ messages in thread
From: Bjorge, Erik C @ 2020-09-28 21:16 UTC (permalink / raw)
To: Desimone, Nathaniel L, devel@edk2.groups.io
Cc: Desimone, Ashley E, Pandya, Puja, Bret Barkelew, Agyeman, Prince
Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com>
-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Friday, September 25, 2020 6:28 PM
To: devel@edk2.groups.io
Cc: Desimone, Ashley E <ashley.e.desimone@intel.com>; Pandya, Puja <puja.pandya@intel.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>; Agyeman, Prince <prince.agyeman@intel.com>; Bjorge, Erik C <erik.c.bjorge@intel.com>
Subject: [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/common/pathfix.py | 50 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/edkrepo/common/pathfix.py b/edkrepo/common/pathfix.py index 1a9c20f..2775442 100644
--- a/edkrepo/common/pathfix.py
+++ b/edkrepo/common/pathfix.py
@@ -3,7 +3,7 @@
## @file
# checkout_command.py
#
-# Copyright (c) 2018- 2020, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2018 - 2020, Intel Corporation. All rights
+reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # import os @@ -11,6 +11,7 @@ import sys if sys.platform == "win32":
from ctypes import windll, POINTER, byref, GetLastError, Structure, WinError
from ctypes import c_void_p, c_ushort, c_int, c_ulong, c_wchar, c_wchar_p
+ from ctypes import create_unicode_buffer
def _is_wow64_process():
kernel32 = windll.kernel32
@@ -211,3 +212,50 @@ def expanduser(path):
userhome = os.path.join(os.path.dirname(userhome), path[1:i])
return userhome + path[i:]
+
+def get_subst_drive_dict():
+ if sys.platform != "win32":
+ return {}
+ def _query_subst_drive(drive_letter):
+ kernel32 = windll.kernel32
+ QueryDosDevice = kernel32.QueryDosDeviceW
+ QueryDosDevice.argtypes = [c_wchar_p, c_wchar_p, c_ulong]
+ QueryDosDevice.restype = c_ulong
+ MAX_PATH = 260
+
+ if len(drive_letter) > 1 or len(drive_letter) == 0:
+ raise ValueError("Bad drive letter")
+ drive = '{}:'.format(drive_letter.upper())
+ drive_buffer = create_unicode_buffer(drive)
+ target_path_buffer_size = c_ulong(MAX_PATH)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ while True:
+ count = QueryDosDevice(drive_buffer, target_path_buffer, target_path_buffer_size)
+ if count == 0:
+ last_error = GetLastError()
+ if last_error == 122: #ERROR_INSUFFICIENT_BUFFER
+ #Increase the buffer size and try again
+ target_path_buffer_size = c_ulong((target_path_buffer_size.value * 161) / 100)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ elif last_error == 2: #ERROR_FILE_NOT_FOUND
+ #This is an invalid drive, return an empty string
+ return ''
+ else:
+ raise WinError(last_error)
+ else:
+ break
+ target_path = target_path_buffer.value
+ if len(target_path) > 4 and target_path[0:4] == '\\??\\':
+ if (ord(target_path[4]) >= ord('A') and ord(target_path[4]) <= ord('Z')) or \
+ (ord(target_path[4]) >= ord('a') and ord(target_path[4]) <= ord('z')):
+ #This is a SUBST'd drive, return the path
+ return target_path[4:].strip()
+ #This is a non-SUBST'd (aka real) drive, return an empty string
+ return ''
+ subst_dict = {}
+ for index in range(26):
+ drive_letter = chr(ord('A') + index)
+ target_path = _query_subst_drive(drive_letter)
+ if target_path != '':
+ subst_dict[drive_letter] = target_path
+ return subst_dict
--
2.27.0.windows.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for subst drives
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for " Nate DeSimone
@ 2020-09-28 21:17 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
1 sibling, 0 replies; 7+ messages in thread
From: Bjorge, Erik C @ 2020-09-28 21:17 UTC (permalink / raw)
To: Desimone, Nathaniel L, devel@edk2.groups.io
Cc: Desimone, Ashley E, Pandya, Puja, Bret Barkelew, Agyeman, Prince
Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com>
-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Friday, September 25, 2020 6:28 PM
To: devel@edk2.groups.io
Cc: Desimone, Ashley E <ashley.e.desimone@intel.com>; Pandya, Puja <puja.pandya@intel.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>; Agyeman, Prince <prince.agyeman@intel.com>; Bjorge, Erik C <erik.c.bjorge@intel.com>
Subject: [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for subst drives
get_workspace_path() now converts a virtual drive path to a real path before any git repo operations are done.
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/commands/clone_command.py | 8 ++++++++ edkrepo/config/config_factory.py | 10 +++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/edkrepo/commands/clone_command.py b/edkrepo/commands/clone_command.py
index f638090..8769102 100644
--- a/edkrepo/commands/clone_command.py
+++ b/edkrepo/commands/clone_command.py
@@ -9,6 +9,7 @@
import os
import shutil
+import sys
from edkrepo.commands.edkrepo_command import EdkrepoCommand from edkrepo.commands.edkrepo_command import SubmoduleSkipArgument, SourceManifestRepoArgument @@ -20,6 +21,7 @@ from edkrepo.common.edkrepo_exception import EdkrepoInvalidParametersException,
from edkrepo.common.edkrepo_exception import EdkrepoManifestNotFoundException from edkrepo.common.humble import CLONE_INVALID_WORKSPACE, CLONE_INVALID_PROJECT_ARG, CLONE_INVALID_COMBO_ARG from edkrepo.common.humble import SPARSE_CHECKOUT, CLONE_INVALID_LOCAL_ROOTS
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo.common.workspace_maintenance.workspace_maintenance import case_insensitive_single_match from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import pull_all_manifest_repos, find_project_in_all_indices from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import list_available_manifest_repos @@ -77,6 +79,12 @@ class CloneCommand(EdkrepoCommand):
workspace_dir = os.getcwd()
else:
workspace_dir = os.path.abspath(workspace_dir)
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(workspace_dir)[0][0].upper()
+ if drive in subst:
+ workspace_dir = os.path.join(subst[drive], os.path.splitdrive(workspace_dir)[1][1:])
+ workspace_dir = os.path.normpath(workspace_dir)
if os.path.isdir(workspace_dir) and os.listdir(workspace_dir):
raise EdkrepoInvalidParametersException(CLONE_INVALID_WORKSPACE)
if not os.path.isdir(workspace_dir):
diff --git a/edkrepo/config/config_factory.py b/edkrepo/config/config_factory.py
index a82a438..fe69460 100644
--- a/edkrepo/config/config_factory.py
+++ b/edkrepo/config/config_factory.py
@@ -11,13 +11,16 @@ import os
import sys
import configparser
import collections
-from ctypes import *
+if sys.platform == "win32":
+ from ctypes import oledll, c_void_p, c_uint32, c_wchar_p
+ from ctypes import create_unicode_buffer
import edkrepo.config.humble.config_factory_humble as humble from edkrepo.common.edkrepo_exception import EdkrepoGlobalConfigNotFoundException, EdkrepoConfigFileInvalidException from edkrepo.common.edkrepo_exception import EdkrepoWorkspaceInvalidException, EdkrepoGlobalDataDirectoryNotFoundException
from edkrepo.common.edkrepo_exception import EdkrepoConfigFileReadOnlyException
from edkrepo.common.humble import MIRROR_PRIMARY_REPOS_MISSING, MIRROR_DECODE_WARNING, MAX_PATCH_SET_INVALID
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo_manifest_parser import edk_manifest from edkrepo.common.pathfix import expanduser
@@ -238,6 +241,11 @@ def get_workspace_path():
while True:
if os.path.isdir(os.path.join(path, "repo")):
if os.path.isfile(os.path.join(os.path.join(path, "repo"), "Manifest.xml")):
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(path)[0][0].upper()
+ if drive in subst:
+ path = os.path.join(subst[drive],
+ os.path.splitdrive(path)[1][1:])
return path
if os.path.dirname(path) == path:
break
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Nate DeSimone
2020-09-28 21:16 ` Bjorge, Erik C
@ 2020-10-08 22:56 ` Ashley E Desimone
1 sibling, 0 replies; 7+ messages in thread
From: Ashley E Desimone @ 2020-10-08 22:56 UTC (permalink / raw)
To: Desimone, Nathaniel L, devel@edk2.groups.io
Cc: Pandya, Puja, Bret Barkelew, Agyeman, Prince, Bjorge, Erik C
Reviewed-by: Ashley DeSimone <ashley.e.desimone@intel.com>
-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Friday, September 25, 2020 6:28 PM
To: devel@edk2.groups.io
Cc: Desimone, Ashley E <ashley.e.desimone@intel.com>; Pandya, Puja <puja.pandya@intel.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>; Agyeman, Prince <prince.agyeman@intel.com>; Bjorge, Erik C <erik.c.bjorge@intel.com>
Subject: [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/common/pathfix.py | 50 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/edkrepo/common/pathfix.py b/edkrepo/common/pathfix.py index 1a9c20f..2775442 100644
--- a/edkrepo/common/pathfix.py
+++ b/edkrepo/common/pathfix.py
@@ -3,7 +3,7 @@
## @file
# checkout_command.py
#
-# Copyright (c) 2018- 2020, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2018 - 2020, Intel Corporation. All rights
+reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # import os @@ -11,6 +11,7 @@ import sys if sys.platform == "win32":
from ctypes import windll, POINTER, byref, GetLastError, Structure, WinError
from ctypes import c_void_p, c_ushort, c_int, c_ulong, c_wchar, c_wchar_p
+ from ctypes import create_unicode_buffer
def _is_wow64_process():
kernel32 = windll.kernel32
@@ -211,3 +212,50 @@ def expanduser(path):
userhome = os.path.join(os.path.dirname(userhome), path[1:i])
return userhome + path[i:]
+
+def get_subst_drive_dict():
+ if sys.platform != "win32":
+ return {}
+ def _query_subst_drive(drive_letter):
+ kernel32 = windll.kernel32
+ QueryDosDevice = kernel32.QueryDosDeviceW
+ QueryDosDevice.argtypes = [c_wchar_p, c_wchar_p, c_ulong]
+ QueryDosDevice.restype = c_ulong
+ MAX_PATH = 260
+
+ if len(drive_letter) > 1 or len(drive_letter) == 0:
+ raise ValueError("Bad drive letter")
+ drive = '{}:'.format(drive_letter.upper())
+ drive_buffer = create_unicode_buffer(drive)
+ target_path_buffer_size = c_ulong(MAX_PATH)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ while True:
+ count = QueryDosDevice(drive_buffer, target_path_buffer, target_path_buffer_size)
+ if count == 0:
+ last_error = GetLastError()
+ if last_error == 122: #ERROR_INSUFFICIENT_BUFFER
+ #Increase the buffer size and try again
+ target_path_buffer_size = c_ulong((target_path_buffer_size.value * 161) / 100)
+ target_path_buffer = create_unicode_buffer(target_path_buffer_size.value)
+ elif last_error == 2: #ERROR_FILE_NOT_FOUND
+ #This is an invalid drive, return an empty string
+ return ''
+ else:
+ raise WinError(last_error)
+ else:
+ break
+ target_path = target_path_buffer.value
+ if len(target_path) > 4 and target_path[0:4] == '\\??\\':
+ if (ord(target_path[4]) >= ord('A') and ord(target_path[4]) <= ord('Z')) or \
+ (ord(target_path[4]) >= ord('a') and ord(target_path[4]) <= ord('z')):
+ #This is a SUBST'd drive, return the path
+ return target_path[4:].strip()
+ #This is a non-SUBST'd (aka real) drive, return an empty string
+ return ''
+ subst_dict = {}
+ for index in range(26):
+ drive_letter = chr(ord('A') + index)
+ target_path = _query_subst_drive(drive_letter)
+ if target_path != '':
+ subst_dict[drive_letter] = target_path
+ return subst_dict
--
2.27.0.windows.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for subst drives
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for " Nate DeSimone
2020-09-28 21:17 ` Bjorge, Erik C
@ 2020-10-08 22:56 ` Ashley E Desimone
1 sibling, 0 replies; 7+ messages in thread
From: Ashley E Desimone @ 2020-10-08 22:56 UTC (permalink / raw)
To: Desimone, Nathaniel L, devel@edk2.groups.io
Cc: Pandya, Puja, Bret Barkelew, Agyeman, Prince, Bjorge, Erik C
Reviewed-by: Ashley DeSimone <ashley.e.desimone@intel.com>
-----Original Message-----
From: Nate DeSimone <nathaniel.l.desimone@intel.com>
Sent: Friday, September 25, 2020 6:28 PM
To: devel@edk2.groups.io
Cc: Desimone, Ashley E <ashley.e.desimone@intel.com>; Pandya, Puja <puja.pandya@intel.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>; Agyeman, Prince <prince.agyeman@intel.com>; Bjorge, Erik C <erik.c.bjorge@intel.com>
Subject: [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for subst drives
get_workspace_path() now converts a virtual drive path to a real path before any git repo operations are done.
Cc: Ashley E Desimone <ashley.e.desimone@intel.com>
Cc: Puja Pandya <puja.pandya@intel.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Cc: Erik Bjorge <erik.c.bjorge@intel.com>
Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
edkrepo/commands/clone_command.py | 8 ++++++++ edkrepo/config/config_factory.py | 10 +++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/edkrepo/commands/clone_command.py b/edkrepo/commands/clone_command.py
index f638090..8769102 100644
--- a/edkrepo/commands/clone_command.py
+++ b/edkrepo/commands/clone_command.py
@@ -9,6 +9,7 @@
import os
import shutil
+import sys
from edkrepo.commands.edkrepo_command import EdkrepoCommand from edkrepo.commands.edkrepo_command import SubmoduleSkipArgument, SourceManifestRepoArgument @@ -20,6 +21,7 @@ from edkrepo.common.edkrepo_exception import EdkrepoInvalidParametersException,
from edkrepo.common.edkrepo_exception import EdkrepoManifestNotFoundException from edkrepo.common.humble import CLONE_INVALID_WORKSPACE, CLONE_INVALID_PROJECT_ARG, CLONE_INVALID_COMBO_ARG from edkrepo.common.humble import SPARSE_CHECKOUT, CLONE_INVALID_LOCAL_ROOTS
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo.common.workspace_maintenance.workspace_maintenance import case_insensitive_single_match from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import pull_all_manifest_repos, find_project_in_all_indices from edkrepo.common.workspace_maintenance.manifest_repos_maintenance import list_available_manifest_repos @@ -77,6 +79,12 @@ class CloneCommand(EdkrepoCommand):
workspace_dir = os.getcwd()
else:
workspace_dir = os.path.abspath(workspace_dir)
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(workspace_dir)[0][0].upper()
+ if drive in subst:
+ workspace_dir = os.path.join(subst[drive], os.path.splitdrive(workspace_dir)[1][1:])
+ workspace_dir = os.path.normpath(workspace_dir)
if os.path.isdir(workspace_dir) and os.listdir(workspace_dir):
raise EdkrepoInvalidParametersException(CLONE_INVALID_WORKSPACE)
if not os.path.isdir(workspace_dir):
diff --git a/edkrepo/config/config_factory.py b/edkrepo/config/config_factory.py
index a82a438..fe69460 100644
--- a/edkrepo/config/config_factory.py
+++ b/edkrepo/config/config_factory.py
@@ -11,13 +11,16 @@ import os
import sys
import configparser
import collections
-from ctypes import *
+if sys.platform == "win32":
+ from ctypes import oledll, c_void_p, c_uint32, c_wchar_p
+ from ctypes import create_unicode_buffer
import edkrepo.config.humble.config_factory_humble as humble from edkrepo.common.edkrepo_exception import EdkrepoGlobalConfigNotFoundException, EdkrepoConfigFileInvalidException from edkrepo.common.edkrepo_exception import EdkrepoWorkspaceInvalidException, EdkrepoGlobalDataDirectoryNotFoundException
from edkrepo.common.edkrepo_exception import EdkrepoConfigFileReadOnlyException
from edkrepo.common.humble import MIRROR_PRIMARY_REPOS_MISSING, MIRROR_DECODE_WARNING, MAX_PATCH_SET_INVALID
+from edkrepo.common.pathfix import get_subst_drive_dict
from edkrepo_manifest_parser import edk_manifest from edkrepo.common.pathfix import expanduser
@@ -238,6 +241,11 @@ def get_workspace_path():
while True:
if os.path.isdir(os.path.join(path, "repo")):
if os.path.isfile(os.path.join(os.path.join(path, "repo"), "Manifest.xml")):
+ if sys.platform == "win32":
+ subst = get_subst_drive_dict()
+ drive = os.path.splitdrive(path)[0][0].upper()
+ if drive in subst:
+ path = os.path.join(subst[drive],
+ os.path.splitdrive(path)[1][1:])
return path
if os.path.dirname(path) == path:
break
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-10-08 22:56 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-26 1:28 [edk2-staging/EdkRepo] [PATCH V3 0/2] EdkRepo: Add support for SUBST drives Nate DeSimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Nate DeSimone
2020-09-28 21:16 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
2020-09-26 1:28 ` [edk2-staging/EdkRepo] [PATCH V3 2/2] EdkRepo: Add support for " Nate DeSimone
2020-09-28 21:17 ` Bjorge, Erik C
2020-10-08 22:56 ` Ashley E Desimone
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox