Revert "unpack-objects: prevent writing of inconsistent objects"
This reverts commit d5ef408b9afb5b4417f4e7e1593a96302d666650.
Junio C Hamano committed
Mar 4, 2008 at 03:11 UTC
c95b3ad9ea310ec89e31a21edecaaf2c374e2c46
2 files changed
+7
-106
Documentation/git-unpack-objects.txt
-3
@@ -40,9 +40,6 @@ OPTIONS
40
and make the best effort to recover as many objects as
41
possible.
42
43
---strict::
44
- Don't write objects with broken content or links.
45
-
43
44
Author
45
------
builtin-unpack-objects.c
+7
-103
@@ -7,13 +7,11 @@
7
#include "commit.h"
8
#include "tag.h"
9
#include "tree.h"
10
-#include "tree-walk.h"
10
#include "progress.h"
11
#include "decorate.h"
13
-#include "fsck.h"
12
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";
15
16
/* We always read in 4kB chunks. */
17
static unsigned char buffer[4096];
@@ -33,16 +31,6 @@ static struct obj_buffer *lookup_object_buffer(struct object *base)
31
return lookup_decoration(&obj_decorate, base);
32
}
33
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
-
34
/*
35
* Make sure at least "min" bytes are available in the buffer, and
36
* return the pointer to the buffer.
@@ -146,58 +134,9 @@ static void add_delta_to_list(unsigned nr, unsigned const char *base_sha1,
134
struct obj_info {
135
off_t offset;
136
unsigned char sha1[20];
149
- struct object *obj;
137
};
138
152
-#define FLAG_OPEN (1u<<20)
153
-#define FLAG_WRITTEN (1u<<21)
154
-
139
static 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
-}
140
141
static void added_object(unsigned nr, enum object_type type,
142
void *data, unsigned long size);
@@ -205,36 +144,9 @@ static void added_object(unsigned nr, enum object_type type,
144
static void write_object(unsigned nr, enum object_type type,
145
void *buf, unsigned long size)
146
{
147
+ if (write_sha1_file(buf, size, typename(type), obj_list[nr].sha1) < 0)
148
+ die("failed to write object");
149
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
- }
150
}
151
152
static void resolve_delta(unsigned nr, enum object_type type,
@@ -251,6 +163,7 @@ static void resolve_delta(unsigned nr, enum object_type type,
163
die("failed to apply delta");
164
free(delta);
165
write_object(nr, type, result, result_size);
166
+ free(result);
167
}
168
169
static 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,
193
194
if (!dry_run && buf)
195
write_object(nr, type, buf, size);
283
- else
284
- free(buf);
196
+ free(buf);
197
}
198
199
static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
@@ -424,8 +336,7 @@ static void unpack_all(void)
336
int i;
337
struct progress *progress = NULL;
338
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);
340
341
if (ntohl(hdr->hdr_signature) != PACK_SIGNATURE)
342
die("bad pack file");
@@ -436,7 +347,6 @@ static void unpack_all(void)
347
if (!quiet)
348
progress = start_progress("Unpacking objects", nr_objects);
349
obj_list = xmalloc(nr_objects * sizeof(*obj_list));
439
- memset(obj_list, 0, nr_objects * sizeof(*obj_list));
350
for (i = 0; i < nr_objects; i++) {
351
unpack_one(i);
352
display_progress(progress, i + 1);
@@ -472,10 +382,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
382
recover = 1;
383
continue;
384
}
475
- if (!strcmp(arg, "--strict")) {
476
- strict = 1;
477
- continue;
478
- }
385
if (!prefixcmp(arg, "--pack_header=")) {
386
struct pack_header *hdr;
387
char *c;
@@ -501,8 +407,6 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
407
unpack_all();
408
SHA1_Update(&ctx, buffer, offset);
409
SHA1_Final(sha1, &ctx);
504
- if (strict)
505
- write_rest();
410
if (hashcmp(fill(20), sha1))
411
die("final sha1 did not match");
412
use(20);