git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stefan Haller <stefan@haller-berlin.de>
To: paulus@ozlabs.org
Cc: git@vger.kernel.org, sunshine@sunshineco.com
Subject: [PATCH v2] gitk: Add options --select-file and --select-line
Date: Thu, 15 Oct 2020 09:31:38 +0200	[thread overview]
Message-ID: <20201015073138.50899-1-stefan@haller-berlin.de> (raw)
In-Reply-To: <CAPig+cSRX+5o645fxBZunm4hiBM-1Gr8jChijyUNgNkO1wHKdA@mail.gmail.com>

These can be used in combination with --select-commit to jump to a given
line in a patch on startup. (They don't have any effect when
--select-commit is not used.)

This is useful for the "Show History Context" command in Git Gui's blame
window, which currently only jumps to the right commit in gitk, but
doesn't select the line that the context menu was opened on.

Also, these options allow for powerful editor integration; they make it
possible to jump into gitk right from a text editor. For example, here's
a small ruby script that takes a file path and a line number and opens
gitk with the commit selected that last modified that line. This can
easily be mapped to a key in vim or other editors.

    #!/usr/bin/env ruby

    if ARGV.length != 2
        puts "Usage: #{$0} <file> <line>"
        exit 1
    end

    file, line = ARGV
    blame_output = `git blame -p -L#{line},+1 "#{file}"`
    exit 1 if $?.exitstatus != 0

    blame_output_lines = blame_output.split("\n")
    commit, line = blame_output_lines[0].split

    file = blame_output_lines.grep(/^filename /)[0][9..-1]
    date = blame_output_lines.grep(/^committer-time /)[0][15..-1]
    two_weeks_later = date.to_i + 60 * 60 * 24 * 7 * 2

    system "gitk --before='#{two_weeks_later}' \
                 --select-commit=#{commit} \
                 --select-file='#{file}' \
                 --select-line=#{line} &"

Signed-off-by: Stefan Haller <stefan@haller-berlin.de>
---
Second version: added Signed-off-by. No other changes.

 gitk | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/gitk b/gitk
index 23d9dd1..cf70313 100755
--- a/gitk
+++ b/gitk
@@ -475,12 +475,17 @@ proc stop_rev_list {view} {
 }

 proc reset_pending_select {selid} {
-    global pending_select mainheadid selectheadid
+    global pending_select pending_select_file pending_select_line
+    global mainheadid selectheadid select_file select_line

     if {$selid ne {}} {
         set pending_select $selid
     } elseif {$selectheadid ne {}} {
         set pending_select $selectheadid
+        if {$select_file ne {} && $select_line ne {}} {
+            set pending_select_file $select_file
+            set pending_select_line $select_line
+        }
     } else {
         set pending_select $mainheadid
     }
@@ -1612,6 +1617,16 @@ proc getcommitlines {fd inst view updating}  {
     return 2
 }

+proc select_pending_line {} {
+    global pending_select pending_select_file pending_select_line
+
+    set desired_loc [expr {[info exists pending_select_file]
+        ? [list $pending_select_file $pending_select_line]
+        : {}}]
+
+    selectline [rowofcommit $pending_select] 1 $desired_loc
+}
+
 proc chewcommits {} {
     global curview hlview viewcomplete
     global pending_select
@@ -1626,7 +1641,7 @@ proc chewcommits {} {
             reset_pending_select {}

             if {[commitinview $pending_select $curview]} {
-                selectline [rowofcommit $pending_select] 1
+                select_pending_line
             } else {
                 set row [first_real_row]
                 selectline $row 1
@@ -5244,7 +5259,7 @@ proc layoutmore {} {
     if {[info exists pending_select] &&
         [commitinview $pending_select $curview]} {
         update
-        selectline [rowofcommit $pending_select] 1
+        select_pending_line
     }
     drawvisible
 }
@@ -7325,6 +7340,8 @@ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
     global vinlinediff

     unset -nocomplain pending_select
+    unset -nocomplain pending_select_file
+    unset -nocomplain pending_select_line
     $canv delete hover
     normalline
     unsel_reflist
@@ -12507,6 +12524,8 @@ if {[catch {set gitdir [exec git rev-parse --git-dir]}]} {

 set selecthead {}
 set selectheadid {}
+set select_file {}
+set select_line {}

 set revtreeargs {}
 set cmdline_files {}
@@ -12522,6 +12541,12 @@ foreach arg $argv {
         "--select-commit=*" {
             set selecthead [string range $arg 16 end]
         }
+        "--select-file=*" {
+            set select_file [string range $arg 14 end]
+        }
+        "--select-line=*" {
+            set select_line [string range $arg 14 end]
+        }
         "--argscmd=*" {
             set revtreeargscmd [string range $arg 10 end]
         }
--
2.29.0.rc1.13.g3b7fca9674


  reply	other threads:[~2020-10-15  7:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-14 14:55 [PATCH] gitk: Add options --select-file and --select-line Stefan Haller
2020-10-14 22:34 ` Eric Sunshine
2020-10-15  7:31   ` Stefan Haller [this message]
2020-11-01  9:24     ` [PATCH v2] " Stefan Haller
2020-12-19 10:21       ` Stefan Haller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201015073138.50899-1-stefan@haller-berlin.de \
    --to=stefan@haller-berlin.de \
    --cc=git@vger.kernel.org \
    --cc=paulus@ozlabs.org \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).