]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tgit.py
tgit.py: set git committer/author info
[bup.git] / lib / bup / t / tgit.py
1 import struct, os, tempfile, time
2 from bup import git
3 from bup.helpers import *
4 from wvtest import *
5
6 bup_tmp = os.path.realpath('../../../t/tmp')
7 mkdirp(bup_tmp)
8
9 @wvtest
10 def testmangle():
11     afile  = 0100644
12     afile2 = 0100770
13     alink  = 0120000
14     adir   = 0040000
15     adir2  = 0040777
16     WVPASSEQ(git.mangle_name("a", adir2, adir), "a")
17     WVPASSEQ(git.mangle_name(".bup", adir2, adir), ".bup.bupl")
18     WVPASSEQ(git.mangle_name("a.bupa", adir2, adir), "a.bupa.bupl")
19     WVPASSEQ(git.mangle_name("b.bup", alink, alink), "b.bup.bupl")
20     WVPASSEQ(git.mangle_name("b.bu", alink, alink), "b.bu")
21     WVPASSEQ(git.mangle_name("f", afile, afile2), "f")
22     WVPASSEQ(git.mangle_name("f.bup", afile, afile2), "f.bup.bupl")
23     WVPASSEQ(git.mangle_name("f.bup", afile, adir), "f.bup.bup")
24     WVPASSEQ(git.mangle_name("f", afile, adir), "f.bup")
25
26     WVPASSEQ(git.demangle_name("f.bup"), ("f", git.BUP_CHUNKED))
27     WVPASSEQ(git.demangle_name("f.bupl"), ("f", git.BUP_NORMAL))
28     WVPASSEQ(git.demangle_name("f.bup.bupl"), ("f.bup", git.BUP_NORMAL))
29
30     # for safety, we ignore .bup? suffixes we don't recognize.  Future
31     # versions might implement a .bup[a-z] extension as something other
32     # than BUP_NORMAL.
33     WVPASSEQ(git.demangle_name("f.bupa"), ("f.bupa", git.BUP_NORMAL))
34
35
36 @wvtest
37 def testencode():
38     s = 'hello world'
39     looseb = ''.join(git._encode_looseobj('blob', s))
40     looset = ''.join(git._encode_looseobj('tree', s))
41     loosec = ''.join(git._encode_looseobj('commit', s))
42     packb = ''.join(git._encode_packobj('blob', s))
43     packt = ''.join(git._encode_packobj('tree', s))
44     packc = ''.join(git._encode_packobj('commit', s))
45     WVPASSEQ(git._decode_looseobj(looseb), ('blob', s))
46     WVPASSEQ(git._decode_looseobj(looset), ('tree', s))
47     WVPASSEQ(git._decode_looseobj(loosec), ('commit', s))
48     WVPASSEQ(git._decode_packobj(packb), ('blob', s))
49     WVPASSEQ(git._decode_packobj(packt), ('tree', s))
50     WVPASSEQ(git._decode_packobj(packc), ('commit', s))
51
52
53 @wvtest
54 def testpacks():
55     initial_failures = wvfailure_count()
56     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
57     os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
58     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
59     git.init_repo(bupdir)
60     git.verbose = 1
61
62     w = git.PackWriter()
63     w.new_blob(os.urandom(100))
64     w.new_blob(os.urandom(100))
65     w.abort()
66
67     w = git.PackWriter()
68     hashes = []
69     nobj = 1000
70     for i in range(nobj):
71         hashes.append(w.new_blob(str(i)))
72     log('\n')
73     nameprefix = w.close()
74     print repr(nameprefix)
75     WVPASS(os.path.exists(nameprefix + '.pack'))
76     WVPASS(os.path.exists(nameprefix + '.idx'))
77
78     r = git.open_idx(nameprefix + '.idx')
79     print repr(r.fanout)
80
81     for i in range(nobj):
82         WVPASS(r.find_offset(hashes[i]) > 0)
83     WVPASS(r.exists(hashes[99]))
84     WVFAIL(r.exists('\0'*20))
85
86     pi = iter(r)
87     for h in sorted(hashes):
88         WVPASSEQ(str(pi.next()).encode('hex'), h.encode('hex'))
89
90     WVFAIL(r.find_offset('\0'*20))
91
92     r = git.PackIdxList(bupdir + '/objects/pack')
93     WVPASS(r.exists(hashes[5]))
94     WVPASS(r.exists(hashes[6]))
95     WVFAIL(r.exists('\0'*20))
96     if wvfailure_count() == initial_failures:
97         subprocess.call(['rm', '-rf', tmpdir])
98
99 @wvtest
100 def test_pack_name_lookup():
101     initial_failures = wvfailure_count()
102     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
103     os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
104     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
105     git.init_repo(bupdir)
106     git.verbose = 1
107     packdir = git.repo('objects/pack')
108
109     idxnames = []
110     hashes = []
111
112     for start in range(0,28,2):
113         w = git.PackWriter()
114         for i in range(start, start+2):
115             hashes.append(w.new_blob(str(i)))
116         log('\n')
117         idxnames.append(os.path.basename(w.close() + '.idx'))
118
119     r = git.PackIdxList(packdir)
120     WVPASSEQ(len(r.packs), 2)
121     for e,idxname in enumerate(idxnames):
122         for i in range(e*2, (e+1)*2):
123             WVPASSEQ(r.exists(hashes[i], want_source=True), idxname)
124     if wvfailure_count() == initial_failures:
125         subprocess.call(['rm', '-rf', tmpdir])
126
127
128 @wvtest
129 def test_long_index():
130     initial_failures = wvfailure_count()
131     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
132     os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
133     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
134     git.init_repo(bupdir)
135     w = git.PackWriter()
136     obj_bin = struct.pack('!IIIII',
137             0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
138     obj2_bin = struct.pack('!IIIII',
139             0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
140     obj3_bin = struct.pack('!IIIII',
141             0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
142     pack_bin = struct.pack('!IIIII',
143             0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
144     idx = list(list() for i in xrange(256))
145     idx[0].append((obj_bin, 1, 0xfffffffff))
146     idx[0x11].append((obj2_bin, 2, 0xffffffffff))
147     idx[0x22].append((obj3_bin, 3, 0xff))
148     (fd,name) = tempfile.mkstemp(suffix='.idx', dir=git.repo('objects'))
149     os.close(fd)
150     w.count = 3
151     r = w._write_pack_idx_v2(name, idx, pack_bin)
152     i = git.PackIdxV2(name, open(name, 'rb'))
153     WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
154     WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
155     WVPASSEQ(i.find_offset(obj3_bin), 0xff)
156     if wvfailure_count() == initial_failures:
157         os.remove(name)
158         subprocess.call(['rm', '-rf', tmpdir])
159
160
161 @wvtest
162 def test_check_repo_or_die():
163     initial_failures = wvfailure_count()
164     orig_cwd = os.getcwd()
165     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
166     os.environ['BUP_DIR'] = bupdir = tmpdir + "/bup"
167     try:
168         os.chdir(tmpdir)
169         git.init_repo(bupdir)
170         git.check_repo_or_die()
171         WVPASS('check_repo_or_die')  # if we reach this point the call above passed
172
173         os.rename(bupdir + '/objects/pack', bupdir + '/objects/pack.tmp')
174         open(bupdir + '/objects/pack', 'w').close()
175         try:
176             git.check_repo_or_die()
177         except SystemExit, e:
178             WVPASSEQ(e.code, 14)
179         else:
180             WVFAIL()
181         os.unlink(bupdir + '/objects/pack')
182         os.rename(bupdir + '/objects/pack.tmp', bupdir + '/objects/pack')
183
184         try:
185             git.check_repo_or_die('nonexistantbup.tmp')
186         except SystemExit, e:
187             WVPASSEQ(e.code, 15)
188         else:
189             WVFAIL()
190     finally:
191         os.chdir(orig_cwd)
192     if wvfailure_count() == initial_failures:
193         subprocess.call(['rm', '-rf', tmpdir])
194
195
196 @wvtest
197 def test_commit_parsing():
198     def restore_env_var(name, val):
199         if val is None:
200             del os.environ[name]
201         else:
202             os.environ[name] = val
203     def showval(commit, val):
204         return readpipe(['git', 'show', '-s',
205                          '--pretty=format:%s' % val, commit]).strip()
206     initial_failures = wvfailure_count()
207     orig_cwd = os.getcwd()
208     tmpdir = tempfile.mkdtemp(dir=bup_tmp, prefix='bup-tgit-')
209     workdir = tmpdir + "/work"
210     repodir = workdir + '/.git'
211     orig_author_name = os.environ.get('GIT_AUTHOR_NAME')
212     orig_author_email = os.environ.get('GIT_AUTHOR_EMAIL')
213     orig_committer_name = os.environ.get('GIT_COMMITTER_NAME')
214     orig_committer_email = os.environ.get('GIT_COMMITTER_EMAIL')
215     os.environ['GIT_AUTHOR_NAME'] = 'bup test'
216     os.environ['GIT_COMMITTER_NAME'] = os.environ['GIT_AUTHOR_NAME']
217     os.environ['GIT_AUTHOR_EMAIL'] = 'bup@a425bc70a02811e49bdf73ee56450e6f'
218     os.environ['GIT_COMMITTER_EMAIL'] = os.environ['GIT_AUTHOR_EMAIL']
219     try:
220         readpipe(['git', 'init', workdir])
221         os.environ['GIT_DIR'] = os.environ['BUP_DIR'] = repodir
222         git.check_repo_or_die(repodir)
223         os.chdir(workdir)
224         with open('foo', 'w') as f:
225             print >> f, 'bar'
226         readpipe(['git', 'add', '.'])
227         readpipe(['git', 'commit', '-am', 'Do something',
228                   '--author', 'Someone <someone@somewhere>',
229                   '--date', 'Sat Oct 3 19:48:49 2009 -0400'])
230         commit = readpipe(['git', 'show-ref', '-s', 'master']).strip()
231         parents = showval(commit, '%P')
232         tree = showval(commit, '%T')
233         cname = showval(commit, '%cn')
234         cmail = showval(commit, '%ce')
235         cdate = showval(commit, '%ct')
236         coffs = showval(commit, '%ci')
237         coffs = coffs[-5:]
238         coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
239         if coffs[-5] == '-':
240             coff = - coff
241         commit_items = git.get_commit_items(commit, git.cp())
242         WVPASSEQ(commit_items.parents, [])
243         WVPASSEQ(commit_items.tree, tree)
244         WVPASSEQ(commit_items.author_name, 'Someone')
245         WVPASSEQ(commit_items.author_mail, 'someone@somewhere')
246         WVPASSEQ(commit_items.author_sec, 1254613729)
247         WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
248         WVPASSEQ(commit_items.committer_name, cname)
249         WVPASSEQ(commit_items.committer_mail, cmail)
250         WVPASSEQ(commit_items.committer_sec, int(cdate))
251         WVPASSEQ(commit_items.committer_offset, coff)
252         WVPASSEQ(commit_items.message, 'Do something\n')
253         with open('bar', 'w') as f:
254             print >> f, 'baz'
255         readpipe(['git', 'add', '.'])
256         readpipe(['git', 'commit', '-am', 'Do something else'])
257         child = readpipe(['git', 'show-ref', '-s', 'master']).strip()
258         parents = showval(child, '%P')
259         commit_items = git.get_commit_items(child, git.cp())
260         WVPASSEQ(commit_items.parents, [commit])
261     finally:
262         os.chdir(orig_cwd)
263         restore_env_var('GIT_AUTHOR_NAME', orig_author_name)
264         restore_env_var('GIT_AUTHOR_EMAIL', orig_author_email)
265         restore_env_var('GIT_COMMITTER_NAME', orig_committer_name)
266         restore_env_var('GIT_COMMITTER_EMAIL', orig_committer_email)
267     if wvfailure_count() == initial_failures:
268         subprocess.call(['rm', '-rf', tmpdir])