From a2a738495ed1b8602c67efc28827d993b1b47150 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 18 Jul 2023 12:49:23 +0200 Subject: Merging upstream version 0.16.6.1. Signed-off-by: Daniel Baumann --- gita/info.py | 82 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 28 deletions(-) (limited to 'gita/info.py') diff --git a/gita/info.py b/gita/info.py index bfb463b..10d8bea 100644 --- a/gita/info.py +++ b/gita/info.py @@ -1,8 +1,8 @@ -import os import csv import subprocess from enum import Enum from pathlib import Path +from collections import namedtuple from functools import lru_cache, partial from typing import Tuple, List, Callable, Dict @@ -41,11 +41,11 @@ class Color(Enum): default_colors = { - "no-remote": Color.white.name, - "in-sync": Color.green.name, + "no_remote": Color.white.name, + "in_sync": Color.green.name, "diverged": Color.red.name, - "local-ahead": Color.purple.name, - "remote-ahead": Color.yellow.name, + "local_ahead": Color.purple.name, + "remote_ahead": Color.yellow.name, } @@ -195,49 +195,75 @@ def get_commit_time(prop: Dict[str, str]) -> str: return f"({result.stdout.strip()})" +default_symbols = { + "dirty": "*", + "staged": "+", + "untracked": "?", + "local_ahead": "↑", + "remote_ahead": "↓", + "diverged": "⇕", + "in_sync": "", + "no_remote": "∅", + "": "", +} + + +@lru_cache() +def get_symbols() -> Dict[str, str]: + """ + return status symbols with customization + """ + custom = {} + csv_config = Path(common.get_config_fname("symbols.csv")) + if csv_config.is_file(): + with open(csv_config, "r") as f: + reader = csv.DictReader(f) + custom = next(reader) + default_symbols.update(custom) + return default_symbols + + def get_repo_status(prop: Dict[str, str], no_colors=False) -> str: - head = get_head(prop["path"]) - dirty, staged, untracked, color = _get_repo_status(prop, no_colors) - info = f"{head:<10} [{dirty+staged+untracked}]" - if color: - return f"{color}{info:<17}{Color.end}" - return f"{info:<17}" + branch = get_head(prop["path"]) + dirty, staged, untracked, situ = _get_repo_status(prop) + symbols = get_symbols() + info = f"{branch:<10} [{symbols[dirty]+symbols[staged]+symbols[untracked]+symbols[situ]}]" + + if no_colors: + return f"{info:<18}" + colors = {situ: Color[name].value for situ, name in get_color_encoding().items()} + color = colors[situ] + return f"{color}{info:<18}{Color.end}" def get_repo_branch(prop: Dict[str, str]) -> str: return get_head(prop["path"]) -def _get_repo_status(prop: Dict[str, str], no_colors: bool) -> Tuple[str]: +def _get_repo_status(prop: Dict[str, str]) -> Tuple[str, str, str, str]: """ Return the status of one repo """ path = prop["path"] flags = prop["flags"] - dirty = "*" if run_quiet_diff(flags, [], path) else "" - staged = "+" if run_quiet_diff(flags, ["--cached"], path) else "" - untracked = "?" if has_untracked(flags, path) else "" - - if no_colors: - return dirty, staged, untracked, "" + dirty = "dirty" if run_quiet_diff(flags, [], path) else "" + staged = "staged" if run_quiet_diff(flags, ["--cached"], path) else "" + untracked = "untracked" if has_untracked(flags, path) else "" - colors = {situ: Color[name].value for situ, name in get_color_encoding().items()} diff_returncode = run_quiet_diff(flags, ["@{u}", "@{0}"], path) - has_no_remote = diff_returncode == 128 - has_no_diff = diff_returncode == 0 - if has_no_remote: - color = colors["no-remote"] - elif has_no_diff: - color = colors["in-sync"] + if diff_returncode == 128: + situ = "no_remote" + elif diff_returncode == 0: + situ = "in_sync" else: common_commit = get_common_commit(path) outdated = run_quiet_diff(flags, ["@{u}", common_commit], path) if outdated: diverged = run_quiet_diff(flags, ["@{0}", common_commit], path) - color = colors["diverged"] if diverged else colors["remote-ahead"] + situ = "diverged" if diverged else "remote_ahead" else: # local is ahead of remote - color = colors["local-ahead"] - return dirty, staged, untracked, color + situ = "local_ahead" + return dirty, staged, untracked, situ ALL_INFO_ITEMS = { -- cgit v1.2.3