Parse raw diff output in brew update

Using each_cons() "works", but to report all changes correctly we need
to look at the last elements even after we've looked at the last 3
consecutive elements.

Instead, let's parse each line of the raw diff output using a regexp.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
This commit is contained in:
Jack Nagel 2012-03-23 20:39:24 -05:00
parent 1bc6313694
commit 8c4e7ca5b5

View File

@ -80,19 +80,21 @@ class Updater
@current_revision = read_current_revision
end
# Matches raw git diff format (see `man git-diff-tree`)
DIFFTREE_RX = /^:[0-7]{6} [0-7]{6} [0-9a-fA-F]{40} [0-9a-fA-F]{40} ([ACDMR])\d{0,3}\t(.+?)(?:\t(.+))?$/
def report
map = Hash.new{ |h,k| h[k] = [] }
if initial_revision && initial_revision != current_revision
changes = `git diff-tree -r --name-status -M85% -z #{initial_revision} #{current_revision}`.split("\0")
changes.each_cons(3) do |status, src, dst|
next unless status =~ /^[AMDR](\d{3})?$/
path = case status = status[0,1]
when 'R' then dst
else src
`git diff-tree -r --raw -M85% #{initial_revision} #{current_revision}`.each_line do |line|
DIFFTREE_RX.match line
path = case status = $1.to_sym
when :R then $3
else $2
end
path = Pathname.pwd.join(path).relative_path_from(HOMEBREW_REPOSITORY)
map[status.to_sym] << path.to_s
map[status] << path.to_s
end
end