dispatch-conf: support PAGER var for bug #384663
authorZac Medico <zmedico@gentoo.org>
Wed, 28 Sep 2011 18:41:44 +0000 (11:41 -0700)
committerZac Medico <zmedico@gentoo.org>
Wed, 28 Sep 2011 18:41:44 +0000 (11:41 -0700)
bin/dispatch-conf
cnf/dispatch-conf.conf

index 497927df42c7f1ab05827b4423474b94b49c7985..55d7f13d7bb0ea57d77e8490ca89ff368ff8419b 100755 (executable)
@@ -64,6 +64,20 @@ atexit.register(cleanup)
 
 MANDATORY_OPTS  = [ 'archive-dir', 'diff', 'replace-cvs', 'replace-wscomments', 'merge' ]
 
+def cmd_var_is_valid(cmd):
+    """
+    Return true if the first whitespace-separated token contained
+    in cmd is an executable file, false otherwise.
+    """
+    cmd = portage.util.shlex_split(cmd)
+    if not cmd:
+        return False
+
+    if os.path.isabs(cmd[0]):
+        return os.access(cmd[0], os.EX_OK)
+
+    return find_binary(cmd[0]) is not None
+
 class dispatch:
     options = {}
 
@@ -84,6 +98,22 @@ class dispatch:
         else:
             self.options["log-file"] = "/dev/null"
 
+        pager = self.options.get("pager")
+        if pager is None or not cmd_var_is_valid(pager):
+            pager = os.environ.get("PAGER")
+            if pager is None or not cmd_var_is_valid(pager):
+                pager = "cat"
+
+        if os.path.basename(pager) == "less":
+            less_opts = self.options.get("less-opts")
+            if less_opts is not None and less_opts.strip():
+                pager += " " + less_opts
+
+        if os.path.basename(portage.util.shlex_split(pager)[0]) == "cat":
+            pager = ""
+        else:
+            pager = " | " + pager
+
         #
         # Build list of extant configs
         #
@@ -226,10 +256,12 @@ class dispatch:
                 clear_screen()
                 if show_new_diff:
                     cmd = self.options['diff'] % (conf['new'], mrgconf)
+                    cmd += pager
                     spawn_shell(cmd)
                     show_new_diff = 0
                 else:
                     cmd = self.options['diff'] % (conf['current'], newconf)
+                    cmd += pager
                     spawn_shell(cmd)
 
                 print()
index b51b61ae17d8584e1ab07d20840623f8e0140af4..c4ab33f990dc41f807a2a1597025200e2495e0e5 100644 (file)
@@ -22,7 +22,15 @@ use-rcs=no
 # %s new file
 # If using colordiff instead of diff, the less -R option may be required
 # for correct display.
-diff="diff -Nu '%s' '%s' | less --no-init --QUIT-AT-EOF"
+diff="diff -Nu '%s' '%s'"
+
+# Set the pager for use with diff commands (this will
+# cause the PAGER environment variable to be ignored).
+# Setting pager="cat" will disable pager usage.
+pager=""
+
+# Default options used if less is the pager
+less-opts="--no-init --QUIT-AT-EOF"
 
 # Diff for interactive merges.
 # %s output file