@@ -155,11 +155,11 @@ static int input_fd, output_fd;
155
155
static const char * curr_pack ;
156
156
157
157
/*
158
- * local_links is guarded by read_mutex, and record_local_links is read-only in
159
- * a thread.
158
+ * outgoing_links is guarded by read_mutex, and record_outgoing_links is
159
+ * read-only in a thread.
160
160
*/
161
- static struct oidset local_links = OIDSET_INIT ;
162
- static int record_local_links ;
161
+ static struct oidset outgoing_links = OIDSET_INIT ;
162
+ static int record_outgoing_links ;
163
163
164
164
static struct thread_local_data * thread_data ;
165
165
static int nr_dispatched ;
@@ -812,18 +812,12 @@ static int check_collison(struct object_entry *entry)
812
812
return 0 ;
813
813
}
814
814
815
- static void record_if_local_object (const struct object_id * oid )
815
+ static void record_outgoing_link (const struct object_id * oid )
816
816
{
817
- struct object_info info = OBJECT_INFO_INIT ;
818
- if (oid_object_info_extended (the_repository , oid , & info , 0 ))
819
- /* Missing; assume it is a promisor object */
820
- return ;
821
- if (info .whence == OI_PACKED && info .u .packed .pack -> pack_promisor )
822
- return ;
823
- oidset_insert (& local_links , oid );
817
+ oidset_insert (& outgoing_links , oid );
824
818
}
825
819
826
- static void do_record_local_links (struct object * obj )
820
+ static void do_record_outgoing_links (struct object * obj )
827
821
{
828
822
if (obj -> type == OBJ_TREE ) {
829
823
struct tree * tree = (struct tree * )obj ;
@@ -837,16 +831,16 @@ static void do_record_local_links(struct object *obj)
837
831
*/
838
832
return ;
839
833
while (tree_entry_gently (& desc , & entry ))
840
- record_if_local_object (& entry .oid );
834
+ record_outgoing_link (& entry .oid );
841
835
} else if (obj -> type == OBJ_COMMIT ) {
842
836
struct commit * commit = (struct commit * ) obj ;
843
837
struct commit_list * parents = commit -> parents ;
844
838
845
839
for (; parents ; parents = parents -> next )
846
- record_if_local_object (& parents -> item -> object .oid );
840
+ record_outgoing_link (& parents -> item -> object .oid );
847
841
} else if (obj -> type == OBJ_TAG ) {
848
842
struct tag * tag = (struct tag * ) obj ;
849
- record_if_local_object (get_tagged_oid (tag ));
843
+ record_outgoing_link (get_tagged_oid (tag ));
850
844
}
851
845
}
852
846
@@ -896,7 +890,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
896
890
free (has_data );
897
891
}
898
892
899
- if (strict || do_fsck_object || record_local_links ) {
893
+ if (strict || do_fsck_object || record_outgoing_links ) {
900
894
read_lock ();
901
895
if (type == OBJ_BLOB ) {
902
896
struct blob * blob = lookup_blob (the_repository , oid );
@@ -928,8 +922,8 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
928
922
die (_ ("fsck error in packed object" ));
929
923
if (strict && fsck_walk (obj , NULL , & fsck_options ))
930
924
die (_ ("Not all child objects of %s are reachable" ), oid_to_hex (& obj -> oid ));
931
- if (record_local_links )
932
- do_record_local_links (obj );
925
+ if (record_outgoing_links )
926
+ do_record_outgoing_links (obj );
933
927
934
928
if (obj -> type == OBJ_TREE ) {
935
929
struct tree * item = (struct tree * ) obj ;
@@ -1779,28 +1773,43 @@ static void repack_local_links(void)
1779
1773
struct strbuf line = STRBUF_INIT ;
1780
1774
struct oidset_iter iter ;
1781
1775
struct object_id * oid ;
1782
- char * base_name ;
1776
+ char * base_name = NULL ;
1783
1777
1784
- if (!oidset_size (& local_links ))
1778
+ if (!oidset_size (& outgoing_links ))
1785
1779
return ;
1786
1780
1787
- base_name = mkpathdup ("%s/pack/pack" , repo_get_object_directory (the_repository ));
1781
+ oidset_iter_init (& outgoing_links , & iter );
1782
+ while ((oid = oidset_iter_next (& iter ))) {
1783
+ struct object_info info = OBJECT_INFO_INIT ;
1784
+ if (oid_object_info_extended (the_repository , oid , & info , 0 ))
1785
+ /* Missing; assume it is a promisor object */
1786
+ continue ;
1787
+ if (info .whence == OI_PACKED && info .u .packed .pack -> pack_promisor )
1788
+ continue ;
1788
1789
1789
- strvec_push (& cmd .args , "pack-objects" );
1790
- strvec_push (& cmd .args , "--exclude-promisor-objects-best-effort" );
1791
- strvec_push (& cmd .args , base_name );
1792
- cmd .git_cmd = 1 ;
1793
- cmd .in = -1 ;
1794
- cmd .out = -1 ;
1795
- if (start_command (& cmd ))
1796
- die (_ ("could not start pack-objects to repack local links" ));
1790
+ if (!cmd .args .nr ) {
1791
+ base_name = mkpathdup (
1792
+ "%s/pack/pack" ,
1793
+ repo_get_object_directory (the_repository ));
1794
+ strvec_push (& cmd .args , "pack-objects" );
1795
+ strvec_push (& cmd .args ,
1796
+ "--exclude-promisor-objects-best-effort" );
1797
+ strvec_push (& cmd .args , base_name );
1798
+ cmd .git_cmd = 1 ;
1799
+ cmd .in = -1 ;
1800
+ cmd .out = -1 ;
1801
+ if (start_command (& cmd ))
1802
+ die (_ ("could not start pack-objects to repack local links" ));
1803
+ }
1797
1804
1798
- oidset_iter_init (& local_links , & iter );
1799
- while ((oid = oidset_iter_next (& iter ))) {
1800
1805
if (write_in_full (cmd .in , oid_to_hex (oid ), the_hash_algo -> hexsz ) < 0 ||
1801
1806
write_in_full (cmd .in , "\n" , 1 ) < 0 )
1802
1807
die (_ ("failed to feed local object to pack-objects" ));
1803
1808
}
1809
+
1810
+ if (!cmd .args .nr )
1811
+ return ;
1812
+
1804
1813
close (cmd .in );
1805
1814
1806
1815
out = xfdopen (cmd .out , "r" );
@@ -1899,7 +1908,7 @@ int cmd_index_pack(int argc,
1899
1908
} else if (skip_to_optional_arg (arg , "--keep" , & keep_msg )) {
1900
1909
; /* nothing to do */
1901
1910
} else if (skip_to_optional_arg (arg , "--promisor" , & promisor_msg )) {
1902
- record_local_links = 1 ;
1911
+ record_outgoing_links = 1 ;
1903
1912
} else if (starts_with (arg , "--threads=" )) {
1904
1913
char * end ;
1905
1914
nr_threads = strtoul (arg + 10 , & end , 0 );
0 commit comments