aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorJack Nagel2012-03-23 20:39:24 -0500
committerJack Nagel2012-03-23 20:39:24 -0500
commitba85e7563e036f3106930f38748c094b13ab2bf3 (patch)
treedebd05c55ae045eadcd136d97ee34ed2e85e49d7 /Library
parent9b885f654ef985d5d6c72bea8e0cd3fa76f54bf2 (diff)
downloadhomebrew-ba85e7563e036f3106930f38748c094b13ab2bf3.tar.bz2
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>
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/cmd/update.rb16
1 files changed, 9 insertions, 7 deletions
diff --git a/Library/Homebrew/cmd/update.rb b/Library/Homebrew/cmd/update.rb
index 594d2da95..26edaf204 100644
--- a/Library/Homebrew/cmd/update.rb
+++ b/Library/Homebrew/cmd/update.rb
@@ -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