summaryrefslogtreecommitdiff
path: root/git/objects/fun.py
diff options
context:
space:
mode:
Diffstat (limited to 'git/objects/fun.py')
-rw-r--r--git/objects/fun.py44
1 files changed, 22 insertions, 22 deletions
diff --git a/git/objects/fun.py b/git/objects/fun.py
index 66b7998e..a046d6d5 100644
--- a/git/objects/fun.py
+++ b/git/objects/fun.py
@@ -5,7 +5,7 @@ __all__ = ('tree_to_stream', 'tree_entries_from_data', 'traverse_trees_recursive
'traverse_tree_recursive')
-
+
def tree_to_stream(entries, write):
"""Write the give list of entries into a stream using its write method
@@ -13,13 +13,13 @@ def tree_to_stream(entries, write):
:param write: write method which takes a data string"""
ord_zero = ord('0')
bit_mask = 7 # 3 bits set
-
+
for binsha, mode, name in entries:
mode_str = ''
for i in xrange(6):
mode_str = chr(((mode >> (i*3)) & bit_mask) + ord_zero) + mode_str
# END for each 8 octal value
-
+
# git slices away the first octal if its zero
if mode_str[0] == '0':
mode_str = mode_str[1:]
@@ -46,7 +46,7 @@ def tree_entries_from_data(data):
out = list()
while i < len_data:
mode = 0
-
+
# read mode
# Some git versions truncate the leading 0, some don't
# The type will be extracted from the mode later
@@ -56,17 +56,17 @@ def tree_entries_from_data(data):
mode = (mode << 3) + (ord(data[i]) - ord_zero)
i += 1
# END while reading mode
-
+
# byte is space now, skip it
i += 1
-
+
# parse name, it is NULL separated
-
+
ns = i
while data[i] != '\0':
i += 1
# END while not reached NULL
-
+
# default encoding for strings in git is utf8
# Only use the respective unicode object if the byte stream was encoded
name = data[ns:i]
@@ -78,7 +78,7 @@ def tree_entries_from_data(data):
if len(name) > len(name_enc):
name = name_enc
# END handle encoding
-
+
# byte is NULL, get next 20
i += 1
sha = data[i:i+20]
@@ -86,8 +86,8 @@ def tree_entries_from_data(data):
out.append((sha, mode, name))
# END for each byte in data stream
return out
-
-
+
+
def _find_by_name(tree_data, name, is_dir, start_at):
"""return data entry matching the given name and tree mode
@@ -96,7 +96,7 @@ def _find_by_name(tree_data, name, is_dir, start_at):
None in the tree_data list to mark it done"""
try:
item = tree_data[start_at]
- if item and item[2] == name and S_ISDIR(item[1]) == is_dir:
+ if item and item[2] == name and S_ISDIR(item[1]) == is_dir:
tree_data[start_at] = None
return item
except IndexError:
@@ -115,7 +115,7 @@ def _to_full_path(item, path_prefix):
if not item:
return item
return (item[0], item[1], path_prefix+item[2])
-
+
def traverse_trees_recursive(odb, tree_shas, path_prefix):
"""
:return: list with entries according to the given binary tree-shas.
@@ -141,10 +141,10 @@ def traverse_trees_recursive(odb, tree_shas, path_prefix):
# END handle muted trees
trees_data.append(data)
# END for each sha to get data for
-
+
out = list()
out_append = out.append
-
+
# find all matching entries and recursively process them together if the match
# is a tree. If the match is a non-tree item, put it into the result.
# Processed items will be set None
@@ -157,7 +157,7 @@ def traverse_trees_recursive(odb, tree_shas, path_prefix):
entries[ti] = item
sha, mode, name = item # its faster to unpack
is_dir = S_ISDIR(mode) # type mode bits
-
+
# find this item in all other tree data items
# wrap around, but stop one before our current index, hence
# ti+nt, not ti+1+nt
@@ -165,23 +165,23 @@ def traverse_trees_recursive(odb, tree_shas, path_prefix):
tio = tio % nt
entries[tio] = _find_by_name(trees_data[tio], name, is_dir, ii)
# END for each other item data
-
+
# if we are a directory, enter recursion
if is_dir:
out.extend(traverse_trees_recursive(odb, [((ei and ei[0]) or None) for ei in entries], path_prefix+name+'/'))
else:
out_append(tuple(_to_full_path(e, path_prefix) for e in entries))
# END handle recursion
-
+
# finally mark it done
tree_data[ii] = None
# END for each item
-
+
# we are done with one tree, set all its data empty
del(tree_data[:])
# END for each tree_data chunk
return out
-
+
def traverse_tree_recursive(odb, tree_sha, path_prefix):
"""
:return: list of entries of the tree pointed to by the binary tree_sha. An entry
@@ -192,7 +192,7 @@ def traverse_tree_recursive(odb, tree_sha, path_prefix):
:param path_prefix: prefix to prepend to the front of all returned paths"""
entries = list()
data = tree_entries_from_data(odb.stream(tree_sha).read())
-
+
# unpacking/packing is faster than accessing individual items
for sha, mode, name in data:
if S_ISDIR(mode):
@@ -200,5 +200,5 @@ def traverse_tree_recursive(odb, tree_sha, path_prefix):
else:
entries.append((sha, mode, path_prefix+name))
# END for each item
-
+
return entries