]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/helpers.py
username/userfullname: use struct names
[bup.git] / lib / bup / helpers.py
index 1bae59d22e99da707daac8198bcba5c0275882b7..d66b5f17dad32a23331876e3ff58ac2477964388 100644 (file)
@@ -1,6 +1,6 @@
 """Helper functions and classes for bup."""
 
-from __future__ import absolute_import
+from __future__ import absolute_import, division
 from collections import namedtuple
 from contextlib import contextmanager
 from ctypes import sizeof, c_void_p
@@ -99,6 +99,13 @@ def partition(predicate, stream):
     return (leading_matches(), rest())
 
 
+def merge_dict(*xs):
+    result = {}
+    for x in xs:
+        result.update(x)
+    return result
+
+
 def lines_until_sentinel(f, sentinel, ex_type):
     # sentinel must end with \n and must contain only one \n
     while True:
@@ -435,7 +442,7 @@ def username():
     global _username
     if not _username:
         uid = os.getuid()
-        _username = pwd_from_uid(uid)[0] or 'user%d' % uid
+        _username = pwd_from_uid(uid).pw_name or b'user%d' % uid
     return _username
 
 
@@ -447,9 +454,9 @@ def userfullname():
         uid = os.getuid()
         entry = pwd_from_uid(uid)
         if entry:
-            _userfullname = entry[4].split(',')[0] or entry[0]
+            _userfullname = entry.pw_gecos.split(b',')[0] or entry.pw_name
         if not _userfullname:
-            _userfullname = 'user%d' % uid
+            _userfullname = b'user%d' % uid
     return _userfullname
 
 
@@ -474,9 +481,9 @@ def format_filesize(size):
     size = float(size)
     if size < unit:
         return "%d" % (size)
-    exponent = int(math.log(size) / math.log(unit))
+    exponent = int(math.log(size) // math.log(unit))
     size_prefix = "KMGTPE"[exponent - 1]
-    return "%.1f%s" % (size / math.pow(unit, exponent), size_prefix)
+    return "%.1f%s" % (size // math.pow(unit, exponent), size_prefix)
 
 
 class NotOk(Exception):
@@ -813,7 +820,7 @@ if _mincore:
         pref_chunk_size = 64 * 1024 * 1024
         chunk_size = sc_page_size
         if (sc_page_size < pref_chunk_size):
-            chunk_size = sc_page_size * (pref_chunk_size / sc_page_size)
+            chunk_size = sc_page_size * (pref_chunk_size // sc_page_size)
         _fmincore_chunk_size = chunk_size
 
     def fmincore(fd):
@@ -825,13 +832,13 @@ if _mincore:
             return bytearray(0)
         if not _fmincore_chunk_size:
             _set_fmincore_chunk_size()
-        pages_per_chunk = _fmincore_chunk_size / sc_page_size;
-        page_count = (st.st_size + sc_page_size - 1) / sc_page_size;
-        chunk_count = page_count / _fmincore_chunk_size
+        pages_per_chunk = _fmincore_chunk_size // sc_page_size;
+        page_count = (st.st_size + sc_page_size - 1) // sc_page_size;
+        chunk_count = page_count // _fmincore_chunk_size
         if chunk_count < 1:
             chunk_count = 1
         result = bytearray(page_count)
-        for ci in xrange(chunk_count):
+        for ci in compat.range(chunk_count):
             pos = _fmincore_chunk_size * ci;
             msize = min(_fmincore_chunk_size, st.st_size - pos)
             try:
@@ -962,7 +969,7 @@ def columnate(l, prefix):
     while len(l) % ncols:
         l.append('')
     rows = len(l) // ncols
-    for s in range(0, len(l), rows):
+    for s in compat.range(0, len(l), rows):
         cols.append(l[s:s+rows])
     out = ''
     for row in zip(*cols):
@@ -1174,7 +1181,7 @@ else:
         return x
 
 
-_some_invalid_save_parts_rx = re.compile(r'[[ ~^:?*\\]|\.\.|//|@{')
+_some_invalid_save_parts_rx = re.compile(r'[\[ ~^:?*\\]|\.\.|//|@{')
 
 def valid_save_name(name):
     # Enforce a superset of the restrictions in git-check-ref-format(1)