Class: RJGit::Plumbing::TreeBuilder
- Inherits:
-
Object
- Object
- RJGit::Plumbing::TreeBuilder
- Defined in:
- lib/rjgit.rb
Instance Attribute Summary collapse
-
#log ⇒ Object
readonly
Returns the value of attribute log.
-
#treemap ⇒ Object
Returns the value of attribute treemap.
Instance Method Summary collapse
- #build_tree(start_tree, treemap = nil, flush = false) ⇒ Object
- #init_log ⇒ Object
-
#initialize(repository) ⇒ TreeBuilder
constructor
A new instance of TreeBuilder.
- #object_inserter ⇒ Object
- #only_contains_deletions(hashmap) ⇒ Object
- #write_blob(contents, flush = false) ⇒ Object
Constructor Details
#initialize(repository) ⇒ TreeBuilder
Returns a new instance of TreeBuilder.
173 174 175 176 177 |
# File 'lib/rjgit.rb', line 173 def initialize(repository) @jrepo = RJGit.repository_type(repository) @treemap = {} init_log end |
Instance Attribute Details
#log ⇒ Object (readonly)
Returns the value of attribute log.
171 172 173 |
# File 'lib/rjgit.rb', line 171 def log @log end |
#treemap ⇒ Object
Returns the value of attribute treemap.
170 171 172 |
# File 'lib/rjgit.rb', line 170 def treemap @treemap end |
Instance Method Details
#build_tree(start_tree, treemap = nil, flush = false) ⇒ Object
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'lib/rjgit.rb', line 198 def build_tree(start_tree, treemap = nil, flush = false) existing_trees = {} untouched_objects = {} formatter = TreeFormatter.new treemap ||= self.treemap if start_tree then treewalk = TreeWalk.new(@jrepo) treewalk.add_tree(start_tree) while treewalk.next filename = treewalk.get_name_string if treemap.keys.include?(filename) then kind = treewalk.isSubtree ? :tree : :blob if treemap[filename] == false then @log[:deleted] << [kind, filename, treewalk.get_object_id(0)] else existing_trees[filename] = treewalk.get_object_id(0) if kind == :tree end else mode = treewalk.get_file_mode(0) filename = "#{filename}/" if mode == FileMode::TREE untouched_objects[filename] = [mode, treewalk.get_object_id(0)] end end end sorted_treemap = treemap.inject({}) {|h, (k,v)| v.is_a?(Hash) ? h["#{k}/"] = v : h[k] = v; h }.merge(untouched_objects).sort sorted_treemap.each do |object_name, data| case data when Array object_name = object_name[0...-1] if data[0] == FileMode::TREE formatter.append(object_name.to_java_string, data[0], data[1]) when Hash object_name = object_name[0...-1] next_tree = build_tree(existing_trees[object_name], data) formatter.append(object_name.to_java_string, FileMode::TREE, next_tree) @log[:added] << [:tree, object_name, next_tree] unless only_contains_deletions(data) when String blobid = write_blob(data) formatter.append(object_name.to_java_string, FileMode::REGULAR_FILE, blobid) @log[:added] << [:blob, object_name, blobid] end end object_inserter.insert(formatter) end |
#init_log ⇒ Object
183 184 185 |
# File 'lib/rjgit.rb', line 183 def init_log @log = {:deleted => [], :added => [] } end |
#object_inserter ⇒ Object
179 180 181 |
# File 'lib/rjgit.rb', line 179 def object_inserter @object_inserter ||= @jrepo.newObjectInserter end |
#only_contains_deletions(hashmap) ⇒ Object
187 188 189 190 191 192 193 194 195 196 |
# File 'lib/rjgit.rb', line 187 def only_contains_deletions(hashmap) hashmap.each do |key, value| if value.is_a?(Hash) then return false unless only_contains_deletions(value) elsif value.is_a?(String) return false end end true end |
#write_blob(contents, flush = false) ⇒ Object
246 247 248 249 250 |
# File 'lib/rjgit.rb', line 246 def write_blob(contents, flush = false) blobid = object_inserter.insert(Constants::OBJ_BLOB, contents.to_java_bytes) object_inserter.flush if flush blobid end |