77#include "commit.h"
88#include "tag.h"
99#include "tree.h"
10- #include "tree-walk.h"
1110#include "progress.h"
1211#include "decorate.h"
13- #include "fsck.h"
1412
15- static int dry_run , quiet , recover , has_errors , strict ;
16- static const char unpack_usage [] = "git-unpack-objects [-n] [-q] [-r] [--strict] < pack-file" ;
13+ static int dry_run , quiet , recover , has_errors ;
14+ static const char unpack_usage [] = "git-unpack-objects [-n] [-q] [-r] < pack-file" ;
1715
1816/* We always read in 4kB chunks. */
1917static unsigned char buffer [4096 ];
@@ -33,16 +31,6 @@ static struct obj_buffer *lookup_object_buffer(struct object *base)
3331 return lookup_decoration (& obj_decorate , base );
3432}
3533
36- static void add_object_buffer (struct object * object , char * buffer , unsigned long size )
37- {
38- struct obj_buffer * obj ;
39- obj = xcalloc (1 , sizeof (struct obj_buffer ));
40- obj -> buffer = buffer ;
41- obj -> size = size ;
42- if (add_decoration (& obj_decorate , object , obj ))
43- die ("object %s tried to add buffer twice!" , sha1_to_hex (object -> sha1 ));
44- }
45-
4634/*
4735 * Make sure at least "min" bytes are available in the buffer, and
4836 * return the pointer to the buffer.
@@ -146,95 +134,19 @@ static void add_delta_to_list(unsigned nr, unsigned const char *base_sha1,
146134struct obj_info {
147135 off_t offset ;
148136 unsigned char sha1 [20 ];
149- struct object * obj ;
150137};
151138
152- #define FLAG_OPEN (1u<<20)
153- #define FLAG_WRITTEN (1u<<21)
154-
155139static struct obj_info * obj_list ;
156- unsigned nr_objects ;
157-
158- static void write_cached_object (struct object * obj )
159- {
160- unsigned char sha1 [20 ];
161- struct obj_buffer * obj_buf = lookup_object_buffer (obj );
162- if (write_sha1_file (obj_buf -> buffer , obj_buf -> size , typename (obj -> type ), sha1 ) < 0 )
163- die ("failed to write object %s" , sha1_to_hex (obj -> sha1 ));
164- obj -> flags |= FLAG_WRITTEN ;
165- }
166-
167- static int check_object (struct object * obj , int type , void * data )
168- {
169- if (!obj )
170- return 0 ;
171-
172- if (obj -> flags & FLAG_WRITTEN )
173- return 1 ;
174-
175- if (type != OBJ_ANY && obj -> type != type )
176- die ("object type mismatch" );
177-
178- if (!(obj -> flags & FLAG_OPEN )) {
179- unsigned long size ;
180- int type = sha1_object_info (obj -> sha1 , & size );
181- if (type != obj -> type || type <= 0 )
182- die ("object of unexpected type" );
183- obj -> flags |= FLAG_WRITTEN ;
184- return 1 ;
185- }
186-
187- if (fsck_object (obj , 1 , fsck_error_function ))
188- die ("Error in object" );
189- if (!fsck_walk (obj , check_object , 0 ))
190- die ("Error on reachable objects of %s" , sha1_to_hex (obj -> sha1 ));
191- write_cached_object (obj );
192- return 1 ;
193- }
194-
195- static void write_rest (void )
196- {
197- unsigned i ;
198- for (i = 0 ; i < nr_objects ; i ++ )
199- check_object (obj_list [i ].obj , OBJ_ANY , 0 );
200- }
201140
202141static void added_object (unsigned nr , enum object_type type ,
203142 void * data , unsigned long size );
204143
205144static void write_object (unsigned nr , enum object_type type ,
206145 void * buf , unsigned long size )
207146{
147+ if (write_sha1_file (buf , size , typename (type ), obj_list [nr ].sha1 ) < 0 )
148+ die ("failed to write object" );
208149 added_object (nr , type , buf , size );
209- if (!strict ) {
210- if (write_sha1_file (buf , size , typename (type ), obj_list [nr ].sha1 ) < 0 )
211- die ("failed to write object" );
212- free (buf );
213- obj_list [nr ].obj = 0 ;
214- } else if (type == OBJ_BLOB ) {
215- struct blob * blob ;
216- if (write_sha1_file (buf , size , typename (type ), obj_list [nr ].sha1 ) < 0 )
217- die ("failed to write object" );
218- free (buf );
219-
220- blob = lookup_blob (obj_list [nr ].sha1 );
221- if (blob )
222- blob -> object .flags |= FLAG_WRITTEN ;
223- else
224- die ("invalid blob object" );
225- obj_list [nr ].obj = 0 ;
226- } else {
227- struct object * obj ;
228- int eaten ;
229- hash_sha1_file (buf , size , typename (type ), obj_list [nr ].sha1 );
230- obj = parse_object_buffer (obj_list [nr ].sha1 , type , size , buf , & eaten );
231- if (!obj )
232- die ("invalid %s" , typename (type ));
233- /* buf is stored via add_object_buffer and in obj, if its a tree or commit */
234- add_object_buffer (obj , buf , size );
235- obj -> flags |= FLAG_OPEN ;
236- obj_list [nr ].obj = obj ;
237- }
238150}
239151
240152static void resolve_delta (unsigned nr , enum object_type type ,
@@ -251,6 +163,7 @@ static void resolve_delta(unsigned nr, enum object_type type,
251163 die ("failed to apply delta" );
252164 free (delta );
253165 write_object (nr , type , result , result_size );
166+ free (result );
254167}
255168
256169static void added_object (unsigned nr , enum object_type type ,
@@ -280,8 +193,7 @@ static void unpack_non_delta_entry(enum object_type type, unsigned long size,
280193
281194 if (!dry_run && buf )
282195 write_object (nr , type , buf , size );
283- else
284- free (buf );
196+ free (buf );
285197}
286198
287199static void unpack_delta_entry (enum object_type type , unsigned long delta_size ,
@@ -424,8 +336,7 @@ static void unpack_all(void)
424336 int i ;
425337 struct progress * progress = NULL ;
426338 struct pack_header * hdr = fill (sizeof (struct pack_header ));
427-
428- nr_objects = ntohl (hdr -> hdr_entries );
339+ unsigned nr_objects = ntohl (hdr -> hdr_entries );
429340
430341 if (ntohl (hdr -> hdr_signature ) != PACK_SIGNATURE )
431342 die ("bad pack file" );
@@ -436,7 +347,6 @@ static void unpack_all(void)
436347 if (!quiet )
437348 progress = start_progress ("Unpacking objects" , nr_objects );
438349 obj_list = xmalloc (nr_objects * sizeof (* obj_list ));
439- memset (obj_list , 0 , nr_objects * sizeof (* obj_list ));
440350 for (i = 0 ; i < nr_objects ; i ++ ) {
441351 unpack_one (i );
442352 display_progress (progress , i + 1 );
@@ -472,10 +382,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
472382 recover = 1 ;
473383 continue ;
474384 }
475- if (!strcmp (arg , "--strict" )) {
476- strict = 1 ;
477- continue ;
478- }
479385 if (!prefixcmp (arg , "--pack_header=" )) {
480386 struct pack_header * hdr ;
481387 char * c ;
@@ -501,8 +407,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
501407 unpack_all ();
502408 SHA1_Update (& ctx , buffer , offset );
503409 SHA1_Final (sha1 , & ctx );
504- if (strict )
505- write_rest ();
506410 if (hashcmp (fill (20 ), sha1 ))
507411 die ("final sha1 did not match" );
508412 use (20 );
0 commit comments