[pacman-dev] Duplicated lines of "downloading foo.db..." with --noprogressbar
Andrew Gregory
andrew.gregory.8 at gmail.com
Mon May 4 12:55:28 UTC 2015
On 05/04/15 at 02:47pm, Allan McRae wrote:
> On 23/04/15 06:27, David Macek wrote:
> > Hello everyone. I see a problem with --noprogressbar output, but it seems to be dependent on server/network. Can anyone confirm with the following settings?
> >
> > # append to pacman.conf
> > [mingw64]
> > Server = ftp://ftp.heanet.ie/mirrors/download.sourceforge.net/pub/sourceforge/m/ms/msys2/REPOS/MINGW/x86_64
>
> Don't let Dave see you using ftp!
>
> >
> > $ pacman -Syy --noprogressbar
> >
> > My output contains multiple "downloading" lines for this DB:
> >
> > downloading mingw64.db...
> > downloading mingw64.db...
> > downloading mingw64.db...
> > downloading mingw64.db...
> > downloading mingw64.db...
> >
>
> allan at arya ~
> $ pacman -Syy --noprogressbar
> :: Synchronizing package databases...
> downloading staging.db...
> downloading testing.db...
> downloading core.db...
> downloading extra.db...
> downloading extra.db...
> downloading extra.db...
> downloading extra.db...
> downloading extra.db...
> downloading community-testing.db...
> downloading community.db...
> downloading multilib-staging.db...
> downloading multilib-testing.db...
> downloading multilib.db...
>
> I can replicate using the Arch dev server (which is really slow from here).
>
> > It seems that the cause is libcurl calling the progress callback
> > multiple times before the first bytes get downloaded, which then
> > in turns `cb_dl_progress` multiple times with `file_xfered` = 0,
> > which then prints the message each time.
> >
> > I don't want to just complain, so I whipped up a quick patch.
> > I can submit it properly if it gets an upvote.
> >
> > diff --git a/src/pacman/callback.c b/src/pacman/callback.c
> > index 695e38d..3bc43b7 100644
> > --- a/src/pacman/callback.c
> > +++ b/src/pacman/callback.c
> > @@ -628,6 +628,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)
> > static double rate_last;
> > static off_t xfered_last;
> > static int64_t initial_time = 0;
> > + static char *filename_last = NULL;
> > int infolen;
> > int filenamelen;
> > char *fname, *p;
> > @@ -646,7 +647,11 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)
> > const unsigned short cols = getcols();
> >
> > if(config->noprogressbar || cols == 0 || file_total == -1) {
> > - if(file_xfered == 0) {
> > + if(filename_last != NULL || strcmp(filename_last, filename) != 0) {
> > + if(filename_last != NULL) {
> > + free(filename_last);
> > + }
> > + filename_last = strdup(filename);
> > printf(_("downloading %s...\n"), filename);
> > fflush(stdout);
> > }
> >
>
> This seems a reasonable solution.
I don't think this is the right solution. The comments in
dload_progress_cb suggest that the callback is not intended to be
called until we have actually downloaded something. So, file_xfered
should always equal 0 exactly once per downloaded file. I think it
makes more sense to fix dload_progress_cb. We might also consider
using the event callback rather than the download callback when
noprogressbar is set.
apg
More information about the pacman-dev
mailing list