The highlight of this patch series are that (1) peeled references are not lost from the packed-refs file when a packed reference is deleted and (2) there is more code sharing between the code used by "git packed-refs" and the code used by repack_without_ref() for deleting a packed reference. Along the way I have added a lot of documentation and fixed several smaller bugs. I had to add some sleeps in test t3210 but I hope that somebody can find a way to eliminate them. The last patch implements a change that I brushed off a long time ago when Heiko suggested it. He was right (probably not for performance reasons, but because it simplifies the code). Summary: Patches 1-4 document existing code. Patches 5-6 random cleanup. Patches 7-9 change the semantics of get_packed_ref() to make it more reusable and change other locations to use this function. Patch 10 extracts a function ref_resolves_to_object(). Patches 11-14 unify reference-peeling in two new functions, peel_object() and peel_entry() (and fix an inconsistency in peel_ref()). Patch 15 introduces a new internal reference-iteration API and adjusts some internal code to use it. The new API gives the callback function direct access to the ref_entry. This corrects the handling of current_ref during an iteration over only packed references. Patches 16-17 add and fix a test of a spurious error message. Patches 18-22 change the reference-deleting code to write peeled refs to the packed-refs file. (Previously, whenever a packed reference was deleted, all of the peeled values were lost when the packed-refs file was rewritten.) Patches 23-31 move the code from pack-refs.{c,h} into refs.{c,h}, adjust it to its new surroundings, and change it to share some code with repack_without_ref(). Patches 32-33 simplify access to the main reference cache. Michael Haggerty (33): refs: document flags constants REF_* refs: document the fields of struct ref_value refs: document do_for_each_ref() and do_one_ref() refs: document how current_ref is used refs: define constant PEELED_LINE_LENGTH do_for_each_ref_in_dirs(): remove dead code get_packed_ref(): return a ref_entry peel_ref(): use function get_packed_ref() repack_without_ref(): use function get_packed_ref() refs: extract a function ref_resolves_to_object() refs: extract function peel_object() peel_object(): give more specific information in return value peel_ref(): fix return value for non-peelable, not-current reference refs: extract a function peel_entry() refs: change the internal reference-iteration API t3210: test for spurious error messages for dangling packed refs repack_without_ref(): silence errors for dangling packed refs search_ref_dir(): return an index rather than a pointer refs: change how packed refs are deleted t3211: demonstrate loss of peeled refs if a packed ref is deleted repack_without_ref(): write peeled refs in the rewritten file refs: extract a function write_packed_entry() pack-refs: rename handle_one_ref() to pack_one_ref() pack-refs: merge code from pack-refs.{c,h} into refs.{c,h} pack_one_ref(): rename "path" parameter to "refname" refs: use same lock_file object for both ref-packing functions pack_refs(): change to use do_for_each_entry() refs: inline function do_not_prune() pack_one_ref(): use function peel_entry() pack_one_ref(): use write_packed_entry() to do the writing pack_one_ref(): do some cheap tests before a more expensive one refs: change do_for_each_*() functions to take ref_cache arguments refs: handle the main ref_cache specially Makefile | 2 - builtin/clone.c | 1 - builtin/pack-refs.c | 2 +- pack-refs.c | 148 ----------- pack-refs.h | 18 -- refs.c | 699 ++++++++++++++++++++++++++++++++++++++------------- refs.h | 35 +++ t/t3210-pack-refs.sh | 36 +++ t/t3211-peel-ref.sh | 9 + 9 files changed, 609 insertions(+), 341 deletions(-) delete mode 100644 pack-refs.c delete mode 100644 pack-refs.h -- 1.8.2.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html