1#! ./miniruby 2 3def diff2index(cmd, *argv) 4 lines = [] 5 path = nil 6 output = `#{cmd} #{argv.join(" ")}` 7 output.force_encoding Encoding::BINARY 8 output.each_line do |line| 9 case line 10 when /^Index: (\S*)/, /^diff --git [a-z]\/(\S*) [a-z]\/\1/ 11 path = $1 12 when /^@@\s*-[,\d]+ +\+(\d+)[,\d]*\s*@@(?: +([A-Za-z_][A-Za-z_0-9 ]*[A-Za-z_0-9]))?/ 13 line = $1.to_i 14 ent = "\t* #{path}" 15 ent << " (#{$2})" if $2 16 lines << "#{ent}:" 17 end 18 end 19 lines.uniq! 20 lines.empty? ? nil : lines 21end 22 23if `svnversion` =~ /^\d+/ 24 cmd = "svn diff --diff-cmd=diff -x-pU0" 25 change = diff2index(cmd, ARGV) 26elsif File.directory?(".git") 27 cmd = "git diff -U0" 28 change = diff2index(cmd, ARGV) || diff2index(cmd, "--cached", ARGV) 29else 30 abort "does not seem to be under a vcs" 31end 32puts change if change 33