Skip to content

Commit 4dfa67a

Browse files
committed
log(feat): Add SimpleLogFormatter for clean CLI output
why: CLI commands need user-friendly output without log prefixes what: - Add SimpleLogFormatter class for message-only output - Configure CLI modules (add, add_from_fs, sync) to use simple formatter - Maintain debug formatter for core vcspull logger - Set propagate=False to prevent duplicate logging
1 parent fa0d3ba commit 4dfa67a

1 file changed

Lines changed: 39 additions & 9 deletions

File tree

src/vcspull/log.py

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,41 @@ def setup_logger(
3838
if not log:
3939
log = logging.getLogger()
4040
if not log.handlers:
41-
channel = logging.StreamHandler()
42-
channel.setFormatter(DebugLogFormatter())
41+
# Setup root vcspull logger with debug formatter
42+
vcspull_logger = logging.getLogger("vcspull")
43+
if not vcspull_logger.handlers:
44+
channel = logging.StreamHandler()
45+
channel.setFormatter(DebugLogFormatter())
46+
vcspull_logger.setLevel(level)
47+
vcspull_logger.addHandler(channel)
48+
vcspull_logger.propagate = False
49+
50+
# Setup simple formatter specifically for CLI modules
51+
# These modules provide user-facing output that should be clean
52+
cli_loggers = [
53+
"vcspull.cli.add",
54+
"vcspull.cli.add_from_fs",
55+
"vcspull.cli.sync",
56+
]
4357

44-
log.setLevel(level)
45-
log.addHandler(channel)
58+
for logger_name in cli_loggers:
59+
cli_logger = logging.getLogger(logger_name)
60+
if not cli_logger.handlers:
61+
cli_channel = logging.StreamHandler()
62+
cli_channel.setFormatter(SimpleLogFormatter())
63+
cli_logger.setLevel(level)
64+
cli_logger.addHandler(cli_channel)
65+
cli_logger.propagate = False
4666

4767
# setup styling for repo loggers
4868
repo_logger = logging.getLogger("libvcs")
49-
channel = logging.StreamHandler()
50-
channel.setFormatter(RepoLogFormatter())
51-
channel.addFilter(RepoFilter())
52-
repo_logger.setLevel(level)
53-
repo_logger.addHandler(channel)
69+
if not repo_logger.handlers:
70+
repo_channel = logging.StreamHandler()
71+
repo_channel.setFormatter(RepoLogFormatter())
72+
repo_channel.addFilter(RepoFilter())
73+
repo_logger.setLevel(level)
74+
repo_logger.addHandler(repo_channel)
75+
repo_logger.propagate = False
5476

5577

5678
class LogFormatter(logging.Formatter):
@@ -180,6 +202,14 @@ def template(self, record: logging.LogRecord) -> str:
180202
return f"{Fore.GREEN + Style.DIM}|{record.bin_name}| {Fore.YELLOW}({record.keyword}) {Fore.RESET}" # type:ignore # noqa: E501
181203

182204

205+
class SimpleLogFormatter(logging.Formatter):
206+
"""Simple formatter that outputs only the message, like print()."""
207+
208+
def format(self, record: logging.LogRecord) -> str:
209+
"""Format log record to just return the message."""
210+
return record.getMessage()
211+
212+
183213
class RepoFilter(logging.Filter):
184214
"""Only include repo logs for this type of record."""
185215

0 commit comments

Comments
 (0)