* [git-gui] bug report: "Open existing repository" dialog fails on submodules @ 2015-01-30 21:46 Rémi Rampin 2015-02-02 8:41 ` Chris Packham 0 siblings, 1 reply; 14+ messages in thread From: Rémi Rampin @ 2015-01-30 21:46 UTC (permalink / raw) To: git Hi, This bug report concerns git-gui. Apologies if this is not the right mailing-list. By submodule I mean a repository for which .git is not a regular Git directory, but rather a "gitdir: ..." file. While running "git gui" from such a directory will work fine, trying to open it from the choose_repository window will fail with "Not a Git repository". This is because of the simplistic implementation of proc _is_git in lib/choose_repository.tcl. I suggest fixing that function, or using Git directly to perform that check, for instance checking "git rev-parse --show-toplevel". I'd attempt a patch but my tcl-fu is weak. Best -- Rémi Rampin ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [git-gui] bug report: "Open existing repository" dialog fails on submodules 2015-01-30 21:46 [git-gui] bug report: "Open existing repository" dialog fails on submodules Rémi Rampin @ 2015-02-02 8:41 ` Chris Packham 2015-02-02 8:43 ` Chris Packham 2015-02-02 15:59 ` Rémi Rampin 0 siblings, 2 replies; 14+ messages in thread From: Chris Packham @ 2015-02-02 8:41 UTC (permalink / raw) To: Rémi Rampin, Pat Thoyts; +Cc: GIT Hi, On Sat, Jan 31, 2015 at 10:46 AM, Rémi Rampin <remirampin@gmail.com> wrote: > Hi, > > This bug report concerns git-gui. Apologies if this is not the right > mailing-list. > > By submodule I mean a repository for which .git is not a regular Git > directory, but rather a "gitdir: ..." file. > While running "git gui" from such a directory will work fine, trying > to open it from the choose_repository window will fail with "Not a Git > repository". This is because of the simplistic implementation of proc > _is_git in lib/choose_repository.tcl. > > I suggest fixing that function, or using Git directly to perform that > check, for instance checking "git rev-parse --show-toplevel". I'd > attempt a patch but my tcl-fu is weak. > I would have thought the following would work --- 8< --- Subject: [PATCH] git-gui: use git rev-parse to validate paths The current _is_git function to validate a path as a git repository does not handle a gitfiles which have been used for submodules for some time. Instead of using a custom function let's just ask git rev-parse. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- lib/choose_repository.tcl | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 92d6022..944ab50 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -339,19 +339,12 @@ method _git_init {} { } proc _is_git {path} { - if {[file exists [file join $path HEAD]] - && [file exists [file join $path objects]] - && [file exists [file join $path config]]} { + puts $path + if {[catch {exec git rev-parse --resolve-git-dir $path}]} { + return 0 + } else { return 1 } - if {[is_Cygwin]} { - if {[file exists [file join $path HEAD]] - && [file exists [file join $path objects.lnk]] - && [file exists [file join $path config.lnk]]} { - return 1 - } - } - return 0 } proc _objdir {path} { -- 2.3.0.rc2 --- >8 --- But it actually looks like git rev-parse --resolve-git-dir $path needs to be run inside a git repository _any_ git repository, which seems a bit backwards to me. $ cd $ git rev-parse --resolve-git-dir ~/src/git/.git fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). $ cd ~/src/git $ git rev-parse --resolve-git-dir ~/src/git-gui/.git /home/chrisp/src/git-gui/.git So one potential fix git a gui-gui bug, one new(?) bug in git rev-parse. ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [git-gui] bug report: "Open existing repository" dialog fails on submodules 2015-02-02 8:41 ` Chris Packham @ 2015-02-02 8:43 ` Chris Packham 2015-02-02 15:59 ` Rémi Rampin 1 sibling, 0 replies; 14+ messages in thread From: Chris Packham @ 2015-02-02 8:43 UTC (permalink / raw) To: Rémi Rampin, Pat Thoyts; +Cc: GIT On Mon, Feb 2, 2015 at 9:41 PM, Chris Packham <judge.packham@gmail.com> wrote: > Hi, > > On Sat, Jan 31, 2015 at 10:46 AM, Rémi Rampin <remirampin@gmail.com> wrote: >> Hi, >> >> This bug report concerns git-gui. Apologies if this is not the right >> mailing-list. >> >> By submodule I mean a repository for which .git is not a regular Git >> directory, but rather a "gitdir: ..." file. >> While running "git gui" from such a directory will work fine, trying >> to open it from the choose_repository window will fail with "Not a Git >> repository". This is because of the simplistic implementation of proc >> _is_git in lib/choose_repository.tcl. >> >> I suggest fixing that function, or using Git directly to perform that >> check, for instance checking "git rev-parse --show-toplevel". I'd >> attempt a patch but my tcl-fu is weak. >> > > I would have thought the following would work > > --- 8< --- > Subject: [PATCH] git-gui: use git rev-parse to validate paths > > The current _is_git function to validate a path as a git repository does > not handle a gitfiles which have been used for submodules for some time. > Instead of using a custom function let's just ask git rev-parse. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > lib/choose_repository.tcl | 15 ++++----------- > 1 file changed, 4 insertions(+), 11 deletions(-) > > diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl > index 92d6022..944ab50 100644 > --- a/lib/choose_repository.tcl > +++ b/lib/choose_repository.tcl > @@ -339,19 +339,12 @@ method _git_init {} { > } > > proc _is_git {path} { > - if {[file exists [file join $path HEAD]] > - && [file exists [file join $path objects]] > - && [file exists [file join $path config]]} { > + puts $path > + if {[catch {exec git rev-parse --resolve-git-dir $path}]} { > + return 0 > + } else { > return 1 > } > - if {[is_Cygwin]} { > - if {[file exists [file join $path HEAD]] > - && [file exists [file join $path objects.lnk]] > - && [file exists [file join $path config.lnk]]} { > - return 1 > - } > - } > - return 0 > } > > proc _objdir {path} { > -- > 2.3.0.rc2 > --- >8 --- > > But it actually looks like git rev-parse --resolve-git-dir $path needs > to be run inside a git repository _any_ git repository, which seems a > bit backwards to me. > > $ cd > $ git rev-parse --resolve-git-dir ~/src/git/.git > fatal: Not a git repository (or any parent up to mount point /home) > Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). > > $ cd ~/src/git > $ git rev-parse --resolve-git-dir ~/src/git-gui/.git > /home/chrisp/src/git-gui/.git > > So one potential fix git a gui-gui bug, one new(?) bug in git rev-parse. Not a new one. Happens in 1.9.1. Still a bit counter-intuitive IMO. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [git-gui] bug report: "Open existing repository" dialog fails on submodules 2015-02-02 8:41 ` Chris Packham 2015-02-02 8:43 ` Chris Packham @ 2015-02-02 15:59 ` Rémi Rampin 2015-02-02 17:24 ` [PATCH 1/2] Fixes _is_git Remi Rampin 2015-02-05 16:20 ` [PATCH 0/2] gitfile support git git-gui Remi Rampin 1 sibling, 2 replies; 14+ messages in thread From: Rémi Rampin @ 2015-02-02 15:59 UTC (permalink / raw) To: Chris Packham, Pat Thoyts; +Cc: GIT 2015-02-02 3:41 UTC-05:00, Chris Packham <judge.packham@gmail.com>: > [...] > But it actually looks like git rev-parse --resolve-git-dir $path needs > to be run inside a git repository _any_ git repository, which seems a > bit backwards to me. > [...] Indeed, looking at git-rev-parse(1), the correct option might be --show-toplevel, which will print the cwd if it is the top-level of a non-bare repository: cd $candidate && test $(git rev-parse --show-toplevel) = $candidate or test $(git --git-dir=$candidate rev-parse --show-toplevel) = $candidate Of course Git will resolve symlinks at this point, so $candidate has to be resolved first for the equality to make sense. Other solution is to parse the "gitdir: ..." format and recurse, which is not exactly hard (provided you speak Tcl). ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] Fixes _is_git 2015-02-02 15:59 ` Rémi Rampin @ 2015-02-02 17:24 ` Remi Rampin 2015-02-02 17:24 ` [PATCH 2/2] Makes _do_open2 set _gitdir to actual path Remi Rampin 2015-02-03 8:44 ` [PATCH 1/2] Fixes _is_git Chris Packham 2015-02-05 16:20 ` [PATCH 0/2] gitfile support git git-gui Remi Rampin 1 sibling, 2 replies; 14+ messages in thread From: Remi Rampin @ 2015-02-02 17:24 UTC (permalink / raw) To: git; +Cc: Remi Rampin Function _git_dir would previously fail to accept a "gitdir: ..." file as a valid Git repository. --- lib/choose_repository.tcl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 92d6022..49ff641 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -339,6 +339,16 @@ method _git_init {} { } proc _is_git {path} { + if {[file isfile $path]} { + set fp [open $path r] + gets $fp line + close $fp + if {[regexp "^gitdir: (.+)$" $line line link_target]} { + return [_is_git [file join [file dirname $path] $link_target]] + } + return 0 + } + if {[file exists [file join $path HEAD]] && [file exists [file join $path objects]] && [file exists [file join $path config]]} { -- 1.9.5.msysgit.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] Makes _do_open2 set _gitdir to actual path 2015-02-02 17:24 ` [PATCH 1/2] Fixes _is_git Remi Rampin @ 2015-02-02 17:24 ` Remi Rampin 2015-02-03 8:51 ` Chris Packham 2015-02-03 8:44 ` [PATCH 1/2] Fixes _is_git Chris Packham 1 sibling, 1 reply; 14+ messages in thread From: Remi Rampin @ 2015-02-02 17:24 UTC (permalink / raw) To: git; +Cc: Remi Rampin If _is_git had to follow "gitdir: ..." files to reach the actual Git directory, we set _gitdir to that final path. --- lib/choose_repository.tcl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 49ff641..641068d 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -338,13 +338,17 @@ method _git_init {} { return 1 } -proc _is_git {path} { +proc _is_git {path {outdir_var ""}} { + if {$outdir_var ne ""} { + upvar 1 $outdir_var outdir + } if {[file isfile $path]} { set fp [open $path r] gets $fp line close $fp if {[regexp "^gitdir: (.+)$" $line line link_target]} { - return [_is_git [file join [file dirname $path] $link_target]] + set link_target_abs [file join [file dirname $path] $link_target] + return [_is_git $link_target_abs outdir] } return 0 } @@ -352,12 +356,14 @@ proc _is_git {path} { if {[file exists [file join $path HEAD]] && [file exists [file join $path objects]] && [file exists [file join $path config]]} { + set outdir $path return 1 } if {[is_Cygwin]} { if {[file exists [file join $path HEAD]] && [file exists [file join $path objects.lnk]] && [file exists [file join $path config.lnk]]} { + set outdir $path return 1 } } @@ -1103,7 +1109,7 @@ method _open_local_path {} { } method _do_open2 {} { - if {![_is_git [file join $local_path .git]]} { + if {![_is_git [file join $local_path .git] actualgit]} { error_popup [mc "Not a Git repository: %s" [file tail $local_path]] return } @@ -1116,7 +1122,7 @@ method _do_open2 {} { } _append_recentrepos [pwd] - set ::_gitdir .git + set ::_gitdir $actualgit set ::_prefix {} set done 1 } -- 1.9.5.msysgit.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] Makes _do_open2 set _gitdir to actual path 2015-02-02 17:24 ` [PATCH 2/2] Makes _do_open2 set _gitdir to actual path Remi Rampin @ 2015-02-03 8:51 ` Chris Packham 2015-02-03 16:00 ` Rémi Rampin 0 siblings, 1 reply; 14+ messages in thread From: Chris Packham @ 2015-02-03 8:51 UTC (permalink / raw) To: Remi Rampin, Pat Thoyts; +Cc: GIT On Tue, Feb 3, 2015 at 6:24 AM, Remi Rampin <remirampin@gmail.com> wrote: > If _is_git had to follow "gitdir: ..." files to reach the actual Git > directory, we set _gitdir to that final path. > --- > lib/choose_repository.tcl | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl > index 49ff641..641068d 100644 > --- a/lib/choose_repository.tcl > +++ b/lib/choose_repository.tcl > @@ -338,13 +338,17 @@ method _git_init {} { > return 1 > } > > -proc _is_git {path} { > +proc _is_git {path {outdir_var ""}} { > + if {$outdir_var ne ""} { > + upvar 1 $outdir_var outdir > + } > if {[file isfile $path]} { > set fp [open $path r] > gets $fp line > close $fp > if {[regexp "^gitdir: (.+)$" $line line link_target]} { > - return [_is_git [file join [file dirname $path] $link_target]] > + set link_target_abs [file join [file dirname $path] $link_target] At this point link_target_abs is something like sub/../.git/modules/sub. It might be nice to normalize this with 'git rev-parse --git-dir' or even just (cd $link_target_abs && pwd). I'm not sure if tcl has anything built in that could do this kind of normalization. > + return [_is_git $link_target_abs outdir] > } > return 0 > } > @@ -352,12 +356,14 @@ proc _is_git {path} { > if {[file exists [file join $path HEAD]] > && [file exists [file join $path objects]] > && [file exists [file join $path config]]} { > + set outdir $path > return 1 > } > if {[is_Cygwin]} { > if {[file exists [file join $path HEAD]] > && [file exists [file join $path objects.lnk]] > && [file exists [file join $path config.lnk]]} { > + set outdir $path > return 1 > } > } > @@ -1103,7 +1109,7 @@ method _open_local_path {} { > } > > method _do_open2 {} { > - if {![_is_git [file join $local_path .git]]} { > + if {![_is_git [file join $local_path .git] actualgit]} { > error_popup [mc "Not a Git repository: %s" [file tail $local_path]] > return > } > @@ -1116,7 +1122,7 @@ method _do_open2 {} { > } > > _append_recentrepos [pwd] > - set ::_gitdir .git > + set ::_gitdir $actualgit > set ::_prefix {} > set done 1 > } > -- > 1.9.5.msysgit.0 > > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] Makes _do_open2 set _gitdir to actual path 2015-02-03 8:51 ` Chris Packham @ 2015-02-03 16:00 ` Rémi Rampin 0 siblings, 0 replies; 14+ messages in thread From: Rémi Rampin @ 2015-02-03 16:00 UTC (permalink / raw) To: Chris Packham, Pat Thoyts; +Cc: GIT 2015-02-02 12:24 UTC-05:00, Remi Rampin <remirampin@gmail.com>: >> - return [_is_git [file join [file dirname $path] $link_target]] >> + set link_target_abs [file join [file dirname $path] $link_target] 2015-02-03 3:51 UTC-05:00, Chris Packham <judge.packham@gmail.com>: > At this point link_target_abs is something like > sub/../.git/modules/sub. It might be nice to normalize this with 'git > rev-parse --git-dir' or even just (cd $link_target_abs && pwd). I'm > not sure if tcl has anything built in that could do this kind of > normalization. There is 'file normalize' according to the docs. I can update the patch if needed. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] Fixes _is_git 2015-02-02 17:24 ` [PATCH 1/2] Fixes _is_git Remi Rampin 2015-02-02 17:24 ` [PATCH 2/2] Makes _do_open2 set _gitdir to actual path Remi Rampin @ 2015-02-03 8:44 ` Chris Packham 2015-02-03 15:52 ` Rémi Rampin 1 sibling, 1 reply; 14+ messages in thread From: Chris Packham @ 2015-02-03 8:44 UTC (permalink / raw) To: Remi Rampin, Pat Thoyts; +Cc: GIT Hi Remi, Added Pat Thoyts the git-gui maintainer. (Disclaimer, it's been years since I did anything with Tcl). On Tue, Feb 3, 2015 at 6:24 AM, Remi Rampin <remirampin@gmail.com> wrote: > Function _git_dir would previously fail to accept a "gitdir: ..." file > as a valid Git repository. > --- > lib/choose_repository.tcl | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl > index 92d6022..49ff641 100644 > --- a/lib/choose_repository.tcl > +++ b/lib/choose_repository.tcl > @@ -339,6 +339,16 @@ method _git_init {} { > } > > proc _is_git {path} { > + if {[file isfile $path]} { > + set fp [open $path r] > + gets $fp line > + close $fp > + if {[regexp "^gitdir: (.+)$" $line line link_target]} { It might be simpler to use one of the 'string' commands e.g. string wordend "gitdir: " I also suspect the string functions would be faster than regexp but that probably doesn't matter. > + return [_is_git [file join [file dirname $path] $link_target]] Do we want to avoid pathological cases of infinite recursion? Someone would have to maliciously create such a situation. > + } > + return 0 > + } > + > if {[file exists [file join $path HEAD]] > && [file exists [file join $path objects]] > && [file exists [file join $path config]]} { > -- > 1.9.5.msysgit.0 > > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] Fixes _is_git 2015-02-03 8:44 ` [PATCH 1/2] Fixes _is_git Chris Packham @ 2015-02-03 15:52 ` Rémi Rampin 2015-02-05 8:13 ` Chris Packham 0 siblings, 1 reply; 14+ messages in thread From: Rémi Rampin @ 2015-02-03 15:52 UTC (permalink / raw) To: Chris Packham, Pat Thoyts; +Cc: GIT 2015-02-02 12:24 UTC-05:00, Remi Rampin <remirampin@gmail.com>: >> proc _is_git {path} { >> + if {[file isfile $path]} { >> + set fp [open $path r] >> + gets $fp line >> + close $fp >> + if {[regexp "^gitdir: (.+)$" $line line link_target]} { 2015-02-03 3:44 UTC-05:00, Chris Packham <judge.packham@gmail.com>: > It might be simpler to use one of the 'string' commands e.g. string > wordend "gitdir: " I also suspect the string functions would be faster > than regexp but that probably doesn't matter. I want to check that the file actually begins with "gitdir: " and then extract the path, so I'm not sure if using string functions is that simple/fast. >> + return [_is_git [file join [file dirname $path] $link_target]] > Do we want to avoid pathological cases of infinite recursion? Someone > would have to maliciously create such a situation. Limiting the recursion is very simple, but I'm not sure people are supposed to stumble on that. More importantly this probably calls for a different error message, thus a new error result that I am not ready to implement. But it could be another patch. But I suppose I can add a simple "return 0" limit to the recursion if needed, let me know. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] Fixes _is_git 2015-02-03 15:52 ` Rémi Rampin @ 2015-02-05 8:13 ` Chris Packham 0 siblings, 0 replies; 14+ messages in thread From: Chris Packham @ 2015-02-05 8:13 UTC (permalink / raw) To: Rémi Rampin; +Cc: Pat Thoyts, GIT On Wed, Feb 4, 2015 at 4:52 AM, Rémi Rampin <remirampin@gmail.com> wrote: > 2015-02-02 12:24 UTC-05:00, Remi Rampin <remirampin@gmail.com>: >>> proc _is_git {path} { >>> + if {[file isfile $path]} { >>> + set fp [open $path r] >>> + gets $fp line >>> + close $fp >>> + if {[regexp "^gitdir: (.+)$" $line line link_target]} { > > 2015-02-03 3:44 UTC-05:00, Chris Packham <judge.packham@gmail.com>: >> It might be simpler to use one of the 'string' commands e.g. string >> wordend "gitdir: " I also suspect the string functions would be faster >> than regexp but that probably doesn't matter. > > I want to check that the file actually begins with "gitdir: " and then > extract the path, so I'm not sure if using string functions is that > simple/fast. Makes sense. > >>> + return [_is_git [file join [file dirname $path] $link_target]] > >> Do we want to avoid pathological cases of infinite recursion? Someone >> would have to maliciously create such a situation. > > Limiting the recursion is very simple, but I'm not sure people are > supposed to stumble on that. More importantly this probably calls for a > different error message, thus a new error result that I am not ready to > implement. But it could be another patch. > But I suppose I can add a simple "return 0" limit to the recursion if > needed, let me know. It'd have to be fairly intentional to cause any real problems. The one thing I was thinking was to factor out the part that checks for HEAD info objects etc into a __is_git that _is_git could call thus eliminating recursion but I don't see it really being anything more than a theoretical issue. ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 0/2] gitfile support git git-gui 2015-02-02 15:59 ` Rémi Rampin 2015-02-02 17:24 ` [PATCH 1/2] Fixes _is_git Remi Rampin @ 2015-02-05 16:20 ` Remi Rampin 2015-02-05 16:20 ` [PATCH 1/2] Fixes chooser not accepting gitfiles Remi Rampin 2015-02-05 16:20 ` [PATCH 2/2] Makes chooser set 'gitdir' to the resolved path Remi Rampin 1 sibling, 2 replies; 14+ messages in thread From: Remi Rampin @ 2015-02-05 16:20 UTC (permalink / raw) To: git; +Cc: patthoyts, Remi Rampin New patch series. I hadn't realized Git doesn't recurse on "gitdir: ..." links itself, it only follows one. Also normalizes the path to the Git repository as requested. Remi Rampin (2): Fixes chooser not accepting gitfiles Makes chooser set 'gitdir' to the resolved path lib/choose_repository.tcl | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) -- 1.9.5.msysgit.0 ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] Fixes chooser not accepting gitfiles 2015-02-05 16:20 ` [PATCH 0/2] gitfile support git git-gui Remi Rampin @ 2015-02-05 16:20 ` Remi Rampin 2015-02-05 16:20 ` [PATCH 2/2] Makes chooser set 'gitdir' to the resolved path Remi Rampin 1 sibling, 0 replies; 14+ messages in thread From: Remi Rampin @ 2015-02-05 16:20 UTC (permalink / raw) To: git; +Cc: patthoyts, Remi Rampin Makes _is_git handle the case where the path is a "gitdir: ..." file. --- lib/choose_repository.tcl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 92d6022..abc6b1d 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -339,6 +339,16 @@ method _git_init {} { } proc _is_git {path} { + if {[file isfile $path]} { + set fp [open $path r] + gets $fp line + close $fp + if {[regexp "^gitdir: (.+)$" $line line link_target]} { + set path [file join [file dirname $path] $link_target] + set path [file normalize $path] + } + } + if {[file exists [file join $path HEAD]] && [file exists [file join $path objects]] && [file exists [file join $path config]]} { -- 1.9.5.msysgit.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] Makes chooser set 'gitdir' to the resolved path 2015-02-05 16:20 ` [PATCH 0/2] gitfile support git git-gui Remi Rampin 2015-02-05 16:20 ` [PATCH 1/2] Fixes chooser not accepting gitfiles Remi Rampin @ 2015-02-05 16:20 ` Remi Rampin 1 sibling, 0 replies; 14+ messages in thread From: Remi Rampin @ 2015-02-05 16:20 UTC (permalink / raw) To: git; +Cc: patthoyts, Remi Rampin If _is_git follows a "gitdir: ..." file link to get to the actual repository, we want _gitdir to be set to that final path. --- lib/choose_repository.tcl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index abc6b1d..75d1da8 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -338,7 +338,10 @@ method _git_init {} { return 1 } -proc _is_git {path} { +proc _is_git {path {outdir_var ""}} { + if {$outdir_var ne ""} { + upvar 1 $outdir_var outdir + } if {[file isfile $path]} { set fp [open $path r] gets $fp line @@ -352,12 +355,14 @@ proc _is_git {path} { if {[file exists [file join $path HEAD]] && [file exists [file join $path objects]] && [file exists [file join $path config]]} { + set outdir $path return 1 } if {[is_Cygwin]} { if {[file exists [file join $path HEAD]] && [file exists [file join $path objects.lnk]] && [file exists [file join $path config.lnk]]} { + set outdir $path return 1 } } @@ -1103,7 +1108,7 @@ method _open_local_path {} { } method _do_open2 {} { - if {![_is_git [file join $local_path .git]]} { + if {![_is_git [file join $local_path .git] actualgit]} { error_popup [mc "Not a Git repository: %s" [file tail $local_path]] return } @@ -1116,7 +1121,7 @@ method _do_open2 {} { } _append_recentrepos [pwd] - set ::_gitdir .git + set ::_gitdir $actualgit set ::_prefix {} set done 1 } -- 1.9.5.msysgit.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2015-02-05 16:20 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-01-30 21:46 [git-gui] bug report: "Open existing repository" dialog fails on submodules Rémi Rampin 2015-02-02 8:41 ` Chris Packham 2015-02-02 8:43 ` Chris Packham 2015-02-02 15:59 ` Rémi Rampin 2015-02-02 17:24 ` [PATCH 1/2] Fixes _is_git Remi Rampin 2015-02-02 17:24 ` [PATCH 2/2] Makes _do_open2 set _gitdir to actual path Remi Rampin 2015-02-03 8:51 ` Chris Packham 2015-02-03 16:00 ` Rémi Rampin 2015-02-03 8:44 ` [PATCH 1/2] Fixes _is_git Chris Packham 2015-02-03 15:52 ` Rémi Rampin 2015-02-05 8:13 ` Chris Packham 2015-02-05 16:20 ` [PATCH 0/2] gitfile support git git-gui Remi Rampin 2015-02-05 16:20 ` [PATCH 1/2] Fixes chooser not accepting gitfiles Remi Rampin 2015-02-05 16:20 ` [PATCH 2/2] Makes chooser set 'gitdir' to the resolved path Remi Rampin
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.