From patchwork Mon Aug 19 21:41:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pratyush Yadav X-Patchwork-Id: 11102003 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 81C841398 for ; Mon, 19 Aug 2019 21:41:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 608302087E for ; Mon, 19 Aug 2019 21:41:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728429AbfHSVlb (ORCPT ); Mon, 19 Aug 2019 17:41:31 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:34165 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728014AbfHSVlb (ORCPT ); Mon, 19 Aug 2019 17:41:31 -0400 Received: from localhost.localdomain (unknown [1.186.12.8]) (Authenticated sender: me@yadavpratyush.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id F312D100005; Mon, 19 Aug 2019 21:41:28 +0000 (UTC) From: Pratyush Yadav To: Cc: Pratyush Yadav , Junio C Hamano Subject: [PATCH 1/3] git-gui: Move revert confirmation dialog creation to separate function Date: Tue, 20 Aug 2019 03:11:08 +0530 Message-Id: <20190819214110.26461-2-me@yadavpratyush.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190819214110.26461-1-me@yadavpratyush.com> References: <20190819214110.26461-1-me@yadavpratyush.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Upcoming commits will introduce reverting lines and hunks. They also need to prompt the user for confirmation. Put the dialog creation in its separate function so the same code won't be repeated again and again. Signed-off-by: Pratyush Yadav --- git-gui/lib/index.tcl | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl index b588db11d9..cb7f74af45 100644 --- a/git-gui/lib/index.tcl +++ b/git-gui/lib/index.tcl @@ -388,6 +388,18 @@ proc do_add_all {} { add_helper [mc "Adding all changed files"] $paths } +proc revert_dialog {query} { + return [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ + "$query" \ + question \ + 1 \ + [mc "Do Nothing"] \ + [mc "Revert Changes"] \ + ] +} + proc revert_helper {txt paths} { global file_states current_diff_path @@ -430,17 +442,12 @@ proc revert_helper {txt paths} { set query [mc "Revert changes in these %i files?" $n] } - set reply [tk_dialog \ - .confirm_revert \ - "[appname] ([reponame])" \ - "$query + set query "$query + +[mc "Any unstaged changes will be permanently lost by the revert."]" + + set reply [revert_dialog $query] -[mc "Any unstaged changes will be permanently lost by the revert."]" \ - question \ - 1 \ - [mc "Do Nothing"] \ - [mc "Revert Changes"] \ - ] if {$reply == 1} { checkout_index \ $txt \ From patchwork Mon Aug 19 21:41:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pratyush Yadav X-Patchwork-Id: 11102005 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 50DB414DB for ; Mon, 19 Aug 2019 21:41:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3B06322CEC for ; Mon, 19 Aug 2019 21:41:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728528AbfHSVld (ORCPT ); Mon, 19 Aug 2019 17:41:33 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:48949 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728014AbfHSVlc (ORCPT ); Mon, 19 Aug 2019 17:41:32 -0400 Received: from localhost.localdomain (unknown [1.186.12.8]) (Authenticated sender: me@yadavpratyush.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 50526100003; Mon, 19 Aug 2019 21:41:30 +0000 (UTC) From: Pratyush Yadav To: Cc: Pratyush Yadav , Junio C Hamano Subject: [PATCH 2/3] git-gui: Add the ability to revert selected lines Date: Tue, 20 Aug 2019 03:11:09 +0530 Message-Id: <20190819214110.26461-3-me@yadavpratyush.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190819214110.26461-1-me@yadavpratyush.com> References: <20190819214110.26461-1-me@yadavpratyush.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Just like the user can select lines to stage or unstage, add the ability to revert selected lines. Signed-off-by: Pratyush Yadav --- git-gui/git-gui.sh | 25 ++++++++++++++++++++++++- git-gui/lib/diff.tcl | 31 ++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index 6de74ce639..2011894bef 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -3611,9 +3611,15 @@ set ui_diff_applyhunk [$ctxm index last] lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state] $ctxm add command \ -label [mc "Apply/Reverse Line"] \ - -command {apply_range_or_line $cursorX $cursorY; do_rescan} + -command {apply_or_revert_range_or_line $cursorX $cursorY 0; do_rescan} set ui_diff_applyline [$ctxm index last] lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state] +$ctxm add command \ + -label [mc "Revert Line"] \ + -command {apply_or_revert_range_or_line $cursorX $cursorY 1; do_rescan} +set ui_diff_revertline [$ctxm index last] +lappend diff_actions [list $ctxm entryconf $ui_diff_revertline -state] +set ui_diff_revertline [$ctxm index last] $ctxm add separator $ctxm add command \ -label [mc "Show Less Context"] \ @@ -3711,15 +3717,19 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { set l [mc "Unstage Hunk From Commit"] if {$has_range} { set t [mc "Unstage Lines From Commit"] + set r [mc "Revert Lines"] } else { set t [mc "Unstage Line From Commit"] + set r [mc "Revert Line"] } } else { set l [mc "Stage Hunk For Commit"] if {$has_range} { set t [mc "Stage Lines For Commit"] + set r [mc "Revert Lines"] } else { set t [mc "Stage Line For Commit"] + set r [mc "Revert Line"] } } if {$::is_3way_diff @@ -3730,11 +3740,24 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { || [string match {T?} $state] || [has_textconv $current_diff_path]} { set s disabled + set revert_state disabled } else { set s normal + + # Only allow reverting changes in the working tree. If + # the user wants to revert changes in the index, they + # need to unstage those first. + if {$::ui_workdir eq $::current_diff_side} { + set revert_state normal + } else { + set revert_state disabled + } } + $ctxm entryconf $::ui_diff_applyhunk -state $s -label $l $ctxm entryconf $::ui_diff_applyline -state $s -label $t + $ctxm entryconf $::ui_diff_revertline -state $revert_state \ + -label $r tk_popup $ctxm $X $Y } } diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl index 68c4a6c736..4b2b00df4b 100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@ -640,7 +640,7 @@ proc apply_hunk {x y} { } } -proc apply_range_or_line {x y} { +proc apply_or_revert_range_or_line {x y revert} { global current_diff_path current_diff_header current_diff_side global ui_diff ui_index file_states @@ -660,25 +660,46 @@ proc apply_range_or_line {x y} { if {$current_diff_path eq {} || $current_diff_header eq {}} return if {![lock_index apply_hunk]} return - set apply_cmd {apply --cached --whitespace=nowarn} + set apply_cmd {apply --whitespace=nowarn} set mi [lindex $file_states($current_diff_path) 0] if {$current_diff_side eq $ui_index} { set failed_msg [mc "Failed to unstage selected line."] set to_context {+} - lappend apply_cmd --reverse + lappend apply_cmd --reverse --cached if {[string index $mi 0] ne {M}} { unlock_index return } } else { - set failed_msg [mc "Failed to stage selected line."] - set to_context {-} + if {$revert} { + set failed_msg [mc "Failed to revert selected line."] + set to_context {+} + lappend apply_cmd --reverse + } else { + set failed_msg [mc "Failed to stage selected line."] + set to_context {-} + lappend apply_cmd --cached + } + if {[string index $mi 1] ne {M}} { unlock_index return } } + if {$revert} { + set query "[mc "Revert changes in file %s?" \ + [short_path $current_diff_path]] + +[mc "The selected lines will be permanently lost by the revert."]" + + set reply [revert_dialog $query] + if {$reply ne 1} { + unlock_index + return + } + } + set wholepatch {} while {$first_l < $last_l} { From patchwork Mon Aug 19 21:41:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pratyush Yadav X-Patchwork-Id: 11102007 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E127414DB for ; Mon, 19 Aug 2019 21:41:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CA8C62087E for ; Mon, 19 Aug 2019 21:41:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728530AbfHSVlf (ORCPT ); Mon, 19 Aug 2019 17:41:35 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:34983 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728435AbfHSVle (ORCPT ); Mon, 19 Aug 2019 17:41:34 -0400 Received: from localhost.localdomain (unknown [1.186.12.8]) (Authenticated sender: me@yadavpratyush.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id A80FF100004; Mon, 19 Aug 2019 21:41:31 +0000 (UTC) From: Pratyush Yadav To: Cc: Pratyush Yadav , Junio C Hamano Subject: [PATCH 3/3] git-gui: Add the ability to revert selected hunk Date: Tue, 20 Aug 2019 03:11:10 +0530 Message-Id: <20190819214110.26461-4-me@yadavpratyush.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190819214110.26461-1-me@yadavpratyush.com> References: <20190819214110.26461-1-me@yadavpratyush.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Just like the user can select a hunk to stage or unstage, add the ability to revert hunks. Signed-off-by: Pratyush Yadav --- git-gui/git-gui.sh | 14 +++++++++++++- git-gui/lib/diff.tcl | 34 +++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index 2011894bef..cfa682ff59 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -3606,9 +3606,14 @@ set ctxm .vpane.lower.diff.body.ctxm menu $ctxm -tearoff 0 $ctxm add command \ -label [mc "Apply/Reverse Hunk"] \ - -command {apply_hunk $cursorX $cursorY} + -command {apply_or_revert_hunk $cursorX $cursorY 0} set ui_diff_applyhunk [$ctxm index last] lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state] +$ctxm add command \ + -label [mc "Revert Hunk"] \ + -command {apply_or_revert_hunk $cursorX $cursorY 1} +set ui_diff_reverthunk [$ctxm index last] +lappend diff_actions [list $ctxm entryconf $ui_diff_reverthunk -state] $ctxm add command \ -label [mc "Apply/Reverse Line"] \ -command {apply_or_revert_range_or_line $cursorX $cursorY 0; do_rescan} @@ -3715,6 +3720,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { set has_range [expr {[$::ui_diff tag nextrange sel 0.0] != {}}] if {$::ui_index eq $::current_diff_side} { set l [mc "Unstage Hunk From Commit"] + set h [mc "Revert Hunk"] + if {$has_range} { set t [mc "Unstage Lines From Commit"] set r [mc "Revert Lines"] @@ -3724,6 +3731,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { } } else { set l [mc "Stage Hunk For Commit"] + set h [mc "Revert Hunk"] + if {$has_range} { set t [mc "Stage Lines For Commit"] set r [mc "Revert Lines"] @@ -3758,6 +3767,9 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { $ctxm entryconf $::ui_diff_applyline -state $s -label $t $ctxm entryconf $::ui_diff_revertline -state $revert_state \ -label $r + $ctxm entryconf $::ui_diff_reverthunk -state $revert_state \ + -label $h + tk_popup $ctxm $X $Y } } diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl index 4b2b00df4b..a818e68dad 100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@ -567,30 +567,50 @@ proc read_diff {fd conflict_size cont_info} { } } -proc apply_hunk {x y} { +proc apply_or_revert_hunk {x y revert} { global current_diff_path current_diff_header current_diff_side global ui_diff ui_index file_states if {$current_diff_path eq {} || $current_diff_header eq {}} return if {![lock_index apply_hunk]} return - set apply_cmd {apply --cached --whitespace=nowarn} + set apply_cmd {apply --whitespace=nowarn} set mi [lindex $file_states($current_diff_path) 0] if {$current_diff_side eq $ui_index} { set failed_msg [mc "Failed to unstage selected hunk."] - lappend apply_cmd --reverse + lappend apply_cmd --reverse --cached if {[string index $mi 0] ne {M}} { unlock_index return } } else { - set failed_msg [mc "Failed to stage selected hunk."] + if {$revert} { + set failed_msg [mc "Failed to revert selected hunk."] + lappend apply_cmd --reverse + } else { + set failed_msg [mc "Failed to stage selected hunk."] + lappend apply_cmd --cached + } + if {[string index $mi 1] ne {M}} { unlock_index return } } + if {$revert} { + set query "[mc "Revert changes in file %s?" \ + [short_path $current_diff_path]] + +[mc "The selected hunk will be permanently lost by the revert."]" + + set reply [revert_dialog $query] + if {$reply ne 1} { + unlock_index + return + } + } + set s_lno [lindex [split [$ui_diff index @$x,$y] .] 0] set s_lno [$ui_diff search -backwards -regexp ^@@ $s_lno.0 0.0] if {$s_lno eq {}} { @@ -619,13 +639,17 @@ proc apply_hunk {x y} { $ui_diff delete $s_lno $e_lno $ui_diff conf -state disabled + # Check if the hunk was the last one in the file. if {[$ui_diff get 1.0 end] eq "\n"} { set o _ } else { set o ? } - if {$current_diff_side eq $ui_index} { + # Update the status flags. + if {$revert} { + set mi [string index $mi 0]$o + } elseif {$current_diff_side eq $ui_index} { set mi ${o}M } elseif {[string index $mi 0] eq {_}} { set mi M$o