]> arthur.barton.de Git - bup.git/blob - cmd/cat-file-cmd.py
Use absolute_import from the __future__ everywhere
[bup.git] / cmd / cat-file-cmd.py
1 #!/bin/sh
2 """": # -*-python-*-
3 bup_python="$(dirname "$0")/bup-python" || exit $?
4 exec "$bup_python" "$0" ${1+"$@"}
5 """
6 # end of bup preamble
7
8 from __future__ import absolute_import
9 import re, stat, sys
10
11 from bup import options, git, vfs
12 from bup.helpers import chunkyreader, handle_ctrl_c, log, saved_errors
13 from bup.repo import LocalRepo
14
15 optspec = """
16 bup cat-file [--meta|--bupm] /branch/revision/[path]
17 --
18 meta        print the target's metadata entry (decoded then reencoded) to stdout
19 bupm        print the target directory's .bupm file directly to stdout
20 """
21
22 handle_ctrl_c()
23
24 o = options.Options(optspec)
25 (opt, flags, extra) = o.parse(sys.argv[1:])
26
27 git.check_repo_or_die()
28
29 if not extra:
30     o.fatal('must specify a target')
31 if len(extra) > 1:
32     o.fatal('only one target file allowed')
33 if opt.bupm and opt.meta:
34     o.fatal('--meta and --bupm are incompatible')
35     
36 target = extra[0]
37
38 if not re.match(r'/*[^/]+/[^/]+', target):
39     o.fatal("path %r doesn't include a branch and revision" % target)
40
41 repo = LocalRepo()
42 resolved = vfs.lresolve(repo, target)
43 leaf_name, leaf_item = resolved[-1]
44 if not leaf_item:
45     log('error: cannot access %r in %r\n'
46         % ('/'.join(name for name, item in resolved), path))
47     sys.exit(1)
48
49 mode = vfs.item_mode(leaf_item)
50
51 if opt.bupm:
52     if not stat.S_ISDIR(mode):
53         o.fatal('%r is not a directory' % target)
54     _, bupm_oid = vfs.tree_data_and_bupm(repo, leaf_item.oid)
55     if bupm_oid:
56         with vfs.tree_data_reader(repo, bupm_oid) as meta_stream:
57             sys.stdout.write(meta_stream.read())
58 elif opt.meta:
59     augmented = vfs.augment_item_meta(repo, leaf_item, include_size=True)
60     sys.stdout.write(augmented.meta.encode())
61 else:
62     if stat.S_ISREG(mode):
63         with vfs.fopen(repo, leaf_item) as f:
64             for b in chunkyreader(f):
65                 sys.stdout.write(b)
66     else:
67         o.fatal('%r is not a plain file' % target)
68
69 if saved_errors:
70     log('warning: %d errors encountered\n' % len(saved_errors))
71     sys.exit(1)