def show_version(self, skip_version_check): local_version = pkg_resources.get_distribution("gitlabform").version tower_crane = cli_ui.Symbol("🏗", "") tokens_to_show = [ cli_ui.reset, tower_crane, " GitLabForm version:", cli_ui.blue, local_version, cli_ui.reset, ] cli_ui.message(*tokens_to_show, end="") if skip_version_check: # just print end of the line print() else: latest_version = luddite.get_version_pypi("gitlabform") if local_version == latest_version: happy = cli_ui.Symbol("😊", "") tokens_to_show = [ "= the latest stable ", happy, ] elif packaging_version.parse( local_version) < packaging_version.parse(latest_version): sad = cli_ui.Symbol("😔", "") tokens_to_show = [ "= outdated ", sad, f", please update! (the latest stable is ", cli_ui.blue, latest_version, cli_ui.reset, ")", ] else: excited = cli_ui.Symbol("🤩", "") tokens_to_show = [ "= pre-release ", excited, f" (the latest stable is ", cli_ui.blue, latest_version, cli_ui.reset, ")", ] cli_ui.message(*tokens_to_show, sep="")
def describe_position(git_status: tsrc.git.Status) -> List[str]: res = [] # type: List[ui.Token] if git_status.ahead != 0: up = ui.Symbol("↑", "+") n_commits = commit_string(git_status.ahead) ahead_desc = "{}{} {}".format(up.as_string, git_status.ahead, n_commits) res += [ui.blue, ahead_desc, ui.reset] if git_status.behind != 0: down = ui.Symbol("↓", "-") n_commits = commit_string(git_status.behind) behind_desc = "{}{} {}".format(down.as_string, git_status.behind, n_commits) res += [ui.blue, behind_desc, ui.reset] return res
""" git tools """ import os import subprocess from pathlib import Path from typing import Any, Dict, Iterable, List, Optional, Tuple import cli_ui as ui from tsrc.errors import Error UP = ui.Symbol("↑", "+").as_string DOWN = ui.Symbol("↓", "-").as_string class GitError(Error): pass class GitCommandError(GitError): def __init__(self, working_path: Path, cmd: Iterable[str], *, output: Optional[str] = None) -> None: self.cmd = cmd self.working_path = working_path self.output = output cmd_str = " ".join(cmd) message = f"`git {cmd_str}` from {working_path} failed" if output:
def process_all(self, projects_and_groups, groups): group_number = 0 successful_groups = 0 failed_groups = {} maybe_output_file = self.try_to_get_output_file() for group in groups: group_number += 1 if group_number < self.start_from_group: info_group_count( "@", group_number, len(groups), cli_ui.yellow, f"Skipping group {group} as requested to start from {self.start_from_group}...", cli_ui.reset, ) continue configuration = self.configuration.get_effective_config_for_group( group) if configuration: info_group_count("@", group_number, len(groups), f"Processing group: {group}") self.try_to_write_header_to_output_file( group, maybe_output_file) try: self.group_processors.process_group( group, configuration, dry_run=self.noop, output_file=maybe_output_file, ) successful_groups += 1 except Exception as e: failed_groups[group_number] = group trace = traceback.format_exc() message = f"Error occurred while processing group {group}, exception:\n\n{e}\n\n{trace}" if self.terminate_after_error: self.try_to_close_output_file(maybe_output_file) cli_ui.error(message) sys.exit(EXIT_PROCESSING_ERROR) else: cli_ui.warning(message) finally: logging.debug( f"@ ({group_number}/{len(groups)}) FINISHED Processing group: {group}" ) else: self.try_to_write_header_to_output_file(group, maybe_output_file, empty_config=True) info_group_count( "@", group_number, len(groups), cli_ui.yellow, f"Skipping group {group} as it has empty effective config.", cli_ui.reset, ) project_number = 0 successful_projects = 0 failed_projects = {} for project_and_group in projects_and_groups: project_number += 1 if project_number < self.start_from: info_project_count( "*", project_number, len(projects_and_groups), cli_ui.yellow, f"Skipping project {project_and_group} as requested to start from {self.start_from}...", cli_ui.reset, ) continue configuration = self.configuration.get_effective_config_for_project( project_and_group) if configuration: info_project_count( "*", project_number, len(projects_and_groups), f"Processing project: {project_and_group}", ) self.try_to_write_header_to_output_file( project_and_group, maybe_output_file) try: self.project_processors.process_project( project_and_group, configuration, dry_run=self.noop, output_file=maybe_output_file, ) successful_projects += 1 except Exception as e: failed_projects[project_number] = project_and_group trace = traceback.format_exc() message = f"Error occurred while processing project {project_and_group}, exception:\n\n{e}\n\n{trace}" if self.terminate_after_error: self.try_to_close_output_file(maybe_output_file) cli_ui.error(message) sys.exit(EXIT_PROCESSING_ERROR) else: cli_ui.warning(message) finally: logging.debug( f"* ({project_number}/{len(projects_and_groups)}) FINISHED Processing project: {project_and_group}", ) else: self.try_to_write_header_to_output_file(project_and_group, maybe_output_file, empty_config=True) info_project_count( "*", project_number, len(projects_and_groups), cli_ui.yellow, f"Skipping project {project_and_group} as it has empty effective config.", cli_ui.reset, ) self.try_to_close_output_file(maybe_output_file) cli_ui.info_1( f"# of groups processed successfully: {successful_groups}") cli_ui.info_1( f"# of projects processed successfully: {successful_projects}") if len(failed_groups) > 0: cli_ui.info_1(cli_ui.red, f"# of groups failed: {len(failed_groups)}", cli_ui.reset) for group_number in failed_groups.keys(): cli_ui.info_1( cli_ui.red, f"Failed group {group_number}: {failed_groups[group_number]}", cli_ui.reset, ) if len(failed_projects) > 0: cli_ui.info_1( cli_ui.red, f"# of projects failed: {len(failed_projects)}", cli_ui.reset, ) for project_number in failed_projects.keys(): cli_ui.info_1( cli_ui.red, f"Failed project {project_number}: {failed_projects[project_number]}", cli_ui.reset, ) if len(failed_groups) > 0 or len(failed_projects) > 0: sys.exit(EXIT_PROCESSING_ERROR) elif successful_groups > 0 or successful_projects > 0: shine = cli_ui.Symbol("✨", "!!!") cli_ui.info_1( cli_ui.green, f"All requested groups/projects processes successfully!", cli_ui.reset, shine, )