summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaugier <pierre.augier@univ-grenoble-alpes.fr>2022-06-24 23:03:05 +0200
committerpaugier <pierre.augier@univ-grenoble-alpes.fr>2022-06-24 23:03:05 +0200
commit8a63dde177eaeaaf2ce6a4b0f9b5c7afc4eb9d10 (patch)
treee9045171809cd5fddc4038a10b3d0a5c3cd9fa99
parentbfcd8e1ba700d6a94817470650d56cbe9e87e7ea (diff)
downloadsetuptools-scm-8a63dde177eaeaaf2ce6a4b0f9b5c7afc4eb9d10.tar.gz
Improve debug logging (indent and commands can be copy/pasted)
-rw-r--r--src/setuptools_scm/hg_git.py8
-rw-r--r--src/setuptools_scm/utils.py20
2 files changed, 17 insertions, 11 deletions
diff --git a/src/setuptools_scm/hg_git.py b/src/setuptools_scm/hg_git.py
index 1b48462..bde71ec 100644
--- a/src/setuptools_scm/hg_git.py
+++ b/src/setuptools_scm/hg_git.py
@@ -29,18 +29,18 @@ class GitWorkdirHgClient(GitWorkdir, HgWorkdir):
return cls(root)
def is_dirty(self) -> bool:
- out, _, _ = self.do_ex("hg id -T '{dirty}'")
+ out, _, _ = self.do_ex('hg id -T "{dirty}"')
return bool(out)
def get_branch(self) -> str | None:
- res = self.do_ex("hg id -T {bookmarks}")
+ res = self.do_ex('hg id -T "{bookmarks}"')
if res.returncode:
trace("branch err", res)
return None
return res.out
def get_head_date(self) -> date | None:
- date_part, err, ret = self.do_ex("hg log -r . -T {shortdate(date)}")
+ date_part, err, ret = self.do_ex('hg log -r . -T "{shortdate(date)}"')
if ret:
trace("head date err", date_part, err, ret)
return None
@@ -53,7 +53,7 @@ class GitWorkdirHgClient(GitWorkdir, HgWorkdir):
pass
def get_hg_node(self) -> str | None:
- node, _, ret = self.do_ex("hg log -r . -T {node}")
+ node, _, ret = self.do_ex('hg log -r . -T "{node}"')
if not ret:
return node
else:
diff --git a/src/setuptools_scm/utils.py b/src/setuptools_scm/utils.py
index dc1e49b..7c690b8 100644
--- a/src/setuptools_scm/utils.py
+++ b/src/setuptools_scm/utils.py
@@ -8,6 +8,7 @@ import platform
import shlex
import subprocess
import sys
+import textwrap
import warnings
from types import CodeType
from types import FunctionType
@@ -72,8 +73,10 @@ def avoid_pip_isolation(env: Mapping[str, str]) -> dict[str, str]:
return new_env
-def trace(*k: object) -> None:
+def trace(*k: object, indent: bool = False) -> None:
if DEBUG:
+ if indent and len(k) > 1:
+ k = (k[0],) + tuple(textwrap.indent(str(s), " ") for s in k[1:])
print(*k, file=sys.stderr, flush=True)
@@ -102,20 +105,23 @@ def _run(cmd: _t.CMD_TYPE, cwd: _t.PathT) -> subprocess.CompletedProcess[str]:
def do_ex(cmd: _t.CMD_TYPE, cwd: _t.PathT = ".") -> _CmdResult:
- if isinstance(cmd, list):
- cmd_4_trace = " ".join(cmd)
- else:
+ if not DEBUG or not isinstance(cmd, list):
cmd_4_trace = cmd
- trace("----\ncmd:", repr(cmd_4_trace))
+ else:
+ # give better results than shlex.join in our cases
+ cmd_4_trace = " ".join(
+ [s if all(c not in s for c in " {[:") else f'"{s}"' for s in cmd]
+ )
+ trace("----\ncmd:\n", cmd_4_trace, indent=True)
trace(" in:", cwd)
if os.name == "posix" and not isinstance(cmd, (list, tuple)):
cmd = shlex.split(cmd)
res = _run(cmd, cwd)
if res.stdout:
- trace("out:\n", res.stdout)
+ trace("out:\n", res.stdout, indent=True)
if res.stderr:
- trace("err:\n", res.stderr)
+ trace("err:\n", res.stderr, indent=True)
if res.returncode:
trace("ret:", res.returncode)
return _CmdResult(