]> arthur.barton.de Git - bup.git/blob - cmd/xstat-cmd.py
A bunch of IOError->OSError conversions.
[bup.git] / cmd / xstat-cmd.py
1 #!/usr/bin/env python
2 # Copyright (C) 2010 Rob Browning
3 #
4 # This code is covered under the terms of the GNU Library General
5 # Public License as described in the bup LICENSE file.
6 import sys, stat, errno
7 from bup import metadata, options, xstat
8 from bup.helpers import handle_ctrl_c, saved_errors, add_error, log
9
10
11 def fstimestr(fstime):
12     (s, ns) = fstime.secs_nsecs()
13     if ns == 0:
14         return '%d' % s
15     else:
16         return '%d.%09d' % (s, ns)
17
18
19 optspec = """
20 bup pathinfo [OPTION ...] <PATH ...>
21 --
22 v,verbose       increase log output (can be used more than once)
23 q,quiet         don't show progress meter
24 exclude-fields= exclude comma-separated fields
25 include-fields= include comma-separated fields (definitive if first)
26 """
27
28 target_filename = ''
29 all_fields = frozenset(['path',
30                         'mode',
31                         'link-target',
32                         'rdev',
33                         'uid',
34                         'gid',
35                         'owner',
36                         'group',
37                         'atime',
38                         'mtime',
39                         'ctime',
40                         'linux-attr',
41                         'linux-xattr',
42                         'posix1e-acl'])
43 active_fields = all_fields
44
45 handle_ctrl_c()
46
47 o = options.Options(optspec)
48 (opt, flags, remainder) = o.parse(sys.argv[1:])
49
50 treat_include_fields_as_definitive = True
51 for flag, value in flags:
52     if flag == '--verbose' or flag == '-v':
53         metadata.verbose += 1
54     elif flag == '--quiet' or flag == '-q':
55         metadata.verbose = 0
56     elif flag == '--exclude-fields':
57         exclude_fields = frozenset(value.split(','))
58         for f in exclude_fields:
59             if not f in all_fields:
60                 o.fatal(f + ' is not a valid field name')
61         active_fields = active_fields - exclude_fields
62         treat_include_fields_as_definitive = False
63     elif flag == '--include-fields':
64         include_fields = frozenset(value.split(','))
65         for f in include_fields:
66             if not f in all_fields:
67                 o.fatal(f + ' is not a valid field name')
68         if treat_include_fields_as_definitive:
69             active_fields = include_fields
70             treat_include_fields_as_definitive = False
71         else:
72             active_fields = active_fields | include_fields
73
74 for path in remainder:
75     try:
76         m = metadata.from_path(path, archive_path = path)
77     except (OSError,IOError), e:
78         if e.errno == errno.ENOENT:
79             add_error(e)
80             continue
81         else:
82             raise
83     if 'path' in active_fields:
84         print 'path:', m.path
85     if 'mode' in active_fields:
86         print 'mode:', oct(m.mode)
87     if 'link-target' in active_fields and stat.S_ISLNK(m.mode):
88         print 'link-target:', m.symlink_target
89     if 'rdev' in active_fields:
90         print 'rdev:', m.rdev
91     if 'uid' in active_fields:
92         print 'uid:', m.uid
93     if 'gid' in active_fields:
94         print 'gid:', m.gid
95     if 'owner' in active_fields:
96         print 'owner:', m.owner
97     if 'group' in active_fields:
98         print 'group:', m.group
99     if 'atime' in active_fields:
100         print 'atime: ' + fstimestr(m.atime)
101     if 'mtime' in active_fields:
102         print 'mtime: ' + fstimestr(m.mtime)
103     if 'ctime' in active_fields:
104         print 'ctime: ' + fstimestr(m.ctime)
105     if 'linux-attr' in active_fields and m.linux_attr:
106         print 'linux-attr:', hex(m.linux_attr)
107     if 'linux-xattr' in active_fields and m.linux_xattr:
108         for name, value in m.linux_xattr:
109             print 'linux-xattr: %s -> %s' % (name, repr(value))
110     if 'posix1e-acl' in active_fields and m.posix1e_acl and metadata.posix1e:
111         flags = metadata.posix1e.TEXT_ABBREVIATE
112         if stat.S_ISDIR(m.mode):
113             acl = m.posix1e_acl[0]
114             default_acl = m.posix1e_acl[2]
115             print acl.to_any_text('posix1e-acl: ', '\n', flags)
116             print acl.to_any_text('posix1e-acl-default: ', '\n', flags)
117         else:
118             acl = m.posix1e_acl[0]
119             print acl.to_any_text('posix1e-acl: ', '\n', flags)
120
121 if saved_errors:
122     log('WARNING: %d errors encountered.\n' % len(saved_errors))
123     sys.exit(1)
124 else:
125     sys.exit(0)