commit - 46fa53a67457a3f2353716b32d15df2e21b3a918
commit + f9d0cc5ebc15b30173617a72127378c5462dd781
blob - 65d0f03cdbe4cd204a096ea2902074a7c4a88398
blob + cb74df094bf1179cf807fd8dc2987fe593de3be6
--- docs/tutorial/remote.txt
+++ docs/tutorial/remote.txt
>>> cid = repo.do_commit(b"message", committer=b"Jelmer <jelmer@samba.org>")
>>> backend = DictBackend({b'/': repo})
>>> dul_server = TCPGitServer(backend, b'localhost', 0)
- >>> threading.Thread(target=dul_server.serve).start()
+ >>> server_thread = threading.Thread(target=dul_server.serve)
+ >>> server_thread.start()
>>> server_address, server_port=dul_server.socket.getsockname()
Remote repositories
>>> from dulwich.repo import Repo
>>> local = Repo.init("local", mkdir=True)
>>> remote_refs = client.fetch(b"/", local)
+ >>> local.close()
Let's shut down the server now that all tests have been run::
blob - e60395572a6e039f7d90e8b1382d82e6254489da
blob + dec12e5d435683a97c818906bc125ced6c85b669
--- dulwich/object_store.py
+++ dulwich/object_store.py
pack_sha, extra_entries = extend_pack(
f, indexer.ext_refs(), get_raw=self.get_raw, compression_level=self.pack_compression_level,
progress=progress)
-
+ f.flush()
+ try:
+ fileno = f.fileno()
+ except AttributeError:
+ pass
+ else:
+ os.fsync(fileno)
f.close()
entries.extend(extra_entries)
# Move the pack in.
entries.sort()
pack_base_name = self._get_pack_basepath(entries)
- target_pack = pack_base_name + ".pack"
+
+ for pack in self.packs:
+ if pack._basename == pack_base_name:
+ return pack
+
+ target_pack_path = pack_base_name + ".pack"
+ target_index_path = pack_base_name + ".idx"
if sys.platform == "win32":
# Windows might have the target pack file lingering. Attempt
# removal, silently passing if the target does not exist.
with suppress(FileNotFoundError):
- os.remove(target_pack)
- os.rename(path, target_pack)
+ os.remove(target_pack_path)
+ os.rename(path, target_pack_path)
# Write the index.
- with GitFile(pack_base_name + ".idx", "wb", mask=PACK_MODE) as index_file:
+ with GitFile(target_index_path, "wb", mask=PACK_MODE) as index_file:
write_pack_index(index_file, entries, pack_sha)
# Add the pack to the store and return it.
Args:
path: Path to the pack file.
"""
- f.flush()
- try:
- fileno = f.fileno()
- except AttributeError:
- pass
- else:
- os.fsync(fileno)
f.seek(0)
- with PackData(path, f) as p:
- entries = p.sorted_entries()
- basename = self._get_pack_basepath(entries)
- index_name = basename + ".idx"
- if not os.path.exists(index_name):
- with GitFile(index_name, "wb", mask=PACK_MODE) as f:
- write_pack_index(f, entries, p.get_stored_checksum())
- for pack in self.packs:
- if pack._basename == basename:
- return pack
- target_pack = basename + ".pack"
- if sys.platform == "win32":
- # Windows might have the target pack file lingering. Attempt
- # removal, silently passing if the target does not exist.
- with suppress(FileNotFoundError):
- os.remove(target_pack)
- os.rename(path, target_pack)
- final_pack = Pack(basename)
- self._add_cached_pack(basename, final_pack)
- return final_pack
+ with PackData(path, f) as pd:
+ indexer = PackIndexer.for_pack_data(pd, resolve_ext_ref=self.get_raw)
+ return self._complete_pack(f, path, len(pd), indexer)
def add_pack(self):
"""Add a new pack to this object store.
def commit():
size = f.tell()
- f.seek(0)
- p = PackData.from_file(f, size)
- for obj in PackInflater.for_pack_data(p, self.get_raw):
- self.add_object(obj)
- p.close()
+ if size > 0:
+ f.seek(0)
+ p = PackData.from_file(f, size)
+ for obj in PackInflater.for_pack_data(p, self.get_raw):
+ self.add_object(obj)
+ p.close()
+ else:
+ f.close()
def abort():
- pass
+ f.close()
return f, commit, abort
blob - dacf1b4735487a03ffcf42319e3d5bb3e1993787
blob + 64fefbd8b59bd9330da1c9087e3d5f9d58b5a89d
--- dulwich/tests/test_client.py
+++ dulwich/tests/test_client.py
target = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, target)
t = Repo.init_bare(target)
+ self.addCleanup(t.close)
s = open_repo("a.git")
self.addCleanup(tear_down_repo, s)
self.assertEqual(s.get_refs(), c.fetch(s.path, t).refs)
blob - 54b4f5d3f64b4f3f078e5a4404f6c0e504b44970
blob + fc0abf09129ffe6ecae73a7bbfecbdf53d600cf7
--- dulwich/tests/test_object_store.py
+++ dulwich/tests/test_object_store.py
def test_add_pack_emtpy(self):
o = MemoryObjectStore()
f, commit, abort = o.add_pack()
- self.assertRaises(AssertionError, commit)
+ commit()
def test_add_thin_pack(self):
o = MemoryObjectStore()
def test_add_pack(self):
o = DiskObjectStore(self.store_dir)
+ self.addCleanup(o.close)
f, commit, abort = o.add_pack()
try:
b = make_object(Blob, data=b"more yummy data")
blob - 3ac257e3c14c50943354f8c2bfc78f4804baf370
blob + 73c1aae4a775df87e32c4b20300c6ab921210363
--- dulwich/tests/test_repository.py
+++ dulwich/tests/test_repository.py
dest_dir = os.path.join(temp_dir, "a.git")
shutil.copytree(os.path.join(repo_dir, "a.git"), dest_dir, symlinks=True)
r = Repo(dest_dir)
+ self.addCleanup(r.close)
del r.refs[b"refs/heads/master"]
del r.refs[b"HEAD"]
t = r.clone(os.path.join(temp_dir, "b.git"), mkdir=True)
+ self.addCleanup(t.close)
self.assertEqual(
{
b"refs/tags/mytag": b"28237f4dc30d0d462658d6b937b08a0f0b6ef55a",