]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: refactor common tail part of dirstat computation
authorJunio C Hamano <gitster@pobox.com>
Fri, 5 May 2023 21:19:16 +0000 (14:19 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 May 2023 21:24:07 +0000 (14:24 -0700)
This will become useful when we plug leaks in these two functions.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c

diff --git a/diff.c b/diff.c
index 648f6717a5597c30c423256a25e0fece08cd30de..e13d0f8b678078bb69218e6b1b94c4ad8728e709 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2971,6 +2971,19 @@ static int dirstat_compare(const void *_a, const void *_b)
        return strcmp(a->name, b->name);
 }
 
+static void conclude_dirstat(struct diff_options *options,
+                            struct dirstat_dir *dir,
+                            unsigned long changed)
+{
+       /* This can happen even with many files, if everything was renames */
+       if (!changed)
+               return;
+
+       /* Show all directories with more than x% of the changes */
+       QSORT(dir->files, dir->nr, dirstat_compare);
+       gather_dirstat(options, dir, changed, "", 0);
+}
+
 static void show_dirstat(struct diff_options *options)
 {
        int i;
@@ -3060,13 +3073,7 @@ found_damage:
                dir.nr++;
        }
 
-       /* This can happen even with many files, if everything was renames */
-       if (!changed)
-               return;
-
-       /* Show all directories with more than x% of the changes */
-       QSORT(dir.files, dir.nr, dirstat_compare);
-       gather_dirstat(options, &dir, changed, "", 0);
+       conclude_dirstat(options, &dir, changed);
 }
 
 static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *options)
@@ -3104,13 +3111,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o
                dir.nr++;
        }
 
-       /* This can happen even with many files, if everything was renames */
-       if (!changed)
-               return;
-
-       /* Show all directories with more than x% of the changes */
-       QSORT(dir.files, dir.nr, dirstat_compare);
-       gather_dirstat(options, &dir, changed, "", 0);
+       conclude_dirstat(options, &dir, changed);
 }
 
 static void free_diffstat_file(struct diffstat_file *f)