Re: [PATCH] contrib/completion: suppress stderror in bash

2015-03-04 Thread SZEDER Gábor

Hi,


Quoting SZEDER Gábor :


Hi,

Quoting Junio C Hamano :


SZEDER Gábor  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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash

2015-02-10 Thread SZEDER Gábor


Hi,

Quoting Junio C Hamano :


SZEDER Gábor  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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash

2015-02-10 Thread Junio C Hamano
SZEDER Gábor  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)?

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash

2015-02-09 Thread SZEDER Gábor


Hi,


Quoting Junio C Hamano :


Matt Korostoff  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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes

2015-02-09 Thread Matt Korostoff
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  wrote:
> Matt Korostoff  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*/}"
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes

2015-02-09 Thread Junio C Hamano
Matt Korostoff  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*/}"
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] contrib/completion: suppress stderror in bash completion of git remotes

2015-02-09 Thread Matt Korostoff
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  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)
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html