public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Mark Levedahl <mlevedahl@gmail•com>
To: git@vger•kernel.org
Cc: j6t@kdbg•org, egg_mushroomcow@foxmail•com, bootaina702@gmail•com,
	Mark Levedahl <mlevedahl@gmail•com>
Subject: [PATCH v3 00/12] Improve git gui operation without a worktree
Date: Sun, 31 May 2026 19:02:13 -0400	[thread overview]
Message-ID: <20260531230225.126817-1-mlevedahl@gmail.com> (raw)
In-Reply-To: <20260520202411.108764-1-mlevedahl@gmail.com>

git gui has a number of inter-related problems that result in problems
during startup from anything but a checked out worktree pointing at a
valid git repository. Some of the symptoms are:
- blame / browser subcommands, and launching gitk, are intended to be
  useful without a worktree, but fail to work.
- unlike git, git-gui is supposed to use the parent directory as a
  worktree if started from the .git subdirectory in the very common
  single worktree + embedded git repository format. This does not
  work.
- git-gui includes a repository picker allowing a user to select a
  worktree from a list and/or start a new repo+worktree: this dialog can
  appear at unexpected times, masking useful error feedback on
  configuration problems.

This patch series addresses the above issues, substantially rewriting
the initial repository/worktree process to rely upon git rev-parse so
that git's knowledge of access rules, repository configuration, and use
of GIT_DIR / GIT_WORK_TREE (or git --gitdir / --work-tree) is used
throughout, replacing code largely based upon what git did in 2008. This
also means that git gui will naturally gain any new rules implmented in
git-core.

With this, git-gui only exports GIT_WORK_TREE when non-empty.
GIT_WORK_TREE is needed, and must be exported, if the user is overriding
core.worktree in the git repository. But, GIT_WORK_TREE cannot be used
to specify the lack of a worktree, so exporting an empty GIT_WORK_TREE
is one of the problems fixed by this series.

v3 of this series addresses j6t's review of v2, with some reordering of
patches (1 from j6t added, patch #8 moved to #1), adds another rewrite
of the browser / blame parser that eliminates the notion of path before
rev on the command line, blame works correctly with a user modified file
in the worktree. Clarification is added on the need for GTI_WORK_TREE,
and the logic in finding a worktree from the gitdir is simplified.

Johannes Sixt (1):
  git-gui: remove unnecessary 'cd $_gitworktree' from do_gitk

Mark Levedahl (11):
  git-gui: use HEAD as current branch when detached
  git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREE
  git-gui: do not change global vars in choose_repository::pick
  git-gui: use --absolute-git-dir
  git-gui: use rev-parse exclusively to find a repository
  git-gui: use git rev-parse for worktree discovery
  git-gui: simplify [is_bare] to report if a worktree is known
  git-gui: try harder to find worktree from gitdir
  git-gui: allow specifying path '.' to the browser
  git-gui: check browser/blame arguments carefully
  git-gui: add gui and pick as explicit subcommands

 git-gui.sh                | 377 ++++++++++++++++++++++----------------
 lib/choose_repository.tcl |  21 +--
 2 files changed, 223 insertions(+), 175 deletions(-)

Interdiff against v2:
diff --git a/git-gui.sh b/git-gui.sh
index 299c1a0292..933e72c9b2 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -1114,33 +1114,29 @@ unset argv0dir
 ## repository setup
 
 proc find_worktree_from_gitdir {} {
-	# Directory 'parent' of a repository named 'parent/.git' might be the worktree.
-	# Assure parent is a worktree and using the git repository already discovered.
-	# Also, handle case of being in a worktree's gitdir, where file "gitdir" points to
-	# gitlink file .git in the real worktree.
+	# this is invoked only if the current directory is inside the repository
 	set worktree {}
 	if {[file tail $::_gitdir] eq {.git}} {
+		# the dir containing .git is a worktree if repo allows it
+		# Check that git reports parent as a worktree (gitdir might not allow a worktree)
 		if {[catch {
-			set gitdir_parent [file dirname $::_gitdir]
-			set worktree [git -C $gitdir_parent rev-parse --show-toplevel]
-			set parent_gitdir [git -C $worktree rev-parse --absolute-git-dir]
-			if {$::_gitdir ne $parent_gitdir} {
-				set worktree {}
-			}
-		}]} {
+				set parent [file dirname $::_gitdir]
+				set worktree [git -C $parent rev-parse --show-toplevel]
+			}]} {
 			set worktree {}
 		}
 	} elseif [file exists {gitdir}] {
+		# a worktree gitdir has .gitdir naming worktree/.git
+		# assure git run there reports this dir as the gitdir (links might be broken)
 		if {[catch {
-			set fd_gitdir [open {gitdir} {r}]
-			set gitlink_parent [file dirname [read $fd_gitdir]]
-			catch {close $fd_gitdir}
-			set worktree [git -C $gitlink_parent rev-parse --show-toplevel]
-			set parent_gitdir [git -C $worktree rev-parse --absolute-git-dir]
-			if {$::_gitdir ne $parent_gitdir} {
-				set worktree {}
-			}
-		}]} {
+				set fd_gitdir [open {gitdir} {r}]
+				set worktree [file dirname [read $fd_gitdir]]
+				catch {close $fd_gitdir}
+				set worktree_gitdir [git -C $worktree rev-parse --absolute-git-dir]
+				if {$::_gitdir ne $worktree_gitdir} {
+					set worktree {}
+				}
+			}]} {
 			catch {close $fd_gitdir}
 			set worktree {}
 		}
@@ -1153,7 +1149,7 @@ proc is_gitvars_error {err} {
 	set GIT_DIR {}
 	set GIT_WORK_TREE {}
 	catch {set GIT_DIR $::env(GIT_DIR); set havevars 1}
-	catch {set GIT_WORK_TREE $::env(GIT_WORK_TREE) ; set havevars 1}
+	catch {set GIT_WORK_TREE $::env(GIT_WORK_TREE); set havevars 1}
 
 	if {$havevars} {
 		catch {wm withdraw .}
@@ -1168,9 +1164,7 @@ proc is_gitvars_error {err} {
 
 proc set_gitdir_vars {} {
 	global _gitdir _gitworktree env
-	if {$_gitdir ne {}} {
-		set env(GIT_DIR) $_gitdir
-	}
+	set env(GIT_DIR) $_gitdir
 	if {$_gitworktree ne {}} {
 		set env(GIT_WORK_TREE) $_gitworktree
 	}
@@ -1182,12 +1176,12 @@ proc unset_gitdir_vars {} {
 	catch {unset env(GIT_WORK_TREE)}
 }
 
-# find repository.
+# find repository
 set _gitdir {}
 if {[is_enabled gitdir_discovery]} {
 	if {[catch {
-		set _gitdir [git rev-parse --absolute-git-dir]
-	} err]} {
+			set _gitdir [git rev-parse --absolute-git-dir]
+		} err]} {
 		if {[is_gitvars_error $err]} {
 			exit 1
 		}
@@ -1200,14 +1194,13 @@ if {$_gitdir eq {} && [is_enabled picker]} {
 	unset_gitdir_vars
 	load_config 1
 	apply_config
-	if {![choose_repository::pick]} {
-		exit 1
-	}
+	choose_repository::pick
 	if {[catch {
-		set _gitdir [git rev-parse --absolute-git-dir]
-	} err]} {
+			set _gitdir [git rev-parse --absolute-git-dir]
+		} err]} {
 		catch {wm withdraw .}
-		error_popup [strcat [mc "Unusable repo/worktree:"] " [pwd] "\n\n$err"]
+		error_popup [strcat [mc "Unusable repo/worktree:"] " [pwd] \n\n$err"]
+		exit 1
 	}
 	set picked 1
 }
@@ -1220,9 +1213,9 @@ if {$_gitdir eq {}} {
 
 # find worktree, continue without if not required
 if {[catch {
-	set _gitworktree [git rev-parse --show-toplevel]
-	set _prefix [git rev-parse --show-prefix]
-} err]} {
+		set _gitworktree [git rev-parse --show-toplevel]
+		set _prefix [git rev-parse --show-prefix]
+	} err]} {
 	if {[is_gitvars_error $err]} {
 		exit 1
 	}
@@ -1238,17 +1231,14 @@ if {[is_bare]} {
 }
 
 if {![is_bare]} {
-	if {[catch {
-		cd $_gitworktree
-	} err]} {
+	if {[catch {cd $_gitworktree} err]} {
 		catch {wm withdraw .}
-		error_popup [strcat [mc "Cannot change to discovered worktree: "] \
-			"$_gitworktree" "\n\n$err"]
-		exit 1;
+		error_popup [strcat [mc "No working directory"] " $_gitworktree:\n\n$err"]
+		exit 1
 	}
 } elseif {![is_enabled bare]} {
 	catch {wm withdraw .}
-	error_popup [strcat [mc "Cannot use bare repository:"] "\n\n" $_gitdir]
+	error_popup [strcat [mc "Cannot use bare repository:"] "\n\n$_gitdir"]
 	exit 1
 }
 
@@ -2086,11 +2076,7 @@ proc do_gitk {revs {is_submodule false}} {
 	} else {
 		set pwd [pwd]
 
-		if {!$is_submodule} {
-			if {![is_bare]} {
-				cd $_gitworktree
-			}
-		} else {
+		if {$is_submodule} {
 			cd $current_diff_path
 			if {$revs eq {--}} {
 				set s $file_states($current_diff_path)
@@ -3026,26 +3012,18 @@ proc normalize_relpath {path} {
 	if {$elements ne {}} {
 		return [eval file join $elements]
 	} else {
-		return {./}
+		return {.}
 	}
 }
 
-proc find_path_type {head path} {
-	if {$path eq {./}} {
-		# the root-tree exists in every rev, ls-tree gives data on the contents,
-		# not the type of tree itself. So, if the rev exists, return {tree}
-		if {[catch {set objtype [git ls-tree $head]}]} {
-			set objtype {}
-		} else {
-			set objtype {tree}
-		}
+proc show_parse_err {err} {
+	if {[tk windowingsystem] eq "win32"} {
+		catch {wm withdraw .}
+		error_popup $err
 	} else {
-		# test that the path exists in head, ls-tree gives info on the path only
-		if {[catch {set objtype [git ls-tree {--format=%(objecttype)} $head $path]}]} {
-			set objtype {}
-		}
+		puts stderr $err
 	}
-	return $objtype
+	exit 1
 }
 
 # -- Not a normal commit type invocation?  Do that instead!
@@ -3054,91 +3032,80 @@ switch -- $subcommand {
 browser -
 blame {
 	if {$subcommand eq "blame"} {
-		set subcommand_args {[--line=<num>] <[rev] [--] filename | [--] filename rev>}
-		set required_objtype blob
+		set subcommand_args {[--line=<num>] [rev] [--] <filename>}
+		set required_pathtype blob
 	} else {
-		set subcommand_args {<[rev] [--] directory | [--] directory rev>}
-		set required_objtype tree
+		set subcommand_args {[rev] [--] <dirname>}
+		set required_pathtype tree
 	}
 	set maxargs [llength $subcommand_args]
 	set nargs [llength $argv]
 	if {$nargs < 1 || $nargs > $maxargs} usage
 	set head {}
-	set althead {}
 	set path {}
-	set altpath {}
-	set canswap 1
 	set jump_spec {}
 
-	# assume: [--line=num] [head] [--] path as the possible arguments, in order.
-	# head and path may need a swap later.
-	for {set iarg 0} {$iarg < $nargs} {incr iarg} {
-		set arg [lindex $argv $iarg]
-		if {$arg eq {--}} {
-			# next arg is the path, prevent or FORCE swap?
-			if {$iarg == $nargs - 2} {
-				set canswap 0
-			} elseif {$iarg == $nargs - 3} {
-				set canswap 2
-			} else {
+	set iarg 0
+	foreach a $argv {
+		incr iarg
+		if {$iarg == $nargs} {
+			# final argument is path
+			set path [normalize_relpath [file join $_prefix $a]]
+		} elseif {$a eq {--}} {
+			# allow before required final arg that must be path
+			if {$iarg != $nargs - 1} {
 				usage
 			}
-		} elseif {[regexp {^--line=(\d+)$} $arg arg lnum]} {
+		} elseif {[regexp {^--line=(\d+)$} $a a lnum]} {
 			# --line can only be the first arg
-			if {$iarg != 0 || $maxargs < 4} usage
+			if {$iarg != 1 || $subcommand ne {blame}} usage
 			set jump_spec [list $lnum]
-		} elseif {$iarg == $nargs - 1} {
-			# assume final argument is path
-			set path [normalize_relpath [file join $_prefix $arg]]
-			set althead $arg
 		} elseif {$head eq {}} {
-			# assume the other argument is head
-			set head $arg
-			set altpath [normalize_relpath [file join $_prefix $arg]]
+			set head $a
 		} else {
 			usage
 		}
 	}
 
-	# no swapping allowed if head not given, use current branch (HEAD)
+	# If head not given, use current branch (HEAD),
+	# and blame will use worktree if there is one.
+	set use_worktree 0
 	if {$head eq {}} {
 		load_current_branch
 		set head $current_branch
-		set canswap 0
-	}
-
-	# -- before "rev" arg means we got -- path head
-	if {$canswap == 2} {
-		set head $althead
-		set path $altpath
-		set canswap 0
-	}
-
-	set objtype [find_path_type $head $path]
-	if {$objtype eq {} && $canswap} {
-		set objtype [find_path_type $althead $altpath]
-		if {$objtype ne {}} {
-			set head $althead
-			set path $altpath
+		if {$subcommand eq {blame} && ![is_bare]} {
+			if {![file isfile $path]} {
+				show_parse_err [mc "fatal: no such file '%s' in worktree" $path]
+			}
+			set use_worktree 1
 		}
-	}
-	set current_branch $head
-
-	# check that path exists in head, and objtype matches need
-	if {$objtype ne $required_objtype} {
-		switch -- $required_objtype {
-			tree {set err [strcat \
-				[mc "'%s' is not a directory in rev '%s'" $path $head]]}
-			blob {set err [strcat \
-				[mc "'%s' is not a filename in rev '%s'" $path $head]]}
-		}
-		if {[tk windowingsystem] eq "win32"} {
-			catch {wm withdraw .}
-			error_popup $err
+	} else {
+		if {[catch {
+				set commitid \
+					[git rev-parse --verify --end-of-options \
+					[strcat $head "^{commit}"]]
+			}]} {
+			show_parse_err [mc "fatal: '%s' is not a valid rev'" $head]
 		} else {
-			puts stderr $err
+			set current_branch $head
+		}
+	}
+
+	# check path is known in head, and is file / directory as required
+	set pathtype {}
+	catch {set pathtype [git ls-tree {--format=%(objecttype)} $head $path]}
+	if {$pathtype ne {} && $path eq {.}} {
+		# ls-tree gives contents of root-dir, we need root-dir itself
+		set pathtype {tree}
+	}
+
+	if {$pathtype ne $required_pathtype} {
+		switch -- $required_pathtype {
+			tree {show_parse_err \
+				[mc "'%s' is not a directory in rev '%s'" $path $head]}
+			blob {show_parse_err \
+				[mc "'%s' is not a filename in rev '%s'" $path $head]}
 		}
-		exit 1
 	}
 
 	wm deiconify .
@@ -3146,8 +3113,8 @@ blame {
 	browser {
 		browser::new $head $path
 	}
-	blame {
-		blame::new $head $path $jump_spec
+	blame   {
+		blame::new [expr {$use_worktree ? {} : $head}] $path $jump_spec
 	}
 	}
 	return
-- 
2.54.0.99.14


  parent reply	other threads:[~2026-05-31 23:02 UTC|newest]

Thread overview: 134+ 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-16 13:38                       ` Mark Levedahl
2026-05-14 14:33                   ` [PATCH v1 02/11] git-gui: refactor browser / blame argument parsing Mark Levedahl
2026-05-15 15:56                     ` Johannes Sixt
2026-05-16 14:21                       ` Mark Levedahl
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-16 14:25                       ` Mark Levedahl
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-16 14:29                       ` Mark Levedahl
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-16 14:33                       ` Mark Levedahl
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-16 14:38                       ` Mark Levedahl
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-16 14:48                       ` Mark Levedahl
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-16 15:28                       ` Mark Levedahl
2026-05-19  8:16                         ` Johannes Sixt
2026-05-19 19:00                           ` Mark Levedahl
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 15:42                       ` Mark Levedahl
2026-05-19  8:21                         ` Johannes Sixt
2026-05-19 18:45                           ` Mark Levedahl
2026-05-19 21:15                             ` Johannes Sixt
2026-05-16  8:28                   ` [PATCH v1 00/11] Improve git gui operation without a worktree Johannes Sixt
2026-05-20 20:23                   ` [PATCH v2 " Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 01/11] git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREE Mark Levedahl
2026-05-22  8:06                       ` Johannes Sixt
2026-05-22 11:54                         ` Mark Levedahl
2026-05-23  8:18                           ` Johannes Sixt
2026-05-23 11:46                             ` Aina Boot
2026-05-23 16:08                             ` Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 02/11] git-gui: return status from choose_repository::pick Mark Levedahl
2026-05-22  8:18                       ` Johannes Sixt
2026-05-20 20:24                     ` [PATCH v2 03/11] git-gui: use --absolute-git-dir Mark Levedahl
2026-05-22  8:25                       ` Johannes Sixt
2026-05-20 20:24                     ` [PATCH v2 04/11] git-gui: use rev-parse exclusively to find a repository Mark Levedahl
2026-05-22  8:46                       ` Johannes Sixt
2026-05-22 12:04                         ` Mark Levedahl
2026-05-22 23:00                         ` Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 05/11] git-gui: simplify [is_bare] to report if a worktree is known Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 06/11] git-gui: use git rev-parse for worktree discovery Mark Levedahl
2026-05-23 13:26                       ` Johannes Sixt
2026-05-20 20:24                     ` [PATCH v2 07/11] git-gui: try harder to find worktree from gitdir Mark Levedahl
2026-05-21  4:55                       ` Shroom Moo
2026-05-21 17:45                         ` Mark Levedahl
2026-05-22 15:09                           ` Shroom Moo
2026-05-22 16:57                             ` Mark Levedahl
2026-05-23  8:01                         ` Johannes Sixt
2026-05-23 11:47                           ` Shroom Moo
2026-05-23 14:06                       ` Johannes Sixt
2026-05-23 15:33                         ` Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 08/11] git-gui: use HEAD as current branch when detached (bug fix) Mark Levedahl
2026-05-23 14:08                       ` Johannes Sixt
2026-05-20 20:24                     ` [PATCH v2 09/11] git-gui: allow specifying path '.' to the browser Mark Levedahl
2026-05-23 14:23                       ` Johannes Sixt
2026-05-23 15:43                         ` Mark Levedahl
2026-05-20 20:24                     ` [PATCH v2 10/11] git-gui: adapt blame/browser parsing for bare operation Mark Levedahl
2026-05-21  5:02                       ` Shroom Moo
2026-05-21 17:35                         ` Mark Levedahl
2026-05-22 15:05                           ` Shroom Moo
2026-05-23 18:19                       ` [PATCH] fixup git-gui: allow blame to show uncommitted changes Mark Levedahl
2026-05-23 20:31                       ` [PATCH v2 10/11] git-gui: adapt blame/browser parsing for bare operation Johannes Sixt
2026-05-20 20:24                     ` [PATCH v2 11/11] git-gui: add gui and pick as explicit subcommands Mark Levedahl
2026-05-24  7:00                       ` Johannes Sixt
2026-05-24  7:16                     ` [PATCH v2 00/11] Improve git gui operation without a worktree Johannes Sixt
2026-05-25 16:02                       ` Mark Levedahl
2026-05-31 23:02                     ` Mark Levedahl [this message]
2026-05-31 23:02                       ` [PATCH v3 01/12] git-gui: use HEAD as current branch when detached Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 02/12] git-gui: remove unnecessary 'cd $_gitworktree' from do_gitk Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 03/12] git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREE Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 04/12] git-gui: do not change global vars in choose_repository::pick Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 05/12] git-gui: use --absolute-git-dir Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 06/12] git-gui: use rev-parse exclusively to find a repository Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 07/12] git-gui: use git rev-parse for worktree discovery Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 08/12] git-gui: simplify [is_bare] to report if a worktree is known Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 09/12] git-gui: try harder to find worktree from gitdir Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 10/12] git-gui: allow specifying path '.' to the browser Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 11/12] git-gui: check browser/blame arguments carefully Mark Levedahl
2026-05-31 23:02                       ` [PATCH v3 12/12] git-gui: add gui and pick as explicit subcommands Mark Levedahl
2026-06-02 17:34                       ` [PATCH v3 00/12] Improve git gui operation without a worktree Johannes Sixt
2026-06-02 18:54                         ` Mark Levedahl
2026-06-02 21:05                           ` 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=20260531230225.126817-1-mlevedahl@gmail.com \
    --to=mlevedahl@gmail$(echo .)com \
    --cc=bootaina702@gmail$(echo .)com \
    --cc=egg_mushroomcow@foxmail$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=j6t@kdbg$(echo .)org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox