From 9d84f5c97652fed9170085d2c09bb0c117cd639c Mon Sep 17 00:00:00 2001 From: Benjamin Milan Date: Thu, 26 Feb 2026 13:33:42 +0000 Subject: [PATCH 1/4] sc show start --- src/sc/branching/commands/show.py | 50 +++++++++++++++++++++++++++++++ src/sc/branching_cli.py | 28 +++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/sc/branching/commands/show.py diff --git a/src/sc/branching/commands/show.py b/src/sc/branching/commands/show.py new file mode 100644 index 0000000..bf2a78a --- /dev/null +++ b/src/sc/branching/commands/show.py @@ -0,0 +1,50 @@ +# Copyright 2025 RDK Management +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from dataclasses import dataclass + +from sc_manifest_parser import ScManifest + +from .command import Command + +@dataclass +class ShowBranch(Command): + def run_git_command(self): + pass + + def run_repo_command(self): + return super().run_repo_command() + +@dataclass +class ShowTag(Command): + def run_git_command(self): + pass + + def run_repo_command(self): + return super().run_repo_command() + +@dataclass +class ShowGroup(Command): + def run_git_command(self): + pass + + def run_repo_command(self): + return super().run_repo_command() + +@dataclass +class ShowRepoFlowConfig(Command): + def run_git_command(self): + pass + + def run_repo_command(self): + return super().run_repo_command() diff --git a/src/sc/branching_cli.py b/src/sc/branching_cli.py index b29aadb..0dae94e 100644 --- a/src/sc/branching_cli.py +++ b/src/sc/branching_cli.py @@ -299,5 +299,33 @@ def checkout(name, force, verify): """Checkout a support branch.""" SCBranching.checkout(BranchType.SUPPORT, name, force, verify) +@cli.group() +def show(): + """sc show commands.""" + pass + +@show.command() +def branch(): + """Show the current status of branching.""" + pass + +@show.command() +@click.argument("tag") +def tag(tag): + """Show information about a tag.""" + pass + +@show.command() +@click.argument("group") +def group(group): + """Show information about a group.""" + pass + +@show.command() +def repo_flow_config(): + """Show git flow config for all projects.""" + pass + + if __name__ == '__main__': cli() From 16aea5ff507e9ee748b9389f2f24f12b61eecf3a Mon Sep 17 00:00:00 2001 From: Benjamin Milan Date: Fri, 27 Feb 2026 10:06:57 +0000 Subject: [PATCH 2/4] sc show --- src/sc/branching/branching.py | 25 +++++++ src/sc/branching/commands/show.py | 107 ++++++++++++++++++++++++++++-- src/sc/branching_cli.py | 8 +-- 3 files changed, 129 insertions(+), 11 deletions(-) diff --git a/src/sc/branching/branching.py b/src/sc/branching/branching.py index 2f4a0b9..d93c971 100644 --- a/src/sc/branching/branching.py +++ b/src/sc/branching/branching.py @@ -28,6 +28,7 @@ from .commands.list import List from .commands.pull import Pull from .commands.push import Push +from .commands.show import ShowBranch, ShowGroup, ShowRepoFlowConfig from .commands.start import Start from .commands.status import Status from .commands.reset import Reset @@ -150,6 +151,30 @@ def list(branch_type: BranchType, run_dir: Path = Path.cwd()): project_type ) + @staticmethod + def show_branch(run_dir: Path = Path.cwd()): + top_dir, project_type = detect_project(run_dir) + run_command_by_project_type( + ShowBranch(top_dir), + project_type + ) + + @staticmethod + def show_group(group: str | None, run_dir: Path = Path.cwd()): + top_dir, project_type = detect_project(run_dir) + run_command_by_project_type( + ShowGroup(top_dir, group), + project_type + ) + + @staticmethod + def show_repo_flow_config(run_dir: Path = Path.cwd()): + top_dir, project_type = detect_project(run_dir) + run_command_by_project_type( + ShowRepoFlowConfig(top_dir), + project_type + ) + def detect_project(run_dir: Path) -> tuple[Path | ProjectType]: if root := RepoLibrary.get_repo_root_dir(run_dir): return root.parent, ProjectType.REPO diff --git a/src/sc/branching/commands/show.py b/src/sc/branching/commands/show.py index bf2a78a..1adf77b 100644 --- a/src/sc/branching/commands/show.py +++ b/src/sc/branching/commands/show.py @@ -11,19 +11,32 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +"""Commands to display information about a repo or sc project.""" + from dataclasses import dataclass +import logging +from pathlib import Path +import subprocess -from sc_manifest_parser import ScManifest +from git import Repo +from sc_manifest_parser import ProjectElementInterface, ScManifest from .command import Command +logger = logging.getLogger(__name__) + @dataclass class ShowBranch(Command): + """Show branch information for all repositories.""" def run_git_command(self): - pass + _show_branch(self.top_dir) def run_repo_command(self): - return super().run_repo_command() + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + for proj in manifest.projects: + _show_project(self.top_dir, proj) + print() + logger.info("-" * 100) @dataclass class ShowTag(Command): @@ -35,16 +48,96 @@ def run_repo_command(self): @dataclass class ShowGroup(Command): + """List groups or show information about a particular group.""" + group: str | None + def run_git_command(self): - pass + logger.error("`sc show group` must be ran inside a repo project!") def run_repo_command(self): - return super().run_repo_command() + if self.group: + self._show_group_info() + else: + self._list_groups() + + def _show_group_info(self): + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + group_shown = False + for proj in manifest.projects: + project_groups = proj.groups + if not project_groups or self.group not in project_groups.split(","): + continue + + group_shown = True + _show_project(self.top_dir, proj) + print() + logger.info("-" * 100) + + if not group_shown: + logger.warning(f"No project matching group `{self.group}` found!") + + def _list_groups(self): + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + groups = [] + for proj in manifest.projects: + project_groups = proj.groups + if project_groups: + groups.extend(project_groups.split(",")) + groups = self._remove_duplicates(groups) + for group in groups: + logger.info(f"[{group}]") + + def _remove_duplicates(self, target_list: list) -> list: + return(list(dict.fromkeys(target_list))) + @dataclass class ShowRepoFlowConfig(Command): + """Show git flow config for all projects.""" def run_git_command(self): - pass + logger.error("`sc show repo_flow_config` must be ran inside a repo project!") def run_repo_command(self): - return super().run_repo_command() + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + for proj in manifest.projects: + proj_dir = self.top_dir / proj.path + logger.info(f"Repo Flow Config: {proj_dir}") + result = subprocess.run( + ["git", "config", "--list"], + cwd=proj_dir, + capture_output=True, + text=True, + check=False + ) + + for line in result.stdout.splitlines(): + if "gitflow" in line: + print(line) + + print() + logger.info("-" * 100) + +def _show_project(top_dir: Path, proj: ProjectElementInterface): + """Show information pertaining to a particular project.""" + proj_dir = top_dir / proj.path + logger.info(f"Project: {proj_dir}") + logger.info(f"Lock Status: [{proj.lock_status or 'NORMAL'}]") + _show_branch(proj_dir) + +def _show_branch(repo_dir: Path): + """Show remotes and branches of a git repo.""" + repo = Repo(repo_dir) + if repo.remotes: + remote = repo.remotes[0] + url = next(remote.urls) + remote_status = f"{remote.name} {url}" + else: + remote_status = "No remotes configured" + + logger.info(f"Remote Status: {remote_status}") + + subprocess.run( + ["git", "branch", "-vv", "--color=always"], + cwd=repo_dir, + check=False + ) diff --git a/src/sc/branching_cli.py b/src/sc/branching_cli.py index 0dae94e..f3acde3 100644 --- a/src/sc/branching_cli.py +++ b/src/sc/branching_cli.py @@ -307,7 +307,7 @@ def show(): @show.command() def branch(): """Show the current status of branching.""" - pass + SCBranching.show_branch() @show.command() @click.argument("tag") @@ -316,15 +316,15 @@ def tag(tag): pass @show.command() -@click.argument("group") +@click.argument("group", required=False) def group(group): """Show information about a group.""" - pass + SCBranching.show_group(group) @show.command() def repo_flow_config(): """Show git flow config for all projects.""" - pass + SCBranching.show_repo_flow_config() if __name__ == '__main__': From e999fc8ff02dbae5167a169ecf5302fcd9a1ea6c Mon Sep 17 00:00:00 2001 From: Benjamin Milan Date: Mon, 2 Mar 2026 14:09:02 +0000 Subject: [PATCH 3/4] sc show --- src/sc/branching/branching.py | 11 ++-- src/sc/branching/commands/common.py | 2 +- src/sc/branching/commands/group.py | 96 +++++++++++++++++++++++++++++ src/sc/branching/commands/show.py | 58 ++--------------- src/sc/branching/commands/tag.py | 2 +- src/sc/branching_cli.py | 60 ++++++++++-------- 6 files changed, 141 insertions(+), 88 deletions(-) create mode 100644 src/sc/branching/commands/group.py diff --git a/src/sc/branching/branching.py b/src/sc/branching/branching.py index bc16332..53c5711 100644 --- a/src/sc/branching/branching.py +++ b/src/sc/branching/branching.py @@ -26,11 +26,12 @@ from .commands.clean import Clean from .commands.command import Command from .commands.finish import Finish, FinishOperationError +from .commands.group import GroupShow from .commands.init import Init from .commands.list import List from .commands.pull import Pull from .commands.push import Push -from .commands.show import ShowBranch, ShowGroup, ShowRepoFlowConfig +from .commands.show import ShowBranch, ShowRepoFlowConfig from .commands.start import Start from .commands.status import Status from .commands.tag import TagCheck, TagCreate, TagList, TagPush, TagRm, TagShow @@ -208,18 +209,18 @@ def show_branch(run_dir: Path = Path.cwd()): ) @staticmethod - def show_group(group: str | None, run_dir: Path = Path.cwd()): + def show_repo_flow_config(run_dir: Path = Path.cwd()): top_dir, project_type = detect_project(run_dir) run_command_by_project_type( - ShowGroup(top_dir, group), + ShowRepoFlowConfig(top_dir), project_type ) @staticmethod - def show_repo_flow_config(run_dir: Path = Path.cwd()): + def group_show(group: str | None, run_dir: Path = Path.cwd()): top_dir, project_type = detect_project(run_dir) run_command_by_project_type( - ShowRepoFlowConfig(top_dir), + GroupShow(top_dir, group), project_type ) diff --git a/src/sc/branching/commands/common.py b/src/sc/branching/commands/common.py index 30d2686..ccf2d62 100644 --- a/src/sc/branching/commands/common.py +++ b/src/sc/branching/commands/common.py @@ -25,4 +25,4 @@ def get_alt_branch_name(branch: Branch, project: ProjectElementInterface) -> str return None def resolve_project_branch_name(branch: Branch, project: ProjectElementInterface) -> str: - return get_alt_branch_name(branch, project) or branch.name \ No newline at end of file + return get_alt_branch_name(branch, project) or branch.name diff --git a/src/sc/branching/commands/group.py b/src/sc/branching/commands/group.py new file mode 100644 index 0000000..c8b517d --- /dev/null +++ b/src/sc/branching/commands/group.py @@ -0,0 +1,96 @@ +# Copyright 2025 RDK Management +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Module for `sc show` functionality.""" + +from dataclasses import dataclass +import logging +from pathlib import Path +import subprocess +import sys + +from git import Repo +from sc_manifest_parser import ProjectElementInterface, ScManifest + +from .command import Command + +logger = logging.getLogger(__name__) + +@dataclass +class GroupShow(Command): + """List groups or show information about a particular group.""" + group: str | None + + def run_git_command(self): + logger.error("`sc show group` must be ran inside a repo project!") + + def run_repo_command(self): + if self.group: + self._show_group_info() + else: + self._list_groups() + + def _show_group_info(self): + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + group_shown = False + for proj in manifest.projects: + project_groups = proj.groups + if not project_groups or self.group not in project_groups.split(","): + continue + + group_shown = True + self._show_project(proj) + print() + logger.info("-" * 100) + + if not group_shown: + logger.warning(f"No project matching group `{self.group}` found!") + + def _list_groups(self): + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + groups = [] + for proj in manifest.projects: + project_groups = proj.groups + if project_groups: + groups.extend(project_groups.split(",")) + groups = self._remove_duplicates(groups) + for group in groups: + logger.info(f"[{group}]") + + def _remove_duplicates(self, target_list: list) -> list: + return(list(dict.fromkeys(target_list))) + + def _show_project(self, proj: ProjectElementInterface): + """Show information pertaining to a particular project.""" + proj_dir = self.top_dir / proj.path + logger.info(f"Project: {proj_dir}") + logger.info( + f"Lock Status: [bold yellow]\[{proj.lock_status or 'NORMAL'}][/]", + extra={"markup": True} + ) + + repo = Repo(proj_dir) + if repo.remotes: + remote = repo.remotes[0] + url = next(remote.urls) + remote_status = f"{remote.name} {url}" + else: + remote_status = "No remotes configured" + + logger.info(f"Remote Status: {remote_status}") + + subprocess.run( + ["git", "branch", "-vv", "--color=always"], + cwd=proj_dir, + check=False + ) diff --git a/src/sc/branching/commands/show.py b/src/sc/branching/commands/show.py index 1adf77b..ce95145 100644 --- a/src/sc/branching/commands/show.py +++ b/src/sc/branching/commands/show.py @@ -38,59 +38,6 @@ def run_repo_command(self): print() logger.info("-" * 100) -@dataclass -class ShowTag(Command): - def run_git_command(self): - pass - - def run_repo_command(self): - return super().run_repo_command() - -@dataclass -class ShowGroup(Command): - """List groups or show information about a particular group.""" - group: str | None - - def run_git_command(self): - logger.error("`sc show group` must be ran inside a repo project!") - - def run_repo_command(self): - if self.group: - self._show_group_info() - else: - self._list_groups() - - def _show_group_info(self): - manifest = ScManifest.from_repo_root(self.top_dir / '.repo') - group_shown = False - for proj in manifest.projects: - project_groups = proj.groups - if not project_groups or self.group not in project_groups.split(","): - continue - - group_shown = True - _show_project(self.top_dir, proj) - print() - logger.info("-" * 100) - - if not group_shown: - logger.warning(f"No project matching group `{self.group}` found!") - - def _list_groups(self): - manifest = ScManifest.from_repo_root(self.top_dir / '.repo') - groups = [] - for proj in manifest.projects: - project_groups = proj.groups - if project_groups: - groups.extend(project_groups.split(",")) - groups = self._remove_duplicates(groups) - for group in groups: - logger.info(f"[{group}]") - - def _remove_duplicates(self, target_list: list) -> list: - return(list(dict.fromkeys(target_list))) - - @dataclass class ShowRepoFlowConfig(Command): """Show git flow config for all projects.""" @@ -121,7 +68,10 @@ def _show_project(top_dir: Path, proj: ProjectElementInterface): """Show information pertaining to a particular project.""" proj_dir = top_dir / proj.path logger.info(f"Project: {proj_dir}") - logger.info(f"Lock Status: [{proj.lock_status or 'NORMAL'}]") + logger.info( + f"Lock Status: [bold yellow]\[{proj.lock_status or 'NORMAL'}][/]", + extra={"markup": True} + ) _show_branch(proj_dir) def _show_branch(repo_dir: Path): diff --git a/src/sc/branching/commands/tag.py b/src/sc/branching/commands/tag.py index 8838ed1..fdf46d3 100644 --- a/src/sc/branching/commands/tag.py +++ b/src/sc/branching/commands/tag.py @@ -67,7 +67,7 @@ def run_git_command(self): self._list_tags(self.top_dir) def run_repo_command(self): - logger.info(f"Tags in mainfest: {self.top_dir / '.repo' / 'manifests'}") + logger.info(f"Tags in manifest: {self.top_dir / '.repo' / 'manifests'}") self._list_tags(self.top_dir / '.repo' / 'manifests') def _list_tags(self, repo_path: Path): diff --git a/src/sc/branching_cli.py b/src/sc/branching_cli.py index 1526f23..8413c5c 100644 --- a/src/sc/branching_cli.py +++ b/src/sc/branching_cli.py @@ -295,33 +295,7 @@ def checkout(name, force, verify): """Checkout a support branch.""" SCBranching.checkout(BranchType.SUPPORT, name, force, verify) -@cli.group() -def show(): - """sc show commands.""" - pass - -@show.command() -def branch(): - """Show the current status of branching.""" - SCBranching.show_branch() - -@show.command() -@click.argument("tag") -def tag(tag): - """Show information about a tag.""" - pass - -@show.command() -@click.argument("group", required=False) -def group(group): - """Show information about a group.""" - SCBranching.show_group(group) - -@show.command() -def repo_flow_config(): - """Show git flow config for all projects.""" - SCBranching.show_repo_flow_config() - +@cli.group def tag(): pass @@ -361,5 +335,37 @@ def check(tag): """Check if a tag exists on all non READ_ONLY repos.""" SCBranching.tag_check(tag) +@cli.group() +def show(): + """sc show commands.""" + pass + +@show.command() +def branch(): + """Show the current status of branching.""" + SCBranching.show_branch() + +@show.command() +def repo_flow_config(): + """Show git flow config for all projects.""" + SCBranching.show_repo_flow_config() + +@show.command() +@click.argument("tag") +def tag(tag): + """Show information about a tag.""" + SCBranching.tag_show(tag) + +@show.command() +def tags(): + """List tags on the manifest.""" + SCBranching.tag_list() + +@show.command() +@click.argument("group", required=False) +def group(group): + """List groups or show information about a group.""" + SCBranching.group_show(group) + if __name__ == '__main__': cli() From 4d3f814a477b8453b93229a4e87907d72cc3df9c Mon Sep 17 00:00:00 2001 From: Benjamin Milan Date: Mon, 2 Mar 2026 15:10:45 +0000 Subject: [PATCH 4/4] gh35 implement sc show --- src/sc/branching/branching.py | 10 +++- src/sc/branching/commands/group.py | 4 +- src/sc/branching/commands/show.py | 87 ++++++++++++++++++++---------- src/sc/branching_cli.py | 6 ++- 4 files changed, 73 insertions(+), 34 deletions(-) diff --git a/src/sc/branching/branching.py b/src/sc/branching/branching.py index 53c5711..230356d 100644 --- a/src/sc/branching/branching.py +++ b/src/sc/branching/branching.py @@ -31,7 +31,7 @@ from .commands.list import List from .commands.pull import Pull from .commands.push import Push -from .commands.show import ShowBranch, ShowRepoFlowConfig +from .commands.show import ShowBranch, ShowLog, ShowRepoFlowConfig from .commands.start import Start from .commands.status import Status from .commands.tag import TagCheck, TagCreate, TagList, TagPush, TagRm, TagShow @@ -216,6 +216,14 @@ def show_repo_flow_config(run_dir: Path = Path.cwd()): project_type ) + @staticmethod + def show_log(run_dir: Path = Path.cwd()): + top_dir, project_type = detect_project(run_dir) + run_command_by_project_type( + ShowLog(top_dir), + project_type + ) + @staticmethod def group_show(group: str | None, run_dir: Path = Path.cwd()): top_dir, project_type = detect_project(run_dir) diff --git a/src/sc/branching/commands/group.py b/src/sc/branching/commands/group.py index c8b517d..1108ebf 100644 --- a/src/sc/branching/commands/group.py +++ b/src/sc/branching/commands/group.py @@ -11,13 +11,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Module for `sc show` functionality.""" +"""Module for `sc group` functionality.""" from dataclasses import dataclass import logging -from pathlib import Path import subprocess -import sys from git import Repo from sc_manifest_parser import ProjectElementInterface, ScManifest diff --git a/src/sc/branching/commands/show.py b/src/sc/branching/commands/show.py index ce95145..f4d6001 100644 --- a/src/sc/branching/commands/show.py +++ b/src/sc/branching/commands/show.py @@ -29,15 +29,52 @@ class ShowBranch(Command): """Show branch information for all repositories.""" def run_git_command(self): - _show_branch(self.top_dir) + self._show_branch(self.top_dir) def run_repo_command(self): manifest = ScManifest.from_repo_root(self.top_dir / '.repo') for proj in manifest.projects: - _show_project(self.top_dir, proj) + self._show_project(proj) print() logger.info("-" * 100) + def _show_project(self, proj: ProjectElementInterface): + """Show information pertaining to a particular project.""" + proj_dir = self.top_dir / proj.path + logger.info(f"Project: {proj_dir}") + logger.info( + f"Lock Status: \[[bold yellow]{proj.lock_status or 'NORMAL'}[/]]", + extra={"markup": True} + ) + + if proj.groups: + groups = proj.groups.split(",") + group_str = " ".join([f"\[[bold yellow]{g}[/]]" for g in groups]) + else: + group_str = "\[[red bold]No Groups[/]]" + + logger.info(f"Groups: {group_str}", extra={"markup": True}) + + self._show_branch(proj_dir) + + def _show_branch(self, repo_dir: Path): + """Show remotes and branches of a git repo.""" + repo = Repo(repo_dir) + if repo.remotes: + remote = repo.remotes[0] + url = next(remote.urls) + remote_status = f"{remote.name} {url}" + else: + remote_status = "No remotes configured" + + logger.info(f"Remote Status: {remote_status}") + + subprocess.run( + ["git", "branch", "-vv", "--color=always"], + cwd=repo_dir, + check=False + ) + @dataclass class ShowRepoFlowConfig(Command): """Show git flow config for all projects.""" @@ -64,30 +101,22 @@ def run_repo_command(self): print() logger.info("-" * 100) -def _show_project(top_dir: Path, proj: ProjectElementInterface): - """Show information pertaining to a particular project.""" - proj_dir = top_dir / proj.path - logger.info(f"Project: {proj_dir}") - logger.info( - f"Lock Status: [bold yellow]\[{proj.lock_status or 'NORMAL'}][/]", - extra={"markup": True} - ) - _show_branch(proj_dir) - -def _show_branch(repo_dir: Path): - """Show remotes and branches of a git repo.""" - repo = Repo(repo_dir) - if repo.remotes: - remote = repo.remotes[0] - url = next(remote.urls) - remote_status = f"{remote.name} {url}" - else: - remote_status = "No remotes configured" - - logger.info(f"Remote Status: {remote_status}") - - subprocess.run( - ["git", "branch", "-vv", "--color=always"], - cwd=repo_dir, - check=False - ) +@dataclass +class ShowLog(Command): + """Display most recent commit on all repositories.""" + def run_git_command(self): + self._show_log(self.top_dir) + + def run_repo_command(self): + manifest = ScManifest.from_repo_root(self.top_dir / '.repo') + for proj in manifest.projects: + logger.info(f"Project: {self.top_dir / proj.path}") + self._show_log(self.top_dir / proj.path) + logger.info("-" * 100) + + def _show_log(self, repo_dir: Path): + subprocess.run( + ["git", "log", "--pretty=oneline", "-n1"], + cwd=repo_dir, + check=False + ) diff --git a/src/sc/branching_cli.py b/src/sc/branching_cli.py index 8413c5c..003c6e8 100644 --- a/src/sc/branching_cli.py +++ b/src/sc/branching_cli.py @@ -295,7 +295,7 @@ def checkout(name, force, verify): """Checkout a support branch.""" SCBranching.checkout(BranchType.SUPPORT, name, force, verify) -@cli.group +@cli.group() def tag(): pass @@ -350,6 +350,10 @@ def repo_flow_config(): """Show git flow config for all projects.""" SCBranching.show_repo_flow_config() +@show.command() +def log(): + SCBranching.show_log() + @show.command() @click.argument("tag") def tag(tag):