(WIP, mostly stream-of-concious notes + reasoning) When using "git format-patch --range-diff", the pre and post-image blob OIDs are in each email, while the exact commit OIDs are rarely shared via emails (only the tip commit from "git request-pull"). These blob OIDs make it easy to search for or lookup the full emails which create them, or the blob itself once it's fetched via git. public-inbox indexes and allows querying specifically for blob OIDs via dfpre:/dfpost: since June 2017. As of Jan 2019, public-inbox also supports recreating blobs out of patch emails (querying internally with dfpre:/dfpost: and doing "git apply") Searching on these blob OIDs also makes it easier to find previous versions of the patch sets using any mail search engine. Future changes to public-inbox may allow generating custom diffs out of any blobs it can find or recreate. Most of this is pretty public-inbox-specific and would've made some future changes to public-inbox much easier.... (if we had this from the start of range-diff). Unfortunately, it won't help with cases where range-diffs are already published, but range-diff isn't too old. I'm also still learning my way around git's C internals, but using patch.{old,new}_oid_prefix seems alright... FIXME: tests, t3206 needs updating Not-signed-off-by: Eric Wong <e@xxxxxxxxx> --- range-diff.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/range-diff.c b/range-diff.c index 7fed5a3b4b..85d2f1f58f 100644 --- a/range-diff.c +++ b/range-diff.c @@ -118,13 +118,24 @@ static int read_patches(const char *range, struct string_list *list) die(_("could not parse git header '%.*s'"), (int)len, line); strbuf_addstr(&buf, " ## "); if (patch.is_new > 0) - strbuf_addf(&buf, "%s (new)", patch.new_name); + strbuf_addf(&buf, "%s (new %s)", + patch.new_name, + patch.new_oid_prefix); else if (patch.is_delete > 0) - strbuf_addf(&buf, "%s (deleted)", patch.old_name); + strbuf_addf(&buf, "%s (deleted %s)", + patch.old_name, + patch.old_oid_prefix); else if (patch.is_rename) - strbuf_addf(&buf, "%s => %s", patch.old_name, patch.new_name); + strbuf_addf(&buf, "%s => %s (%s..%s)", + patch.old_name, + patch.new_name, + patch.old_oid_prefix, + patch.new_oid_prefix); else - strbuf_addstr(&buf, patch.new_name); + strbuf_addf(&buf, "%s (%s..%s)", + patch.new_name, + patch.old_oid_prefix, + patch.new_oid_prefix); free(current_filename); if (patch.is_delete > 0)