All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Levedahl <mlevedahl@gmail.com>
To: git@vger.kernel.org
Cc: egg_mushroomcow@foxmail.com, j6t@kdbg.org, bootaina702@gmail.com,
	Mark Levedahl <mlevedahl@gmail.com>
Subject: [PATCH v1 02/11] git-gui: refactor browser / blame argument parsing
Date: Thu, 14 May 2026 10:33:13 -0400	[thread overview]
Message-ID: <20260514143322.865587-3-mlevedahl@gmail.com> (raw)
In-Reply-To: <20260514143322.865587-1-mlevedahl@gmail.com>

git-gui has subcommands blame and browser, both of which accept a
pathname, possibly preceded by a commit-ish item to specify a revision.
Also, blame can take a first argument that gives a line number to focus.

The command line parser for the above is more complex than needed, and
cannot work without a worktree as the pathname objects are checked
against the current worktree for existence. This also precludes naming a
directory or file that does not exist on the currently checked out
branch.

So, replace this with a simpler parser that looks at argument number and
number of arguments to know what value to expect. The blame and browser
backends already have error checking with diagnostic information, so
defer most error checking to those. Also, allow a line-number selection
to be given and silently ignored for the browser, further simplifying
this code.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
---
 git-gui.sh | 66 +++++++++++++-----------------------------------------
 1 file changed, 16 insertions(+), 50 deletions(-)

diff --git a/git-gui.sh b/git-gui.sh
index 6048f92..a951fcd 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -2986,51 +2986,34 @@ blame {
 	set head {}
 	set path {}
 	set jump_spec {}
-	set is_path 0
+	set nargs [llength $argv]
+	if {$nargs < 1} {
+		usage
+	}
+	set argn 0
 	foreach a $argv {
-		set p [file join $_prefix $a]
+		set argn [expr {$argn + 1}]
 
-		if {$is_path || [file exists $p]} {
-			if {$path ne {}} usage
-			set path [normalize_relpath $p]
-			break
-		} elseif {$a eq {--}} {
-			if {$path ne {}} {
-				if {$head ne {}} usage
-				set head $path
-				set path {}
+		if {$argn < $nargs} {
+			# revision or line number
+			if {[regexp {^--line=(\d+)$} $a a lnum]} {
+				set jump_spec [list $lnum]
+			} else {
+				set head $a
 			}
-			set is_path 1
-		} elseif {[regexp {^--line=(\d+)$} $a a lnum]} {
-			if {$jump_spec ne {} || $head ne {}} usage
-			set jump_spec [list $lnum]
-		} elseif {$head eq {}} {
-			if {$head ne {}} usage
-			set head $a
-			set is_path 1
-		} else {
-			usage
-		}
-	}
-	unset is_path
-
-	if {$head ne {} && $path eq {}} {
-		if {[string index $head 0] eq {/}} {
-			set path [normalize_relpath $head]
-			set head {}
 		} else {
-			set path [normalize_relpath $_prefix$head]
-			set head {}
+			set path [normalize_relpath $a]
 		}
 	}
 
 	if {$head eq {}} {
 		load_current_branch
+		set head $current_branch
 	} else {
 		if {[regexp [string map "@@ [expr $hashlength - 1]" {^[0-9a-f]{1,@@}$}] $head]} {
 			if {[catch {
-					set head [git rev-parse --verify $head]
-				} err]} {
+				set head [git rev-parse --verify $head]
+			} err]} {
 				if {[tk windowingsystem] eq "win32"} {
 					tk_messageBox -icon error -title [mc Error] -message $err
 				} else {
@@ -3046,26 +3029,9 @@ blame {
 	switch -- $subcommand {
 	browser {
 		if {$jump_spec ne {}} usage
-		if {$head eq {}} {
-			if {$path ne {} && [file isdirectory $path]} {
-				set head $current_branch
-			} else {
-				set head $path
-				set path {}
-			}
-		}
 		browser::new $head $path
 	}
 	blame   {
-		if {$head eq {} && ![file exists $path]} {
-			catch {wm withdraw .}
-			tk_messageBox \
-				-icon error \
-				-type ok \
-				-title [mc "git-gui: fatal error"] \
-				-message [mc "fatal: cannot stat path %s: No such file or directory" $path]
-			exit 1
-		}
 		blame::new $head $path $jump_spec
 	}
 	}
-- 
2.54.0.99.14


  parent reply	other threads:[~2026-05-14 14:34 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-21 16:28 [PATCH] git-gui: handle bare repo or missing worktree Shroom Moo
2026-04-29  6:58 ` Johannes Sixt
2026-04-29 17:32   ` [PATCH v2 1/1] git-gui: protect rev-parse --show-toplevel call Shroom Moo
2026-04-29 20:14     ` Mark Levedahl
2026-04-30 10:02     ` [PATCH v3 1/1] git-gui: handle missing worktree and separated gitdir Shroom Moo
2026-04-30 16:18       ` Mark Levedahl
2026-05-01 10:22         ` [PATCH v3 1/1] git-gui: handle missing worktree and separated Shroom Moo
2026-05-01 13:13         ` [PATCH v3 1/1] git-gui: handle missing worktree and separated gitdir Johannes Sixt
2026-05-01 16:42           ` Mark Levedahl
2026-05-02 21:51             ` Mark Levedahl
2026-05-03  8:53               ` Johannes Sixt
2026-05-04 15:13                 ` Mark Levedahl
2026-05-05  3:40                   ` Mark Levedahl
2026-05-06  7:32                   ` Johannes Sixt
2026-05-06 11:27                     ` Mark Levedahl
2026-05-06 12:57                       ` Johannes Sixt
2026-05-06 14:05                         ` Mark Levedahl
2026-05-07  5:09                           ` Mark Levedahl
2026-05-01 10:54       ` [PATCH v4 " Shroom Moo
2026-05-04 14:59         ` [PATCH v5 1/1] git-gui: restructure repository startup Shroom Moo
2026-05-06  7:15           ` Johannes Sixt
2026-05-06 20:27           ` [PATCH v6 0/3] git-gui: robustify startup and fix environment handling Shroom Moo
2026-05-09 13:37             ` [PATCH v7 " Shroom Moo
2026-05-14 14:28               ` Mark Levedahl
2026-05-14 14:33                 ` [PATCH v1 00/11] Improve git gui operation without a worktree Mark Levedahl
2026-05-14 14:33                   ` [PATCH v1 01/11] git-gui: allow specifying path '.' to the browser Mark Levedahl
2026-05-15 15:54                     ` Johannes Sixt
2026-05-14 14:33                   ` Mark Levedahl [this message]
2026-05-15 15:56                     ` [PATCH v1 02/11] git-gui: refactor browser / blame argument parsing Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 03/11] git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREE Mark Levedahl
2026-05-15 15:58                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 04/11] git-gui: put choose_repository::pick in a proc Mark Levedahl
2026-05-15 11:00                     ` Aina Boot
2026-05-15 13:33                       ` Mark Levedahl
2026-05-15 15:59                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 05/11] git-gui: use --absolute-git-dir Mark Levedahl
2026-05-15 16:00                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 06/11] git gui: GIT_DIR / GIT_WORK_TREE make any discovery error fatal Mark Levedahl
2026-05-14 14:33                   ` [PATCH v1 07/11] git-gui: use rev-parse exclusively to find a repository Mark Levedahl
2026-05-15 16:06                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 08/11] git-gui: simplify [is_bare] to report if a worktree is known Mark Levedahl
2026-05-16  8:12                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 09/11] git-gui: support using repository parent dir as a worktree Mark Levedahl
2026-05-16  8:14                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 10/11] git-gui: improve worktree discovery Mark Levedahl
2026-05-16  8:16                     ` Johannes Sixt
2026-05-14 14:33                   ` [PATCH v1 11/11] git-gui: add gui and pick as explicit subcommands Mark Levedahl
2026-05-16  8:18                     ` Johannes Sixt
2026-05-16  8:28                   ` [PATCH v1 00/11] Improve git gui operation without a worktree Johannes Sixt
     [not found]             ` <20260509133756.1367-1-egg_mushroomcow@foxmail.com>
2026-05-09 13:37               ` [PATCH v7 1/3] git-gui: restructure repository startup Shroom Moo
2026-05-15  8:26                 ` Johannes Sixt
2026-05-09 13:37               ` [PATCH v7 2/3] git-gui: disable gitk visualization when no worktree available Shroom Moo
2026-05-15  8:28                 ` Johannes Sixt
2026-05-09 13:37               ` [PATCH v7 3/3] git-gui: handle GIT_DIR and GIT_WORK_TREE early Shroom Moo
2026-05-15  8:28                 ` Johannes Sixt
     [not found]           ` <20260506202751.3294-1-egg_mushroomcow@foxmail.com>
2026-05-06 20:27             ` [PATCH v6 1/3] git-gui: restructure repository startup Shroom Moo
2026-05-06 20:27             ` [PATCH v6 2/3] git-gui: disable gitk visualization when no worktree available Shroom Moo
2026-05-06 20:27             ` [PATCH v6 3/3] git-gui: handle GIT_DIR and GIT_WORK_TREE early Shroom Moo
2026-05-07 15:50               ` Mark Levedahl
2026-05-09  8:46                 ` Aina Boot
2026-05-09  9:55                   ` Shroom Moo
2026-04-29 18:28   ` [PATCH] git-gui: handle bare repo or missing worktree Shroom Moo

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

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

  git send-email \
    --in-reply-to=20260514143322.865587-3-mlevedahl@gmail.com \
    --to=mlevedahl@gmail.com \
    --cc=bootaina702@gmail.com \
    --cc=egg_mushroomcow@foxmail.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    /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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.