objectstore: move tree-moving code into the tree
The code to move the a TreeObject more naturally belongs to the TreeObject itself and makes the ObjectStore.commit() method even easier to read.
This commit is contained in:
parent
b5b5e7be29
commit
ce5719a03f
1 changed files with 13 additions and 7 deletions
|
|
@ -50,6 +50,16 @@ class TreeObject:
|
||||||
|
|
||||||
return treesum_hash
|
return treesum_hash
|
||||||
|
|
||||||
|
def move(self, destination: str):
|
||||||
|
"""Move the tree to destination
|
||||||
|
|
||||||
|
Does so atomically by using rename(2). If the
|
||||||
|
target already exist, use that instead
|
||||||
|
"""
|
||||||
|
with suppress_oserror(errno.ENOTEMPTY, errno.EEXIST):
|
||||||
|
os.rename(self.path, destination)
|
||||||
|
self.path = destination
|
||||||
|
|
||||||
|
|
||||||
class ObjectStore:
|
class ObjectStore:
|
||||||
def __init__(self, store):
|
def __init__(self, store):
|
||||||
|
|
@ -140,13 +150,9 @@ class ObjectStore:
|
||||||
# the tree is stored in the objects directory using its content
|
# the tree is stored in the objects directory using its content
|
||||||
# hash as its name, ideally a given object_id (i.e., given config)
|
# hash as its name, ideally a given object_id (i.e., given config)
|
||||||
# will always produce the same content hash, but that is not
|
# will always produce the same content hash, but that is not
|
||||||
# guaranteed
|
# guaranteed. If a tree with the same treesum already exist, us
|
||||||
output_tree = f"{self.objects}/{treesum_hash}"
|
# the existing one instead
|
||||||
|
tree.move(f"{self.objects}/{treesum_hash}")
|
||||||
# if a tree with the same treesum already exist, use that
|
|
||||||
with suppress_oserror(errno.ENOTEMPTY, errno.EEXIST):
|
|
||||||
os.rename(tree.path, output_tree)
|
|
||||||
tree.path = output_tree
|
|
||||||
|
|
||||||
# symlink the object_id (config hash) in the refs directory to the
|
# symlink the object_id (config hash) in the refs directory to the
|
||||||
# treesum (content hash) in the objects directory. If a symlink by
|
# treesum (content hash) in the objects directory. If a symlink by
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue