summaryrefslogtreecommitdiff
path: root/Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py
diff options
context:
space:
mode:
Diffstat (limited to 'Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py')
-rw-r--r--Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py b/Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py
new file mode 100644
index 00000000..31ed44cf
--- /dev/null
+++ b/Platform/Intel/Tools/AppendPackagesPath/GetPackagesPath.py
@@ -0,0 +1,98 @@
+## @file
+# Get all recursive package paths from special directories.
+#
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+import os
+import glob
+import argparse
+
+#
+# Globals for help information
+#
+__prog__ = 'GetPackagesPath.py'
+__copyright__ = 'Copyright (c) 2020, Intel Corporation. All rights reserved.'
+__description__ = 'Gets all recursive package paths in specified directory.\n'
+
+def __get_packages_path(root):
+ """ Gets all recursive package paths in specified directory.
+ A directory is a package path if it satisfies conditions below:
+ 1. it is a directory
+ 2. it is not an EDK II Package. An EDK II Package (directory) is
+ a directory that contains an EDK II package declaration (DEC) file.
+ 3. it contains at least one first level EDK II Package.
+ Note: A directory is not package path but its subdirectory could be.
+ Example: edk2-platforms/Features is not package path
+ but edk2-platforms/Features/Intel is.
+
+ :param root: The specified directory to find package paths in it,
+ the caller should ensure it is an valid directory
+ :type root: String
+ :returns: Return all recursive package paths
+ :rtype: String list
+ """
+
+ paths = []
+ contain_package = False
+ for filename in os.listdir(root):
+ # skip files whose name starts with ".", such as ".git"
+ if filename.startswith('.'):
+ continue
+ filepath = os.path.join(root, filename)
+ if os.path.isdir(filepath):
+ if glob.glob(os.path.join(filepath, '*.dec')):
+ # it is an EDK II Package
+ contain_package = True
+ else:
+ # get package paths for subdirectory if it is not package
+ paths = paths + __get_packages_path(filepath)
+
+ if contain_package:
+ # root is a package path because it contains EDK II Package
+ # in first level folder, inset it to head of list
+ paths.insert(0, root)
+
+ # return package paths
+ return paths
+
+def get_packages_path(directories):
+ """ For each direcory in directories, gets all recursive package paths
+ in this directory and joins them into one string.
+
+ :param directories: the list of directory
+ :type directories: String list
+ :returns: Return string of package paths
+ :rtype: String
+ """
+
+ packages_path = ''
+ for directory in directories:
+ directory = os.path.abspath(directory)
+ if (not os.path.exists(directory)) or (not os.path.isdir(directory)):
+ continue
+
+ if glob.glob(os.path.join(directory, '*.dec')):
+ # it is an EDK II Package
+ continue
+
+ paths = __get_packages_path(directory)
+ for path in paths:
+ if packages_path == '':
+ packages_path = path
+ else:
+ packages_path += os.pathsep + path
+ return packages_path
+
+if __name__ == '__main__':
+ # Create command line argument parser object
+ parser = argparse.ArgumentParser(
+ prog=__prog__,
+ description=__description__ + __copyright__,
+ conflict_handler='resolve'
+ )
+ parser.add_argument('directory', nargs='+',
+ help='Specified directory where package packages are got from')
+ args = parser.parse_args()
+ print(get_packages_path(args.directory))