* [PATCH] contrib/completion: suppress stderror in bash completion of git remotes @ 2015-02-09 20:58 Matt Korostoff 2015-02-09 21:00 ` Matt Korostoff 2015-02-09 21:09 ` Junio C Hamano 0 siblings, 2 replies; 11+ messages in thread From: Matt Korostoff @ 2015-02-09 20:58 UTC (permalink / raw) To: git; +Cc: Matt Korostoff In some system configurations there is a bug with the __git_remotes function. Specifically, there is a problem with line 415, `test -d "$d/remotes" && ls -1 "$d/remotes"`. While `test -d` is meant to prevent listing the remotes directory if it does not exist, in some system, `ls` will run regardless. This results in an error in which typing `git push or` + `tab` prints out `ls: .git/remotes: No such file or directory`. This can be fixed by simply directing stderror of this line to /dev/null. --- contrib/completion/git-completion.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 2fece98..72251cc 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -412,7 +412,7 @@ __git_refs_remotes () __git_remotes () { local i IFS=$'\n' d="$(__gitdir)" - test -d "$d/remotes" && ls -1 "$d/remotes" + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do i="${i#remote.}" echo "${i/.url*/}" -- 1.7.10.2 (Apple Git-33) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes 2015-02-09 20:58 [PATCH] contrib/completion: suppress stderror in bash completion of git remotes Matt Korostoff @ 2015-02-09 21:00 ` Matt Korostoff 2015-02-09 21:09 ` Junio C Hamano 1 sibling, 0 replies; 11+ messages in thread From: Matt Korostoff @ 2015-02-09 21:00 UTC (permalink / raw) To: git Here are some screen shots demonstrating the issue I'm describing here: before this patch: https://cloud.githubusercontent.com/assets/1197335/6108333/1f3b10fa-b040-11e4-9164-3c7769dae110.gif after this patch: https://cloud.githubusercontent.com/assets/1197335/6108340/3878cad0-b040-11e4-9994-dcd5c4d62bba.gif On Mon, Feb 9, 2015 at 3:58 PM, Matt Korostoff <mkorostoff@gmail.com> wrote: > In some system configurations there is a bug with the > __git_remotes function. Specifically, there is a problem > with line 415, `test -d "$d/remotes" && ls -1 "$d/remotes"`. > While `test -d` is meant to prevent listing the remotes > directory if it does not exist, in some system, `ls` will > run regardless. > > This results in an error in which typing `git push or` + `tab` > prints out `ls: .git/remotes: No such file or directory`. > This can be fixed by simply directing stderror of this line > to /dev/null. > --- > contrib/completion/git-completion.bash | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 2fece98..72251cc 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -412,7 +412,7 @@ __git_refs_remotes () > __git_remotes () > { > local i IFS=$'\n' d="$(__gitdir)" > - test -d "$d/remotes" && ls -1 "$d/remotes" > + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null > for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do > i="${i#remote.}" > echo "${i/.url*/}" > -- > 1.7.10.2 (Apple Git-33) > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes 2015-02-09 20:58 [PATCH] contrib/completion: suppress stderror in bash completion of git remotes Matt Korostoff 2015-02-09 21:00 ` Matt Korostoff @ 2015-02-09 21:09 ` Junio C Hamano 2015-02-10 0:08 ` Matt Korostoff 2015-02-10 2:10 ` [PATCH] contrib/completion: suppress stderror in bash SZEDER Gábor 1 sibling, 2 replies; 11+ messages in thread From: Junio C Hamano @ 2015-02-09 21:09 UTC (permalink / raw) To: Matt Korostoff; +Cc: git Matt Korostoff <mkorostoff@gmail.com> writes: > In some system configurations there is a bug with the > __git_remotes function. Specifically, there is a problem > with line 415, `test -d "$d/remotes" && ls -1 "$d/remotes"`. > While `test -d` is meant to prevent listing the remotes > directory if it does not exist, in some system, `ls` will > run regardless. What's "some system"? Is this a platform's bug (e.g. "test -d" does not work correctly)? Is this an configuration error of user's Git repository? Is this something else? I _think_ you would see the problem if $d/remotes is a directory whose contents cannot be listed (e.g. "chmod a= $d/remotes"), and that would not be a platform's bug (i.e. "test -d" would happily say "Yes there is a directory", and "ls" would fail with "Permission denied"). But I wonder if we rather want the user to notice that misconfiguration so that the user can correct it, instead of hiding the error message from "ls". > This results in an error in which typing `git push or` + `tab` > prints out `ls: .git/remotes: No such file or directory`. > This can be fixed by simply directing stderror of this line > to /dev/null. > --- > contrib/completion/git-completion.bash | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 2fece98..72251cc 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -412,7 +412,7 @@ __git_refs_remotes () > __git_remotes () > { > local i IFS=$'\n' d="$(__gitdir)" > - test -d "$d/remotes" && ls -1 "$d/remotes" > + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null > for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do > i="${i#remote.}" > echo "${i/.url*/}" ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes 2015-02-09 21:09 ` Junio C Hamano @ 2015-02-10 0:08 ` Matt Korostoff 2015-02-10 2:10 ` [PATCH] contrib/completion: suppress stderror in bash SZEDER Gábor 1 sibling, 0 replies; 11+ messages in thread From: Matt Korostoff @ 2015-02-10 0:08 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Thank you for your detailed reply Junio. I'll try to address your concerns individually, but let me also offer a general thought that this is probably a good use case to handle even if the root cause is solvable outside of git. That is to say, I would think we'd still want git autocompletion working for users running on imperfect platforms. > What's "some system"? My apologies, that was a typo. I meant to write "some systems." I'm not sure what the root cause is, but I can tell you I'm running a rather vanilla development environment (git 1.7.10, bash 3.2, osx 10.8). I wish I could supply a list of the version combinations that result in such an event, but I'm not sure how I would do acquire a list like that. > Is this a platform's bug (e.g. "test -d" does not work correctly)? I don't believe so—here's a simple test-of-the-test I threw together https://gist.github.com/MKorostoff/f203e414847d43b21de4 which does not throw this error. > Is this an configuration error of user's Git repository? I think I have a pretty generic git configuration (here it is, though note I've had to redact some identifying information https://gist.github.com/MKorostoff/f8358f72b968249a3925). Still, I'd think we would want to handle such a misconfiguration explicitly, rather than throw a seemingly unrelated error during autocompletion > Is this something else? It would be very helpful if you could supply a few more details on the type of something you're looking for > I _think_ you would see the problem if $d/remotes is a directory > whose contents cannot be listed I can confirm, that is indeed the behavior. Animated gif example here http://i.imgur.com/qcPxAub.gif > But I wonder if we rather want the user to notice that > misconfiguration so that the user can correct it While I wholeheartedly agree that such user feedback would be valuable, I'm just not sure that it makes sense for this feedback to interrupt the user's typing mid-word. Sorry if anyone receives this twice, my first attempt to send was rejected for including HTML. On Mon, Feb 9, 2015 at 4:09 PM, Junio C Hamano <gitster@pobox.com> wrote: > Matt Korostoff <mkorostoff@gmail.com> writes: > >> In some system configurations there is a bug with the >> __git_remotes function. Specifically, there is a problem >> with line 415, `test -d "$d/remotes" && ls -1 "$d/remotes"`. >> While `test -d` is meant to prevent listing the remotes >> directory if it does not exist, in some system, `ls` will >> run regardless. > > What's "some system"? > > Is this a platform's bug (e.g. "test -d" does not work correctly)? > > Is this an configuration error of user's Git repository? > > Is this something else? > > I _think_ you would see the problem if $d/remotes is a directory > whose contents cannot be listed (e.g. "chmod a= $d/remotes"), and > that would not be a platform's bug (i.e. "test -d" would happily say > "Yes there is a directory", and "ls" would fail with "Permission > denied"). But I wonder if we rather want the user to notice that > misconfiguration so that the user can correct it, instead of hiding > the error message from "ls". > >> This results in an error in which typing `git push or` + `tab` >> prints out `ls: .git/remotes: No such file or directory`. >> This can be fixed by simply directing stderror of this line >> to /dev/null. >> --- >> contrib/completion/git-completion.bash | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash >> index 2fece98..72251cc 100644 >> --- a/contrib/completion/git-completion.bash >> +++ b/contrib/completion/git-completion.bash >> @@ -412,7 +412,7 @@ __git_refs_remotes () >> __git_remotes () >> { >> local i IFS=$'\n' d="$(__gitdir)" >> - test -d "$d/remotes" && ls -1 "$d/remotes" >> + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null >> for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do >> i="${i#remote.}" >> echo "${i/.url*/}" ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash 2015-02-09 21:09 ` Junio C Hamano 2015-02-10 0:08 ` Matt Korostoff @ 2015-02-10 2:10 ` SZEDER Gábor 2015-02-10 15:25 ` [PATCH] contrib/completion: deprecate __git_remotes in bash completion Matt Korostoff 2015-02-10 18:31 ` [PATCH] contrib/completion: suppress stderror in bash Junio C Hamano 1 sibling, 2 replies; 11+ messages in thread From: SZEDER Gábor @ 2015-02-10 2:10 UTC (permalink / raw) To: Junio C Hamano; +Cc: Matt Korostoff, git Hi, Quoting Junio C Hamano <gitster@pobox.com>: > Matt Korostoff <mkorostoff@gmail.com> writes: >> diff --git a/contrib/completion/git-completion.bash >> b/contrib/completion/git-completion.bash >> index 2fece98..72251cc 100644 >> --- a/contrib/completion/git-completion.bash >> +++ b/contrib/completion/git-completion.bash >> @@ -412,7 +412,7 @@ __git_refs_remotes () >> __git_remotes () >> { >> local i IFS=$'\n' d="$(__gitdir)" >> - test -d "$d/remotes" && ls -1 "$d/remotes" >> + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null >> for i in $(git --git-dir="$d" config --get-regexp >> 'remote\..*\.url' 2>/dev/null); do >> i="${i#remote.}" >> echo "${i/.url*/}" Do I smell some bitrotting here? This function just lists all the defined remotes, first by listing the directories under refs/remotes to get the "legacy" remotes and then loops over 'git config's output to get the "modern" ones. This predates the arrival of the 'git remote' command in January 2007, so it was really a long time ago. We should just run 'git remote' instead, shouldn't we? Cheers, Gábor ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] contrib/completion: deprecate __git_remotes in bash completion 2015-02-10 2:10 ` [PATCH] contrib/completion: suppress stderror in bash SZEDER Gábor @ 2015-02-10 15:25 ` Matt Korostoff 2015-02-10 18:31 ` [PATCH] contrib/completion: suppress stderror in bash Junio C Hamano 1 sibling, 0 replies; 11+ messages in thread From: Matt Korostoff @ 2015-02-10 15:25 UTC (permalink / raw) To: git; +Cc: Matt Korostoff Bash auto completion supplies a function __git_remotes which lists the git remotes of a repository by reading the .git/remotes directory. As of git 1.7.6 this is handled natively by the `git remote` command. This function is now deprecated. Signed-off-by: Matt Korostoff <MKorostoff@gmail.com> --- ***** Great point Gabor! I would hesitate a little about removing the function entirely, because users may have external scripts that rely on this function, but certainly for our internal purposes the __git_remotes shell function can be replaced with the native. Here's a short screen cast of the included patch working on my local http://i.imgur.com/6ZSMXCO.gif ***** contrib/completion/git-completion.bash | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 2fece98..8b41871 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -409,14 +409,14 @@ __git_refs_remotes () done } +# Deprecated wrapper function around git remote. Supplied for legacy purposes, +# to avoid breaking any external scripts which rely on this function. +# Originally this function was used to programmatically generate a list of git +# remotes by reading the .git/remotes directory, but as of git 1.7.6 that is +# natively handled by the git remote command __git_remotes () { - local i IFS=$'\n' d="$(__gitdir)" - test -d "$d/remotes" && ls -1 "$d/remotes" - for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do - i="${i#remote.}" - echo "${i/.url*/}" - done + git remote } __git_list_merge_strategies () @@ -558,7 +558,7 @@ __git_complete_remote_or_refspec () ((c++)) done if [ -z "$remote" ]; then - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" return fi if [ $no_complete_refspec = 1 ]; then @@ -927,7 +927,7 @@ _git_archive () return ;; --remote=*) - __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}" + __gitcomp_nl "$(git remote)" "" "${cur##--remote=}" return ;; --*) @@ -1397,7 +1397,7 @@ _git_ls_files () _git_ls_remote () { - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" } _git_ls_tree () @@ -1639,7 +1639,7 @@ _git_push () { case "$prev" in --repo) - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" return ;; --recurse-submodules) @@ -1649,7 +1649,7 @@ _git_push () esac case "$cur" in --repo=*) - __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" + __gitcomp_nl "$(git remote)" "" "${cur##--repo=}" return ;; --recurse-submodules=*) @@ -1797,7 +1797,7 @@ _git_config () { case "$prev" in branch.*.remote|branch.*.pushremote) - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" return ;; branch.*.merge) @@ -1809,7 +1809,7 @@ _git_config () return ;; remote.pushdefault) - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" return ;; remote.*.fetch) @@ -1944,7 +1944,7 @@ _git_config () ;; remote.*) local pfx="${cur%.*}." cur_="${cur#*.}" - __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." + __gitcomp_nl "$(git remote)" "$pfx" "$cur_" "." __gitcomp_nl_append "pushdefault" "$pfx" "$cur_" return ;; @@ -2250,7 +2250,7 @@ _git_remote () case "$subcommand" in rename|remove|set-url|show|prune) - __gitcomp_nl "$(__git_remotes)" + __gitcomp_nl "$(git remote)" ;; set-head|set-branches) __git_complete_remote_or_refspec -- 1.7.10.2 (Apple Git-33) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash 2015-02-10 2:10 ` [PATCH] contrib/completion: suppress stderror in bash SZEDER Gábor 2015-02-10 15:25 ` [PATCH] contrib/completion: deprecate __git_remotes in bash completion Matt Korostoff @ 2015-02-10 18:31 ` Junio C Hamano 2015-02-10 19:16 ` SZEDER Gábor 1 sibling, 1 reply; 11+ messages in thread From: Junio C Hamano @ 2015-02-10 18:31 UTC (permalink / raw) To: SZEDER Gábor; +Cc: Matt Korostoff, git SZEDER Gábor <szeder@ira.uka.de> writes: >>> @@ -412,7 +412,7 @@ __git_refs_remotes () >>> __git_remotes () >>> { >>> local i IFS=$'\n' d="$(__gitdir)" >>> - test -d "$d/remotes" && ls -1 "$d/remotes" >>> + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null >>> for i in $(git --git-dir="$d" config --get-regexp >>> 'remote\..*\.url' 2>/dev/null); do >>> i="${i#remote.}" >>> echo "${i/.url*/}" > > Do I smell some bitrotting here? > > This function just lists all the defined remotes, first by listing the > directories under refs/remotes to get the "legacy" remotes and then > loops over 'git config's output to get the "modern" ones. This > predates the arrival of the 'git remote' command in January 2007, so > it was really a long time ago. > > We should just run 'git remote' instead, shouldn't we? Perhaps. Is it sufficient to just make __git_remotes() a thin wrapper around, i.e. __git_remotes () { git remotes } or do we need to munge its output further (I didn't look)? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash 2015-02-10 18:31 ` [PATCH] contrib/completion: suppress stderror in bash Junio C Hamano @ 2015-02-10 19:16 ` SZEDER Gábor 2015-03-04 14:04 ` SZEDER Gábor 0 siblings, 1 reply; 11+ messages in thread From: SZEDER Gábor @ 2015-02-10 19:16 UTC (permalink / raw) To: Junio C Hamano; +Cc: Matt Korostoff, git Hi, Quoting Junio C Hamano <gitster@pobox.com>: > SZEDER Gábor <szeder@ira.uka.de> writes: > >>>> @@ -412,7 +412,7 @@ __git_refs_remotes () >>>> __git_remotes () >>>> { >>>> local i IFS=$'\n' d="$(__gitdir)" >>>> - test -d "$d/remotes" && ls -1 "$d/remotes" >>>> + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null >>>> for i in $(git --git-dir="$d" config --get-regexp >>>> 'remote\..*\.url' 2>/dev/null); do >>>> i="${i#remote.}" >>>> echo "${i/.url*/}" >> >> Do I smell some bitrotting here? >> >> This function just lists all the defined remotes, first by listing the >> directories under refs/remotes to get the "legacy" remotes and then >> loops over 'git config's output to get the "modern" ones. This >> predates the arrival of the 'git remote' command in January 2007, so >> it was really a long time ago. >> >> We should just run 'git remote' instead, shouldn't we? > > Perhaps. Is it sufficient to just make __git_remotes() a thin > wrapper around, i.e. > > __git_remotes () > { > git remotes > } > > or do we need to munge its output further (I didn't look)? Well, just like in other cases where we run git from the completion script, we need a '--git-dir="$(__gitdir)"' as well, because the user can specify the path to a different repo via $GIT_DIR or on the command line. Other than that it seems we are OK. Docs say "With no arguments, shows a list of existing remotes." and as far as I can tell, on MSysGit, it does so without any funny formatting. But beware, I spent most of last year cycling to Mongolia and my git-fu became a somewhat rusty... and I'm not quite up to speed yet. Best, Gábor ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] contrib/completion: suppress stderror in bash 2015-02-10 19:16 ` SZEDER Gábor @ 2015-03-04 14:04 ` SZEDER Gábor 2015-03-04 14:10 ` [PATCH 1/2] completion: add a test for __git_remotes() helper function SZEDER Gábor 0 siblings, 1 reply; 11+ messages in thread From: SZEDER Gábor @ 2015-03-04 14:04 UTC (permalink / raw) To: Junio C Hamano; +Cc: Matt Korostoff, git Hi, Quoting SZEDER Gábor <szeder@ira.uka.de>: > Hi, > > Quoting Junio C Hamano <gitster@pobox.com>: > >> SZEDER Gábor <szeder@ira.uka.de> writes: >> >>>>> @@ -412,7 +412,7 @@ __git_refs_remotes () >>>>> __git_remotes () >>>>> { >>>>> local i IFS=$'\n' d="$(__gitdir)" >>>>> - test -d "$d/remotes" && ls -1 "$d/remotes" >>>>> + test -d "$d/remotes" && ls -1 "$d/remotes" 2>/dev/null >>>>> for i in $(git --git-dir="$d" config --get-regexp >>>>> 'remote\..*\.url' 2>/dev/null); do >>>>> i="${i#remote.}" >>>>> echo "${i/.url*/}" >>> >>> Do I smell some bitrotting here? >>> >>> This function just lists all the defined remotes, first by listing the >>> directories under refs/remotes to get the "legacy" remotes and then >>> loops over 'git config's output to get the "modern" ones. This >>> predates the arrival of the 'git remote' command in January 2007, so >>> it was really a long time ago. >>> >>> We should just run 'git remote' instead, shouldn't we? >> >> Perhaps. Is it sufficient to just make __git_remotes() a thin >> wrapper around, i.e. >> >> __git_remotes () >> { >> git remotes >> } >> >> or do we need to munge its output further (I didn't look)? > > Well, just like in other cases where we run git from the completion > script, we need a '--git-dir="$(__gitdir)"' as well, because the user can > specify the path to a different repo via $GIT_DIR or on the command > line. > Other than that it seems we are OK. Docs say "With no arguments, > shows a list of existing remotes." and as far as I can tell, on > MSysGit, it does so without any funny formatting. Oh, look what forgotten treasure did I stumble upon in the vaults: https://github.com/szeder/git/commit/e4e3760c15b485b9ff4768e13050f4b19b5968b8 A two and a half year old commit in my old git repo doing the same... completely forgotten :) Unfortunately, however, it's not quite that simple, because 'git remote' doesn't list remotes under '$GIT_DIR/remotes'. Or at least I would have expected the following test to work, but it does not: diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 17c6330..6a4c139 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -734,6 +734,15 @@ Pull: refs/heads/master:refs/heads/origin Pull: refs/heads/next:refs/heads/origin2 EOF +test_expect_success 'list remote in $GIT_DIR/remotes' ' + mkdir .git/remotes && + test_when_finished "rm -rf .git/remotes" && + cat remotes_origin >.git/remotes/remote_from_file && + git remote >actual && + echo remote_from_file >expect && + test_cmp expect actual +' + test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' ' git clone one five && origin_url=$(pwd)/one && because listing remotes is implemented by for_each_remote(), which only reads remotes from the config file. Now, considering how old 'git remote' is, there were plenty of time for someone to miss this functionality and complain about it, but since it's still not implemented is probably a good sign that noone has actually missed it. And I don't think it's worth implementing it now just to shave off two more lines from the completion script. Anyway, 'git remote' could still replace that 'git config' query. I have the patches ready and it seems I got send-email working, so they'll follow in a minute or two. Best, Gábor ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 1/2] completion: add a test for __git_remotes() helper function 2015-03-04 14:04 ` SZEDER Gábor @ 2015-03-04 14:10 ` SZEDER Gábor 2015-03-04 14:10 ` [PATCH 2/2] completion: simplify __git_remotes() SZEDER Gábor 0 siblings, 1 reply; 11+ messages in thread From: SZEDER Gábor @ 2015-03-04 14:10 UTC (permalink / raw) To: Junio C Hamano; +Cc: Matt Korostoff, git, SZEDER Gábor The test checks that both remotes under '$GIT_DIR/remotes' and remotes in the config file are listed. Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> --- t/t9902-completion.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index f10a752..7a883d1 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -351,6 +351,25 @@ test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name __gitcomp_nl "$invalid_variable_name" ' +test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' ' + cat >expect <<-EOF && + remote_from_file_1 + remote_from_file_2 + remote_in_config_1 + remote_in_config_2 + EOF + test_when_finished "rm -rf .git/remotes" && + mkdir -p .git/remotes && + >.git/remotes/remote_from_file_1 && + >.git/remotes/remote_from_file_2 && + test_when_finished "git remote remove remote_in_config_1" && + git remote add remote_in_config_1 git://remote_1 && + test_when_finished "git remote remove remote_in_config_2" && + git remote add remote_in_config_2 git://remote_2 && + __git_remotes >actual && + test_cmp expect actual +' + test_expect_success 'basic' ' run_completion "git " && # built-in -- 2.1.2.1369.g8751039 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2] completion: simplify __git_remotes() 2015-03-04 14:10 ` [PATCH 1/2] completion: add a test for __git_remotes() helper function SZEDER Gábor @ 2015-03-04 14:10 ` SZEDER Gábor 0 siblings, 0 replies; 11+ messages in thread From: SZEDER Gábor @ 2015-03-04 14:10 UTC (permalink / raw) To: Junio C Hamano; +Cc: Matt Korostoff, git, SZEDER Gábor The __git_remotes() helper function lists the remotes from the config file by processing the output of a 'git config' query. A simple 'git remote' produces the exact same output, so run that instead. Remotes under '$GIT_DIR/remotes' are still listed by running 'ls -1', because 'git remote' unfortunately ignores them. Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> --- contrib/completion/git-completion.bash | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index c21190d..f5ae5e3 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -411,12 +411,9 @@ __git_refs_remotes () __git_remotes () { - local i IFS=$'\n' d="$(__gitdir)" + local d="$(__gitdir)" test -d "$d/remotes" && ls -1 "$d/remotes" - for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do - i="${i#remote.}" - echo "${i/.url*/}" - done + git --git-dir="$d" remote } __git_list_merge_strategies () -- 2.1.2.1369.g8751039 ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-03-04 14:11 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-02-09 20:58 [PATCH] contrib/completion: suppress stderror in bash completion of git remotes Matt Korostoff 2015-02-09 21:00 ` Matt Korostoff 2015-02-09 21:09 ` Junio C Hamano 2015-02-10 0:08 ` Matt Korostoff 2015-02-10 2:10 ` [PATCH] contrib/completion: suppress stderror in bash SZEDER Gábor 2015-02-10 15:25 ` [PATCH] contrib/completion: deprecate __git_remotes in bash completion Matt Korostoff 2015-02-10 18:31 ` [PATCH] contrib/completion: suppress stderror in bash Junio C Hamano 2015-02-10 19:16 ` SZEDER Gábor 2015-03-04 14:04 ` SZEDER Gábor 2015-03-04 14:10 ` [PATCH 1/2] completion: add a test for __git_remotes() helper function SZEDER Gábor 2015-03-04 14:10 ` [PATCH 2/2] completion: simplify __git_remotes() SZEDER Gábor
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 NNTP newsgroup(s).