+def cat_batch(conn, dummy):
+ _init_session()
+ cat_pipe = git.cp()
+ # For now, avoid potential deadlock by just reading them all
+ for ref in tuple(lines_until_sentinel(conn, '\n', Exception)):
+ ref = ref[:-1]
+ it = cat_pipe.get(ref)
+ info = next(it)
+ if not info[0]:
+ conn.write('missing\n')
+ continue
+ conn.write('%s %s %d\n' % info)
+ for buf in it:
+ conn.write(buf)
+ conn.ok()
+
+def refs(conn, args):
+ limit_to_heads, limit_to_tags = args.split()
+ assert limit_to_heads in ('0', '1')
+ assert limit_to_tags in ('0', '1')
+ limit_to_heads = int(limit_to_heads)
+ limit_to_tags = int(limit_to_tags)
+ _init_session()
+ patterns = tuple(x[:-1] for x in lines_until_sentinel(conn, '\n', Exception))
+ for name, oid in git.list_refs(patterns=patterns,
+ limit_to_heads=limit_to_heads,
+ limit_to_tags=limit_to_tags):
+ assert '\n' not in name
+ conn.write('%s %s\n' % (oid.encode('hex'), name))
+ conn.write('\n')
+ conn.ok()
+
+def rev_list(conn, _):
+ _init_session()
+ count = conn.readline()
+ if not count:
+ raise Exception('Unexpected EOF while reading rev-list count')
+ count = None if count == '\n' else int(count)
+ fmt = conn.readline()
+ if not fmt:
+ raise Exception('Unexpected EOF while reading rev-list format')
+ fmt = None if fmt == '\n' else fmt[:-1]
+ refs = tuple(x[:-1] for x in lines_until_sentinel(conn, '\n', Exception))
+ args = git.rev_list_invocation(refs, count=count, format=fmt)
+ p = subprocess.Popen(git.rev_list_invocation(refs, count=count, format=fmt),
+ preexec_fn=git._gitenv(git.repodir),
+ stdout=subprocess.PIPE)
+ while True:
+ out = p.stdout.read(64 * 1024)
+ if not out:
+ break
+ conn.write(out)
+ rv = p.wait() # not fatal
+ if rv:
+ msg = 'git rev-list returned error %d' % rv
+ conn.error(msg)
+ raise GitError(msg)
+ conn.ok()
+