o3de.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import argparse
  9. import logging
  10. import pathlib
  11. import sys
  12. logger = logging.getLogger('o3de')
  13. def add_args(parser: argparse.ArgumentParser) -> None:
  14. """
  15. add_args is called to add expected parser arguments and subparsers arguments to each command such that it can be
  16. invoked by o3de.py
  17. Ex o3de.py can invoke the register downloadable commands by importing register,
  18. call add_args and execute: python o3de.py register --gem-path "C:/TestGem"
  19. :param parser: the caller instantiates an ArgumentParser and passes it in here
  20. """
  21. subparsers = parser.add_subparsers(help='To get help on a sub-command:\no3de.py <sub-command> -h',
  22. title='Sub-Commands')
  23. # As o3de.py shares the same name as the o3de package attempting to use a regular
  24. # from o3de import <module> line tries to import from the current o3de.py script and not the package
  25. # So the {current script directory} / 'o3de' is added to the front of the sys.path
  26. script_dir = pathlib.Path(__file__).parent
  27. o3de_package_dir = (script_dir / 'o3de').resolve()
  28. # add the scripts/o3de directory to the front of the sys.path
  29. sys.path.insert(0, str(o3de_package_dir))
  30. from o3de import android, engine_properties, engine_template, gem_properties, \
  31. global_project, register, print_registration, get_registration, \
  32. enable_gem, disable_gem, project_properties, sha256, download, \
  33. export_project, repo, repo_properties
  34. # Remove the temporarily added path
  35. sys.path = sys.path[1:]
  36. # global project
  37. global_project.add_args(subparsers)
  38. # engine template
  39. engine_template.add_args(subparsers)
  40. # registration
  41. register.add_args(subparsers)
  42. # show registration
  43. print_registration.add_args(subparsers)
  44. # get registration
  45. get_registration.add_args(subparsers)
  46. # add a gem to a project
  47. enable_gem.add_args(subparsers)
  48. # remove a gem from a project
  49. disable_gem.add_args(subparsers)
  50. # modify engine properties
  51. engine_properties.add_args(subparsers)
  52. # modify project properties
  53. project_properties.add_args(subparsers)
  54. # modify gem properties
  55. gem_properties.add_args(subparsers)
  56. # sha256
  57. sha256.add_args(subparsers)
  58. # download
  59. download.add_args(subparsers)
  60. # export_project
  61. export_project.add_args(subparsers)
  62. # repo
  63. repo.add_args(subparsers)
  64. # modify remote repo
  65. repo_properties.add_args(subparsers)
  66. # Android
  67. android.add_args(subparsers)
  68. if __name__ == "__main__":
  69. # parse the command line args
  70. the_parser = argparse.ArgumentParser()
  71. # add args to the parser
  72. add_args(the_parser)
  73. # if empty print help
  74. if len(sys.argv) == 1:
  75. the_parser.print_help(sys.stderr)
  76. sys.exit(1)
  77. # parse args
  78. # argparse stores unknown arguments separately as a tuple,
  79. # not packed in the same NameSpace as known arguments
  80. known_args, unknown_args = the_parser.parse_known_args()
  81. if hasattr(known_args, 'accepts_partial_args'):
  82. ret = known_args.func(known_args, unknown_args) if hasattr(known_args, 'func') else 1
  83. elif unknown_args:
  84. # since we expect every command which doesn't accept partial args to process only known args,
  85. # if we face unknown args in such cases, we should throw an error.
  86. # parse_args() calls parse_known_args() and will issue an error
  87. # https://hg.python.org/cpython/file/bb9fc884a838/Lib/argparse.py#l1725
  88. the_parser.parse_args()
  89. else:
  90. ret = known_args.func(known_args) if hasattr(known_args, 'func') else 1
  91. # run
  92. logger.info('Success!' if ret == 0 else 'Completed with issues: result {}'.format(ret))
  93. # return
  94. sys.exit(ret)