From 9b867c1be90fdf29f592b16ee6ec7ea8b574dc5c Mon Sep 17 00:00:00 2001 From: Nathan Cooper Date: Mon, 23 Feb 2026 15:02:59 -0500 Subject: [PATCH 1/2] add support for paths --- fastgit/core.py | 2 ++ nbs/00_core.ipynb | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/fastgit/core.py b/fastgit/core.py index c5fc0d9..a362f6c 100644 --- a/fastgit/core.py +++ b/fastgit/core.py @@ -30,11 +30,13 @@ class Git: def __init__(self, d): self.d = Path(d) def __call__(self, cmd, *args, split=None, mute_errors=False, **kwargs): + paths = listify(kwargs.pop('__', [])) args = listify(args) args += concat((f'-{k}',v) for k,v in kwargs.items() if len(k)==1 and v is not True) args += [f'-{k}' for k,v in kwargs.items() if len(k)==1 and v is True] args += [f'--{k.replace("_","-")}={v}' for k,v in kwargs.items() if len(k)>1 and v is not True and v is not False] args += [f'--{k.replace("_","-")}' for k,v in kwargs.items() if len(k)>1 and v is True] + if paths: args += ['--'] + paths try: return callgit(self.d, cmd, *args, split=split) except CalledProcessError as e: if not mute_errors: print(f'ERROR: Git.__call__ caught exception {e} \n with stderr={e.stderr}') diff --git a/nbs/00_core.ipynb b/nbs/00_core.ipynb index 06635d9..8b3b347 100644 --- a/nbs/00_core.ipynb +++ b/nbs/00_core.ipynb @@ -112,7 +112,32 @@ "id": "97f78839", "metadata": {}, "outputs": [], - "source": "#| export\nclass Git:\n def __init__(self, d): self.d = Path(d)\n\n def __call__(self, cmd, *args, split=None, mute_errors=False, **kwargs):\n args = listify(args)\n args += concat((f'-{k}',v) for k,v in kwargs.items() if len(k)==1 and v is not True)\n args += [f'-{k}' for k,v in kwargs.items() if len(k)==1 and v is True]\n args += [f'--{k.replace(\"_\",\"-\")}={v}' for k,v in kwargs.items() if len(k)>1 and v is not True and v is not False]\n args += [f'--{k.replace(\"_\",\"-\")}' for k,v in kwargs.items() if len(k)>1 and v is True]\n try: return callgit(self.d, cmd, *args, split=split)\n except CalledProcessError as e:\n if not mute_errors: print(f'ERROR: Git.__call__ caught exception {e} \\n with stderr={e.stderr}')\n\n def __getattr__(self, nm):\n if nm.startswith('_'): raise AttributeError(nm)\n return partial(self, nm.replace('_','-'))\n\n def top(self): return self.rev_parse('--show-toplevel', mute_errors=True)\n \n @property\n def exists(self): return self.top() is not None" + "source": [ + "#| export\n", + "class Git:\n", + " def __init__(self, d): self.d = Path(d)\n", + "\n", + " def __call__(self, cmd, *args, split=None, mute_errors=False, **kwargs):\n", + " paths = listify(kwargs.pop('__', []))\n", + " args = listify(args)\n", + " args += concat((f'-{k}',v) for k,v in kwargs.items() if len(k)==1 and v is not True)\n", + " args += [f'-{k}' for k,v in kwargs.items() if len(k)==1 and v is True]\n", + " args += [f'--{k.replace(\"_\",\"-\")}={v}' for k,v in kwargs.items() if len(k)>1 and v is not True and v is not False]\n", + " args += [f'--{k.replace(\"_\",\"-\")}' for k,v in kwargs.items() if len(k)>1 and v is True]\n", + " if paths: args += ['--'] + paths\n", + " try: return callgit(self.d, cmd, *args, split=split)\n", + " except CalledProcessError as e:\n", + " if not mute_errors: print(f'ERROR: Git.__call__ caught exception {e} \\n with stderr={e.stderr}')\n", + "\n", + " def __getattr__(self, nm):\n", + " if nm.startswith('_'): raise AttributeError(nm)\n", + " return partial(self, nm.replace('_','-'))\n", + "\n", + " def top(self): return self.rev_parse('--show-toplevel', mute_errors=True)\n", + " \n", + " @property\n", + " def exists(self): return self.top() is not None" + ] }, { "cell_type": "code", From f8b783e2916cf7bb0387950438f1841fdb53a6fe Mon Sep 17 00:00:00 2001 From: Nathan Cooper Date: Mon, 23 Feb 2026 15:14:49 -0500 Subject: [PATCH 2/2] defense --- fastgit/core.py | 2 +- nbs/00_core.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fastgit/core.py b/fastgit/core.py index a362f6c..d92fe68 100644 --- a/fastgit/core.py +++ b/fastgit/core.py @@ -30,7 +30,7 @@ class Git: def __init__(self, d): self.d = Path(d) def __call__(self, cmd, *args, split=None, mute_errors=False, **kwargs): - paths = listify(kwargs.pop('__', [])) + paths = [str(p) for p in listify(kwargs.pop('__', None) or [])] args = listify(args) args += concat((f'-{k}',v) for k,v in kwargs.items() if len(k)==1 and v is not True) args += [f'-{k}' for k,v in kwargs.items() if len(k)==1 and v is True] diff --git a/nbs/00_core.ipynb b/nbs/00_core.ipynb index 8b3b347..b9258da 100644 --- a/nbs/00_core.ipynb +++ b/nbs/00_core.ipynb @@ -118,7 +118,7 @@ " def __init__(self, d): self.d = Path(d)\n", "\n", " def __call__(self, cmd, *args, split=None, mute_errors=False, **kwargs):\n", - " paths = listify(kwargs.pop('__', []))\n", + " paths = [str(p) for p in listify(kwargs.pop('__', None) or [])]\n", " args = listify(args)\n", " args += concat((f'-{k}',v) for k,v in kwargs.items() if len(k)==1 and v is not True)\n", " args += [f'-{k}' for k,v in kwargs.items() if len(k)==1 and v is True]\n",