in lib/grit/index.rb [164:210]
def write_tree(tree = nil, now_tree = nil)
tree = self.tree if !tree
tree_contents = {}
now_tree = read_tree(now_tree) if(now_tree && now_tree.is_a?(String))
now_tree.contents.each do |obj|
sha = [obj.id].pack("H*")
k = obj.name
k += '/' if (obj.class == Grit::Tree)
tmode = obj.mode.to_i.to_s
tree_contents[k] = "%s %s\0%s" % [tmode, obj.name, sha]
end if now_tree
tree.each do |k, v|
case v
when Array
sha, mode = v
if sha.size == 40
sha = [sha].pack("H*")
mode = mode.to_i.to_s
k = k.split('/').last
str = "%s %s\0%s" % [mode, k, sha]
tree_contents[k] = str
end
when String
sha = write_blob(v)
sha = [sha].pack("H*")
str = "%s %s\0%s" % ['100644', k, sha]
tree_contents[k] = str
when Hash
ctree = now_tree/k if now_tree
sha = write_tree(v, ctree)
sha = [sha].pack("H*")
str = "%s %s\0%s" % ['40000', k, sha]
tree_contents[k + '/'] = str
when false
tree_contents.delete(k)
end
end
tr = tree_contents.sort.map { |k, v| v }.join('')
@last_tree_size = tr.size
self.repo.git.put_raw_object(tr, 'tree')
end