From 03e0f1eb21e9df76ed792cbd8349d04ec29b8906 Mon Sep 17 00:00:00 2001 From: Fabian Homborg Date: Thu, 29 Dec 2016 16:02:59 +0100 Subject: [PATCH] create_manpage_completions: Try more ways to get manpath Haiku only has `man --path`. Still doesn't support OpenBSD. Use $MANPATH if available. This needs to: - Ignore stderr (we pipe it and throw it away) - Read the subprocess returncode, since `man --path` is an existing command that fails instead of a non-existent one (that raises an exception) - Properly set up the fallback Fixes #2194. --- share/tools/create_manpage_completions.py | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/share/tools/create_manpage_completions.py b/share/tools/create_manpage_completions.py index a65c057bb..e79744568 100755 --- a/share/tools/create_manpage_completions.py +++ b/share/tools/create_manpage_completions.py @@ -857,12 +857,26 @@ def parse_and_output_man_pages(paths, output_directory, show_progress): def get_paths_from_manpath(): # Return all the paths to man(1) and man(8) files in the manpath import subprocess, os - proc = subprocess.Popen(['manpath'], stdout=subprocess.PIPE) - manpath, err_data = proc.communicate() + # $MANPATH takes precedence, just like with `man` on the CLI. + if os.getenv("MANPATH"): + manpath = os.getenv("MANPATH") + else: + # Some systems have manpath, others have `man --path` (like Haiku). + # TODO: Deal with systems that have neither (OpenBSD) + for prog in [['manpath'], ['man', '--path']]: + try: + proc = subprocess.Popen(prog, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except OSError: # Command does not exist, keep trying + continue + break # Command exists, use it. + manpath, err_data = proc.communicate() parent_paths = manpath.decode().strip().split(':') - if not parent_paths: - sys.stderr.write("Unable to get the manpath (tried manpath)\n") - sys.exit(-1) + if not parent_paths or proc.returncode > 0: + # HACK: Use some fallback in case we can't get anything else. + # `mandoc` does not provide `manpath` or `man --path` and $MANPATH might not be set, so just use the default for mandoc (minus /usr/X11R6/man, because that's not relevant). + # The alternative is reading its config file (/etc/man.conf) + sys.stderr.write("Unable to get the manpath, falling back to /usr/share/man:/usr/local/share/man. Please set $MANPATH if that is not correct.\n") + parent_paths = ["/usr/share/man", "/usr/local/share/man"] result = [] for parent_path in parent_paths: for section in ['man1', 'man6', 'man8']: