]> arthur.barton.de Git - bup.git/commitdiff
vfs: rely on FakeLink's target in readlink
authorRob Browning <rlb@defaultvalue.org>
Sun, 20 Oct 2019 16:48:58 +0000 (11:48 -0500)
committerRob Browning <rlb@defaultvalue.org>
Sun, 3 Nov 2019 19:29:39 +0000 (13:29 -0600)
This could result in an error like:

  File "/usr/local/lib/bup/bup/vfs.py", line 524, in _compute_item_size
    return len(_readlink(repo, item.oid))
  AttributeError: 'FakeLink' object has no attribute 'oid'

Thanks to Hartmut Krafft for reporting the problem and helping devise
the solution.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
lib/bup/t/tvfs.py
lib/bup/vfs.py

index dcd862bfb57393c7b6540ff6bd343261c6044c9d..a35ad057fb0bd8ad5f4980843c8f7d1014889546 100644 (file)
@@ -192,6 +192,9 @@ def test_misc():
             fake_item = file_item._replace(meta=meta)
             wvpasseq(42, vfs.item_size(repo, fake_item))
 
+            _, fakelink_item = vfs.resolve(repo, '/test/latest', follow=False)[-1]
+            wvpasseq(17, vfs.item_size(repo, fakelink_item))
+
             wvstart('augment_item_meta')
             run_augment_item_meta_tests(repo,
                                         '/test/latest/file', 7,
index 8a1e671df73b2aa3f809e34ed07f9c98e7d18881..1fd1b462348ccfe6962e5440aeccb21f4cfe5479 100644 (file)
@@ -512,12 +512,12 @@ def readlink(repo, item):
     target from the repository if necessary."""
     assert repo
     assert S_ISLNK(item_mode(item))
+    if isinstance(item, FakeLink):
+        return item.target
     if isinstance(item.meta, Metadata):
         target = item.meta.symlink_target
         if target:
             return target
-    elif isinstance(item, FakeLink):
-        return item.target
     return _readlink(repo, item.oid)
 
 def _compute_item_size(repo, item):
@@ -526,6 +526,8 @@ def _compute_item_size(repo, item):
         size = _normal_or_chunked_file_size(repo, item.oid)
         return size
     if S_ISLNK(mode):
+        if isinstance(item, FakeLink):
+            return len(item.target)
         return len(_readlink(repo, item.oid))
     return 0