From 4c55082e7c0bcf0c6bb2b1401286fda466ad3248 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Tue, 10 Sep 2013 15:08:03 -0500 Subject: [PATCH] update: restore previous state when interrupted Fixes Homebrew/homebrew#19460. Closes Homebrew/homebrew#22375. --- Library/Homebrew/cmd/update.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/cmd/update.rb b/Library/Homebrew/cmd/update.rb index b3248c5cb3..09e68f6884 100644 --- a/Library/Homebrew/cmd/update.rb +++ b/Library/Homebrew/cmd/update.rb @@ -86,11 +86,19 @@ class Updater # the refspec ensures that 'origin/master' gets updated args << "refs/heads/master:refs/remotes/origin/master" - safe_system "git", *args + reset_on_interrupt { safe_system "git", *args } @current_revision = read_current_revision end + def reset_on_interrupt + ignore_interrupts { yield } + ensure + if $?.signaled? && $?.termsig == 2 # SIGINT + safe_system "git", "reset", "--hard", @initial_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(.+))?$/