DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=12632>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=12632

[PATCH] New <lsync> to synchronize a local directory from one or more <fileset>s





------- Additional Comments From [EMAIL PROTECTED]  2003-01-17 17:50 -------
I have finished my mucking to repair pass 2 (removing orphaned files - on second
thought, its not really a repair, but an extension.  In my opinion, if you ask
it to removed orphaned files, it should remove orphaned files and orphaned
directories).

I have attached the class in its entirity.

Here are the changes in diff format:

<         int removedFileCount = removeOrphanFiles(allFiles, toDir);
<         logRemovedCount(removedFileCount, "dangling file", "", "s");
---
>               int[] removedFileCount = removeOrphanFiles(allFiles, toDir);
>               logRemovedCount(removedFileCount[0], "dangling director", "y",
"ies");
>               logRemovedCount(removedFileCount[1], "dangling file", "", "s");
110c111
<      * Removes all files not found as keyes of a table (used as a set!).
---
>        * Removes all files and folders not found as keyes of a table (used as
a set!).
114a116,117
>        * If the directory is an orphan, it will also be removed.
>        *
117c120,123
<      * @return the number of orphaned files actually removed.
---
>        * @return the number of orphaned files and directories actually 
> removed.
>        * Position 0 of the array is the number of orphaned directories.
>        * Position 1 of the array is the number or orphaned files.
>        * Position 2 is meaningless.
119,120c125,126
<     private int removeOrphanFiles(Hashtable nonOrphans, File file) {
<         int removedCount = 0;
---
>       private int[] removeOrphanFiles(Hashtable nonOrphans, File file) {
>               int[] removedCount = new int[]{0, 0, 0};
124c130,154
<                 removedCount += removeOrphanFiles(nonOrphans, children[i]);
---
>                               int[] temp = removeOrphanFiles(nonOrphans,
children[i]);
>                               removedCount[0] += temp[0];
>                               removedCount[1] += temp[1];
>                               removedCount[2] += temp[2];
>                       }
>                       if (nonOrphans.get(file) == null && removedCount[2] == 
> 0) {
>                               log("Removing orphan directory: "+file,
Project.MSG_DEBUG);
>                               file.delete();
>                               ++removedCount[0];
>                       }
>                       else {
>                               /*
>                               Contrary to what is said above, position 2 is
not meaningless inside the recursion.
>                               Position 2 is used to carry information back up
the recursion about whether or not
>                               a directory contains a directory or file at any
depth that is not an orphan
>                               This has to be done, because if you have the
following directory structure:
>                               c:\src\a\file
>                               and your mapper src files were constructed like 
> so:
>                               <include name="**\a\**\*"/>
>                               The folder 'a' will not be in the hashtable of
nonorphans.  So, before deleting it as
>                               an orphan, we have to know whether or not any of
its children at any level are orphans.
>                               If no, then this folder is also an orphan, and
may be deleted.  I do this by changing
>                               position 2 to a '1'.
>                               */
>                               removedCount[2] = 1;
131c161,164
<                 ++removedCount;
---
>                               ++removedCount[1];
>                       }
>                       else {
>                               removedCount[2] = 1;


The way I implemented this felt like sort of a hack.  But I don't know a better
way to do it.  It has tested correctly in all of my use cases, but I am not well
versed in ANT, so there may be problems that I have introduced in other use 
cases.  

Feedback welcome!  Especially if you can think of a better way to implement my
changes.

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to