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:
parent
1bc6313694
commit
8c4e7ca5b5
@ -80,19 +80,21 @@ class Updater
|
|||||||
@current_revision = read_current_revision
|
@current_revision = read_current_revision
|
||||||
end
|
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
|
def report
|
||||||
map = Hash.new{ |h,k| h[k] = [] }
|
map = Hash.new{ |h,k| h[k] = [] }
|
||||||
|
|
||||||
if initial_revision && initial_revision != current_revision
|
if initial_revision && initial_revision != current_revision
|
||||||
changes = `git diff-tree -r --name-status -M85% -z #{initial_revision} #{current_revision}`.split("\0")
|
`git diff-tree -r --raw -M85% #{initial_revision} #{current_revision}`.each_line do |line|
|
||||||
changes.each_cons(3) do |status, src, dst|
|
DIFFTREE_RX.match line
|
||||||
next unless status =~ /^[AMDR](\d{3})?$/
|
path = case status = $1.to_sym
|
||||||
path = case status = status[0,1]
|
when :R then $3
|
||||||
when 'R' then dst
|
else $2
|
||||||
else src
|
|
||||||
end
|
end
|
||||||
path = Pathname.pwd.join(path).relative_path_from(HOMEBREW_REPOSITORY)
|
path = Pathname.pwd.join(path).relative_path_from(HOMEBREW_REPOSITORY)
|
||||||
map[status.to_sym] << path.to_s
|
map[status] << path.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user