Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Builtin "git count-objects". |
| 3 | * |
| 4 | * Copyright (c) 2006 Junio C Hamano |
| 5 | */ |
| 6 | |
| 7 | #include "cache.h" |
Alexander Potashev | 8ca12c0 | 2009-01-10 15:07:50 +0300 | [diff] [blame] | 8 | #include "dir.h" |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 9 | #include "builtin.h" |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 10 | #include "parse-options.h" |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 11 | |
Nguyễn Thái Ngọc Duy | 543c5ca | 2013-02-15 19:07:10 +0700 | [diff] [blame] | 12 | static unsigned long garbage; |
Nguyễn Thái Ngọc Duy | 1a20dd4 | 2013-02-13 16:13:19 +0700 | [diff] [blame] | 13 | static off_t size_garbage; |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 14 | static int verbose; |
| 15 | static unsigned long loose, packed, packed_loose; |
| 16 | static off_t loose_size; |
Nguyễn Thái Ngọc Duy | 543c5ca | 2013-02-15 19:07:10 +0700 | [diff] [blame] | 17 | |
| 18 | static void real_report_garbage(const char *desc, const char *path) |
| 19 | { |
Nguyễn Thái Ngọc Duy | 1a20dd4 | 2013-02-13 16:13:19 +0700 | [diff] [blame] | 20 | struct stat st; |
| 21 | if (!stat(path, &st)) |
| 22 | size_garbage += st.st_size; |
Nguyễn Thái Ngọc Duy | 543c5ca | 2013-02-15 19:07:10 +0700 | [diff] [blame] | 23 | warning("%s: %s", desc, path); |
| 24 | garbage++; |
| 25 | } |
| 26 | |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 27 | static void loose_garbage(const char *path) |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 28 | { |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 29 | if (verbose) |
| 30 | report_garbage("garbage found", path); |
| 31 | } |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 32 | |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 33 | static int count_loose(const unsigned char *sha1, const char *path, void *data) |
| 34 | { |
| 35 | struct stat st; |
| 36 | |
| 37 | if (lstat(path, &st) || !S_ISREG(st.st_mode)) |
| 38 | loose_garbage(path); |
| 39 | else { |
| 40 | loose_size += on_disk_bytes(st); |
| 41 | loose++; |
| 42 | if (verbose && has_sha1_pack(sha1)) |
| 43 | packed_loose++; |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 44 | } |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 45 | return 0; |
| 46 | } |
| 47 | |
| 48 | static int count_cruft(const char *basename, const char *path, void *data) |
| 49 | { |
| 50 | loose_garbage(path); |
| 51 | return 0; |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 52 | } |
| 53 | |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 54 | static char const * const count_objects_usage[] = { |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 55 | N_("git count-objects [-v] [-H | --human-readable]"), |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 56 | NULL |
| 57 | }; |
| 58 | |
| 59 | int cmd_count_objects(int argc, const char **argv, const char *prefix) |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 60 | { |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 61 | int human_readable = 0; |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 62 | struct option opts[] = { |
Nguyễn Thái Ngọc Duy | 7adaddc | 2012-08-20 19:32:06 +0700 | [diff] [blame] | 63 | OPT__VERBOSE(&verbose, N_("be verbose")), |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 64 | OPT_BOOL('H', "human-readable", &human_readable, |
| 65 | N_("print sizes in human readable format")), |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 66 | OPT_END(), |
| 67 | }; |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 68 | |
Stephen Boyd | 3778292 | 2009-05-23 11:53:12 -0700 | [diff] [blame] | 69 | argc = parse_options(argc, argv, prefix, opts, count_objects_usage, 0); |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 70 | /* we do not take arguments other than flags for now */ |
Pierre Habouzit | 833f3ab | 2007-10-15 22:38:51 +0200 | [diff] [blame] | 71 | if (argc) |
| 72 | usage_with_options(count_objects_usage, opts); |
Nguyễn Thái Ngọc Duy | 543c5ca | 2013-02-15 19:07:10 +0700 | [diff] [blame] | 73 | if (verbose) |
| 74 | report_garbage = real_report_garbage; |
Jeff King | 4a1e693 | 2014-10-15 18:41:11 -0400 | [diff] [blame] | 75 | |
| 76 | for_each_loose_file_in_objdir(get_object_directory(), |
| 77 | count_loose, count_cruft, NULL, NULL); |
| 78 | |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 79 | if (verbose) { |
| 80 | struct packed_git *p; |
Junio C Hamano | ae72f68 | 2006-12-27 01:04:03 -0800 | [diff] [blame] | 81 | unsigned long num_pack = 0; |
Andreas Schwab | c985ddf | 2009-12-29 20:09:15 +0100 | [diff] [blame] | 82 | off_t size_pack = 0; |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 83 | struct strbuf loose_buf = STRBUF_INIT; |
| 84 | struct strbuf pack_buf = STRBUF_INIT; |
| 85 | struct strbuf garbage_buf = STRBUF_INIT; |
Junio C Hamano | 80fe7d2 | 2006-05-02 23:03:15 -0700 | [diff] [blame] | 86 | if (!packed_git) |
| 87 | prepare_packed_git(); |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 88 | for (p = packed_git; p; p = p->next) { |
| 89 | if (!p->pack_local) |
| 90 | continue; |
Shawn O. Pearce | eaa8677 | 2007-05-30 02:12:28 -0400 | [diff] [blame] | 91 | if (open_pack_index(p)) |
Shawn O. Pearce | d079837 | 2007-05-26 01:24:19 -0400 | [diff] [blame] | 92 | continue; |
Nicolas Pitre | 5705909 | 2007-04-09 01:06:28 -0400 | [diff] [blame] | 93 | packed += p->num_objects; |
Marcus Griep | f223824 | 2008-08-15 00:20:20 -0400 | [diff] [blame] | 94 | size_pack += p->pack_size + p->index_size; |
Junio C Hamano | ae72f68 | 2006-12-27 01:04:03 -0800 | [diff] [blame] | 95 | num_pack++; |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 96 | } |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 97 | |
| 98 | if (human_readable) { |
| 99 | strbuf_humanise_bytes(&loose_buf, loose_size); |
| 100 | strbuf_humanise_bytes(&pack_buf, size_pack); |
| 101 | strbuf_humanise_bytes(&garbage_buf, size_garbage); |
| 102 | } else { |
| 103 | strbuf_addf(&loose_buf, "%lu", |
| 104 | (unsigned long)(loose_size / 1024)); |
| 105 | strbuf_addf(&pack_buf, "%lu", |
| 106 | (unsigned long)(size_pack / 1024)); |
| 107 | strbuf_addf(&garbage_buf, "%lu", |
| 108 | (unsigned long)(size_garbage / 1024)); |
| 109 | } |
| 110 | |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 111 | printf("count: %lu\n", loose); |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 112 | printf("size: %s\n", loose_buf.buf); |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 113 | printf("in-pack: %lu\n", packed); |
Junio C Hamano | ae72f68 | 2006-12-27 01:04:03 -0800 | [diff] [blame] | 114 | printf("packs: %lu\n", num_pack); |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 115 | printf("size-pack: %s\n", pack_buf.buf); |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 116 | printf("prune-packable: %lu\n", packed_loose); |
| 117 | printf("garbage: %lu\n", garbage); |
Antoine Pelisse | 1918225 | 2013-04-10 21:03:24 +0200 | [diff] [blame] | 118 | printf("size-garbage: %s\n", garbage_buf.buf); |
| 119 | strbuf_release(&loose_buf); |
| 120 | strbuf_release(&pack_buf); |
| 121 | strbuf_release(&garbage_buf); |
| 122 | } else { |
| 123 | struct strbuf buf = STRBUF_INIT; |
| 124 | if (human_readable) |
| 125 | strbuf_humanise_bytes(&buf, loose_size); |
| 126 | else |
| 127 | strbuf_addf(&buf, "%lu kilobytes", |
| 128 | (unsigned long)(loose_size / 1024)); |
| 129 | printf("%lu objects, %s\n", loose, buf.buf); |
| 130 | strbuf_release(&buf); |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 131 | } |
Junio C Hamano | c743208 | 2006-04-27 15:37:18 -0700 | [diff] [blame] | 132 | return 0; |
| 133 | } |