Re: [PATCH] mingw_rmdir: do not prompt for retry when non-empty
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Dec 5, 2012, 16:02 UTC
- Message-ID
- <alpine.DEB.1.00.1212051657131.31987@s15462909.onlinehome-server.info>
- In-Reply-To
- <CABPQNSbcSEKApDBWWt7z67DvV6=JwTGebdk6hjgR1OppPyOQwg@mail.gmail.com>
Hi kusma,
On Wed, 5 Dec 2012, Erik Faye-Lund wrote:
> Sorry for a late reply.
Yeah, sorry, my replies tend to be delayed a lot. For the record: your reply was not at all late.
Show 52 quoted lines
> On Tue, Dec 4, 2012 at 5:35 PM, Johannes Schindelin
> <Johannes.Schindelin@gmx.de> wrote:
> >
> > On Tue, 4 Dec 2012, Erik Faye-Lund wrote:
> >
> >> in ab1a11be ("mingw_rmdir: set errno=ENOTEMPTY when appropriate"), a
> >> check was added to prevent us from retrying to delete a directory
> >> that is both in use and non-empty.
> >>
> >> However, this logic was slightly flawed; since we didn't return
> >> immediately, we end up falling out of the retry-loop, but right into
> >> the prompting loop.
> >>
> >> Fix this by simply returning from the function instead of breaking
> >> the loop.
> >>
> >> While we're at it, change the second break to a return as well; we
> >> already know that we won't enter the prompting-loop, beacuse
> >> is_file_in_use_error(GetLastError()) already evaluated to false.
> >
> > I usually prefer to break from the loop, to be able to add whatever
> > cleanup code we might need in the future after the loop.
> >
> > So does this fix the problem for you?
> >
> > -- snipsnap --
> > diff --git a/compat/mingw.c b/compat/mingw.c
> > index 04af3dc..504495a 100644
> > --- a/compat/mingw.c
> > +++ b/compat/mingw.c
> > @@ -259,7 +259,8 @@ int mingw_rmdir(const char *pathname)
> > return -1;
> >
> > while ((ret = _wrmdir(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
> > - if (!is_file_in_use_error(GetLastError()))
> > + errno = err_win_to_posix(GetLastError());
> > + if (errno != EACCESS)
> > break;
> > if (!is_dir_empty(wpathname)) {
> > errno = ENOTEMPTY;
> > @@ -275,7 +276,7 @@ int mingw_rmdir(const char *pathname)
> > Sleep(delay[tries]);
> > tries++;
> > }
> > - while (ret == -1 && is_file_in_use_error(GetLastError()) &&
> > + while (ret == -1 && errno == EACCESS &&
> > ask_yes_no_if_possible("Deletion of directory '%s' failed. "
> > "Should I try again?", pathname))
> > ret = _wrmdir(wpathname);
>
> Yes, as long as you do s/EACCESS/EACCES/ first. I don't mind such a
> version instead.As you probably suspected, I did not have a way to test-compile it before sending.
The reason I was suggesting my version of the patch was to unify the error handling: rather than relying on both errno and GetLastError() (but for different error conditions), I would like to rely on only one: errno. That way, they cannot contradict each other (as they did in your case).
However, I have no strong opinion on this, so please apply the version you like better.
Ciao, Dscho
-- *** Please reply-to-all at all times *** *** (do not pretend to know who is subscribed and who is not) *** *** Please avoid top-posting. *** The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free. You received this message because you are subscribed to the Google Groups "msysGit" group. To post to this group, send email to msysgit@googlegroups.com To unsubscribe from this group, send email to msysgit+unsubscribe@googlegroups.com For more options, and view previous threads, visit this group at http://groups.google.com/group/msysgit?hl=en_US?hl=en