git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 0/7] builtin/repo: add object size info to structure output

From
Justin Tobler <jltobler@gmail.com>
Date
Dec 17, 2025, 17:53 UTC
Message-ID
<20251217175404.37963-1-jltobler@gmail.com>
In-Reply-To
<20251216173842.3357832-1-jltobler@gmail.com>
Greetings,

This patch series extends the recently introduced "structure" subcommand for git-repo(1) to collect object size information. More specifically, it shows total inflated and disk sizes of objects by object type. The aim to provide additional insight that may be useful to users regarding the structure of a repository.

In addition to this change, this series also updates the table output format to downscale larger output values along with the appropriate unit prefix. This is done to make table output more human friendly. The keyvalue and nul output formats are left the same since they are intended more for machine parsing.

Changes in V5:
- Small updates to some comments and log messages to improve
  correctness.
- Adjusted spacing in builtin/repo.c:count_objects().
Changes in V4:
- Unmark "byte" string in "t/helper/test-simple-ipc.c" for translation
  to avoid conflict with translated plural "byte/bytes" string.
- Remove some unnecessary translations and add comments to clarify some
  of the added translations.
- Some small changes to the tests in patch 7.
Changes in V3:
- Address potential localization regression by making the downscaled
  number format string also translatable. Also make the format string
  for how the values and unit prefixes are displayed via
  `strbuf_humanise_{bytes,rate}()` translatable to be more flexible.
- `strbuf_humanise_{bytes,count}_value()` has been renamed to
  `humanise_{bytes,count}()` and updated to provide both the value and
  unit prefix as separate strings.
- Unit prefix strings are no longer allocated and instead constant.
- The humanise flags are now defined in an enum.
- Instead of using `OBJECT_INFO_FOR_PREFETCH`,
  `OBJECT_INFO_SKIP_FETCH_OBJECT` and `OBJECT_INFO_QUICK` are used
  explicitly.
- Tests now use git-rev-list(1) to verify disk size info.
Changes in V2:
- Factor out and reuse existing logic from strbuf_humanise() to handle
  downscaling values and determining the appropriate unit prefix
  separately. This enables more control over how exactly the values are
  written to the structure output table which is useful for alignment
  reasons. I'm not how about the interface used in patch 2. Feedback is
  most welcome.
- In the previous version, when checking object size on a missing object
  we would die. Instead we now ignore missing objects. This allows the
  structure command to work on partial clones.
- disk/inflated keyvalue names renamed to disk_size/inflated_size.
- Unit prefixes are marked for translation.
- The test for keyvalue disk size values are updated to check against
  real expected values instead of skipping. Table output tests still
  skip verifing human-readable values though.

Thanks, -Justin

Justin Tobler (7):
  builtin/repo: group per-type object values into struct
  strbuf: split out logic to humanise byte values
  builtin/repo: humanise count values in structure output
  builtin/repo: add inflated object info to keyvalue structure output
  builtin/repo: add inflated object info to structure table
  builtin/repo: add disk size info to keyvalue stucture output
  builtin/repo: add object disk size info to structure table
 Documentation/git-repo.adoc |   2 +
 builtin/repo.c              | 175 ++++++++++++++++++++++++++++++------
 strbuf.c                    | 102 ++++++++++++++-------
 strbuf.h                    |  25 ++++++
 t/helper/test-simple-ipc.c  |   7 +-
 t/t1901-repo-structure.sh   | 118 ++++++++++++++++--------
 6 files changed, 331 insertions(+), 98 deletions(-)
Range-diff against v4:
1:  be14de68f6 = 1:  be14de68f6 builtin/repo: group per-type object values into struct
2:  0a145cfeec ! 2:  61cff22afa strbuf: split out logic to humanise byte values
    @@ Commit message
         In a subsequent commit, byte size values displayed in table output for
         the git-repo(1) "structure" subcommand will be shown in a more
         human-readable format with the appropriate unit prefixes. For this
    -    usecase, the downscaled values and unit prefixes must be handled
    +    usecase, the downscaled values and unit strings must be handled
         separately to ensure proper column alignment.
     
         Split out logic from strbuf_humanise() to downscale byte values and
    @@ strbuf.c: void strbuf_addstr_urlencode(struct strbuf *sb, const char *s,
     +
     +	/*
     +	 * TRANSLATORS: The first argument is the number string. The second
    -+	 * argument is the unit prefix string (i.e. "12.34 MiB/s").
    ++	 * argument is the unit string (i.e. "12.34 MiB/s").
     +	 */
     +	strbuf_addf(buf, _("%s %s"), value, unit);
     +	free(value);
    @@ strbuf.h: void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbu
      
     +enum humanise_flags {
     +	/*
    -+	 * Use rate based unit prefixes for humanised values.
    ++	 * Use rate based units for humanised values.
     +	 */
     +	HUMANISE_RATE = (1 << 0),
     +};
     +
     +/**
     + * Converts the given byte size into a downscaled human-readable value and
    -+ * corresponding unit prefix as two separate strings.
    ++ * corresponding unit as two separate strings.
     + */
     +void humanise_bytes(off_t bytes, char **value, const char **unit,
     +		    unsigned flags);
3:  eebf0d917b ! 3:  0b575738c2 builtin/repo: humanise count values in structure output
    @@ strbuf.h: enum humanise_flags {
      
     +/**
     + * Converts the given count into a downscaled human-readable value and
    -+ * corresponding unit prefix as two separate strings.
    ++ * corresponding unit as two separate strings.
     + */
     +void humanise_count(size_t count, char **value, const char **unit);
     +
4:  37f71cc1bc ! 4:  e2c79c8759 builtin/repo: add inflated object info to keyvalue structure output
    @@ builtin/repo.c: static int count_objects(const char *path UNUSED, struct oid_arr
     +
     +		if (odb_read_object_info_extended(data->odb, &oids->oid[i], &oi,
     +						  OBJECT_INFO_SKIP_FETCH_OBJECT |
    -+							  OBJECT_INFO_QUICK) < 0)
    ++						  OBJECT_INFO_QUICK) < 0)
     +			continue;
     +
     +		inflated_total += inflated;
5:  40edf4c20b ! 5:  03219630cc builtin/repo: add inflated object info to structure table
    @@ strbuf.c: void humanise_bytes(off_t bytes, char **value, const char **unit,
     
      ## strbuf.h ##
     @@ strbuf.h: enum humanise_flags {
    - 	 * Use rate based unit prefixes for humanised values.
    + 	 * Use rate based units for humanised values.
      	 */
      	HUMANISE_RATE = (1 << 0),
     +	/*
    -+	 * Use compact "B" unit prefixes instead of "byte/bytes" for humanised
    ++	 * Use compact "B" unit symbol instead of "byte/bytes" for humanised
     +	 * values.
     +	 */
     +	HUMANISE_COMPACT = (1 << 1),
6:  ba861f37c9 = 6:  7d8862a064 builtin/repo: add disk size info to keyvalue stucture output
7:  3118c17ae3 ! 7:  3e2d5c20f8 builtin/repo: add object disk size info to structure table
    @@ t/t1901-repo-structure.sh: test_expect_success SHA1 'repository with references
     -		cat >expect <<-\EOF &&
     +		# The tags disk size is handled specially due to the
     +		# git-rev-list(1) --disk-usage=human option printing the full
    -+		# "byte/bytes" unit prefix instead of just "B".
    ++		# "byte/bytes" unit string instead of just "B".
     +		cat >expect <<-EOF &&
      		| Repository structure | Value      |
      		| -------------------- | ---------- |
base-commit: e85ae279b0d58edc2f4c3fd5ac391b51e1223985
-- 
2.52.0.209.ge85ae279b0
Previous: Justin ToblerNext: Justin Tobler
Message 72 of 80 in “builtin/repo: add object size info to structure output”
  1. 0/6 builtin/repo: add object size info to structure outputJustin Tobler, Dec 9, 2025
  2. 1/6 builtin/repo: group per-type object values into structJustin Tobler, Dec 9, 2025
  3. 2/6 builtin/repo: humanise count values in structure outputJustin Tobler, Dec 9, 2025
  4. Patrick SteinhardtDec 10, 2025
  5. Justin ToblerDec 10, 2025
  6. Junio C HamanoDec 11, 2025
  7. Justin ToblerDec 12, 2025
  8. 3/6 builtin/repo: add inflated object info to keyvalue structure outputJustin Tobler, Dec 9, 2025
  9. 4/6 builtin/repo: add inflated object info to structure tableJustin Tobler, Dec 9, 2025
  10. Patrick SteinhardtDec 10, 2025
  11. Justin ToblerDec 10, 2025
  12. 5/6 builtin/repo: add disk size info to keyvalue stucture outputJustin Tobler, Dec 9, 2025
  13. Patrick SteinhardtDec 10, 2025
  14. Justin ToblerDec 10, 2025
  15. Justin ToblerDec 12, 2025
  16. Patrick SteinhardtDec 15, 2025
  17. Justin ToblerDec 15, 2025
  18. Junio C HamanoDec 10, 2025
  19. Lucas Seiki OshiroDec 10, 2025
  20. Justin ToblerDec 12, 2025
  21. Junio C HamanoDec 12, 2025
  22. 6/6 builtin/repo: add object disk size info to structure tableJustin Tobler, Dec 9, 2025
  23. Patrick SteinhardtDec 10, 2025
  24. Justin ToblerDec 10, 2025
  25. 0/7 builtin/repo: add object size info to structure outputJustin Tobler, Dec 12, 2025
  26. 1/7 builtin/repo: group per-type object values into structJustin Tobler, Dec 12, 2025
  27. 2/7 strbuf: split out logic to humanise byte valuesJustin Tobler, Dec 12, 2025
  28. Patrick SteinhardtDec 15, 2025
  29. Justin ToblerDec 15, 2025
  30. Junio C HamanoDec 15, 2025
  31. Justin ToblerDec 15, 2025
  32. Jiang XinDec 16, 2025
  33. Junio C HamanoDec 16, 2025
  34. Jiang XinDec 16, 2025
  35. Justin ToblerDec 16, 2025
  36. 3/7 builtin/repo: humanise count values in structure outputJustin Tobler, Dec 12, 2025
  37. Patrick SteinhardtDec 15, 2025
  38. 4/7 builtin/repo: add inflated object info to keyvalue structure outputJustin Tobler, Dec 12, 2025
  39. Patrick SteinhardtDec 15, 2025
  40. Justin ToblerDec 15, 2025
  41. 5/7 builtin/repo: add inflated object info to structure tableJustin Tobler, Dec 12, 2025
  42. 6/7 builtin/repo: add disk size info to keyvalue stucture outputJustin Tobler, Dec 12, 2025
  43. Patrick SteinhardtDec 15, 2025
  44. 7/7 builtin/repo: add object disk size info to structure tableJustin Tobler, Dec 12, 2025
  45. 0/7 builtin/repo: add object size info to structure outputJustin Tobler, Dec 15, 2025
  46. 1/7 builtin/repo: group per-type object values into structJustin Tobler, Dec 15, 2025
  47. 2/7 strbuf: split out logic to humanise byte valuesJustin Tobler, Dec 15, 2025
  48. Junio C HamanoDec 16, 2025
  49. Justin ToblerDec 16, 2025
  50. 3/7 builtin/repo: humanise count values in structure outputJustin Tobler, Dec 15, 2025
  51. Patrick SteinhardtDec 16, 2025
  52. 4/7 builtin/repo: add inflated object info to keyvalue structure outputJustin Tobler, Dec 15, 2025
  53. 5/7 builtin/repo: add inflated object info to structure tableJustin Tobler, Dec 15, 2025
  54. 6/7 builtin/repo: add disk size info to keyvalue stucture outputJustin Tobler, Dec 15, 2025
  55. 7/7 builtin/repo: add object disk size info to structure tableJustin Tobler, Dec 15, 2025
  56. Patrick SteinhardtDec 16, 2025
  57. Justin ToblerDec 16, 2025
  58. 0/7 builtin/repo: add object size info to structure outputJustin Tobler, Dec 16, 2025
  59. 1/7 builtin/repo: group per-type object values into structJustin Tobler, Dec 16, 2025
  60. 2/7 strbuf: split out logic to humanise byte valuesJustin Tobler, Dec 16, 2025
  61. Junio C HamanoDec 16, 2025
  62. Justin ToblerDec 16, 2025
  63. 4/7 builtin/repo: add inflated object info to keyvalue structure outputJustin Tobler, Dec 16, 2025
  64. Patrick SteinhardtDec 17, 2025
  65. Justin ToblerDec 17, 2025
  66. 3/7 builtin/repo: humanise count values in structure outputJustin Tobler, Dec 16, 2025
  67. 5/7 builtin/repo: add inflated object info to structure tableJustin Tobler, Dec 16, 2025
  68. 6/7 builtin/repo: add disk size info to keyvalue stucture outputJustin Tobler, Dec 16, 2025
  69. 7/7 builtin/repo: add object disk size info to structure tableJustin Tobler, Dec 16, 2025
  70. Patrick SteinhardtDec 17, 2025
  71. Justin ToblerDec 17, 2025
  72. 0/7 builtin/repo: add object size info to structure outputJustin Tobler, Dec 17, 2025
  73. 1/7 builtin/repo: group per-type object values into structJustin Tobler, Dec 17, 2025
  74. 2/7 strbuf: split out logic to humanise byte valuesJustin Tobler, Dec 17, 2025
  75. 4/7 builtin/repo: add inflated object info to keyvalue structure outputJustin Tobler, Dec 17, 2025
  76. 3/7 builtin/repo: humanise count values in structure outputJustin Tobler, Dec 17, 2025
  77. 5/7 builtin/repo: add inflated object info to structure tableJustin Tobler, Dec 17, 2025
  78. 6/7 builtin/repo: add disk size info to keyvalue stucture outputJustin Tobler, Dec 17, 2025
  79. 7/7 builtin/repo: add object disk size info to structure tableJustin Tobler, Dec 17, 2025
  80. Patrick SteinhardtDec 18, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.