Report every link in scan progress
authorEric Biggers <ebiggers3@gmail.com>
Sat, 9 Jan 2016 17:53:16 +0000 (11:53 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Sat, 9 Jan 2016 18:37:14 +0000 (12:37 -0600)
NEWS
include/wimlib.h
src/capture_common.c

diff --git a/NEWS b/NEWS
index e20b859..602c1da 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ Version 1.9.0-BETA:
        The progress messages printed by wimlib-imagex while writing WIM files
        have been slightly tweaked.
 
+       Progress information for directory tree scans now counts all hard links.
+
        Added a new '--image-property' option to 'wimcapture', 'wimappend', and
        'wiminfo'.  This option lets you assign values to elements in a WIM
        file's XML document by name.
index 2e5ba3c..33f124b 100644 (file)
@@ -856,13 +856,11 @@ union wimlib_progress_info {
                uint64_t num_dirs_scanned;
 
                /** The number of non-directories scanned so far, not counting
-                * excluded/unsupported files.  If a file has multiple names
-                * (hard links), it is only counted one time.  */
+                * excluded/unsupported files.  */
                uint64_t num_nondirs_scanned;
 
                /** The number of bytes of file data detected so far, not
-                * counting excluded/unsupported files.  If a file has multiple
-                * names (hard links), its data is counted only one time.  */
+                * counting excluded/unsupported files.  */
                uint64_t num_bytes_scanned;
        } scan;
 
index 0a2f26c..8279497 100644 (file)
@@ -67,20 +67,26 @@ do_capture_progress(struct capture_params *params, int status,
                break;
        }
        params->progress.scan.status = status;
-       if (status == WIMLIB_SCAN_DENTRY_OK && inode->i_nlink == 1) {
-
-               /* Successful scan, and visiting inode for the first time  */
-
-               /* Tally size of all streams.  */
-               for (unsigned i = 0; i < inode->i_num_streams; i++) {
-                       const struct blob_descriptor *blob =
-                               stream_blob_resolved(&inode->i_streams[i]);
-                       if (blob)
-                               params->progress.scan.num_bytes_scanned += blob->size;
+       if (status == WIMLIB_SCAN_DENTRY_OK) {
+
+               /* The first time the inode is seen, tally all its streams.  */
+               if (inode->i_nlink == 1) {
+                       for (unsigned i = 0; i < inode->i_num_streams; i++) {
+                               const struct blob_descriptor *blob =
+                                       stream_blob_resolved(&inode->i_streams[i]);
+                               if (blob)
+                                       params->progress.scan.num_bytes_scanned += blob->size;
+                       }
                }
 
-               /* Tally the file itself.  */
-               if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY)
+               /* Tally the file itself, counting every hard link.  It's
+                * debatable whether every link should be counted, but counting
+                * every link makes the statistics consistent with the ones
+                * placed in the FILECOUNT and DIRCOUNT elements of the WIM
+                * file's XML document.  It also avoids possible user confusion
+                * if the number of files reported were to be lower than that
+                * displayed by some other software such as file browsers.  */
+               if (inode_is_directory(inode))
                        params->progress.scan.num_dirs_scanned++;
                else
                        params->progress.scan.num_nondirs_scanned++;