Merge lp:~jelmer/brz/pack-changes into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: 7638
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/pack-changes
Merge into: lp:brz
Diff against target: 87 lines (+30/-12)
2 files modified
breezy/git/tests/test_remote.py (+1/-1)
breezy/git/transportgit.py (+29/-11)
To merge this branch: bzr merge lp:~jelmer/brz/pack-changes
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+429890@code.launchpad.net

Commit message

Fix compatibility with modern dulwich.

Description of the change

Fix compatibility with modern dulwich.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
lp:~jelmer/brz/pack-changes updated
7638. By Jelmer Vernooij

More refactoring - avoid creating index with newer versions of Dulwich.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/git/tests/test_remote.py'
2--- breezy/git/tests/test_remote.py 2022-08-30 17:23:15 +0000
3+++ breezy/git/tests/test_remote.py 2022-09-14 13:53:01 +0000
4@@ -892,7 +892,7 @@
5 t = br.basis_tree()
6 chunks = list(t.archive('tgz', 'foo.tar.gz'))
7 with gzip.GzipFile(fileobj=BytesIO(b''.join(chunks))) as g:
8- self.assertEqual('', g.filename)
9+ self.assertEqual('', g.name)
10
11 def test_archive_unsupported(self):
12 # archive is not supported over HTTP, so simulate that
13
14=== modified file 'breezy/git/transportgit.py'
15--- breezy/git/transportgit.py 2022-08-22 18:19:46 +0000
16+++ breezy/git/transportgit.py 2022-09-14 13:53:01 +0000
17@@ -51,6 +51,10 @@
18 compute_file_sha,
19 write_pack_object,
20 )
21+try:
22+ from dulwich.refs import SymrefLoop
23+except ImportError: # dulwich < 0.20.46
24+ SymrefLoop = KeyError
25 from dulwich.repo import (
26 BaseRepo,
27 InfoRefsContainer,
28@@ -274,7 +278,7 @@
29 try:
30 realnames, _ = self.follow(name)
31 realname = realnames[-1]
32- except (KeyError, IndexError):
33+ except (KeyError, IndexError, SymrefLoop):
34 realname = name
35 if realname == b'HEAD':
36 transport = self.worktree_transport
37@@ -635,8 +639,8 @@
38 warning('Unable to read pack file %s',
39 self.pack_transport.abspath(pack_name))
40 continue
41- # TODO(jelmer): Don't read entire file into memory?
42- f = BytesIO(f.read())
43+ from tempfile import SpooledTemporaryFile
44+ f = SpooledTemporaryFile(f.read())
45 pd = PackData(pack_name, f)
46 else:
47 pd = PackData(
48@@ -766,17 +770,31 @@
49 :param path: Path to the pack file.
50 """
51 f.seek(0)
52- p = Pack('', resolve_ext_ref=self.get_raw)
53- p._data = PackData.from_file(f, len(f.getvalue()))
54- p._data.pack = p
55- p._idx_load = lambda: MemoryPackIndex(
56- p.data.sorted_entries(), p.data.get_stored_checksum())
57-
58- pack_sha = p.index.objects_sha1()
59+ data = PackData.from_file(f, len(f.getvalue()))
60+ if hasattr(Pack, 'sorted_entries'):
61+ from dulwich.pack import _PackTupleIterable, PackInflater
62+ sorted_entries = list(
63+ data.sorted_entries(resolve_ext_ref=self.get_raw))
64+ pack_sha = iter_sha1(entry[0] for entry in sorted_entries)
65+ inflater = PackInflater.for_pack_data(
66+ data, resolve_ext_ref=self.get_raw)
67+ pack_tuples = _PackTupleIterable(lambda: iter(inflater), len(data))
68+ else: # dulwich < 0.20.47
69+ p = Pack('', resolve_ext_ref=self.get_raw)
70+ p._data = data
71+ p._data.pack = p
72+ sorted_entries = p.data.sorted_entries()
73+
74+ p._idx_load = lambda: MemoryPackIndex(
75+ sorted_entries,
76+ p.data.get_stored_checksum())
77+
78+ pack_sha = p.index.objects_sha1()
79+ pack_tuples = p.pack_tuples()
80
81 with self.pack_transport.open_write_stream(
82 "pack-%s.pack" % pack_sha.decode('ascii')) as datafile:
83- entries, data_sum = write_pack_objects(datafile, p.pack_tuples())
84+ entries, data_sum = write_pack_objects(datafile, pack_tuples)
85 entries = sorted([(k, v[0], v[1]) for (k, v) in entries.items()])
86 with self.pack_transport.open_write_stream(
87 "pack-%s.idx" % pack_sha.decode('ascii')) as idxfile:

Subscribers

People subscribed via source and target branches