Browse Source

Implemented --numeric-owner

Jonas Borgström 13 năm trước cách đây
mục cha
commit
4ddbf0d02a
2 tập tin đã thay đổi với 23 bổ sung7 xóa
  1. 11 3
      darc/archive.py
  2. 12 4
      darc/archiver.py

+ 11 - 3
darc/archive.py

@@ -30,7 +30,8 @@ class Archive(object):
     class AlreadyExists(Exception):
         pass
 
-    def __init__(self, store, key, manifest, name, cache=None, create=False, checkpoint_interval=300):
+    def __init__(self, store, key, manifest, name, cache=None, create=False,
+                 checkpoint_interval=300, numeric_owner=False):
         self.key = key
         self.store = store
         self.cache = cache
@@ -41,6 +42,7 @@ class Archive(object):
         self.stats = Statistics()
         self.name = name
         self.checkpoint_interval = checkpoint_interval
+        self.numeric_owner = numeric_owner
         if create:
             if name in manifest.archives:
                 raise self.AlreadyExists
@@ -246,8 +248,12 @@ class Archive(object):
             os.lchmod(path, item['mode'])
         elif not symlink:
             os.chmod(path, item['mode'])
-        uid = user2uid(item['user']) or item['uid']
-        gid = group2gid(item['group']) or item['gid']
+        uid = gid = None
+        if not self.numeric_owner:
+            uid = user2uid(item['user'])
+            gid = group2gid(item['group'])
+        uid = uid or item['uid']
+        gid = gid or item['gid']
         try:
             os.lchown(path, uid, gid)
         except OSError:
@@ -306,6 +312,8 @@ class Archive(object):
             'gid': st.st_gid, 'group': gid2group(st.st_gid),
             'mtime': st.st_mtime,
         }
+        if self.numeric_owner:
+            item['user'] = item['group'] = None
         try:
             xa = xattr(path, XATTR_NOFOLLOW)
             xattrs = {}

+ 12 - 4
darc/archiver.py

@@ -72,7 +72,8 @@ class Archiver(object):
         manifest = Manifest(store, key)
         cache = Cache(store, key, manifest)
         archive = Archive(store, key, manifest, args.archive.archive, cache=cache,
-                          create=True, checkpoint_interval=args.checkpoint_interval)
+                          create=True, checkpoint_interval=args.checkpoint_interval,
+                          numeric_owner=args.numeric_owner)
         # Add darc cache dir to inode_skip list
         skip_inodes = set()
         try:
@@ -170,7 +171,8 @@ class Archiver(object):
         store = self.open_store(args.archive)
         key = Key(store)
         manifest = Manifest(store, key)
-        archive = Archive(store, key, manifest, args.archive.archive)
+        archive = Archive(store, key, manifest, args.archive.archive,
+                          numeric_owner=args.numeric_owner)
         dirs = []
         archive.iter_items(extract_cb)
         store.flush_rpc()
@@ -206,8 +208,8 @@ class Archiver(object):
                     extra = ' link to %s' % item['source']
             else:
                 extra = ''
-            print '%s%s %-6s %-6s %8d %s %s%s' % (type, mode, item['user'],
-                                              item['group'], size, mtime,
+            print '%s%s %-6s %-6s %8d %s %s%s' % (type, mode, item['user'] or item['uid'],
+                                              item['group'] or item['gid'], size, mtime,
                                               item['path'], extra)
 
         store = self.open_store(args.src)
@@ -347,6 +349,9 @@ class Archiver(object):
         subparser.add_argument('--do-not-cross-mountpoints', dest='dontcross',
                                action='store_true', default=False,
                                help='Do not cross mount points')
+        subparser.add_argument('--numeric-owner', dest='numeric_owner',
+                               action='store_true', default=False,
+                               help='Only store numeric user and group identifiers')
         subparser.add_argument('archive', metavar='ARCHIVE',
                                type=location_validator(archive=True),
                                help='Archive to create')
@@ -361,6 +366,9 @@ class Archiver(object):
         subparser.add_argument('-e', '--exclude', dest='patterns',
                                type=ExcludePattern, action='append',
                                help='Include condition')
+        subparser.add_argument('--numeric-owner', dest='numeric_owner',
+                               action='store_true', default=False,
+                               help='Only obey numeric user and group identifiers')
         subparser.add_argument('archive', metavar='ARCHIVE',
                                type=location_validator(archive=True),
                                help='Archive to create')