Kaynağa Gözat

diff: support presence change for blkdev, chrdev and fifo items (1.1-maint) (#6625)

diff: support presence change for blkdev, chrdev and fifo items

fixes #6483
TW 3 yıl önce
ebeveyn
işleme
dc4aebde71
1 değiştirilmiş dosya ile 22 ekleme ve 12 silme
  1. 22 12
      src/borg/archiver.py

+ 22 - 12
src/borg/archiver.py

@@ -1083,15 +1083,22 @@ class Archiver:
         def has_hardlink_master(item, hardlink_masters):
             return hardlinkable(item.mode) and item.get('source') in hardlink_masters
 
+        def compare_presence(item1, item2, item_type):
+            if item2.get('deleted') and not item1.get('deleted'):
+                chg = 'removed ' + item_type
+                return ({"type": chg}, chg)
+            elif item1.get('deleted') and not item2.get('deleted'):
+                chg = 'added ' + item_type
+                return ({"type": chg}, chg)
+
         def compare_link(item1, item2):
             # These are the simple link cases. For special cases, e.g. if a
             # regular file is replaced with a link or vice versa, it is
             # indicated in compare_mode instead.
-            if item1.get('deleted'):
-                return ({"type": 'added link'}, 'added link')
-            elif item2.get('deleted'):
-                return ({"type": 'removed link'}, 'removed link')
-            elif 'source' in item1 and 'source' in item2 and item1.source != item2.source:
+            pd = compare_presence(item1, item2, 'link')
+            if pd is not None:
+                return pd
+            if 'source' in item1 and 'source' in item2 and item1.source != item2.source:
                 return ({"type": 'changed link'}, 'changed link')
 
         def contents_changed(item1, item2):
@@ -1129,12 +1136,6 @@ class Archiver:
                         '{:>9} {:>9}'.format(format_file_size(added, precision=1, sign=True),
                         format_file_size(-removed, precision=1, sign=True)))
 
-        def compare_directory(item1, item2):
-            if item2.get('deleted') and not item1.get('deleted'):
-                return ({"type": 'removed directory'}, 'removed directory')
-            elif item1.get('deleted') and not item2.get('deleted'):
-                return ({"type": 'added directory'}, 'added directory')
-
         def compare_owner(item1, item2):
             user1, group1 = get_owner(item1)
             user2, group2 = get_owner(item2)
@@ -1168,7 +1169,16 @@ class Archiver:
                 changes.append(compare_content(path, item1, item2))
 
             if get_mode(item1)[0] == 'd' or get_mode(item2)[0] == 'd':
-                changes.append(compare_directory(item1, item2))
+                changes.append(compare_presence(item1, item2, 'directory'))
+
+            if get_mode(item1)[0] == 'b' or get_mode(item2)[0] == 'b':
+                changes.append(compare_presence(item1, item2, 'blkdev'))
+
+            if get_mode(item1)[0] == 'c' or get_mode(item2)[0] == 'c':
+                changes.append(compare_presence(item1, item2, 'chrdev'))
+
+            if get_mode(item1)[0] == 's' or get_mode(item2)[0] == 's':
+                changes.append(compare_presence(item1, item2, 'fifo'))
 
             if not deleted:
                 changes.append(compare_owner(item1, item2))