./lib/dolt/git/repository.rb in dolt-0.4.2 vs ./lib/dolt/git/repository.rb in dolt-0.4.3
- old
+ new
@@ -18,15 +18,40 @@
require "em_rugged/repository"
require "em_pessimistic/deferrable_child_process"
require "em/deferrable"
require "dolt/git/blame"
require "dolt/git/commit"
+require "dolt/git/submodule"
+require "dolt/git/tree"
require "dolt/async/when"
module Dolt
module Git
class Repository < EMRugged::Repository
+ def submodules(ref)
+ d = EventMachine::DefaultDeferrable.new
+ gm = rev_parse("#{ref}:.gitmodules")
+ gm.callback do |config|
+ d.succeed(Dolt::Git::Submodule.parse_config(config.content))
+ end
+ # Fails if .gitmodules cannot be found, which means no submodules
+ gm.errback { |err| d.succeed([]) }
+ d
+ end
+
+ def tree(ref, path)
+ d = EventMachine::DefaultDeferrable.new
+ rp = rev_parse("#{ref}:#{path}")
+ rp.callback do |tree|
+ break d.fail(StandardError.new("Not a tree")) unless tree.is_a?(Rugged::Tree)
+ break d.succeed(tree) if !tree.find { |e| e[:type].nil? }
+ annotate_submodules(ref, path, d, tree)
+ end
+ rp.errback { |err| d.fail(err) }
+ d
+ end
+
def blame(ref, path)
deferred_method("blame -l -t -p #{ref} #{path}") do |output, s|
Dolt::Git::Blame.parse_porcelain(output)
end
end
@@ -68,9 +93,27 @@
progress.errback { |e| d.fail(e) }
progress.callback do |history|
d.succeed(entries.map { |e| e.merge({ :history => history.shift }) })
end
d
+ end
+
+ def annotate_submodules(ref, path, deferrable, tree)
+ submodules(ref).callback do |submodules|
+ entries = tree.entries.map do |entry|
+ if entry[:type].nil?
+ mod = path == "" ? entry[:name] : File.join(path, entry[:name])
+ meta = submodules.find { |s| s[:path] == mod }
+ if meta
+ entry[:type] = :submodule
+ entry[:url] = meta[:url]
+ end
+ end
+ entry
+ end
+
+ deferrable.succeed(Dolt::Git::Tree.new(tree.oid, entries))
+ end
end
def deferred_method(cmd, &block)
d = EventMachine::DefaultDeferrable.new
cmd = git(cmd)