From b8911c38ae3f9d5a3b78254fde4ced624c1f8261 Mon Sep 17 00:00:00 2001 From: Thomas Boyer-Chammard <49786685+thomas-bc@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:13:20 -0800 Subject: [PATCH] Add submodule information to version-check (#232) * Add submodule information in version-check command * spelling --- .github/actions/spelling/expect.txt | 1 + src/fprime/util/cli.py | 8 ++- src/fprime/util/commands.py | 84 +++++++++++++++++------------ 3 files changed, 58 insertions(+), 35 deletions(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 1902fe7a..bc5bd029 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -77,6 +77,7 @@ fileobj filepath firest floordiv +foreach FPGA fpl fpp diff --git a/src/fprime/util/cli.py b/src/fprime/util/cli.py index 1f2cf3a6..d90cb5ae 100644 --- a/src/fprime/util/cli.py +++ b/src/fprime/util/cli.py @@ -118,7 +118,7 @@ def add_special_parsers( formatter_class=argparse.RawDescriptionHelpFormatter, ) - subparsers.add_parser( + version_parser = subparsers.add_parser( "version-check", description=help_text.long("version-check"), help=help_text.short("version-check"), @@ -126,6 +126,12 @@ def add_special_parsers( add_help=False, formatter_class=argparse.RawDescriptionHelpFormatter, ) + version_parser.add_argument( + "--all-submodules", + default=False, + action="store_true", + help="Print all submodules for version information. Defaults to only public F´ repositories, for privacy.", + ) # New functionality new_parser = subparsers.add_parser( diff --git a/src/fprime/util/commands.py b/src/fprime/util/commands.py index f27b2dcc..0513fc53 100644 --- a/src/fprime/util/commands.py +++ b/src/fprime/util/commands.py @@ -15,6 +15,11 @@ import sys from pathlib import Path from typing import Dict, List +import subprocess +import platform +import pkg_resources +import pip + from fprime.fbuild.builder import Build, InvalidBuildCacheException from fprime.util.code_formatter import ClangFormatter @@ -192,43 +197,25 @@ def run_code_format( def run_version_check( base: Build, parsed: argparse.Namespace, _: Dict[str, str], __: Dict[str, str], ___ ): - """Print out versions to help debugging""" - - try: - import platform - - print(f"Operating System: {platform.system()}") - print(f"CPU Architecture: {platform.machine()}") - print(f"Platform: {platform.platform()}") - print(f"Python version: {platform.python_version()}") - except ImportError: # Python >=3.6 - print("[WARNING] Cannot import 'platform'.") - - try: - import subprocess - - cmake_version = ( - subprocess.check_output(["cmake", "--version"]) - .decode("utf-8") - .splitlines()[0] - .split()[2] - ) - print(f"CMake version: {cmake_version}") - except ImportError: # Python >=3.6 - print("[WARNING] Cannot import 'subprocess'.") + """Print out versions to help debugging - try: - import pip + This prints out versions of tools such as Python, CMake, and F Prime packages. + This will also print submodules information. Only submodules in github.com are printed, + unless all submodules are requested with --all-submodules.""" - print(f"Pip version: {pip.__version__}") - except ModuleNotFoundError: # Python >=3.6 - print("[WARNING] Cannot import 'Pip'.") + print(f"Operating System: {platform.system()}") + print(f"CPU Architecture: {platform.machine()}") + print(f"Platform: {platform.platform()}") + print(f"Python version: {platform.python_version()}") - try: - import pkg_resources - except ModuleNotFoundError: # Python >=3.6 - print("[WARNING] Cannot import 'pkg_resources'. Will not check tool versions.") - return + cmake_version = ( + subprocess.check_output(["cmake", "--version"]) + .decode("utf-8") + .splitlines()[0] + .split()[2] + ) + print(f"CMake version: {cmake_version}") + print(f"Pip version: {pip.__version__}") print("Pip packages:") # Used to print fprime-fpp-* versions together if they are all the same to de-clutter the output @@ -248,3 +235,32 @@ def run_version_check( else: for tool, version in fpp_packages.items(): print(f" {tool}=={version}") + + try: + out = ( + subprocess.check_output( + [ + "git", + "submodule", + "--quiet", + "foreach", + "--recursive", + "git remote get-url origin && git describe --tags --always", + ] + ) + .decode("utf-8") + .splitlines() + ) + fprime_version_pairs = [(out[i], out[i + 1]) for i in range(0, len(out), 2)] + if fprime_version_pairs: + print(f"Project submodules:") + for remote, version in fprime_version_pairs: + # Filter out by remotes unless all submodules are requested (for privacy reasons) + if ( + "github.com/nasa" in remote + or "github.com/fprime-community" in remote + or parsed.all_submodules + ): + print(f" {remote} @ {version}") + except: + print("[WARNING] Failed to retrieve submodule version information.")