|
@@ -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))
|