diff --git a/README.md b/README.md index fc04bf7..7ae3175 100644 --- a/README.md +++ b/README.md @@ -114,13 +114,11 @@ Options: Similar to a distributed `git ls-files -z -- FILENAMES | xargs -0 sed -i EXPRESSION`. -_note_: this assumes GNU sed. If you're on macOS, install `gnu-sed` with Homebrew: +_note_: this assumes GNU sed. If you're on macOS, install `gnu-sed` with +Homebrew, which will expose `gsed` executable: ```bash brew install gnu-sed - -# Add to .bashrc / .zshrc -export PATH="$(brew --prefix)/opt/gnu-sed/libexec/gnubin:$PATH" ``` Arguments: diff --git a/all_repos/sed.py b/all_repos/sed.py index 91ab5e0..d5f8d10 100644 --- a/all_repos/sed.py +++ b/all_repos/sed.py @@ -3,8 +3,11 @@ import argparse import functools import os.path +import platform import shlex +import shutil import subprocess +import sys from typing import Generator from typing import Sequence @@ -14,6 +17,14 @@ from all_repos.config import Config from all_repos.util import zsplit +SED_EXEC = "sed" +if platform.system() == 'Darwin': # pragma: no cover + if not shutil.which("gsed"): + print('MacOS specific prerequisite missing, please install it with: brew install gnu-sed') + sys.exit(2) + + SED_EXEC = "gsed" + def find_repos( config: Config, @@ -44,7 +55,7 @@ def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser( description=( 'Similar to a distributed ' - '`git ls-files -z -- FILENAMES | xargs -0 sed -i EXPRESSION`.' + f'`git ls-files -z -- FILENAMES | xargs -0 {SED_EXEC} -i EXPRESSION`.' ), usage='%(prog)s [options] EXPRESSION FILENAMES', ) @@ -62,7 +73,7 @@ def main(argv: Sequence[str] | None = None) -> int: '--commit-msg', '--commit-message', help=( 'override the autofixer commit message. (default ' - '`git ls-files -z -- FILENAMES | xargs -0 sed -i ... EXPRESSION`).' + f'`git ls-files -z -- FILENAMES | xargs -0 {SED_EXEC} -i ... EXPRESSION`).' ), ) parser.add_argument( @@ -79,7 +90,7 @@ def main(argv: Sequence[str] | None = None) -> int: dash_r = ('-r',) else: dash_r = () - sed_cmd = ('sed', '-i', *dash_r, args.expression) + sed_cmd = (SED_EXEC, '-i', *dash_r, args.expression) ls_files_cmd = ('git', 'ls-files', '-z', '--', args.filenames) msg = f'{shlex.join(ls_files_cmd)} | xargs -0 {shlex.join(sed_cmd)}'