]> arthur.barton.de Git - bup.git/blob - lib/bup/cmd/join.py
Replace LocalRepo/RemoteRepo __del__ with context management
[bup.git] / lib / bup / cmd / join.py
1
2 from __future__ import absolute_import
3
4 import sys
5
6 from bup import git, options
7 from bup.compat import argv_bytes
8 from bup.helpers import linereader, log
9 from bup.io import byte_stream
10 from bup.repo import LocalRepo, RemoteRepo
11
12
13 optspec = """
14 bup join [-r host:path] [refs or hashes...]
15 --
16 r,remote=  remote repository path
17 o=         output filename
18 """
19
20 def main(argv):
21     o = options.Options(optspec)
22     opt, flags, extra = o.parse_bytes(argv[1:])
23     if opt.remote:
24         opt.remote = argv_bytes(opt.remote)
25
26     git.check_repo_or_die()
27
28     stdin = byte_stream(sys.stdin)
29
30     if not extra:
31         extra = linereader(stdin)
32
33     ret = 0
34     with RemoteRepo(opt.remote) if opt.remote else LocalRepo() as repo:
35
36         if opt.o:
37             outfile = open(opt.o, 'wb')
38         else:
39             sys.stdout.flush()
40             outfile = byte_stream(sys.stdout)
41
42         for ref in [argv_bytes(x) for x in extra]:
43             try:
44                 for blob in repo.join(ref):
45                     outfile.write(blob)
46             except KeyError as e:
47                 outfile.flush()
48                 log('error: %s\n' % e)
49                 ret = 1
50
51     sys.exit(ret)