+
+from __future__ import absolute_import
import io, math, os
from bup import _helpers, helpers
+from bup._helpers import cat_bytes
+from bup.compat import buffer
from bup.helpers import sc_page_size
+
_fmincore = getattr(helpers, 'fmincore', None)
BLOB_MAX = 8192*4 # 8192 is the "typical" blob size for bupsplit
-BLOB_READ_SIZE = 1024*1024
+BLOB_READ_SIZE = 8 * 1024 * 1024
MAX_PER_TREE = 256
progress_callback = None
fanout = 16
-GIT_MODE_FILE = 0100644
-GIT_MODE_TREE = 040000
-GIT_MODE_SYMLINK = 0120000
-assert(GIT_MODE_TREE != 40000) # 0xxx should be treated as octal
+GIT_MODE_FILE = 0o100644
+GIT_MODE_TREE = 0o40000
+GIT_MODE_SYMLINK = 0o120000
# The purpose of this type of buffer is to avoid copying on peek(), get(),
# and eat(). We do copy the buffer contents on put(), but that should
# be ok if we always only put() large amounts of data at a time.
class Buf:
def __init__(self):
- self.data = ''
+ self.data = b''
self.start = 0
def put(self, s):
- if s:
- self.data = buffer(self.data, self.start) + s
+ if not self.data:
+ self.data = s
+ self.start = 0
+ elif s:
+ remaining = len(self.data) - self.start
+ self.data = cat_bytes(self.data, self.start, remaining,
+ s, 0, len(s))
self.start = 0
-
+
def peek(self, count):
+ if count <= 256:
+ return self.data[self.start : self.start + count]
return buffer(self.data, self.start, count)
-
+
def eat(self, count):
self.start += count
def get(self, count):
- v = buffer(self.data, self.start, count)
+ if count <= 256:
+ v = self.data[self.start : self.start + count]
+ else:
+ v = buffer(self.data, self.start, count)
self.start += count
return v
ofs = 0
l = list(l)
total = sum(size for mode,sha,size, in l)
- vlen = len('%x' % total)
+ vlen = len(b'%x' % total)
shalist = []
for (mode, sha, size) in l:
- shalist.append((mode, '%0*x' % (vlen,ofs), sha))
+ shalist.append((mode, b'%0*x' % (vlen,ofs), sha))
ofs += size
assert(ofs == total)
return (shalist, total)
if len(shalist) == 1:
return (shalist[0][0], shalist[0][2])
elif len(shalist) == 0:
- return (GIT_MODE_FILE, makeblob(''))
+ return (GIT_MODE_FILE, makeblob(b''))
else:
return (GIT_MODE_TREE, maketree(shalist))