[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

RE: How to fix issue #4023 (on Windows, 'svn rm missingItem' deletes the unversioned 'MissingItem' from disk)?

From: Bert Huijben <bert_at_qqmail.nl>
Date: Sun, 15 Jan 2012 22:14:40 +0100

> -----Original Message-----
> From: Johan Corveleyn [mailto:jcorvel_at_gmail.com]
> Sent: zondag 15 januari 2012 21:26
> To: Subversion Development
> Subject: How to fix issue #4023 (on Windows, 'svn rm missingItem' deletes
> the unversioned 'MissingItem' from disk)?
>
> Hi,
>
> I'm looking into fixing issue #4023. I'd like to have some feedback on
> a possible solution, and some hints on how to best implement it.
>
> The problem
> -----------
> - 'svn rm missingItem' (while there is a 'MissingItem' on disk, and
> not a 'missingItem') will eventually call
> adm.ops.c#svn_wc__delete_many, with 'missingItem' as one of the
> targets (so far so good).
>
> - svn_wc__delete_many, after updating wc.db, will eventually call
> erase_unversioned_from_wc, which will call
> svn_io_remove_file2('missingItem').
>
> - At this point, we have a problem, because
> svn_io_remove_file2('missingItem') will eventually call the Windows
> API DeleteFileW, which will happily delete 'MissingItem' when given
> the 'missingItem' argument.
>
>
> Proposed solution
> -----------------
> Inside svn_wc__delete_many, we could find out that 'missingItem' is,
> you know, missing, before we try to delete it from disk. In that case,
> there is no need to call erase_unversioned_from_wc, so no call to
> DeleteFileW occurs.
>
>
> I can't come up with a better way, but if someone has other ideas, shoot.
>
> If this is indeed the way to proceed, then I'd appreciate a small
> hint/pointer: how do I find out (as cheaply as possible) whether the
> target in question is missing? In the beginning of
> svn_wc__delete_many, a call is done to svn_wc__db_read_info, but this
> doesn't seem to give this information (status == normal, kind == file,
> whether or not the file in question is missing from disk).

The cheapest way to check would be (indirectly) calling the
apr_filepath_merge call to find the paths true name. If the basename of the
returned path is (case-)different than the path you entered, then the file
would be missing.
If the file is really missing, you would get the identical path or an error
from that call.

On Windows this is cheaper than retrieving all directory entries in the
parent directory and checking yourself and on other platforms getting the
truename is a no-op.

We might have a wrapper for that apr_filepath_merge, for handling the path
encoding conversion.
If we have, then we probably used it for the file move fix we programmed in
Berlin. If not, then we should probably add one :)

        Bert Huijben

>
>
> --
> Johan
Received on 2012-01-15 22:15:56 CET

This is an archived mail posted to the Subversion Dev mailing list.