]> arthur.barton.de Git - bup.git/commitdiff
bup join: continue gracefully if one of the requested files does not exist.
authorAvery Pennarun <apenwarr@gmail.com>
Sat, 13 Feb 2010 21:45:12 +0000 (16:45 -0500)
committerAvery Pennarun <apenwarr@gmail.com>
Sat, 13 Feb 2010 21:45:12 +0000 (16:45 -0500)
This makes it work more like 'cat'.  If any of the requested files is
missing, the final return code is nonzero.

client.py
cmd-join.py
cmd-server.py
helpers.py

index f99708b75662208f1cbe1a20ae8068d589c958f5..a9e9c95dae3c085b4fd6d9df6b9e2577a41a7960 100644 (file)
--- a/client.py
+++ b/client.py
@@ -85,7 +85,7 @@ class Client:
         if rv != None:
             raise ClientError('server exited unexpectedly with code %r' % rv)
         try:
-            self.conn.check_ok()
+            return self.conn.check_ok()
         except Exception, e:
             raise ClientError, e, sys.exc_info()[2]
 
@@ -191,8 +191,10 @@ class Client:
             sz = struct.unpack('!I', self.conn.read(4))[0]
             if not sz: break
             yield self.conn.read(sz)
-        self.check_ok()
+        e = self.check_ok()
         self._not_busy()
+        if e:
+            raise KeyError(str(e))
 
 
 class PackWriter_Remote(git.PackWriter):
index 07dfdcd238b22eb551468aafcd855be1b4344c97..26f390c43ce3efa581d38f39b96782695f591b64 100755 (executable)
@@ -18,15 +18,22 @@ git.check_repo_or_die()
 if not extra:
     extra = linereader(sys.stdin)
 
+ret = 0
+
 if opt.remote:
     cli = client.Client(opt.remote)
-    for id in extra:
-        for blob in cli.cat(id):
-            sys.stdout.write(blob)
-    cli.close()
+    cat = cli.cat
 else:
     cp = git.CatPipe()
-    for id in extra:
-        #log('id=%r\n' % id)
-        for blob in cp.join(id):
+    cat = cp.join
+
+for id in extra:
+    try:
+        for blob in cat(id):
             sys.stdout.write(blob)
+    except KeyError, e:
+        sys.stdout.flush()
+        log('error: %s\n' % e)
+        ret = 1
+
+sys.exit(ret)
index 7cc78a3fb89e4c32988087aa3513818047eef2b5..e849b451d627d7de5ebdb7b86101ac432883fdb9 100755 (executable)
@@ -118,11 +118,17 @@ def update_ref(conn, refname):
 
 def cat(conn, id):
     git.check_repo_or_die()
-    for blob in git.cat(id):
-        conn.write(struct.pack('!I', len(blob)))
-        conn.write(blob)
-    conn.write('\0\0\0\0')
-    conn.ok()
+    try:
+        for blob in git.cat(id):
+            conn.write(struct.pack('!I', len(blob)))
+            conn.write(blob)
+    except KeyError, e:
+        log('server: error: %s\n' % e)
+        conn.write('\0\0\0\0')
+        conn.error(e)
+    else:
+        conn.write('\0\0\0\0')
+        conn.ok()
 
 
 optspec = """
index 8201c3198c2023c09ab4d55c9894d65ba9503df3..2bfdd536ec543357ba558ec2fef466e5ca46c6e7 100644 (file)
@@ -97,6 +97,9 @@ def hostname():
     return _hostname
 
 
+class NotOk(Exception):
+    pass
+
 class Conn:
     def __init__(self, inp, outp):
         self.inp = inp
@@ -125,20 +128,11 @@ class Conn:
     def ok(self):
         self.write('\nok\n')
 
-    def drain_and_check_ok(self):
-        self.outp.flush()
-        rl = ''
-        for rl in linereader(self.inp):
-            #log('%d got line: %r\n' % (os.getpid(), rl))
-            if not rl:  # empty line
-                continue
-            elif rl == 'ok':
-                return True
-            else:
-                pass # ignore line
-        # NOTREACHED
+    def error(self, s):
+        s = re.sub(r'\s+', ' ', str(s))
+        self.write('\nerror %s\n' % s)
 
-    def check_ok(self):
+    def _check_ok(self, onempty):
         self.outp.flush()
         rl = ''
         for rl in linereader(self.inp):
@@ -146,11 +140,24 @@ class Conn:
             if not rl:  # empty line
                 continue
             elif rl == 'ok':
-                return True
+                return None
+            elif rl.startswith('error '):
+                #log('client: error: %s\n' % rl[6:])
+                return NotOk(rl[6:])
             else:
-                raise Exception('expected "ok", got %r' % rl)
+                onempty(rl)
         raise Exception('server exited unexpectedly; see errors above')
 
+    def drain_and_check_ok(self):
+        def onempty(rl):
+            pass
+        return self._check_ok(onempty)
+
+    def check_ok(self):
+        def onempty(rl):
+            raise Exception('expected "ok", got %r' % rl)
+        return self._check_ok(onempty)
+
 
 def linereader(f):
     while 1: