]> git.ipfire.org Git - thirdparty/git.git/commitdiff
dir: report number of visited directories and paths with trace2
authorElijah Newren <newren@gmail.com>
Wed, 12 May 2021 17:28:15 +0000 (17:28 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 May 2021 23:45:02 +0000 (08:45 +0900)
Provide more statistics in trace2 output that include the number of
directories and total paths visited by the directory traversal logic.
Subsequent patches will take advantage of this to ensure we do not
unnecessarily traverse into ignored directories.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
dir.h
t/t7063-status-untracked-cache.sh

diff --git a/dir.c b/dir.c
index b8dfe2e413d0e9660c487080bf7b498f8c56bc6b..151cc37e23e31a67d3a96c92fe361d6889aa5b07 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -2431,6 +2431,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
 
        if (open_cached_dir(&cdir, dir, untracked, istate, &path, check_only))
                goto out;
+       dir->visited_directories++;
 
        if (untracked)
                untracked->check_only = !!check_only;
@@ -2439,6 +2440,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                /* check how the file or directory should be treated */
                state = treat_path(dir, untracked, &cdir, istate, &path,
                                   baselen, pathspec);
+               dir->visited_paths++;
 
                if (state > dir_state)
                        dir_state = state;
@@ -2768,6 +2770,11 @@ static void emit_traversal_statistics(struct dir_struct *dir,
                strbuf_release(&tmp);
        }
 
+       trace2_data_intmax("read_directory", repo,
+                          "directories-visited", dir->visited_directories);
+       trace2_data_intmax("read_directory", repo,
+                          "paths-visited", dir->visited_paths);
+
        if (!dir->untracked)
                return;
        trace2_data_intmax("read_directory", repo,
@@ -2788,6 +2795,8 @@ int read_directory(struct dir_struct *dir, struct index_state *istate,
        struct untracked_cache_dir *untracked;
 
        trace2_region_enter("dir", "read_directory", istate->repo);
+       dir->visited_paths = 0;
+       dir->visited_directories = 0;
 
        if (has_symlink_leading_path(path, len)) {
                trace2_region_leave("dir", "read_directory", istate->repo);
diff --git a/dir.h b/dir.h
index facfae47402adcd982f3fc3b066a7dbbd1f615bd..70c750e3053ded3114cc2b22287afbb53350002c 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -336,6 +336,10 @@ struct dir_struct {
        struct oid_stat ss_info_exclude;
        struct oid_stat ss_excludes_file;
        unsigned unmanaged_exclude_files;
+
+       /* Stats about the traversal */
+       unsigned visited_paths;
+       unsigned visited_directories;
 };
 
 /*Count the number of slashes for string s*/
index 9710d33b3cd60f0b5bc76d7e197152250f9dfab4..a0c123b0a77a6f99877d4e5cd2fd74cb78e0b96c 100755 (executable)
@@ -65,7 +65,8 @@ get_relevant_traces () {
        INPUT_FILE=$1
        OUTPUT_FILE=$2
        grep data.*read_directo $INPUT_FILE |
-           cut -d "|" -f 9 \
+           cut -d "|" -f 9 |
+           grep -v visited \
            >"$OUTPUT_FILE"
 }