2 import os, subprocess, time, tempfile
4 from bup import index, metadata
5 from bup.helpers import mkdirp, resolve_parent
6 import bup.xstat as xstat
11 lib_t_dir = os.getcwd()
12 bup_tmp = os.path.realpath('../../../t/tmp')
17 cd = os.path.realpath('../../../t')
19 sd = os.path.realpath(cd + '/sampledata')
20 WVPASSEQ(resolve_parent(cd + '/sampledata'), sd)
21 WVPASSEQ(os.path.realpath(cd + '/sampledata/x'), sd + '/x')
22 WVPASSEQ(os.path.realpath(cd + '/sampledata/var/abs-symlink'),
23 sd + '/var/abs-symlink-target')
24 WVPASSEQ(resolve_parent(cd + '/sampledata/var/abs-symlink'),
25 sd + '/var/abs-symlink')
30 initial_failures = wvfailure_count()
31 tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tindex-')
32 orig_cwd = os.getcwd()
36 fs = xstat.stat(lib_t_dir + '/tindex.py')
37 ms = index.MetaStoreWriter('index.meta.tmp');
38 tmax = (time.time() - 1) * 10**9
39 w = index.Writer('index.tmp', ms, tmax)
40 w.add('/var/tmp/sporky', fs, 0)
41 w.add('/etc/passwd', fs, 0)
48 if wvfailure_count() == initial_failures:
49 subprocess.call(['rm', '-rf', tmpdir])
54 print '%s%s %s' % (e.is_valid() and ' ' or 'M',
55 e.is_fake() and 'F' or ' ',
58 def fake_validate(*l):
61 e.validate(0100644, index.FAKE_SHA)
70 def index_negative_timestamps():
71 initial_failures = wvfailure_count()
72 tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tindex-')
74 foopath = tmpdir + '/foo'
75 f = file(foopath, 'wb')
79 os.utime(foopath, (-86400, -86400))
81 tstart = time.time() * ns_per_sec
82 tmax = tstart - ns_per_sec
83 e = index.BlankNewEntry(foopath, 0, tmax)
84 e.from_stat(xstat.stat(foopath), 0, tstart)
85 assert len(e.packed())
89 os.utime(foopath, (-0x80000000, -0x80000000))
90 e = index.BlankNewEntry(foopath, 0, tmax)
91 e.from_stat(xstat.stat(foopath), 0, tstart)
92 assert len(e.packed())
94 if wvfailure_count() == initial_failures:
95 subprocess.call(['rm', '-rf', tmpdir])
100 initial_failures = wvfailure_count()
101 orig_cwd = os.getcwd()
102 tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tindex-')
105 default_meta = metadata.Metadata()
106 ms1 = index.MetaStoreWriter('index.meta.tmp')
107 ms2 = index.MetaStoreWriter('index2.meta.tmp')
108 ms3 = index.MetaStoreWriter('index3.meta.tmp')
109 meta_ofs1 = ms1.store(default_meta)
110 meta_ofs2 = ms2.store(default_meta)
111 meta_ofs3 = ms3.store(default_meta)
113 ds = xstat.stat(lib_t_dir)
114 fs = xstat.stat(lib_t_dir + '/tindex.py')
115 tmax = (time.time() - 1) * 10**9
117 w1 = index.Writer('index.tmp', ms1, tmax)
118 w1.add('/a/b/x', fs, meta_ofs1)
119 w1.add('/a/b/c', fs, meta_ofs1)
120 w1.add('/a/b/', ds, meta_ofs1)
121 w1.add('/a/', ds, meta_ofs1)
125 w2 = index.Writer('index2.tmp', ms2, tmax)
126 w2.add('/a/b/n/2', fs, meta_ofs2)
130 w3 = index.Writer('index3.tmp', ms3, tmax)
131 w3.add('/a/c/n/3', fs, meta_ofs3)
140 r1all = [e.name for e in r1]
142 ['/a/b/x', '/a/b/c', '/a/b/', '/a/', '/'])
143 r2all = [e.name for e in r2]
145 ['/a/b/n/2', '/a/b/n/', '/a/b/', '/a/', '/'])
146 r3all = [e.name for e in r3]
148 ['/a/c/n/3', '/a/c/n/', '/a/c/', '/a/', '/'])
149 all = [e.name for e in index.merge(r2, r1, r3)]
151 ['/a/c/n/3', '/a/c/n/', '/a/c/',
152 '/a/b/x', '/a/b/n/2', '/a/b/n/', '/a/b/c',
153 '/a/b/', '/a/', '/'])
157 print [hex(e.flags) for e in r1]
158 WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
159 WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
160 WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
161 ['/a/c/n/3', '/a/c/n/', '/a/c/',
162 '/a/b/n/2', '/a/b/n/', '/a/b/', '/a/', '/'])
164 expect_invalid = ['/'] + r2all + r3all
165 expect_real = (set(r1all) - set(r2all) - set(r3all)) \
166 | set(['/a/b/n/2', '/a/c/n/3'])
167 dump(index.merge(r2, r1, r3))
168 for e in index.merge(r2, r1, r3):
169 print e.name, hex(e.flags), e.ctime
170 eiv = e.name in expect_invalid
171 er = e.name in expect_real
172 WVPASSEQ(eiv, not e.is_valid())
173 WVPASSEQ(er, e.is_real())
174 fake_validate(r2, r3)
175 dump(index.merge(r2, r1, r3))
176 WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
178 e = eget(index.merge(r2, r1, r3), '/a/b/c')
181 dump(index.merge(r2, r1, r3))
182 WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
183 ['/a/b/c', '/a/b/', '/a/', '/'])
189 if wvfailure_count() == initial_failures:
190 subprocess.call(['rm', '-rf', tmpdir])