git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] git-p4: add read_pipe_text() internal function

From
Luke Diamand <luke@diamand.org>
Date
Apr 15, 2017, 10:36 UTC
Message-ID
<20170415103609.6002-3-luke@diamand.org>
In-Reply-To
<20170415103609.6002-1-luke@diamand.org>

The existing read_pipe() function returns an empty string on error, but also returns an empty string if the command returns an empty string.

This leads to ugly constructions trying to detect error cases.
Add read_pipe_text() which just returns None on error.
Signed-off-by: Luke Diamand <luke@diamand.org>
---
 git-p4.py | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index eab319d76..584b81775 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -160,17 +160,42 @@ def p4_write_pipe(c, stdin):
     real_cmd = p4_build_cmd(c)
     return write_pipe(real_cmd, stdin)
 
-def read_pipe(c, ignore_error=False):
+def read_pipe_full(c):
+    """ Read output from  command. Returns a tuple
+        of the return status, stdout text and stderr
+        text.
+    """
     if verbose:
         sys.stderr.write('Reading pipe: %s\n' % str(c))
 
     expand = isinstance(c,basestring)
     p = subprocess.Popen(c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=expand)
     (out, err) = p.communicate()
-    if p.returncode != 0 and not ignore_error:
-        die('Command failed: %s\nError: %s' % (str(c), err))
+    return (p.returncode, out, err)
+
+def read_pipe(c, ignore_error=False):
+    """ Read output from  command. Returns the output text on
+        success. On failure, terminates execution, unless
+        ignore_error is True, when it returns an empty string.
+    """
+    (retcode, out, err) = read_pipe_full(c)
+    if retcode != 0:
+        if ignore_error:
+            out = ""
+        else:
+            die('Command failed: %s\nError: %s' % (str(c), err))
     return out
 
+def read_pipe_text(c):
+    """ Read output from a command with trailing whitespace stripped.
+        On error, returns None.
+    """
+    (retcode, out, err) = read_pipe_full(c)
+    if retcode != 0:
+        return None
+    else:
+        return out.rstrip()
+
 def p4_read_pipe(c, ignore_error=False):
     real_cmd = p4_build_cmd(c)
     return read_pipe(real_cmd, ignore_error)
-- 
2.12.2.719.gcbd162c
Previous: Luke DiamandNext: Luke Diamand
Message 3 of 4 in “git-p4: use symbolic-ref instead of name-rev”
  1. 0/3 git-p4: use symbolic-ref instead of name-revLuke Diamand, Apr 15, 2017
  2. 1/3 git-p4: add failing test for name-rev rather than symbolic-refLuke Diamand, Apr 15, 2017
  3. 2/3 git-p4: add read_pipe_text() internal functionLuke Diamand, Apr 15, 2017
  4. 3/3 git-p4: don't use name-rev to get current branchLuke Diamand, Apr 15, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.