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]
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):
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)
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 = """
return _hostname
+class NotOk(Exception):
+ pass
+
class Conn:
def __init__(self, inp, outp):
self.inp = inp
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):
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: