Summary

Weeks 7 and 8 focused on eliminating duplication across implementation, documentation, and tests by restructuring refs list as a wrapper around for-each-ref.

What I Worked On

These two weeks were shaped by ongoing discussions with the Git community around the direction of refs list and how closely it should match for-each-ref. Based on the feedback, I focused on ensuring behavior and feature parity between the two. I also worked on reducing code duplication, particularly around formatting and filtering logic, to make way for a clean transition.

Initially, the refs list command had its own implementation for option parsing, mimicking that of for-each-ref. However, this introduced code duplication and created a risk of divergence between the two commands over time. Taking Junio’s suggestion, I restructured refs list to act as a thin wrapper over for-each-ref, similar to how git-annotate wraps around git-blame.

The documentation also had redundant content between the two. To address this, I extracted the common options into a shared AsciiDoc file (refs-list-options.adoc) and used the include:: directive in both man pages to embed it.

As for the tests, I had initially used a variable-based approach to reuse tests across the two commands. While this avoided duplication, it depended on shared test libraries being idempotent, which is not guaranteed. To solve this, we followed the structure used by git-blame and git-annotate: we moved the common test cases to a separate file (for-each-ref-tests.sh) and sourced it from both for-each-ref and refs list test scripts.

What’s Next

In the coming weeks, I plan to:

  • Follow up on any remaining mailing list discussion.
  • Begin exploring other ref-related commands for consolidation

Back to coding, see you in the next update!