18
18
*/
19
19
20
20
/*
21
- * Copyright (c) 2017, Chris Fraire <[email protected] >.
21
+ * Copyright (c) 2017-2018 , Chris Fraire <[email protected] >.
22
22
*/
23
23
24
24
package org .opensolaris .opengrok .index ;
@@ -277,16 +277,22 @@ private void doRename(PendingFileRenamingExec ren) throws IOException {
277
277
}
278
278
}
279
279
280
+ /**
281
+ * For the unique set of parent directories among
282
+ * {@link PendingFileDeletionExec#absoluteParent}, traverse in descending
283
+ * order of path-length, and attempt to clean any empty directories.
284
+ */
280
285
private void tryDeleteParents (List <PendingFileDeletionExec > dels ) {
281
286
Set <File > parents = new TreeSet <>(DESC_PATHLEN_COMPARATOR );
282
287
dels .forEach ((del ) -> { parents .add (del .absoluteParent ); });
283
288
289
+ SkeletonDirs skels = new SkeletonDirs ();
284
290
for (File dir : parents ) {
285
- Set <File > children = findFilelessChildren (dir );
286
- children .forEach ((childDir ) -> {
291
+ skels .reset ();
292
+ findFilelessChildren (skels , dir );
293
+ skels .childDirs .forEach ((childDir ) -> {
287
294
tryDeleteDirectory (childDir );
288
295
});
289
-
290
296
tryDeleteDirectory (dir );
291
297
}
292
298
}
@@ -299,25 +305,10 @@ private void tryDeleteDirectory(File dir) {
299
305
}
300
306
301
307
/**
302
- * Determines a DESC ordered set of eligible file-less child directories
303
- * for cleaning up.
304
- */
305
- private Set <File > findFilelessChildren (File directory ) {
306
- SkeletonDirs ret = new SkeletonDirs ();
307
- findFilelessChildrenDeep (ret , directory );
308
-
309
- Set <File > parents = new TreeSet <>(DESC_PATHLEN_COMPARATOR );
310
- // N.b. the `ineligible' field is not relevant here but only during
311
- // recursion. `childDirs' contains eligible directories.
312
- parents .addAll (ret .childDirs );
313
- return parents ;
314
- }
315
-
316
- /**
317
- * Recursive method used by {@link #findFilelessChildren(java.io.File)}.
308
+ * Recursively determines eligible, file-less child directories for cleaning
309
+ * up, and writes them to {@code skels}.
318
310
*/
319
- private void findFilelessChildrenDeep (SkeletonDirs ret , File directory ) {
320
-
311
+ private void findFilelessChildren (SkeletonDirs skels , File directory ) {
321
312
if (!directory .exists ()) return ;
322
313
String dirPath = directory .getAbsolutePath ();
323
314
boolean topLevelIneligible = false ;
@@ -337,9 +328,9 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
337
328
f .getAbsolutePath ());
338
329
}
339
330
} else {
340
- findFilelessChildrenDeep ( ret , f );
341
- if (!ret .ineligible ) {
342
- ret .childDirs .add (f );
331
+ findFilelessChildren ( skels , f );
332
+ if (!skels .ineligible ) {
333
+ skels .childDirs .add (f );
343
334
} else {
344
335
topLevelIneligible = true ;
345
336
if (LOGGER .isLoggable (Level .FINEST )) {
@@ -351,7 +342,7 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
351
342
352
343
// Reset this flag so that other potential, eligible
353
344
// children are evaluated.
354
- ret .ineligible = false ;
345
+ skels .ineligible = false ;
355
346
}
356
347
}
357
348
} catch (IOException ex ) {
@@ -362,7 +353,7 @@ private void findFilelessChildrenDeep(SkeletonDirs ret, File directory) {
362
353
}
363
354
}
364
355
365
- ret .ineligible = topLevelIneligible ;
356
+ skels .ineligible = topLevelIneligible ;
366
357
}
367
358
368
359
/**
@@ -404,6 +395,12 @@ public PendingFileRenamingExec(String source, String target) {
404
395
*/
405
396
private class SkeletonDirs {
406
397
public boolean ineligible ; // a flag used during recursion
407
- public List <File > childDirs = new ArrayList <>();
398
+ public final Set <File > childDirs = new TreeSet <>(
399
+ DESC_PATHLEN_COMPARATOR );
400
+
401
+ public void reset () {
402
+ ineligible = false ;
403
+ childDirs .clear ();
404
+ }
408
405
}
409
406
}
0 commit comments