mercurial/cffi/osutil.py
changeset 43077 687b865b95ad
parent 43076 2372284d9457
child 46785 521ac0d7047f
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
    38         def __init__(self, st_mode, st_mtime, st_size):
    38         def __init__(self, st_mode, st_mtime, st_size):
    39             self.st_mode = st_mode
    39             self.st_mode = st_mode
    40             self.st_mtime = st_mtime
    40             self.st_mtime = st_mtime
    41             self.st_size = st_size
    41             self.st_size = st_size
    42 
    42 
    43     tv_sec_ofs = ffi.offsetof("struct timespec", "tv_sec")
    43     tv_sec_ofs = ffi.offsetof(b"struct timespec", b"tv_sec")
    44     buf = ffi.new("char[]", listdir_batch_size)
    44     buf = ffi.new(b"char[]", listdir_batch_size)
    45 
    45 
    46     def listdirinternal(dfd, req, stat, skip):
    46     def listdirinternal(dfd, req, stat, skip):
    47         ret = []
    47         ret = []
    48         while True:
    48         while True:
    49             r = lib.getattrlistbulk(dfd, req, buf, listdir_batch_size, 0)
    49             r = lib.getattrlistbulk(dfd, req, buf, listdir_batch_size, 0)
    50             if r == 0:
    50             if r == 0:
    51                 break
    51                 break
    52             if r == -1:
    52             if r == -1:
    53                 raise OSError(ffi.errno, os.strerror(ffi.errno))
    53                 raise OSError(ffi.errno, os.strerror(ffi.errno))
    54             cur = ffi.cast("val_attrs_t*", buf)
    54             cur = ffi.cast(b"val_attrs_t*", buf)
    55             for i in range(r):
    55             for i in range(r):
    56                 lgt = cur.length
    56                 lgt = cur.length
    57                 assert lgt == ffi.cast('uint32_t*', cur)[0]
    57                 assert lgt == ffi.cast(b'uint32_t*', cur)[0]
    58                 ofs = cur.name_info.attr_dataoffset
    58                 ofs = cur.name_info.attr_dataoffset
    59                 str_lgt = cur.name_info.attr_length
    59                 str_lgt = cur.name_info.attr_length
    60                 base_ofs = ffi.offsetof('val_attrs_t', 'name_info')
    60                 base_ofs = ffi.offsetof(b'val_attrs_t', b'name_info')
    61                 name = str(
    61                 name = str(
    62                     ffi.buffer(
    62                     ffi.buffer(
    63                         ffi.cast("char*", cur) + base_ofs + ofs, str_lgt - 1
    63                         ffi.cast(b"char*", cur) + base_ofs + ofs, str_lgt - 1
    64                     )
    64                     )
    65                 )
    65                 )
    66                 tp = attrkinds[cur.obj_type]
    66                 tp = attrkinds[cur.obj_type]
    67                 if name == "." or name == "..":
    67                 if name == b"." or name == b"..":
    68                     continue
    68                     continue
    69                 if skip == name and tp == statmod.S_ISDIR:
    69                 if skip == name and tp == statmod.S_ISDIR:
    70                     return []
    70                     return []
    71                 if stat:
    71                 if stat:
    72                     mtime = cur.mtime.tv_sec
    72                     mtime = cur.mtime.tv_sec
    83                         )
    83                         )
    84                     )
    84                     )
    85                 else:
    85                 else:
    86                     ret.append((name, tp))
    86                     ret.append((name, tp))
    87                 cur = ffi.cast(
    87                 cur = ffi.cast(
    88                     "val_attrs_t*", int(ffi.cast("intptr_t", cur)) + lgt
    88                     b"val_attrs_t*", int(ffi.cast(b"intptr_t", cur)) + lgt
    89                 )
    89                 )
    90         return ret
    90         return ret
    91 
    91 
    92     def listdir(path, stat=False, skip=None):
    92     def listdir(path, stat=False, skip=None):
    93         req = ffi.new("struct attrlist*")
    93         req = ffi.new(b"struct attrlist*")
    94         req.bitmapcount = lib.ATTR_BIT_MAP_COUNT
    94         req.bitmapcount = lib.ATTR_BIT_MAP_COUNT
    95         req.commonattr = (
    95         req.commonattr = (
    96             lib.ATTR_CMN_RETURNED_ATTRS
    96             lib.ATTR_CMN_RETURNED_ATTRS
    97             | lib.ATTR_CMN_NAME
    97             | lib.ATTR_CMN_NAME
    98             | lib.ATTR_CMN_OBJTYPE
    98             | lib.ATTR_CMN_OBJTYPE