]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/rev-list.c
Merge branch 'jk/rev-list-disk-usage'
[thirdparty/git.git] / builtin / rev-list.c
index 25c6c3b38d4b120687bb02220c3db25af2ae66de..b4d8ea0a35b5b2a0fde7302312b3bf39a5edcda1 100644 (file)
@@ -80,6 +80,19 @@ static int arg_show_object_names = 1;
 
 #define DEFAULT_OIDSET_SIZE     (16*1024)
 
+static int show_disk_usage;
+static off_t total_disk_usage;
+
+static off_t get_object_disk_usage(struct object *obj)
+{
+       off_t size;
+       struct object_info oi = OBJECT_INFO_INIT;
+       oi.disk_sizep = &size;
+       if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
+               die(_("unable to get disk usage of %s"), oid_to_hex(&obj->oid));
+       return size;
+}
+
 static void finish_commit(struct commit *commit);
 static void show_commit(struct commit *commit, void *data)
 {
@@ -88,6 +101,9 @@ static void show_commit(struct commit *commit, void *data)
 
        display_progress(progress, ++progress_counter);
 
+       if (show_disk_usage)
+               total_disk_usage += get_object_disk_usage(&commit->object);
+
        if (info->flags & REV_LIST_QUIET) {
                finish_commit(commit);
                return;
@@ -258,6 +274,8 @@ static void show_object(struct object *obj, const char *name, void *cb_data)
        if (finish_object(obj, name, cb_data))
                return;
        display_progress(progress, ++progress_counter);
+       if (show_disk_usage)
+               total_disk_usage += get_object_disk_usage(obj);
        if (info->flags & REV_LIST_QUIET)
                return;
 
@@ -452,6 +470,23 @@ static int try_bitmap_traversal(struct rev_info *revs,
        return 0;
 }
 
+static int try_bitmap_disk_usage(struct rev_info *revs,
+                                struct list_objects_filter_options *filter)
+{
+       struct bitmap_index *bitmap_git;
+
+       if (!show_disk_usage)
+               return -1;
+
+       bitmap_git = prepare_bitmap_walk(revs, filter);
+       if (!bitmap_git)
+               return -1;
+
+       printf("%"PRIuMAX"\n",
+              (uintmax_t)get_disk_usage_from_bitmap(bitmap_git, revs));
+       return 0;
+}
+
 int cmd_rev_list(int argc, const char **argv, const char *prefix)
 {
        struct rev_info revs;
@@ -584,6 +619,12 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                        continue;
                }
 
+               if (!strcmp(arg, "--disk-usage")) {
+                       show_disk_usage = 1;
+                       info.flags |= REV_LIST_QUIET;
+                       continue;
+               }
+
                usage(rev_list_usage);
 
        }
@@ -626,6 +667,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
        if (use_bitmap_index) {
                if (!try_bitmap_count(&revs, &filter_options))
                        return 0;
+               if (!try_bitmap_disk_usage(&revs, &filter_options))
+                       return 0;
                if (!try_bitmap_traversal(&revs, &filter_options))
                        return 0;
        }
@@ -690,5 +733,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                        printf("%d\n", revs.count_left + revs.count_right);
        }
 
+       if (show_disk_usage)
+               printf("%"PRIuMAX"\n", (uintmax_t)total_disk_usage);
+
        return 0;
 }