{"thread":{"id":"20373","subject":"Making git push output quieter","startedAt":"2009-08-04T21:27:10Z","lastAt":"2009-08-31T19:39:06Z","messageCount":19,"participants":["Albert Astals Cid","Pau Garcia i Quiles","Shawn O. Pearce","Nicolas Pitre","Jeff King","Sverre Rabbelier","Avery Pennarun","Junio C Hamano","Sebastian Pipping"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"119527","messageId":"200908042327.10912.aacid@kde.org","threadId":"20373","inReplyTo":null,"subject":"Making git push output quieter","fromName":"Albert Astals Cid","fromEmail":"aacid@kde.org","sentAt":"2009-08-04T21:27:10Z","receivedAt":"2009-08-04T21:27:10Z","isPatch":false,"sender":{"key":"aacid@kde.org","avatar":"https://gravatar.com/avatar/f75ccc222073fee7e869dee8627ed66dc18904e0cbb06314adfd8586940f97f3?d=mp&s=160"},"body":"Hi, at KDE we are starting to try to use git and one of the things that's \nbothering me is that git push is too verbose for our scripts.\n\nWe have some scripts that commit things and i get the diff of previous runs,  \nif there is no diff it means all worked fine, a diff means something i have to \nlook at.\n\nNow i'm getting diffs like\n\n-Counting objects: 23, done.\n+Counting objects: 53, done.\n Delta compression using up to 2 threads.\n-Compressing objects:   8% (1/12)   Compressing objects:  16% (2/12)   \nCompressing objects:  25% (3/12)   Compressing objects:  33% (4/12)   \nCompressing objects:  41% (5/12)   Compressing objects:  50% (6/12)   \nCompressing objects:  58% (7/12)   Compressing objects:  66% (8/12)   \nCompressing objects:  75% (9/12)   Compressing objects:  83% (10/12)   \nCompressing objects:  91% (11/12)   Compressing objects: 100% (12/12)   \nCompressing objects: 100% (12/12), done.\n-Writing objects:   8% (1/12)   Writing objects:  16% (2/12)   Writing \nobjects:  25% (3/12)   Writing objects:  33% (4/12)   Writing objects:  41% \n(5/12)   Writing objects:  50% (6/12)   Writing objects:  58% (7/12)   Writing \nobjects:  66% (8/12)   Writing objects:  75% (9/12)   Writing objects:  83% \n(10/12)   Writing objects:  91% (11/12)   Writing objects: 100% (12/12)   \nWriting objects: 100% (12/12), 1.05 KiB, done.\n-Total 12 (delta 11), reused 0 (delta 0)\n+Compressing objects:   3% (1/29)   Compressing objects:   6% (2/29)   \nCompressing objects:  10% (3/29)   Compressing objects:  13% (4/29)   \nCompressing objects:  17% (5/29)   Compressing objects:  20% (6/29)   \nCompressing objects:  24% (7/29)   Compressing objects:  27% (8/29)   \nCompressing objects:  31% (9/29)   Compressing objects:  34% (10/29)   \nCompressing objects:  37% (11/29)   Compressing objects:  41% (12/29)   \nCompressing objects:  44% (13/29)   Compressing objects:  48% (14/29)   \nCompressing objects:  51% (15/29)   Compressing objects:  55% (16/29)   \nCompressing objects:  58% (17/29)   Compressing objects:  62% (18/29)   \nCompressing objects:  65% (19/29)   Compressing objects:  68% (20/29)   \nCompressing objects:  72% (21/29)   Compressing objects:  75% (22/29)   \nCompressing objects:  79% (23/29)   Compressing objects:  82% (24/29)   \nCompressing objects:  86% (25/29)   Compressing objects:  89% (26/29)   \nCompressing objects:  93% (27/29)   Compressing objects:  96% (28/29) \n  Compressing objects: 100% (29/29)   Compressing objects: 100% (29/29), done.\n+Writing objects:   3% (1/29)   Writing objects:   6% (2/29)   Writing \nobjects:  10% (3/29)   Writing objects:  13% (4/29)   Writing objects:  17% \n(5/29)   Writing objects:  20% (6/29)   Writing objects:  24% (7/29)   Writing \nobjects:  27% (8/29)   Writing objects:  31% (9/29)   Writing objects:  34% \n(10/29)   Writing objects:  37% (11/29)   Writing objects:  41% (12/29)   \nWriting objects:  44% (13/29)   Writing objects:  48% (14/29)   Writing \nobjects:  51% (15/29)   Writing objects:  55% (16/29)   Writing objects:  62% \n(18/29)   Writing objects:  65% (19/29)   Writing objects:  68% (20/29)   \nWriting objects:  72% (21/29)   Writing objects:  75% (22/29)   Writing \nobjects:  79% (23/29)   Writing objects:  82% (24/29)   Writing objects:  86% \n(25/29)   Writing objects:  89% (26/29)   Writing objects:  93% (27/29)   \nWriting objects:  96% (28/29)   Writing objects: 100% (29/29)   Writing \nobjects: 100% (29/29), 4.46 KiB, done.\n+Total 29 (delta 23), reused 0 (delta 0)\n => Syncing Gitorious... [OK]\n To git@gitorious.org:amarok/amarok.git\n-   f7863f9..f4370ae  HEAD -> master\n+   1a1b30f..670cb0e  HEAD -> master\n\nThat really are not a problem and are filling my diffs for no reason. We could \nredirect to > /dev/null the git push command but then i would not see if \nanything failed.\n\nIs it possible to make git push just output data when failing? And if not do \nyou think it's a worthwhile feature i can ask for? Do you have a formal way \nfor feature requests?\n\nThanks,\n  Albert\n"},{"id":"119535","messageId":"3af572ac0908041520l327482f1u45121b6b991a3673@mail.gmail.com","threadId":"20373","inReplyTo":"200908042327.10912.aacid@kde.org","subject":"Re: Making git push output quieter","fromName":"Pau Garcia i Quiles","fromEmail":"pgquiles@elpauer.org","sentAt":"2009-08-04T22:20:32Z","receivedAt":"2009-08-04T22:20:32Z","isPatch":false,"sender":{"key":"pgquiles@elpauer.org","avatar":null},"body":"On Tue, Aug 4, 2009 at 11:27 PM, Albert Astals Cid<aacid@kde.org> wrote:\n> Hi, at KDE we are starting to try to use git and one of the things that's\n> bothering me is that git push is too verbose for our scripts.\n>\n> We have some scripts that commit things and i get the diff of previous runs,\n> if there is no diff it means all worked fine, a diff means something i have to\n> look at.\n>\n> Now i'm getting diffs like\n>\n> -Counting objects: 23, done.\n> +Counting objects: 53, done.\n>  Delta compression using up to 2 threads.\n> -Compressing objects:   8% (1/12)   Compressing objects:  16% (2/12)\n> Compressing objects:  25% (3/12)   Compressing objects:  33% (4/12)\n> Compressing objects:  41% (5/12)   Compressing objects:  50% (6/12)\n> Compressing objects:  58% (7/12)   Compressing objects:  66% (8/12)\n> Compressing objects:  75% (9/12)   Compressing objects:  83% (10/12)\n> Compressing objects:  91% (11/12)   Compressing objects: 100% (12/12)\n> Compressing objects: 100% (12/12), done.\n> -Writing objects:   8% (1/12)   Writing objects:  16% (2/12)   Writing\n> objects:  25% (3/12)   Writing objects:  33% (4/12)   Writing objects:  41%\n> (5/12)   Writing objects:  50% (6/12)   Writing objects:  58% (7/12)   Writing\n> objects:  66% (8/12)   Writing objects:  75% (9/12)   Writing objects:  83%\n> (10/12)   Writing objects:  91% (11/12)   Writing objects: 100% (12/12)\n> Writing objects: 100% (12/12), 1.05 KiB, done.\n> -Total 12 (delta 11), reused 0 (delta 0)\n> +Compressing objects:   3% (1/29)   Compressing objects:   6% (2/29)\n> Compressing objects:  10% (3/29)   Compressing objects:  13% (4/29)\n> Compressing objects:  17% (5/29)   Compressing objects:  20% (6/29)\n> Compressing objects:  24% (7/29)   Compressing objects:  27% (8/29)\n> Compressing objects:  31% (9/29)   Compressing objects:  34% (10/29)\n> Compressing objects:  37% (11/29)   Compressing objects:  41% (12/29)\n> Compressing objects:  44% (13/29)   Compressing objects:  48% (14/29)\n> Compressing objects:  51% (15/29)   Compressing objects:  55% (16/29)\n> Compressing objects:  58% (17/29)   Compressing objects:  62% (18/29)\n> Compressing objects:  65% (19/29)   Compressing objects:  68% (20/29)\n> Compressing objects:  72% (21/29)   Compressing objects:  75% (22/29)\n> Compressing objects:  79% (23/29)   Compressing objects:  82% (24/29)\n> Compressing objects:  86% (25/29)   Compressing objects:  89% (26/29)\n> Compressing objects:  93% (27/29)   Compressing objects:  96% (28/29)\n>  Compressing objects: 100% (29/29)   Compressing objects: 100% (29/29), done.\n> +Writing objects:   3% (1/29)   Writing objects:   6% (2/29)   Writing\n> objects:  10% (3/29)   Writing objects:  13% (4/29)   Writing objects:  17%\n> (5/29)   Writing objects:  20% (6/29)   Writing objects:  24% (7/29)   Writing\n> objects:  27% (8/29)   Writing objects:  31% (9/29)   Writing objects:  34%\n> (10/29)   Writing objects:  37% (11/29)   Writing objects:  41% (12/29)\n> Writing objects:  44% (13/29)   Writing objects:  48% (14/29)   Writing\n> objects:  51% (15/29)   Writing objects:  55% (16/29)   Writing objects:  62%\n> (18/29)   Writing objects:  65% (19/29)   Writing objects:  68% (20/29)\n> Writing objects:  72% (21/29)   Writing objects:  75% (22/29)   Writing\n> objects:  79% (23/29)   Writing objects:  82% (24/29)   Writing objects:  86%\n> (25/29)   Writing objects:  89% (26/29)   Writing objects:  93% (27/29)\n> Writing objects:  96% (28/29)   Writing objects: 100% (29/29)   Writing\n> objects: 100% (29/29), 4.46 KiB, done.\n> +Total 29 (delta 23), reused 0 (delta 0)\n>  => Syncing Gitorious... [OK]\n>  To git@gitorious.org:amarok/amarok.git\n> -   f7863f9..f4370ae  HEAD -> master\n> +   1a1b30f..670cb0e  HEAD -> master\n>\n> That really are not a problem and are filling my diffs for no reason. We could\n> redirect to > /dev/null the git push command but then i would not see if\n> anything failed.\n>\n> Is it possible to make git push just output data when failing? And if not do\n> you think it's a worthwhile feature i can ask for? Do you have a formal way\n> for feature requests?\n\nHave you tried redirecting only stdout to /dev/null, and keeping\nstderr to yourself ? In addition to that, exit code != 0 means\nsomething went wrong.\n\n-- \nPau Garcia i Quiles\nhttp://www.elpauer.org\n(Due to my workload, I may need 10 days to answer)\n"},{"id":"119662","messageId":"200908052113.06373.aacid@kde.org","threadId":"20373","inReplyTo":"3af572ac0908041520l327482f1u45121b6b991a3673@mail.gmail.com","subject":"Re: Making git push output quieter","fromName":"Albert Astals Cid","fromEmail":"aacid@kde.org","sentAt":"2009-08-05T19:13:06Z","receivedAt":"2009-08-05T19:13:06Z","isPatch":false,"sender":{"key":"aacid@kde.org","avatar":"https://gravatar.com/avatar/f75ccc222073fee7e869dee8627ed66dc18904e0cbb06314adfd8586940f97f3?d=mp&s=160"},"body":"A Dimecres, 5 d'agost de 2009, Pau Garcia i Quiles va escriure:\n> On Tue, Aug 4, 2009 at 11:27 PM, Albert Astals Cid<aacid@kde.org> wrote:\n> > Hi, at KDE we are starting to try to use git and one of the things that's\n> > bothering me is that git push is too verbose for our scripts.\n> >\n> > We have some scripts that commit things and i get the diff of previous\n> > runs, if there is no diff it means all worked fine, a diff means\n> > something i have to look at.\n> >\n> > Now i'm getting diffs like\n> >\n> > -Counting objects: 23, done.\n> > +Counting objects: 53, done.\n> >  Delta compression using up to 2 threads.\n> > -Compressing objects:   8% (1/12)   Compressing objects:  16% (2/12)\n> > Compressing objects:  25% (3/12)   Compressing objects:  33% (4/12)\n> > Compressing objects:  41% (5/12)   Compressing objects:  50% (6/12)\n> > Compressing objects:  58% (7/12)   Compressing objects:  66% (8/12)\n> > Compressing objects:  75% (9/12)   Compressing objects:  83% (10/12)\n> > Compressing objects:  91% (11/12)   Compressing objects: 100% (12/12)\n> > Compressing objects: 100% (12/12), done.\n> > -Writing objects:   8% (1/12)   Writing objects:  16% (2/12)   Writing\n> > objects:  25% (3/12)   Writing objects:  33% (4/12)   Writing objects:\n> >  41% (5/12)   Writing objects:  50% (6/12)   Writing objects:  58% (7/12)\n> >   Writing objects:  66% (8/12)   Writing objects:  75% (9/12)   Writing\n> > objects:  83% (10/12)   Writing objects:  91% (11/12)   Writing objects:\n> > 100% (12/12) Writing objects: 100% (12/12), 1.05 KiB, done.\n> > -Total 12 (delta 11), reused 0 (delta 0)\n> > +Compressing objects:   3% (1/29)   Compressing objects:   6% (2/29)\n> > Compressing objects:  10% (3/29)   Compressing objects:  13% (4/29)\n> > Compressing objects:  17% (5/29)   Compressing objects:  20% (6/29)\n> > Compressing objects:  24% (7/29)   Compressing objects:  27% (8/29)\n> > Compressing objects:  31% (9/29)   Compressing objects:  34% (10/29)\n> > Compressing objects:  37% (11/29)   Compressing objects:  41% (12/29)\n> > Compressing objects:  44% (13/29)   Compressing objects:  48% (14/29)\n> > Compressing objects:  51% (15/29)   Compressing objects:  55% (16/29)\n> > Compressing objects:  58% (17/29)   Compressing objects:  62% (18/29)\n> > Compressing objects:  65% (19/29)   Compressing objects:  68% (20/29)\n> > Compressing objects:  72% (21/29)   Compressing objects:  75% (22/29)\n> > Compressing objects:  79% (23/29)   Compressing objects:  82% (24/29)\n> > Compressing objects:  86% (25/29)   Compressing objects:  89% (26/29)\n> > Compressing objects:  93% (27/29)   Compressing objects:  96% (28/29)\n> >  Compressing objects: 100% (29/29)   Compressing objects: 100% (29/29),\n> > done. +Writing objects:   3% (1/29)   Writing objects:   6% (2/29)  \n> > Writing objects:  10% (3/29)   Writing objects:  13% (4/29)   Writing\n> > objects:  17% (5/29)   Writing objects:  20% (6/29)   Writing objects:\n> >  24% (7/29)   Writing objects:  27% (8/29)   Writing objects:  31% (9/29)\n> >   Writing objects:  34% (10/29)   Writing objects:  37% (11/29)   Writing\n> > objects:  41% (12/29) Writing objects:  44% (13/29)   Writing objects:\n> >  48% (14/29)   Writing objects:  51% (15/29)   Writing objects:  55%\n> > (16/29)   Writing objects:  62% (18/29)   Writing objects:  65% (19/29)  \n> > Writing objects:  68% (20/29) Writing objects:  72% (21/29)   Writing\n> > objects:  75% (22/29)   Writing objects:  79% (23/29)   Writing objects:\n> >  82% (24/29)   Writing objects:  86% (25/29)   Writing objects:  89%\n> > (26/29)   Writing objects:  93% (27/29) Writing objects:  96% (28/29)  \n> > Writing objects: 100% (29/29)   Writing objects: 100% (29/29), 4.46 KiB,\n> > done.\n> > +Total 29 (delta 23), reused 0 (delta 0)\n> >  => Syncing Gitorious... [OK]\n> >  To git@gitorious.org:amarok/amarok.git\n> > -   f7863f9..f4370ae  HEAD -> master\n> > +   1a1b30f..670cb0e  HEAD -> master\n> >\n> > That really are not a problem and are filling my diffs for no reason. We\n> > could redirect to > /dev/null the git push command but then i would not\n> > see if anything failed.\n> >\n> > Is it possible to make git push just output data when failing? And if not\n> > do you think it's a worthwhile feature i can ask for? Do you have a\n> > formal way for feature requests?\n>\n> Have you tried redirecting only stdout to /dev/null, and keeping\n> stderr to yourself ?\n\nEverything goes to stderr.\n\n> In addition to that, exit code != 0 means\n> something went wrong.\n\nI could make something with this, but is it really not something that should \nhappen that errors go to stderr and regular text to stdout?\n\nAlbert\n"},{"id":"119663","messageId":"20090805192658.GI1033@spearce.org","threadId":"20373","inReplyTo":"200908052113.06373.aacid@kde.org","subject":"Re: Making git push output quieter","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2009-08-05T19:26:58Z","receivedAt":"2009-08-05T19:26:58Z","isPatch":false,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Albert Astals Cid <aacid@kde.org> wrote:\n> A Dimecres, 5 d'agost de 2009, Pau Garcia i Quiles va escriure:\n> > On Tue, Aug 4, 2009 at 11:27 PM, Albert Astals Cid<aacid@kde.org> wrote:\n> > > Hi, at KDE we are starting to try to use git and one of the things that's\n> > > bothering me is that git push is too verbose for our scripts.\n...\n> > Have you tried redirecting only stdout to /dev/null, and keeping\n> > stderr to yourself ?\n> \n> Everything goes to stderr.\n\nSadly our use of isatty to determine if progress/verbosity should\nbe used is inconsistent.  pack-objects.c, which is what you are\ntalking about above, is using stderr to determine if progress should\nbe enabled, but other code like transport.c, which is used on the\nclient side, is using stdout.  Hence the suggestion above to redirect\nstdout to /dev/null to try and shutoff the spew.\n\n  $ git grep isatty\n  builtin-commit.c:\t\tif (isatty(0))\n  builtin-config.c:\t\t\tstdout_is_tty = isatty(1);\n  builtin-pack-objects.c:\tprogress = isatty(2);\n  builtin-revert.c:\tif (isatty(0))\n  builtin-shortlog.c:\tif (!nongit && !rev.pending.nr && isatty(0))\n  builtin-unpack-objects.c:\tquiet = !isatty(2);\n  color.c:\t\tstdout_is_tty = isatty(1);\n  compat/winansi.c:\tif (!isatty(fileno(stream)))\n  compat/winansi.c:\tif (!isatty(fileno(stream)))\n  pack-redundant.c:\tif (!isatty(0)) {\n  pager.c:\tif (!isatty(1))\n  pager.c:\tif (isatty(2))\n  transport.c:\targs.no_progress = args.quiet || (!transport->progress && !isatty(1));\n  wt-status.c:\t * will have checked isatty on stdout).\n\nI'm thinking this might be a reasonable patch to apply, Junio/Nico?\n\n--8<--\npack-objects: Display progress only if stdout is tty\n\nClient transports underneath git fetch display progress output only\nif stdout is a tty, allowing redirection of stdout to /dev/null (or\na pipe) to silence progress but still report actual errors on stderr.\n\nDoing the same in pack-objects means push, bundle creation and\nrepack can use the same trick to silence noisy progress progress,\nbut still obtain real errors.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n builtin-pack-objects.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/builtin-pack-objects.c b/builtin-pack-objects.c\nindex 961b639..0b9234a 100644\n--- a/builtin-pack-objects.c\n+++ b/builtin-pack-objects.c\n@@ -2110,7 +2110,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)\n \tif (!pack_compression_seen && core_compression_seen)\n \t\tpack_compression_level = core_compression_level;\n \n-\tprogress = isatty(2);\n+\tprogress = isatty(1);\n \tfor (i = 1; i < argc; i++) {\n \t\tconst char *arg = argv[i];\n \n-- \n1.6.4.70.g9c084\n\n\n-- \nShawn.\n"},{"id":"119666","messageId":"alpine.LFD.2.00.0908051545300.16073@xanadu.home","threadId":"20373","inReplyTo":"20090805192658.GI1033@spearce.org","subject":"Re: Making git push output quieter","fromName":"Nicolas Pitre","fromEmail":"nico@cam.org","sentAt":"2009-08-05T19:51:27Z","receivedAt":"2009-08-05T19:51:27Z","isPatch":false,"sender":{"key":"nico@fluxnic.net","avatar":"https://avatars.githubusercontent.com/u/702790?v=4"},"body":"On Wed, 5 Aug 2009, Shawn O. Pearce wrote:\n\n> Albert Astals Cid <aacid@kde.org> wrote:\n> > A Dimecres, 5 d'agost de 2009, Pau Garcia i Quiles va escriure:\n> > > On Tue, Aug 4, 2009 at 11:27 PM, Albert Astals Cid<aacid@kde.org> wrote:\n> > > > Hi, at KDE we are starting to try to use git and one of the things that's\n> > > > bothering me is that git push is too verbose for our scripts.\n> ...\n> > > Have you tried redirecting only stdout to /dev/null, and keeping\n> > > stderr to yourself ?\n> > \n> > Everything goes to stderr.\n> \n> Sadly our use of isatty to determine if progress/verbosity should\n> be used is inconsistent.  pack-objects.c, which is what you are\n> talking about above, is using stderr to determine if progress should\n> be enabled, but other code like transport.c, which is used on the\n> client side, is using stdout.  Hence the suggestion above to redirect\n> stdout to /dev/null to try and shutoff the spew.\n> \n>   $ git grep isatty\n>   builtin-commit.c:\t\tif (isatty(0))\n>   builtin-config.c:\t\t\tstdout_is_tty = isatty(1);\n>   builtin-pack-objects.c:\tprogress = isatty(2);\n>   builtin-revert.c:\tif (isatty(0))\n>   builtin-shortlog.c:\tif (!nongit && !rev.pending.nr && isatty(0))\n>   builtin-unpack-objects.c:\tquiet = !isatty(2);\n>   color.c:\t\tstdout_is_tty = isatty(1);\n>   compat/winansi.c:\tif (!isatty(fileno(stream)))\n>   compat/winansi.c:\tif (!isatty(fileno(stream)))\n>   pack-redundant.c:\tif (!isatty(0)) {\n>   pager.c:\tif (!isatty(1))\n>   pager.c:\tif (isatty(2))\n>   transport.c:\targs.no_progress = args.quiet || (!transport->progress && !isatty(1));\n>   wt-status.c:\t * will have checked isatty on stdout).\n> \n> I'm thinking this might be a reasonable patch to apply, Junio/Nico?\n> \n> --8<--\n> pack-objects: Display progress only if stdout is tty\n> \n> Client transports underneath git fetch display progress output only\n> if stdout is a tty, allowing redirection of stdout to /dev/null (or\n> a pipe) to silence progress but still report actual errors on stderr.\n> \n> Doing the same in pack-objects means push, bundle creation and\n> repack can use the same trick to silence noisy progress progress,\n> but still obtain real errors.\n> \n> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n> ---\n>  builtin-pack-objects.c |    2 +-\n>  1 files changed, 1 insertions(+), 1 deletions(-)\n> \n> diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c\n> index 961b639..0b9234a 100644\n> --- a/builtin-pack-objects.c\n> +++ b/builtin-pack-objects.c\n> @@ -2110,7 +2110,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)\n>  \tif (!pack_compression_seen && core_compression_seen)\n>  \t\tpack_compression_level = core_compression_level;\n>  \n> -\tprogress = isatty(2);\n> +\tprogress = isatty(1);\n\nDoesn't this break progress reporting on a push since stdout is never a \ntty in that case?  Same issue on a fetch although in that case the \nprogress level is provided explicitly by the caller.\n\n\n\n>  \tfor (i = 1; i < argc; i++) {\n>  \t\tconst char *arg = argv[i];\n>  \n> -- \n> 1.6.4.70.g9c084\n> \n> \n> -- \n> Shawn.\n> --\n> To unsubscribe from this list: send the line \"unsubscribe git\" in\n> the body of a message to majordomo@vger.kernel.org\n> More majordomo info at  http://vger.kernel.org/majordomo-info.html\n> \n"},{"id":"119672","messageId":"20090805201937.GB9004@coredump.intra.peff.net","threadId":"20373","inReplyTo":"alpine.LFD.2.00.0908051545300.16073@xanadu.home","subject":"Re: Making git push output quieter","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T20:19:37Z","receivedAt":"2009-08-05T20:19:37Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Aug 05, 2009 at 03:51:27PM -0400, Nicolas Pitre wrote:\n\n> > -\tprogress = isatty(2);\n> > +\tprogress = isatty(1);\n> \n> Doesn't this break progress reporting on a push since stdout is never a \n> tty in that case?  Same issue on a fetch although in that case the \n> progress level is provided explicitly by the caller.\n\nIt also doesn't entirely fix the original poster's problem. There are\nactually two outputs: the progress report and the push status. I think\nwe actually just want a \"--quiet\" flag here which is passed along to\npack-objects, and which suppresses the push status. Patch series\nto follow:\n\n  1/3: push: add --quiet flag\n  2/3: transport: pass \"quiet\" flag to pack-objects\n  3/3: transport: don't show push status if --quiet is given\n\n-Peff\n"},{"id":"119673","messageId":"20090805202219.GA23226@coredump.intra.peff.net","threadId":"20373","inReplyTo":"20090805201937.GB9004@coredump.intra.peff.net","subject":"[RFC/PATCH 1/3] push: add --quiet flag","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T20:22:19Z","receivedAt":"2009-08-05T20:22:19Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"Some transports produce output even without \"--verbose\"\nturned on. This provides a way to tell them to be more\nquiet (whereas simply redirecting might lose error\nmessages).\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\nMissing tests and docs still.\n\nIt may be a bit weird, but you can actually say \"--quiet --verbose\" and\nthey don't exactly cancel each other. But it can actually be useful to\nsay \"don't show me the ref status unless there is an error (--quiet), in\nwhich case show me the entire table (--verbose)\".\n\n builtin-push.c |    1 +\n transport.h    |    1 +\n 2 files changed, 2 insertions(+), 0 deletions(-)\n\ndiff --git a/builtin-push.c b/builtin-push.c\nindex 1d92e22..bc0c91a 100644\n--- a/builtin-push.c\n+++ b/builtin-push.c\n@@ -168,6 +168,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)\n \tconst char *repo = NULL;\t/* default repository */\n \n \tstruct option options[] = {\n+\t\tOPT_BIT('q', \"quiet\", &flags, \"be quiet\", TRANSPORT_PUSH_QUIET),\n \t\tOPT_BIT('v', \"verbose\", &flags, \"be verbose\", TRANSPORT_PUSH_VERBOSE),\n \t\tOPT_STRING( 0 , \"repo\", &repo, \"repository\", \"repository\"),\n \t\tOPT_BIT( 0 , \"all\", &flags, \"push all refs\", TRANSPORT_PUSH_ALL),\ndiff --git a/transport.h b/transport.h\nindex 51b5397..f1d3ebf 100644\n--- a/transport.h\n+++ b/transport.h\n@@ -36,6 +36,7 @@ struct transport {\n #define TRANSPORT_PUSH_MIRROR 8\n #define TRANSPORT_PUSH_VERBOSE 16\n #define TRANSPORT_PUSH_PORCELAIN 32\n+#define TRANSPORT_PUSH_QUIET 64\n \n /* Returns a transport suitable for the url */\n struct transport *transport_get(struct remote *, const char *);\n-- \n1.6.4.218.g9f65c.dirty\n"},{"id":"119674","messageId":"20090805202236.GB23226@coredump.intra.peff.net","threadId":"20373","inReplyTo":"20090805201937.GB9004@coredump.intra.peff.net","subject":"[PATCH 2/3] transport: pass \"quiet\" flag to pack-objects","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T20:22:36Z","receivedAt":"2009-08-05T20:22:36Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"When pushing over the git protocol, pack-objects gives\nprogress reports about the pack being sent. If \"push\" is\ngiven the --quiet flag, it now passes \"-q\" to pack-objects,\nsuppressing this output.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n builtin-send-pack.c |    3 +++\n send-pack.h         |    1 +\n transport.c         |    1 +\n 3 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/builtin-send-pack.c b/builtin-send-pack.c\nindex 47fb9f7..37e528e 100644\n--- a/builtin-send-pack.c\n+++ b/builtin-send-pack.c\n@@ -44,6 +44,7 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext\n \t\tNULL,\n \t\tNULL,\n \t\tNULL,\n+\t\tNULL,\n \t};\n \tstruct child_process po;\n \tint i;\n@@ -53,6 +54,8 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext\n \t\targv[i++] = \"--thin\";\n \tif (args->use_ofs_delta)\n \t\targv[i++] = \"--delta-base-offset\";\n+\tif (args->quiet)\n+\t\targv[i++] = \"-q\";\n \tmemset(&po, 0, sizeof(po));\n \tpo.argv = argv;\n \tpo.in = -1;\ndiff --git a/send-pack.h b/send-pack.h\nindex 1d7b1b3..8b3cf02 100644\n--- a/send-pack.h\n+++ b/send-pack.h\n@@ -3,6 +3,7 @@\n \n struct send_pack_args {\n \tunsigned verbose:1,\n+\t\tquiet:1,\n \t\tsend_mirror:1,\n \t\tforce_update:1,\n \t\tuse_thin_pack:1,\ndiff --git a/transport.c b/transport.c\nindex 8a42e76..2d0c491 100644\n--- a/transport.c\n+++ b/transport.c\n@@ -878,6 +878,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re\n \targs.force_update = !!(flags & TRANSPORT_PUSH_FORCE);\n \targs.use_thin_pack = data->thin;\n \targs.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE);\n+\targs.quiet = !!(flags & TRANSPORT_PUSH_QUIET);\n \targs.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);\n \n \tret = send_pack(&args, data->fd, data->conn, remote_refs,\n-- \n1.6.4.218.g9f65c.dirty\n"},{"id":"119675","messageId":"20090805202326.GC23226@coredump.intra.peff.net","threadId":"20373","inReplyTo":"20090805201937.GB9004@coredump.intra.peff.net","subject":"[PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T20:23:26Z","receivedAt":"2009-08-05T20:23:26Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"When --quiet is given, the user generally only wants to see\nerrors. So let's suppress printing the ref status table\nunless there is an error, in which case we print out the\nwhole table.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\nWe could get fancier here and print out only the refs with errors if\nquiet is given, but I went for simplicity.\n\n transport.c |   20 +++++++++++++++++++-\n 1 files changed, 19 insertions(+), 1 deletions(-)\n\ndiff --git a/transport.c b/transport.c\nindex 2d0c491..afec5b7 100644\n--- a/transport.c\n+++ b/transport.c\n@@ -667,6 +667,21 @@ static int fetch_refs_via_pack(struct transport *transport,\n \treturn (refs ? 0 : -1);\n }\n \n+static int push_had_errors(struct ref *ref)\n+{\n+\tfor (; ref; ref = ref->next) {\n+\t\tswitch (ref->status) {\n+\t\tcase REF_STATUS_NONE:\n+\t\tcase REF_STATUS_UPTODATE:\n+\t\tcase REF_STATUS_OK:\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\treturn 0;\n+}\n+\n static int refs_pushed(struct ref *ref)\n {\n \tfor (; ref; ref = ref->next) {\n@@ -996,6 +1011,7 @@ int transport_push(struct transport *transport,\n \t\tstruct ref *local_refs = get_local_heads();\n \t\tint match_flags = MATCH_REFS_NONE;\n \t\tint verbose = flags & TRANSPORT_PUSH_VERBOSE;\n+\t\tint quiet = flags & TRANSPORT_PUSH_QUIET;\n \t\tint porcelain = flags & TRANSPORT_PUSH_PORCELAIN;\n \t\tint ret;\n \n@@ -1011,7 +1027,9 @@ int transport_push(struct transport *transport,\n \n \t\tret = transport->push_refs(transport, remote_refs, flags);\n \n-\t\tprint_push_status(transport->url, remote_refs, verbose | porcelain, porcelain);\n+\t\tif (!quiet || push_had_errors(remote_refs))\n+\t\t\tprint_push_status(transport->url, remote_refs,\n+\t\t\t\t\tverbose | porcelain, porcelain);\n \n \t\tif (!(flags & TRANSPORT_PUSH_DRY_RUN)) {\n \t\t\tstruct ref *ref;\n-- \n1.6.4.218.g9f65c.dirty\n"},{"id":"119676","messageId":"fabb9a1e0908051327l74e06afdvf3b35b5abde2e140@mail.gmail.com","threadId":"20373","inReplyTo":"20090805202326.GC23226@coredump.intra.peff.net","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Sverre Rabbelier","fromEmail":"srabbelier@gmail.com","sentAt":"2009-08-05T20:27:20Z","receivedAt":"2009-08-05T20:27:20Z","isPatch":true,"sender":{"key":"srabbelier@gmail.com","avatar":"https://avatars.githubusercontent.com/u/3098?v=4"},"body":"Heya,\n\nOn Wed, Aug 5, 2009 at 13:23, Jeff King<peff@peff.net> wrote:\n> +       for (; ref; ref = ref->next) {\n> +               switch (ref->status) {\n> +               case REF_STATUS_NONE:\n> +               case REF_STATUS_UPTODATE:\n> +               case REF_STATUS_OK:\n> +                       break;\n> +               default:\n> +                       return 1;\n> +               }\n> +       }\n\nIs my C getting sloppy or is this a non-looping loop? AFAICS it either\nreturn 1's on the first run, or breaks?\n\n-- \nCheers,\n\nSverre Rabbelier\n"},{"id":"119677","messageId":"32541b130908051329w43882ca6ne0824b01da3948aa@mail.gmail.com","threadId":"20373","inReplyTo":"fabb9a1e0908051327l74e06afdvf3b35b5abde2e140@mail.gmail.com","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Avery Pennarun","fromEmail":"apenwarr@gmail.com","sentAt":"2009-08-05T20:29:13Z","receivedAt":"2009-08-05T20:29:13Z","isPatch":true,"sender":{"key":"apenwarr@gmail.com","avatar":"https://avatars.githubusercontent.com/u/20592?v=4"},"body":"On Wed, Aug 5, 2009 at 8:27 PM, Sverre Rabbelier<srabbelier@gmail.com> wrote:\n> On Wed, Aug 5, 2009 at 13:23, Jeff King<peff@peff.net> wrote:\n>> +       for (; ref; ref = ref->next) {\n>> +               switch (ref->status) {\n>> +               case REF_STATUS_NONE:\n>> +               case REF_STATUS_UPTODATE:\n>> +               case REF_STATUS_OK:\n>> +                       break;\n>> +               default:\n>> +                       return 1;\n>> +               }\n>> +       }\n>\n> Is my C getting sloppy or is this a non-looping loop? AFAICS it either\n> return 1's on the first run, or breaks?\n\nThe \"break\" in this case breaks out of the switch, not the for.\n\nAvery\n"},{"id":"119678","messageId":"fabb9a1e0908051330v24863b4fo6fc2021bafb2fdb8@mail.gmail.com","threadId":"20373","inReplyTo":"32541b130908051329w43882ca6ne0824b01da3948aa@mail.gmail.com","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Sverre Rabbelier","fromEmail":"srabbelier@gmail.com","sentAt":"2009-08-05T20:30:20Z","receivedAt":"2009-08-05T20:30:20Z","isPatch":true,"sender":{"key":"srabbelier@gmail.com","avatar":"https://avatars.githubusercontent.com/u/3098?v=4"},"body":"Heya,\n\nOn Wed, Aug 5, 2009 at 13:29, Avery Pennarun<apenwarr@gmail.com> wrote:\n>> Is my C getting sloppy or is this a non-looping loop? AFAICS it either\n>> return 1's on the first run, or breaks?\n>\n> The \"break\" in this case breaks out of the switch, not the for.\n\nOuch, painfull, my C _IS_ getting sloppy :(.\n\n-- \nCheers,\n\nSverre Rabbelier\n"},{"id":"119681","messageId":"7vhbwm0zcs.fsf@alter.siamese.dyndns.org","threadId":"20373","inReplyTo":"20090805202326.GC23226@coredump.intra.peff.net","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-08-05T20:39:31Z","receivedAt":"2009-08-05T20:39:31Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> When --quiet is given, the user generally only wants to see\n> errors.\n\nThat does not match what my cron job at day job expects.\n\nI'd welcome the warm and fuzzy feeling of seeing \"ah, yes, we had changes\non those branches to push out last night\".\n\nMaybe it is just me, but my gut feeling is that it would be more\nappropriate to squelch only \"already up to date\" refs at least, at the\ndefault level of quietness.\n"},{"id":"119685","messageId":"20090805204835.GA24539@coredump.intra.peff.net","threadId":"20373","inReplyTo":"7vhbwm0zcs.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T20:48:35Z","receivedAt":"2009-08-05T20:48:35Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Aug 05, 2009 at 01:39:31PM -0700, Junio C Hamano wrote:\n\n> > When --quiet is given, the user generally only wants to see\n> > errors.\n> \n> That does not match what my cron job at day job expects.\n> \n> I'd welcome the warm and fuzzy feeling of seeing \"ah, yes, we had changes\n> on those branches to push out last night\".\n> \n> Maybe it is just me, but my gut feeling is that it would be more\n> appropriate to squelch only \"already up to date\" refs at least, at the\n> default level of quietness.\n\nI don't understand. Isn't that what \"git push\" _already_ does? Or are\nyou saying you would like the \"squelch progress\" feature of 2/3, but not\nthe \"squelch ref status\" of 3/3? In that case, are you not already doing\nsomething to squelch the progress?\n\nWe could accomodate that by doubling --quiet to suppress ref status,\nthough the transport interface seems to rely on flags (I guess we could\nhave QUIET and REALLY_QUIET).\n\n-Peff\n"},{"id":"119691","messageId":"7vws5ix9dz.fsf@alter.siamese.dyndns.org","threadId":"20373","inReplyTo":"20090805204835.GA24539@coredump.intra.peff.net","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-08-05T21:01:44Z","receivedAt":"2009-08-05T21:01:44Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> I don't understand. Isn't that what \"git push\" _already_ does?\n\nSorry, it has been a while since I looked at print_push_status() the last\ntime.  You are right; without --verbose, we show interesting ref update\nstatus, excluding the \"already up to date\" report.\n\nWhat I meant was that I'd still want to see the non-verbose part of\nprint_push_status(), while suppressing the progress report.  That would\nmake mails coming from the cron job much more pleasant to read.\n\nIf you somehow can automatically squelch progress without -q for an\nunattended invocation (e.g. cron jobs), then I wouldn't need to pass -q\nand everything will be good.  But if I have to pass -q in order to squelch\nprogress, I do not want that same -q to automatically also mean \"no status\noutput\", which is what your 3/3 is about, if I am reading the patch\ncorrectly.  That's all.\n"},{"id":"119696","messageId":"20090805211700.GA24697@coredump.intra.peff.net","threadId":"20373","inReplyTo":"7vws5ix9dz.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-05T21:17:00Z","receivedAt":"2009-08-05T21:17:00Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Aug 05, 2009 at 02:01:44PM -0700, Junio C Hamano wrote:\n\n> What I meant was that I'd still want to see the non-verbose part of\n> print_push_status(), while suppressing the progress report.  That would\n> make mails coming from the cron job much more pleasant to read.\n> \n> If you somehow can automatically squelch progress without -q for an\n> unattended invocation (e.g. cron jobs), then I wouldn't need to pass -q\n> and everything will be good.  But if I have to pass -q in order to squelch\n> progress, I do not want that same -q to automatically also mean \"no status\n> output\", which is what your 3/3 is about, if I am reading the patch\n> correctly.  That's all.\n\nHmm. Doesn't that already work? pack-objects checks isatty(2) already\nbefore outputting progress, which means it should be suppressed when run\nvia cron (the original poster is seeing it, though, which maybe means\nsome crons allocate a terminal?).\n\nBut it sounds like git already does what you want; this extra \"-q\" would\nreally be more about shutting up the ref status. If you really wanted to\ncontrol them separately (e.g., because your isatty check is not\nreliable), then maybe it should be split into \"--quiet\" and\n\"--no-progress\"?\n\n-Peff\n"},{"id":"122194","messageId":"4A9C175E.6020905@hartwork.org","threadId":"20373","inReplyTo":"20090805211700.GA24697@coredump.intra.peff.net","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Sebastian Pipping","fromEmail":"webmaster@hartwork.org","sentAt":"2009-08-31T18:33:02Z","receivedAt":"2009-08-31T18:33:02Z","isPatch":true,"sender":{"key":"webmaster@hartwork.org","avatar":null},"body":"Hello!\n\n\nI run git push in a cron job, too.  I want mails in error cases only\nso I need git push to print errors but _only_ errors to stderr.  That\nseems impossible with 1.6.4.* and related to what you're discussing here.\n\nDoes the patch you're building address that case already?  has it been\napplied to any branch already?  I got a bit lost in this thread, sorry.\n\n\n\nSebastian\n"},{"id":"122199","messageId":"20090831192834.GC4876@sigill.intra.peff.net","threadId":"20373","inReplyTo":"4A9C175E.6020905@hartwork.org","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2009-08-31T19:28:34Z","receivedAt":"2009-08-31T19:28:34Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Aug 31, 2009 at 08:33:02PM +0200, Sebastian Pipping wrote:\n\n> I run git push in a cron job, too.  I want mails in error cases only\n> so I need git push to print errors but _only_ errors to stderr.  That\n> seems impossible with 1.6.4.* and related to what you're discussing here.\n> \n> Does the patch you're building address that case already?  has it been\n> applied to any branch already?  I got a bit lost in this thread, sorry.\n\nJunio applied the series, and it is in 'master' right now (and so should\nbe part of the upcoming 1.6.5).\n\nUsing \"git push -q\" will do what you want, but playing with it a bit, I\nthink there is one bit missing from the original series:\n\n-- >8 --\nSubject: [PATCH] push: teach --quiet to suppress \"Everything up-to-date\"\n\nThis should have been part of 481c7a6, whose goal was to\nmake \"git push -q\" silent unless there is an error.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n transport.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/transport.c b/transport.c\nindex ce91387..f2bd998 100644\n--- a/transport.c\n+++ b/transport.c\n@@ -908,7 +908,7 @@ int transport_push(struct transport *transport,\n \t\t\t\tupdate_tracking_ref(transport->remote, ref, verbose);\n \t\t}\n \n-\t\tif (!ret && !refs_pushed(remote_refs))\n+\t\tif (!quiet && !ret && !refs_pushed(remote_refs))\n \t\t\tfprintf(stderr, \"Everything up-to-date\\n\");\n \t\treturn ret;\n \t}\n-- \n1.6.4.2.372.gf7961.dirty\n"},{"id":"122200","messageId":"4A9C26DA.9010701@hartwork.org","threadId":"20373","inReplyTo":"20090831192834.GC4876@sigill.intra.peff.net","subject":"Re: [PATCH 3/3] transport: don't show push status if --quiet is given","fromName":"Sebastian Pipping","fromEmail":"webmaster@hartwork.org","sentAt":"2009-08-31T19:39:06Z","receivedAt":"2009-08-31T19:39:06Z","isPatch":true,"sender":{"key":"webmaster@hartwork.org","avatar":null},"body":"Jeff King wrote:\n> Junio applied the series, and it is in 'master' right now (and so should\n> be part of the upcoming 1.6.5).\n> \n> Using \"git push -q\" will do what you want,\n\nThat's great news.  Thanks for the quick reply.\n\n\n> but playing with it a bit, I\n> think there is one bit missing from the original series:\n> \n> -- >8 --\n> Subject: [PATCH] push: teach --quiet to suppress \"Everything up-to-date\"\n> \n> This should have been part of 481c7a6, whose goal was to\n> make \"git push -q\" silent unless there is an error.\n> \n> Signed-off-by: Jeff King <peff@peff.net>\n> ---\n>  transport.c |    2 +-\n>  1 files changed, 1 insertions(+), 1 deletions(-)\n> \n> diff --git a/transport.c b/transport.c\n> index ce91387..f2bd998 100644\n> --- a/transport.c\n> +++ b/transport.c\n> @@ -908,7 +908,7 @@ int transport_push(struct transport *transport,\n>  \t\t\t\tupdate_tracking_ref(transport->remote, ref, verbose);\n>  \t\t}\n>  \n> -\t\tif (!ret && !refs_pushed(remote_refs))\n> +\t\tif (!quiet && !ret && !refs_pushed(remote_refs))\n>  \t\t\tfprintf(stderr, \"Everything up-to-date\\n\");\n>  \t\treturn ret;\n>  \t}\n\nWould be great to have that patch in too.\n\n\n\nSebastian\n"}]}