Bug Summary

File:fast-import.c
Location:line 2995, column 2
Description:Assigned value is garbage or undefined

Annotated Source Code

1/*
2(See Documentation/git-fast-import.txt for maintained documentation.)
3Format of STDIN stream:
4
5 stream ::= cmd*;
6
7 cmd ::= new_blob
8 | new_commit
9 | new_tag
10 | reset_branch
11 | checkpoint
12 | progress
13 ;
14
15 new_blob ::= 'blob' lf
16 mark?
17 file_content;
18 file_content ::= data;
19
20 new_commit ::= 'commit' sp ref_str lf
21 mark?
22 ('author' (sp name)? sp '<' email '>' sp when lf)?
23 'committer' (sp name)? sp '<' email '>' sp when lf
24 commit_msg
25 ('from' sp commit-ish lf)?
26 ('merge' sp commit-ish lf)*
27 (file_change | ls)*
28 lf?;
29 commit_msg ::= data;
30
31 ls ::= 'ls' sp '"' quoted(path) '"' lf;
32
33 file_change ::= file_clr
34 | file_del
35 | file_rnm
36 | file_cpy
37 | file_obm
38 | file_inm;
39 file_clr ::= 'deleteall' lf;
40 file_del ::= 'D' sp path_str lf;
41 file_rnm ::= 'R' sp path_str sp path_str lf;
42 file_cpy ::= 'C' sp path_str sp path_str lf;
43 file_obm ::= 'M' sp mode sp (hexsha1 | idnum) sp path_str lf;
44 file_inm ::= 'M' sp mode sp 'inline' sp path_str lf
45 data;
46 note_obm ::= 'N' sp (hexsha1 | idnum) sp commit-ish lf;
47 note_inm ::= 'N' sp 'inline' sp commit-ish lf
48 data;
49
50 new_tag ::= 'tag' sp tag_str lf
51 'from' sp commit-ish lf
52 ('tagger' (sp name)? sp '<' email '>' sp when lf)?
53 tag_msg;
54 tag_msg ::= data;
55
56 reset_branch ::= 'reset' sp ref_str lf
57 ('from' sp commit-ish lf)?
58 lf?;
59
60 checkpoint ::= 'checkpoint' lf
61 lf?;
62
63 progress ::= 'progress' sp not_lf* lf
64 lf?;
65
66 # note: the first idnum in a stream should be 1 and subsequent
67 # idnums should not have gaps between values as this will cause
68 # the stream parser to reserve space for the gapped values. An
69 # idnum can be updated in the future to a new object by issuing
70 # a new mark directive with the old idnum.
71 #
72 mark ::= 'mark' sp idnum lf;
73 data ::= (delimited_data | exact_data)
74 lf?;
75
76 # note: delim may be any string but must not contain lf.
77 # data_line may contain any data but must not be exactly
78 # delim.
79 delimited_data ::= 'data' sp '<<' delim lf
80 (data_line lf)*
81 delim lf;
82
83 # note: declen indicates the length of binary_data in bytes.
84 # declen does not include the lf preceding the binary data.
85 #
86 exact_data ::= 'data' sp declen lf
87 binary_data;
88
89 # note: quoted strings are C-style quoting supporting \c for
90 # common escapes of 'c' (e..g \n, \t, \\, \") or \nnn where nnn
91 # is the signed byte value in octal. Note that the only
92 # characters which must actually be escaped to protect the
93 # stream formatting is: \, " and LF. Otherwise these values
94 # are UTF8.
95 #
96 commit-ish ::= (ref_str | hexsha1 | sha1exp_str | idnum);
97 ref_str ::= ref;
98 sha1exp_str ::= sha1exp;
99 tag_str ::= tag;
100 path_str ::= path | '"' quoted(path) '"' ;
101 mode ::= '100644' | '644'
102 | '100755' | '755'
103 | '120000'
104 ;
105
106 declen ::= # unsigned 32 bit value, ascii base10 notation;
107 bigint ::= # unsigned integer value, ascii base10 notation;
108 binary_data ::= # file content, not interpreted;
109
110 when ::= raw_when | rfc2822_when;
111 raw_when ::= ts sp tz;
112 rfc2822_when ::= # Valid RFC 2822 date and time;
113
114 sp ::= # ASCII space character;
115 lf ::= # ASCII newline (LF) character;
116
117 # note: a colon (':') must precede the numerical value assigned to
118 # an idnum. This is to distinguish it from a ref or tag name as
119 # GIT does not permit ':' in ref or tag strings.
120 #
121 idnum ::= ':' bigint;
122 path ::= # GIT style file path, e.g. "a/b/c";
123 ref ::= # GIT ref name, e.g. "refs/heads/MOZ_GECKO_EXPERIMENT";
124 tag ::= # GIT tag name, e.g. "FIREFOX_1_5";
125 sha1exp ::= # Any valid GIT SHA1 expression;
126 hexsha1 ::= # SHA1 in hexadecimal format;
127
128 # note: name and email are UTF8 strings, however name must not
129 # contain '<' or lf and email must not contain any of the
130 # following: '<', '>', lf.
131 #
132 name ::= # valid GIT author/committer name;
133 email ::= # valid GIT author/committer email;
134 ts ::= # time since the epoch in seconds, ascii base10 notation;
135 tz ::= # GIT style timezone;
136
137 # note: comments, get-mark, ls-tree, and cat-blob requests may
138 # appear anywhere in the input, except within a data command. Any
139 # form of the data command always escapes the related input from
140 # comment processing.
141 #
142 # In case it is not clear, the '#' that starts the comment
143 # must be the first character on that line (an lf
144 # preceded it).
145 #
146
147 get_mark ::= 'get-mark' sp idnum lf;
148 cat_blob ::= 'cat-blob' sp (hexsha1 | idnum) lf;
149 ls_tree ::= 'ls' sp (hexsha1 | idnum) sp path_str lf;
150
151 comment ::= '#' not_lf* lf;
152 not_lf ::= # Any byte that is not ASCII newline (LF);
153*/
154
155#include "builtin.h"
156#include "cache.h"
157#include "lockfile.h"
158#include "object.h"
159#include "blob.h"
160#include "tree.h"
161#include "commit.h"
162#include "delta.h"
163#include "pack.h"
164#include "refs.h"
165#include "csum-file.h"
166#include "quote.h"
167#include "dir.h"
168#include "run-command.h"
169
170#define PACK_ID_BITS16 16
171#define MAX_PACK_ID((1<<16)-1) ((1<<PACK_ID_BITS16)-1)
172#define DEPTH_BITS13 13
173#define MAX_DEPTH((1<<13)-1) ((1<<DEPTH_BITS13)-1)
174
175/*
176 * We abuse the setuid bit on directories to mean "do not delta".
177 */
178#define NO_DELTA0004000 S_ISUID0004000
179
180struct object_entry {
181 struct pack_idx_entry idx;
182 struct object_entry *next;
183 uint32_t type : TYPE_BITS3,
184 pack_id : PACK_ID_BITS16,
185 depth : DEPTH_BITS13;
186};
187
188struct object_entry_pool {
189 struct object_entry_pool *next_pool;
190 struct object_entry *next_free;
191 struct object_entry *end;
192 struct object_entry entries[FLEX_ARRAY]; /* more */
193};
194
195struct mark_set {
196 union {
197 struct object_entry *marked[1024];
198 struct mark_set *sets[1024];
199 } data;
200 unsigned int shift;
201};
202
203struct last_object {
204 struct strbuf data;
205 off_t offset;
206 unsigned int depth;
207 unsigned no_swap : 1;
208};
209
210struct mem_pool {
211 struct mem_pool *next_pool;
212 char *next_free;
213 char *end;
214 uintmax_t space[FLEX_ARRAY]; /* more */
215};
216
217struct atom_str {
218 struct atom_str *next_atom;
219 unsigned short str_len;
220 char str_dat[FLEX_ARRAY]; /* more */
221};
222
223struct tree_content;
224struct tree_entry {
225 struct tree_content *tree;
226 struct atom_str *name;
227 struct tree_entry_ms {
228 uint16_t mode;
229 unsigned char sha1[20];
230 } versions[2];
231};
232
233struct tree_content {
234 unsigned int entry_capacity; /* must match avail_tree_content */
235 unsigned int entry_count;
236 unsigned int delta_depth;
237 struct tree_entry *entries[FLEX_ARRAY]; /* more */
238};
239
240struct avail_tree_content {
241 unsigned int entry_capacity; /* must match tree_content */
242 struct avail_tree_content *next_avail;
243};
244
245struct branch {
246 struct branch *table_next_branch;
247 struct branch *active_next_branch;
248 const char *name;
249 struct tree_entry branch_tree;
250 uintmax_t last_commit;
251 uintmax_t num_notes;
252 unsigned active : 1;
253 unsigned delete : 1;
254 unsigned pack_id : PACK_ID_BITS16;
255 unsigned char sha1[20];
256};
257
258struct tag {
259 struct tag *next_tag;
260 const char *name;
261 unsigned int pack_id;
262 unsigned char sha1[20];
263};
264
265struct hash_list {
266 struct hash_list *next;
267 unsigned char sha1[20];
268};
269
270typedef enum {
271 WHENSPEC_RAW = 1,
272 WHENSPEC_RFC2822,
273 WHENSPEC_NOW
274} whenspec_type;
275
276struct recent_command {
277 struct recent_command *prev;
278 struct recent_command *next;
279 char *buf;
280};
281
282/* Configured limits on output */
283static unsigned long max_depth = 10;
284static off_t max_packsize;
285static int unpack_limit = 100;
286static int force_update;
287
288/* Stats and misc. counters */
289static uintmax_t alloc_count;
290static uintmax_t marks_set_count;
291static uintmax_t object_count_by_type[1 << TYPE_BITS3];
292static uintmax_t duplicate_count_by_type[1 << TYPE_BITS3];
293static uintmax_t delta_count_by_type[1 << TYPE_BITS3];
294static uintmax_t delta_count_attempts_by_type[1 << TYPE_BITS3];
295static unsigned long object_count;
296static unsigned long branch_count;
297static unsigned long branch_load_count;
298static int failure;
299static FILE *pack_edges;
300static unsigned int show_stats = 1;
301static int global_argc;
302static const char **global_argv;
303
304/* Memory pools */
305static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mem_pool);
306static size_t total_allocd;
307static struct mem_pool *mem_pool;
308
309/* Atom management */
310static unsigned int atom_table_sz = 4451;
311static unsigned int atom_cnt;
312static struct atom_str **atom_table;
313
314/* The .pack file being generated */
315static struct pack_idx_option pack_idx_opts;
316static unsigned int pack_id;
317static struct sha1file *pack_file;
318static struct packed_git *pack_data;
319static struct packed_git **all_packs;
320static off_t pack_size;
321
322/* Table of objects we've written. */
323static unsigned int object_entry_alloc = 5000;
324static struct object_entry_pool *blocks;
325static struct object_entry *object_table[1 << 16];
326static struct mark_set *marks;
327static const char *export_marks_file;
328static const char *import_marks_file;
329static int import_marks_file_from_stream;
330static int import_marks_file_ignore_missing;
331static int import_marks_file_done;
332static int relative_marks_paths;
333
334/* Our last blob */
335static struct last_object last_blob = { STRBUF_INIT{ 0, 0, strbuf_slopbuf }, 0, 0, 0 };
336
337/* Tree management */
338static unsigned int tree_entry_alloc = 1000;
339static void *avail_tree_entry;
340static unsigned int avail_tree_table_sz = 100;
341static struct avail_tree_content **avail_tree_table;
342static struct strbuf old_tree = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
343static struct strbuf new_tree = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
344
345/* Branch data */
346static unsigned long max_active_branches = 5;
347static unsigned long cur_active_branches;
348static unsigned long branch_table_sz = 1039;
349static struct branch **branch_table;
350static struct branch *active_branches;
351
352/* Tag data */
353static struct tag *first_tag;
354static struct tag *last_tag;
355
356/* Input stream parsing */
357static whenspec_type whenspec = WHENSPEC_RAW;
358static struct strbuf command_buf = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
359static int unread_command_buf;
360static struct recent_command cmd_hist = {&cmd_hist, &cmd_hist, NULL((void*)0)};
361static struct recent_command *cmd_tail = &cmd_hist;
362static struct recent_command *rc_free;
363static unsigned int cmd_save = 100;
364static uintmax_t next_mark;
365static struct strbuf new_data = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
366static int seen_data_command;
367static int require_explicit_termination;
368
369/* Signal handling */
370static volatile sig_atomic_t checkpoint_requested;
371
372/* Where to write output of cat-blob commands */
373static int cat_blob_fd = STDOUT_FILENO1;
374
375static void parse_argv(void);
376static void parse_get_mark(const char *p);
377static void parse_cat_blob(const char *p);
378static void parse_ls(const char *p, struct branch *b);
379
380static void write_branch_report(FILE *rpt, struct branch *b)
381{
382 fprintf(rpt, "%s:\n", b->name);
383
384 fprintf(rpt, " status :");
385 if (b->active)
386 fputs(" active", rpt);
387 if (b->branch_tree.tree)
388 fputs(" loaded", rpt);
389 if (is_null_sha1(b->branch_tree.versions[1].sha1))
390 fputs(" dirty", rpt);
391 fputc('\n', rpt);
392
393 fprintf(rpt, " tip commit : %s\n", sha1_to_hex(b->sha1));
394 fprintf(rpt, " old tree : %s\n", sha1_to_hex(b->branch_tree.versions[0].sha1));
395 fprintf(rpt, " cur tree : %s\n", sha1_to_hex(b->branch_tree.versions[1].sha1));
396 fprintf(rpt, " commit clock: %" PRIuMAX"j" "u" "\n", b->last_commit);
397
398 fputs(" last pack : ", rpt);
399 if (b->pack_id < MAX_PACK_ID((1<<16)-1))
400 fprintf(rpt, "%u", b->pack_id);
401 fputc('\n', rpt);
402
403 fputc('\n', rpt);
404}
405
406static void dump_marks_helper(FILE *, uintmax_t, struct mark_set *);
407
408static void write_crash_report(const char *err)
409{
410 char *loc = git_pathdup("fast_import_crash_%"PRIuMAX"j" "u", (uintmax_t) getpid());
411 FILE *rpt = fopen(loc, "w");
412 struct branch *b;
413 unsigned long lu;
414 struct recent_command *rc;
415
416 if (!rpt) {
417 error_errno("can't write crash report %s", loc)(error_errno("can't write crash report %s", loc), const_error
())
;
418 free(loc);
419 return;
420 }
421
422 fprintf(stderr__stderrp, "fast-import: dumping crash report to %s\n", loc);
423
424 fprintf(rpt, "fast-import crash report:\n");
425 fprintf(rpt, " fast-import process: %"PRIuMAX"j" "u""\n", (uintmax_t) getpid());
426 fprintf(rpt, " parent process : %"PRIuMAX"j" "u""\n", (uintmax_t) getppid());
427 fprintf(rpt, " at %s\n", show_date(time(NULL((void*)0)), 0, DATE_MODE(ISO8601)date_mode_from_type(DATE_ISO8601)));
428 fputc('\n', rpt);
429
430 fputs("fatal: ", rpt);
431 fputs(err, rpt);
432 fputc('\n', rpt);
433
434 fputc('\n', rpt);
435 fputs("Most Recent Commands Before Crash\n", rpt);
436 fputs("---------------------------------\n", rpt);
437 for (rc = cmd_hist.next; rc != &cmd_hist; rc = rc->next) {
438 if (rc->next == &cmd_hist)
439 fputs("* ", rpt);
440 else
441 fputs(" ", rpt);
442 fputs(rc->buf, rpt);
443 fputc('\n', rpt);
444 }
445
446 fputc('\n', rpt);
447 fputs("Active Branch LRU\n", rpt);
448 fputs("-----------------\n", rpt);
449 fprintf(rpt, " active_branches = %lu cur, %lu max\n",
450 cur_active_branches,
451 max_active_branches);
452 fputc('\n', rpt);
453 fputs(" pos clock name\n", rpt);
454 fputs(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", rpt);
455 for (b = active_branches, lu = 0; b; b = b->active_next_branch)
456 fprintf(rpt, " %2lu) %6" PRIuMAX"j" "u"" %s\n",
457 ++lu, b->last_commit, b->name);
458
459 fputc('\n', rpt);
460 fputs("Inactive Branches\n", rpt);
461 fputs("-----------------\n", rpt);
462 for (lu = 0; lu < branch_table_sz; lu++) {
463 for (b = branch_table[lu]; b; b = b->table_next_branch)
464 write_branch_report(rpt, b);
465 }
466
467 if (first_tag) {
468 struct tag *tg;
469 fputc('\n', rpt);
470 fputs("Annotated Tags\n", rpt);
471 fputs("--------------\n", rpt);
472 for (tg = first_tag; tg; tg = tg->next_tag) {
473 fputs(sha1_to_hex(tg->sha1), rpt);
474 fputc(' ', rpt);
475 fputs(tg->name, rpt);
476 fputc('\n', rpt);
477 }
478 }
479
480 fputc('\n', rpt);
481 fputs("Marks\n", rpt);
482 fputs("-----\n", rpt);
483 if (export_marks_file)
484 fprintf(rpt, " exported to %s\n", export_marks_file);
485 else
486 dump_marks_helper(rpt, 0, marks);
487
488 fputc('\n', rpt);
489 fputs("-------------------\n", rpt);
490 fputs("END OF CRASH REPORT\n", rpt);
491 fclose(rpt);
492 free(loc);
493}
494
495static void end_packfile(void);
496static void unkeep_all_packs(void);
497static void dump_marks(void);
498
499static NORETURN__attribute__((__noreturn__)) void die_nicely(const char *err, va_list params)
500{
501 static int zombie;
502 char message[2 * PATH_MAX1024];
503
504 vsnprintf(message, sizeof(message), err, params)__builtin___vsnprintf_chk (message, sizeof(message), 0, __builtin_object_size
(message, 2 > 1 ? 1 : 0), err, params)
;
505 fputs("fatal: ", stderr__stderrp);
506 fputs(message, stderr__stderrp);
507 fputc('\n', stderr__stderrp);
508
509 if (!zombie) {
510 zombie = 1;
511 write_crash_report(message);
512 end_packfile();
513 unkeep_all_packs();
514 dump_marks();
515 }
516 exit(128);
517}
518
519#ifndef SIGUSR130 /* Windows, for example */
520
521static void set_checkpoint_signal(void)
522{
523}
524
525#else
526
527static void checkpoint_signal(int signo)
528{
529 checkpoint_requested = 1;
530}
531
532static void set_checkpoint_signal(void)
533{
534 struct sigaction sa;
535
536 memset(&sa, 0, sizeof(sa))__builtin___memset_chk (&sa, 0, sizeof(sa), __builtin_object_size
(&sa, 0))
;
537 sa.sa_handler__sigaction_u.__sa_handler = checkpoint_signal;
538 sigemptyset(&sa.sa_mask)(*(&sa.sa_mask) = 0, 0);
539 sa.sa_flags = SA_RESTART0x0002;
540 sigaction(SIGUSR130, &sa, NULL((void*)0));
541}
542
543#endif
544
545static void alloc_objects(unsigned int cnt)
546{
547 struct object_entry_pool *b;
548
549 b = xmalloc(sizeof(struct object_entry_pool)
550 + cnt * sizeof(struct object_entry));
551 b->next_pool = blocks;
552 b->next_free = b->entries;
553 b->end = b->entries + cnt;
554 blocks = b;
555 alloc_count += cnt;
556}
557
558static struct object_entry *new_object(unsigned char *sha1)
559{
560 struct object_entry *e;
561
562 if (blocks->next_free == blocks->end)
563 alloc_objects(object_entry_alloc);
564
565 e = blocks->next_free++;
566 hashcpy(e->idx.sha1, sha1);
567 return e;
568}
569
570static struct object_entry *find_object(unsigned char *sha1)
571{
572 unsigned int h = sha1[0] << 8 | sha1[1];
573 struct object_entry *e;
574 for (e = object_table[h]; e; e = e->next)
575 if (!hashcmp(sha1, e->idx.sha1))
576 return e;
577 return NULL((void*)0);
578}
579
580static struct object_entry *insert_object(unsigned char *sha1)
581{
582 unsigned int h = sha1[0] << 8 | sha1[1];
583 struct object_entry *e = object_table[h];
584
585 while (e) {
586 if (!hashcmp(sha1, e->idx.sha1))
587 return e;
588 e = e->next;
589 }
590
591 e = new_object(sha1);
592 e->next = object_table[h];
593 e->idx.offset = 0;
594 object_table[h] = e;
595 return e;
596}
597
598static void invalidate_pack_id(unsigned int id)
599{
600 unsigned int h;
601 unsigned long lu;
602 struct tag *t;
603
604 for (h = 0; h < ARRAY_SIZE(object_table)(sizeof(object_table) / sizeof((object_table)[0]) + (sizeof(char
[1 - 2*!(!__builtin_types_compatible_p(__typeof__(object_table
), __typeof__(&(object_table)[0])))]) - 1))
; h++) {
605 struct object_entry *e;
606
607 for (e = object_table[h]; e; e = e->next)
608 if (e->pack_id == id)
609 e->pack_id = MAX_PACK_ID((1<<16)-1);
610 }
611
612 for (lu = 0; lu < branch_table_sz; lu++) {
613 struct branch *b;
614
615 for (b = branch_table[lu]; b; b = b->table_next_branch)
616 if (b->pack_id == id)
617 b->pack_id = MAX_PACK_ID((1<<16)-1);
618 }
619
620 for (t = first_tag; t; t = t->next_tag)
621 if (t->pack_id == id)
622 t->pack_id = MAX_PACK_ID((1<<16)-1);
623}
624
625static unsigned int hc_str(const char *s, size_t len)
626{
627 unsigned int r = 0;
628 while (len-- > 0)
629 r = r * 31 + *s++;
630 return r;
631}
632
633static void *pool_alloc(size_t len)
634{
635 struct mem_pool *p;
636 void *r;
637
638 /* round up to a 'uintmax_t' alignment */
639 if (len & (sizeof(uintmax_t) - 1))
640 len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
641
642 for (p = mem_pool; p; p = p->next_pool)
643 if ((p->end - p->next_free >= len))
644 break;
645
646 if (!p) {
647 if (len >= (mem_pool_alloc/2)) {
648 total_allocd += len;
649 return xmalloc(len);
650 }
651 total_allocd += sizeof(struct mem_pool) + mem_pool_alloc;
652 p = xmalloc(st_add(sizeof(struct mem_pool), mem_pool_alloc));
653 p->next_pool = mem_pool;
654 p->next_free = (char *) p->space;
655 p->end = p->next_free + mem_pool_alloc;
656 mem_pool = p;
657 }
658
659 r = p->next_free;
660 p->next_free += len;
661 return r;
662}
663
664static void *pool_calloc(size_t count, size_t size)
665{
666 size_t len = count * size;
667 void *r = pool_alloc(len);
668 memset(r, 0, len)__builtin___memset_chk (r, 0, len, __builtin_object_size (r, 0
))
;
669 return r;
670}
671
672static char *pool_strdup(const char *s)
673{
674 size_t len = strlen(s) + 1;
675 char *r = pool_alloc(len);
676 memcpy(r, s, len)__builtin___memcpy_chk (r, s, len, __builtin_object_size (r, 0
))
;
677 return r;
678}
679
680static void insert_mark(uintmax_t idnum, struct object_entry *oe)
681{
682 struct mark_set *s = marks;
683 while ((idnum >> s->shift) >= 1024) {
684 s = pool_calloc(1, sizeof(struct mark_set));
685 s->shift = marks->shift + 10;
686 s->data.sets[0] = marks;
687 marks = s;
688 }
689 while (s->shift) {
690 uintmax_t i = idnum >> s->shift;
691 idnum -= i << s->shift;
692 if (!s->data.sets[i]) {
693 s->data.sets[i] = pool_calloc(1, sizeof(struct mark_set));
694 s->data.sets[i]->shift = s->shift - 10;
695 }
696 s = s->data.sets[i];
697 }
698 if (!s->data.marked[idnum])
699 marks_set_count++;
700 s->data.marked[idnum] = oe;
701}
702
703static struct object_entry *find_mark(uintmax_t idnum)
704{
705 uintmax_t orig_idnum = idnum;
706 struct mark_set *s = marks;
707 struct object_entry *oe = NULL((void*)0);
708 if ((idnum >> s->shift) < 1024) {
709 while (s && s->shift) {
710 uintmax_t i = idnum >> s->shift;
711 idnum -= i << s->shift;
712 s = s->data.sets[i];
713 }
714 if (s)
715 oe = s->data.marked[idnum];
716 }
717 if (!oe)
718 die("mark :%" PRIuMAX"j" "u" " not declared", orig_idnum);
719 return oe;
720}
721
722static struct atom_str *to_atom(const char *s, unsigned short len)
723{
724 unsigned int hc = hc_str(s, len) % atom_table_sz;
725 struct atom_str *c;
726
727 for (c = atom_table[hc]; c; c = c->next_atom)
728 if (c->str_len == len && !strncmp(s, c->str_dat, len))
729 return c;
730
731 c = pool_alloc(sizeof(struct atom_str) + len + 1);
732 c->str_len = len;
733 memcpy(c->str_dat, s, len)__builtin___memcpy_chk (c->str_dat, s, len, __builtin_object_size
(c->str_dat, 0))
;
734 c->str_dat[len] = 0;
735 c->next_atom = atom_table[hc];
736 atom_table[hc] = c;
737 atom_cnt++;
738 return c;
739}
740
741static struct branch *lookup_branch(const char *name)
742{
743 unsigned int hc = hc_str(name, strlen(name)) % branch_table_sz;
744 struct branch *b;
745
746 for (b = branch_table[hc]; b; b = b->table_next_branch)
747 if (!strcmp(name, b->name))
748 return b;
749 return NULL((void*)0);
750}
751
752static struct branch *new_branch(const char *name)
753{
754 unsigned int hc = hc_str(name, strlen(name)) % branch_table_sz;
755 struct branch *b = lookup_branch(name);
756
757 if (b)
758 die("Invalid attempt to create duplicate branch: %s", name);
759 if (check_refname_format(name, REFNAME_ALLOW_ONELEVEL1))
760 die("Branch name doesn't conform to GIT standards: %s", name);
761
762 b = pool_calloc(1, sizeof(struct branch));
763 b->name = pool_strdup(name);
764 b->table_next_branch = branch_table[hc];
765 b->branch_tree.versions[0].mode = S_IFDIR0040000;
766 b->branch_tree.versions[1].mode = S_IFDIR0040000;
767 b->num_notes = 0;
768 b->active = 0;
769 b->pack_id = MAX_PACK_ID((1<<16)-1);
770 branch_table[hc] = b;
771 branch_count++;
772 return b;
773}
774
775static unsigned int hc_entries(unsigned int cnt)
776{
777 cnt = cnt & 7 ? (cnt / 8) + 1 : cnt / 8;
778 return cnt < avail_tree_table_sz ? cnt : avail_tree_table_sz - 1;
779}
780
781static struct tree_content *new_tree_content(unsigned int cnt)
782{
783 struct avail_tree_content *f, *l = NULL((void*)0);
784 struct tree_content *t;
785 unsigned int hc = hc_entries(cnt);
786
787 for (f = avail_tree_table[hc]; f; l = f, f = f->next_avail)
788 if (f->entry_capacity >= cnt)
789 break;
790
791 if (f) {
792 if (l)
793 l->next_avail = f->next_avail;
794 else
795 avail_tree_table[hc] = f->next_avail;
796 } else {
797 cnt = cnt & 7 ? ((cnt / 8) + 1) * 8 : cnt;
798 f = pool_alloc(sizeof(*t) + sizeof(t->entries[0]) * cnt);
799 f->entry_capacity = cnt;
800 }
801
802 t = (struct tree_content*)f;
803 t->entry_count = 0;
804 t->delta_depth = 0;
805 return t;
806}
807
808static void release_tree_entry(struct tree_entry *e);
809static void release_tree_content(struct tree_content *t)
810{
811 struct avail_tree_content *f = (struct avail_tree_content*)t;
812 unsigned int hc = hc_entries(f->entry_capacity);
813 f->next_avail = avail_tree_table[hc];
814 avail_tree_table[hc] = f;
815}
816
817static void release_tree_content_recursive(struct tree_content *t)
818{
819 unsigned int i;
820 for (i = 0; i < t->entry_count; i++)
821 release_tree_entry(t->entries[i]);
822 release_tree_content(t);
823}
824
825static struct tree_content *grow_tree_content(
826 struct tree_content *t,
827 int amt)
828{
829 struct tree_content *r = new_tree_content(t->entry_count + amt);
830 r->entry_count = t->entry_count;
831 r->delta_depth = t->delta_depth;
832 memcpy(r->entries,t->entries,t->entry_count*sizeof(t->entries[0]))__builtin___memcpy_chk (r->entries, t->entries, t->entry_count
*sizeof(t->entries[0]), __builtin_object_size (r->entries
, 0))
;
833 release_tree_content(t);
834 return r;
835}
836
837static struct tree_entry *new_tree_entry(void)
838{
839 struct tree_entry *e;
840
841 if (!avail_tree_entry) {
842 unsigned int n = tree_entry_alloc;
843 total_allocd += n * sizeof(struct tree_entry);
844 ALLOC_ARRAY(e, n)(e) = xmalloc(st_mult(sizeof(*(e)), (n)));
845 avail_tree_entry = e;
846 while (n-- > 1) {
847 *((void**)e) = e + 1;
848 e++;
849 }
850 *((void**)e) = NULL((void*)0);
851 }
852
853 e = avail_tree_entry;
854 avail_tree_entry = *((void**)e);
855 return e;
856}
857
858static void release_tree_entry(struct tree_entry *e)
859{
860 if (e->tree)
861 release_tree_content_recursive(e->tree);
862 *((void**)e) = avail_tree_entry;
863 avail_tree_entry = e;
864}
865
866static struct tree_content *dup_tree_content(struct tree_content *s)
867{
868 struct tree_content *d;
869 struct tree_entry *a, *b;
870 unsigned int i;
871
872 if (!s)
873 return NULL((void*)0);
874 d = new_tree_content(s->entry_count);
875 for (i = 0; i < s->entry_count; i++) {
876 a = s->entries[i];
877 b = new_tree_entry();
878 memcpy(b, a, sizeof(*a))__builtin___memcpy_chk (b, a, sizeof(*a), __builtin_object_size
(b, 0))
;
879 if (a->tree && is_null_sha1(b->versions[1].sha1))
880 b->tree = dup_tree_content(a->tree);
881 else
882 b->tree = NULL((void*)0);
883 d->entries[i] = b;
884 }
885 d->entry_count = s->entry_count;
886 d->delta_depth = s->delta_depth;
887
888 return d;
889}
890
891static void start_packfile(void)
892{
893 static char tmp_file[PATH_MAX1024];
894 struct packed_git *p;
895 struct pack_header hdr;
896 int pack_fd;
897
898 pack_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
899 "pack/tmp_pack_XXXXXX");
900 FLEX_ALLOC_STR(p, pack_name, tmp_file)do { size_t flex_array_len_ = (strlen(tmp_file)); ((p)) = xcalloc
(1, st_add(st_add((sizeof(*((p)))),(flex_array_len_)),(1))); __builtin___memcpy_chk
((void *)((p))->pack_name, ((tmp_file)), flex_array_len_,
__builtin_object_size ((void *)((p))->pack_name, 0)); } while
(0)
;
901 p->pack_fd = pack_fd;
902 p->do_not_close = 1;
903 pack_file = sha1fd(pack_fd, p->pack_name);
904
905 hdr.hdr_signature = htonl(PACK_SIGNATURE)git_bswap32(0x5041434b);
906 hdr.hdr_version = htonl(2)git_bswap32(2);
907 hdr.hdr_entries = 0;
908 sha1write(pack_file, &hdr, sizeof(hdr));
909
910 pack_data = p;
911 pack_size = sizeof(hdr);
912 object_count = 0;
913
914 REALLOC_ARRAY(all_packs, pack_id + 1)(all_packs) = xrealloc((all_packs), st_mult(sizeof(*(all_packs
)), (pack_id + 1)))
;
915 all_packs[pack_id] = p;
916}
917
918static const char *create_index(void)
919{
920 const char *tmpfile;
921 struct pack_idx_entry **idx, **c, **last;
922 struct object_entry *e;
923 struct object_entry_pool *o;
924
925 /* Build the table of object IDs. */
926 ALLOC_ARRAY(idx, object_count)(idx) = xmalloc(st_mult(sizeof(*(idx)), (object_count)));
927 c = idx;
928 for (o = blocks; o; o = o->next_pool)
929 for (e = o->next_free; e-- != o->entries;)
930 if (pack_id == e->pack_id)
931 *c++ = &e->idx;
932 last = idx + object_count;
933 if (c != last)
934 die("internal consistency error creating the index");
935
936 tmpfile = write_idx_file(NULL((void*)0), idx, object_count, &pack_idx_opts, pack_data->sha1);
937 free(idx);
938 return tmpfile;
939}
940
941static char *keep_pack(const char *curr_index_name)
942{
943 static char name[PATH_MAX1024];
944 static const char *keep_msg = "fast-import";
945 int keep_fd;
946
947 keep_fd = odb_pack_keep(name, sizeof(name), pack_data->sha1);
948 if (keep_fd < 0)
949 die_errno("cannot create keep file");
950 write_or_die(keep_fd, keep_msg, strlen(keep_msg));
951 if (close(keep_fd))
952 die_errno("failed to write keep file");
953
954 snprintf(name, sizeof(name), "%s/pack/pack-%s.pack",__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.pack", get_object_directory
(), sha1_to_hex(pack_data->sha1))
955 get_object_directory(), sha1_to_hex(pack_data->sha1))__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.pack", get_object_directory
(), sha1_to_hex(pack_data->sha1))
;
956 if (finalize_object_file(pack_data->pack_name, name))
957 die("cannot store pack file");
958
959 snprintf(name, sizeof(name), "%s/pack/pack-%s.idx",__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.idx", get_object_directory
(), sha1_to_hex(pack_data->sha1))
960 get_object_directory(), sha1_to_hex(pack_data->sha1))__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.idx", get_object_directory
(), sha1_to_hex(pack_data->sha1))
;
961 if (finalize_object_file(curr_index_name, name))
962 die("cannot store index file");
963 free((void *)curr_index_name);
964 return name;
965}
966
967static void unkeep_all_packs(void)
968{
969 static char name[PATH_MAX1024];
970 int k;
971
972 for (k = 0; k < pack_id; k++) {
973 struct packed_git *p = all_packs[k];
974 snprintf(name, sizeof(name), "%s/pack/pack-%s.keep",__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.keep", get_object_directory
(), sha1_to_hex(p->sha1))
975 get_object_directory(), sha1_to_hex(p->sha1))__builtin___snprintf_chk (name, sizeof(name), 0, __builtin_object_size
(name, 2 > 1 ? 1 : 0), "%s/pack/pack-%s.keep", get_object_directory
(), sha1_to_hex(p->sha1))
;
976 unlink_or_warn(name);
977 }
978}
979
980static int loosen_small_pack(const struct packed_git *p)
981{
982 struct child_process unpack = CHILD_PROCESS_INIT{ ((void*)0), { empty_argv, 0, 0 }, { empty_argv, 0, 0 } };
983
984 if (lseek(p->pack_fd, 0, SEEK_SET0) < 0)
985 die_errno("Failed seeking to start of '%s'", p->pack_name);
986
987 unpack.in = p->pack_fd;
988 unpack.git_cmd = 1;
989 unpack.stdout_to_stderr = 1;
990 argv_array_push(&unpack.args, "unpack-objects");
991 if (!show_stats)
992 argv_array_push(&unpack.args, "-q");
993
994 return run_command(&unpack);
995}
996
997static void end_packfile(void)
998{
999 static int running;
1000
1001 if (running || !pack_data)
1002 return;
1003
1004 running = 1;
1005 clear_delta_base_cache();
1006 if (object_count) {
1007 struct packed_git *new_p;
1008 unsigned char cur_pack_sha1[20];
1009 char *idx_name;
1010 int i;
1011 struct branch *b;
1012 struct tag *t;
1013
1014 close_pack_windows(pack_data);
1015 sha1close(pack_file, cur_pack_sha1, 0);
1016 fixup_pack_header_footer(pack_data->pack_fd, pack_data->sha1,
1017 pack_data->pack_name, object_count,
1018 cur_pack_sha1, pack_size);
1019
1020 if (object_count <= unpack_limit) {
1021 if (!loosen_small_pack(pack_data)) {
1022 invalidate_pack_id(pack_id);
1023 goto discard_pack;
1024 }
1025 }
1026
1027 close(pack_data->pack_fd);
1028 idx_name = keep_pack(create_index());
1029
1030 /* Register the packfile with core git's machinery. */
1031 new_p = add_packed_git(idx_name, strlen(idx_name), 1);
1032 if (!new_p)
1033 die("core git rejected index %s", idx_name);
1034 all_packs[pack_id] = new_p;
1035 install_packed_git(new_p);
1036
1037 /* Print the boundary */
1038 if (pack_edges) {
1039 fprintf(pack_edges, "%s:", new_p->pack_name);
1040 for (i = 0; i < branch_table_sz; i++) {
1041 for (b = branch_table[i]; b; b = b->table_next_branch) {
1042 if (b->pack_id == pack_id)
1043 fprintf(pack_edges, " %s", sha1_to_hex(b->sha1));
1044 }
1045 }
1046 for (t = first_tag; t; t = t->next_tag) {
1047 if (t->pack_id == pack_id)
1048 fprintf(pack_edges, " %s", sha1_to_hex(t->sha1));
1049 }
1050 fputc('\n', pack_edges);
1051 fflush(pack_edges);
1052 }
1053
1054 pack_id++;
1055 }
1056 else {
1057discard_pack:
1058 close(pack_data->pack_fd);
1059 unlink_or_warn(pack_data->pack_name);
1060 }
1061 free(pack_data);
1062 pack_data = NULL((void*)0);
1063 running = 0;
1064
1065 /* We can't carry a delta across packfiles. */
1066 strbuf_release(&last_blob.data);
1067 last_blob.offset = 0;
1068 last_blob.depth = 0;
1069}
1070
1071static void cycle_packfile(void)
1072{
1073 end_packfile();
1074 start_packfile();
1075}
1076
1077static int store_object(
1078 enum object_type type,
1079 struct strbuf *dat,
1080 struct last_object *last,
1081 unsigned char *sha1out,
1082 uintmax_t mark)
1083{
1084 void *out, *delta;
1085 struct object_entry *e;
1086 unsigned char hdr[96];
1087 unsigned char sha1[20];
1088 unsigned long hdrlen, deltalen;
1089 git_SHA_CTXblk_SHA_CTX c;
1090 git_zstream s;
1091
1092 hdrlen = xsnprintf((char *)hdr, sizeof(hdr), "%s %lu",
1093 typename(type), (unsigned long)dat->len) + 1;
1094 git_SHA1_Initblk_SHA1_Init(&c);
1095 git_SHA1_Updategit_SHA1_Update_Chunked(&c, hdr, hdrlen);
1096 git_SHA1_Updategit_SHA1_Update_Chunked(&c, dat->buf, dat->len);
1097 git_SHA1_Finalblk_SHA1_Final(sha1, &c);
1098 if (sha1out)
1099 hashcpy(sha1out, sha1);
1100
1101 e = insert_object(sha1);
1102 if (mark)
1103 insert_mark(mark, e);
1104 if (e->idx.offset) {
1105 duplicate_count_by_type[type]++;
1106 return 1;
1107 } else if (find_sha1_pack(sha1, packed_git)) {
1108 e->type = type;
1109 e->pack_id = MAX_PACK_ID((1<<16)-1);
1110 e->idx.offset = 1; /* just not zero! */
1111 duplicate_count_by_type[type]++;
1112 return 1;
1113 }
1114
1115 if (last && last->data.buf && last->depth < max_depth && dat->len > 20) {
1116 delta_count_attempts_by_type[type]++;
1117 delta = diff_delta(last->data.buf, last->data.len,
1118 dat->buf, dat->len,
1119 &deltalen, dat->len - 20);
1120 } else
1121 delta = NULL((void*)0);
1122
1123 git_deflate_init(&s, pack_compression_level);
1124 if (delta) {
1125 s.next_in = delta;
1126 s.avail_in = deltalen;
1127 } else {
1128 s.next_in = (void *)dat->buf;
1129 s.avail_in = dat->len;
1130 }
1131 s.avail_out = git_deflate_bound(&s, s.avail_in);
1132 s.next_out = out = xmalloc(s.avail_out);
1133 while (git_deflate(&s, Z_FINISH4) == Z_OK0)
1134 ; /* nothing */
1135 git_deflate_end(&s);
1136
1137 /* Determine if we should auto-checkpoint. */
1138 if ((max_packsize && (pack_size + 60 + s.total_out) > max_packsize)
1139 || (pack_size + 60 + s.total_out) < pack_size) {
1140
1141 /* This new object needs to *not* have the current pack_id. */
1142 e->pack_id = pack_id + 1;
1143 cycle_packfile();
1144
1145 /* We cannot carry a delta into the new pack. */
1146 if (delta) {
1147 free(delta);
1148 delta = NULL((void*)0);
1149
1150 git_deflate_init(&s, pack_compression_level);
1151 s.next_in = (void *)dat->buf;
1152 s.avail_in = dat->len;
1153 s.avail_out = git_deflate_bound(&s, s.avail_in);
1154 s.next_out = out = xrealloc(out, s.avail_out);
1155 while (git_deflate(&s, Z_FINISH4) == Z_OK0)
1156 ; /* nothing */
1157 git_deflate_end(&s);
1158 }
1159 }
1160
1161 e->type = type;
1162 e->pack_id = pack_id;
1163 e->idx.offset = pack_size;
1164 object_count++;
1165 object_count_by_type[type]++;
1166
1167 crc32_begin(pack_file);
1168
1169 if (delta) {
1170 off_t ofs = e->idx.offset - last->offset;
1171 unsigned pos = sizeof(hdr) - 1;
1172
1173 delta_count_by_type[type]++;
1174 e->depth = last->depth + 1;
1175
1176 hdrlen = encode_in_pack_object_header(OBJ_OFS_DELTA, deltalen, hdr);
1177 sha1write(pack_file, hdr, hdrlen);
1178 pack_size += hdrlen;
1179
1180 hdr[pos] = ofs & 127;
1181 while (ofs >>= 7)
1182 hdr[--pos] = 128 | (--ofs & 127);
1183 sha1write(pack_file, hdr + pos, sizeof(hdr) - pos);
1184 pack_size += sizeof(hdr) - pos;
1185 } else {
1186 e->depth = 0;
1187 hdrlen = encode_in_pack_object_header(type, dat->len, hdr);
1188 sha1write(pack_file, hdr, hdrlen);
1189 pack_size += hdrlen;
1190 }
1191
1192 sha1write(pack_file, out, s.total_out);
1193 pack_size += s.total_out;
1194
1195 e->idx.crc32 = crc32_end(pack_file);
1196
1197 free(out);
1198 free(delta);
1199 if (last) {
1200 if (last->no_swap) {
1201 last->data = *dat;
1202 } else {
1203 strbuf_swap(&last->data, dat);
1204 }
1205 last->offset = e->idx.offset;
1206 last->depth = e->depth;
1207 }
1208 return 0;
1209}
1210
1211static void truncate_pack(struct sha1file_checkpoint *checkpoint)
1212{
1213 if (sha1file_truncate(pack_file, checkpoint))
1214 die_errno("cannot truncate pack to skip duplicate");
1215 pack_size = checkpoint->offset;
1216}
1217
1218static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
1219{
1220 size_t in_sz = 64 * 1024, out_sz = 64 * 1024;
1221 unsigned char *in_buf = xmalloc(in_sz);
1222 unsigned char *out_buf = xmalloc(out_sz);
1223 struct object_entry *e;
1224 unsigned char sha1[20];
1225 unsigned long hdrlen;
1226 off_t offset;
1227 git_SHA_CTXblk_SHA_CTX c;
1228 git_zstream s;
1229 struct sha1file_checkpoint checkpoint;
1230 int status = Z_OK0;
1231
1232 /* Determine if we should auto-checkpoint. */
1233 if ((max_packsize && (pack_size + 60 + len) > max_packsize)
1234 || (pack_size + 60 + len) < pack_size)
1235 cycle_packfile();
1236
1237 sha1file_checkpoint(pack_file, &checkpoint);
1238 offset = checkpoint.offset;
1239
1240 hdrlen = snprintf((char *)out_buf, out_sz, "blob %" PRIuMAX, len)__builtin___snprintf_chk ((char *)out_buf, out_sz, 0, __builtin_object_size
((char *)out_buf, 2 > 1 ? 1 : 0), "blob %" "j" "u", len)
+ 1;
1241 if (out_sz <= hdrlen)
1242 die("impossibly large object header");
1243
1244 git_SHA1_Initblk_SHA1_Init(&c);
1245 git_SHA1_Updategit_SHA1_Update_Chunked(&c, out_buf, hdrlen);
1246
1247 crc32_begin(pack_file);
1248
1249 git_deflate_init(&s, pack_compression_level);
1250
1251 hdrlen = encode_in_pack_object_header(OBJ_BLOB, len, out_buf);
1252 if (out_sz <= hdrlen)
1253 die("impossibly large object header");
1254
1255 s.next_out = out_buf + hdrlen;
1256 s.avail_out = out_sz - hdrlen;
1257
1258 while (status != Z_STREAM_END1) {
1259 if (0 < len && !s.avail_in) {
1260 size_t cnt = in_sz < len ? in_sz : (size_t)len;
1261 size_t n = fread(in_buf, 1, cnt, stdin__stdinp);
1262 if (!n && feof(stdin__stdinp))
1263 die("EOF in data (%" PRIuMAX"j" "u" " bytes remaining)", len);
1264
1265 git_SHA1_Updategit_SHA1_Update_Chunked(&c, in_buf, n);
1266 s.next_in = in_buf;
1267 s.avail_in = n;
1268 len -= n;
1269 }
1270
1271 status = git_deflate(&s, len ? 0 : Z_FINISH4);
1272
1273 if (!s.avail_out || status == Z_STREAM_END1) {
1274 size_t n = s.next_out - out_buf;
1275 sha1write(pack_file, out_buf, n);
1276 pack_size += n;
1277 s.next_out = out_buf;
1278 s.avail_out = out_sz;
1279 }
1280
1281 switch (status) {
1282 case Z_OK0:
1283 case Z_BUF_ERROR(-5):
1284 case Z_STREAM_END1:
1285 continue;
1286 default:
1287 die("unexpected deflate failure: %d", status);
1288 }
1289 }
1290 git_deflate_end(&s);
1291 git_SHA1_Finalblk_SHA1_Final(sha1, &c);
1292
1293 if (sha1out)
1294 hashcpy(sha1out, sha1);
1295
1296 e = insert_object(sha1);
1297
1298 if (mark)
1299 insert_mark(mark, e);
1300
1301 if (e->idx.offset) {
1302 duplicate_count_by_type[OBJ_BLOB]++;
1303 truncate_pack(&checkpoint);
1304
1305 } else if (find_sha1_pack(sha1, packed_git)) {
1306 e->type = OBJ_BLOB;
1307 e->pack_id = MAX_PACK_ID((1<<16)-1);
1308 e->idx.offset = 1; /* just not zero! */
1309 duplicate_count_by_type[OBJ_BLOB]++;
1310 truncate_pack(&checkpoint);
1311
1312 } else {
1313 e->depth = 0;
1314 e->type = OBJ_BLOB;
1315 e->pack_id = pack_id;
1316 e->idx.offset = offset;
1317 e->idx.crc32 = crc32_end(pack_file);
1318 object_count++;
1319 object_count_by_type[OBJ_BLOB]++;
1320 }
1321
1322 free(in_buf);
1323 free(out_buf);
1324}
1325
1326/* All calls must be guarded by find_object() or find_mark() to
1327 * ensure the 'struct object_entry' passed was written by this
1328 * process instance. We unpack the entry by the offset, avoiding
1329 * the need for the corresponding .idx file. This unpacking rule
1330 * works because we only use OBJ_REF_DELTA within the packfiles
1331 * created by fast-import.
1332 *
1333 * oe must not be NULL. Such an oe usually comes from giving
1334 * an unknown SHA-1 to find_object() or an undefined mark to
1335 * find_mark(). Callers must test for this condition and use
1336 * the standard read_sha1_file() when it happens.
1337 *
1338 * oe->pack_id must not be MAX_PACK_ID. Such an oe is usually from
1339 * find_mark(), where the mark was reloaded from an existing marks
1340 * file and is referencing an object that this fast-import process
1341 * instance did not write out to a packfile. Callers must test for
1342 * this condition and use read_sha1_file() instead.
1343 */
1344static void *gfi_unpack_entry(
1345 struct object_entry *oe,
1346 unsigned long *sizep)
1347{
1348 enum object_type type;
1349 struct packed_git *p = all_packs[oe->pack_id];
1350 if (p == pack_data && p->pack_size < (pack_size + 20)) {
1351 /* The object is stored in the packfile we are writing to
1352 * and we have modified it since the last time we scanned
1353 * back to read a previously written object. If an old
1354 * window covered [p->pack_size, p->pack_size + 20) its
1355 * data is stale and is not valid. Closing all windows
1356 * and updating the packfile length ensures we can read
1357 * the newly written data.
1358 */
1359 close_pack_windows(p);
1360 sha1flush(pack_file);
1361
1362 /* We have to offer 20 bytes additional on the end of
1363 * the packfile as the core unpacker code assumes the
1364 * footer is present at the file end and must promise
1365 * at least 20 bytes within any window it maps. But
1366 * we don't actually create the footer here.
1367 */
1368 p->pack_size = pack_size + 20;
1369 }
1370 return unpack_entry(p, oe->idx.offset, &type, sizep);
1371}
1372
1373static const char *get_mode(const char *str, uint16_t *modep)
1374{
1375 unsigned char c;
1376 uint16_t mode = 0;
1377
1378 while ((c = *str++) != ' ') {
1379 if (c < '0' || c > '7')
1380 return NULL((void*)0);
1381 mode = (mode << 3) + (c - '0');
1382 }
1383 *modep = mode;
1384 return str;
1385}
1386
1387static void load_tree(struct tree_entry *root)
1388{
1389 unsigned char *sha1 = root->versions[1].sha1;
1390 struct object_entry *myoe;
1391 struct tree_content *t;
1392 unsigned long size;
1393 char *buf;
1394 const char *c;
1395
1396 root->tree = t = new_tree_content(8);
1397 if (is_null_sha1(sha1))
1398 return;
1399
1400 myoe = find_object(sha1);
1401 if (myoe && myoe->pack_id != MAX_PACK_ID((1<<16)-1)) {
1402 if (myoe->type != OBJ_TREE)
1403 die("Not a tree: %s", sha1_to_hex(sha1));
1404 t->delta_depth = myoe->depth;
1405 buf = gfi_unpack_entry(myoe, &size);
1406 if (!buf)
1407 die("Can't load tree %s", sha1_to_hex(sha1));
1408 } else {
1409 enum object_type type;
1410 buf = read_sha1_file(sha1, &type, &size);
1411 if (!buf || type != OBJ_TREE)
1412 die("Can't load tree %s", sha1_to_hex(sha1));
1413 }
1414
1415 c = buf;
1416 while (c != (buf + size)) {
1417 struct tree_entry *e = new_tree_entry();
1418
1419 if (t->entry_count == t->entry_capacity)
1420 root->tree = t = grow_tree_content(t, t->entry_count);
1421 t->entries[t->entry_count++] = e;
1422
1423 e->tree = NULL((void*)0);
1424 c = get_mode(c, &e->versions[1].mode);
1425 if (!c)
1426 die("Corrupt mode in %s", sha1_to_hex(sha1));
1427 e->versions[0].mode = e->versions[1].mode;
1428 e->name = to_atom(c, strlen(c));
1429 c += e->name->str_len + 1;
1430 hashcpy(e->versions[0].sha1, (unsigned char *)c);
1431 hashcpy(e->versions[1].sha1, (unsigned char *)c);
1432 c += 20;
1433 }
1434 free(buf);
1435}
1436
1437static int tecmp0 (const void *_a, const void *_b)
1438{
1439 struct tree_entry *a = *((struct tree_entry**)_a);
1440 struct tree_entry *b = *((struct tree_entry**)_b);
1441 return base_name_compare(
1442 a->name->str_dat, a->name->str_len, a->versions[0].mode,
1443 b->name->str_dat, b->name->str_len, b->versions[0].mode);
1444}
1445
1446static int tecmp1 (const void *_a, const void *_b)
1447{
1448 struct tree_entry *a = *((struct tree_entry**)_a);
1449 struct tree_entry *b = *((struct tree_entry**)_b);
1450 return base_name_compare(
1451 a->name->str_dat, a->name->str_len, a->versions[1].mode,
1452 b->name->str_dat, b->name->str_len, b->versions[1].mode);
1453}
1454
1455static void mktree(struct tree_content *t, int v, struct strbuf *b)
1456{
1457 size_t maxlen = 0;
1458 unsigned int i;
1459
1460 if (!v)
1461 QSORT(t->entries, t->entry_count, tecmp0)sane_qsort((t->entries), (t->entry_count), sizeof(*(t->
entries)), tecmp0)
;
1462 else
1463 QSORT(t->entries, t->entry_count, tecmp1)sane_qsort((t->entries), (t->entry_count), sizeof(*(t->
entries)), tecmp1)
;
1464
1465 for (i = 0; i < t->entry_count; i++) {
1466 if (t->entries[i]->versions[v].mode)
1467 maxlen += t->entries[i]->name->str_len + 34;
1468 }
1469
1470 strbuf_reset(b)strbuf_setlen(b, 0);
1471 strbuf_grow(b, maxlen);
1472 for (i = 0; i < t->entry_count; i++) {
1473 struct tree_entry *e = t->entries[i];
1474 if (!e->versions[v].mode)
1475 continue;
1476 strbuf_addf(b, "%o %s%c",
1477 (unsigned int)(e->versions[v].mode & ~NO_DELTA0004000),
1478 e->name->str_dat, '\0');
1479 strbuf_add(b, e->versions[v].sha1, 20);
1480 }
1481}
1482
1483static void store_tree(struct tree_entry *root)
1484{
1485 struct tree_content *t;
1486 unsigned int i, j, del;
1487 struct last_object lo = { STRBUF_INIT{ 0, 0, strbuf_slopbuf }, 0, 0, /* no_swap */ 1 };
1488 struct object_entry *le = NULL((void*)0);
1489
1490 if (!is_null_sha1(root->versions[1].sha1))
1491 return;
1492
1493 if (!root->tree)
1494 load_tree(root);
1495 t = root->tree;
1496
1497 for (i = 0; i < t->entry_count; i++) {
1498 if (t->entries[i]->tree)
1499 store_tree(t->entries[i]);
1500 }
1501
1502 if (!(root->versions[0].mode & NO_DELTA0004000))
1503 le = find_object(root->versions[0].sha1);
1504 if (S_ISDIR(root->versions[0].mode)(((root->versions[0].mode) & 0170000) == 0040000) && le && le->pack_id == pack_id) {
1505 mktree(t, 0, &old_tree);
1506 lo.data = old_tree;
1507 lo.offset = le->idx.offset;
1508 lo.depth = t->delta_depth;
1509 }
1510
1511 mktree(t, 1, &new_tree);
1512 store_object(OBJ_TREE, &new_tree, &lo, root->versions[1].sha1, 0);
1513
1514 t->delta_depth = lo.depth;
1515 for (i = 0, j = 0, del = 0; i < t->entry_count; i++) {
1516 struct tree_entry *e = t->entries[i];
1517 if (e->versions[1].mode) {
1518 e->versions[0].mode = e->versions[1].mode;
1519 hashcpy(e->versions[0].sha1, e->versions[1].sha1);
1520 t->entries[j++] = e;
1521 } else {
1522 release_tree_entry(e);
1523 del++;
1524 }
1525 }
1526 t->entry_count -= del;
1527}
1528
1529static void tree_content_replace(
1530 struct tree_entry *root,
1531 const unsigned char *sha1,
1532 const uint16_t mode,
1533 struct tree_content *newtree)
1534{
1535 if (!S_ISDIR(mode)(((mode) & 0170000) == 0040000))
1536 die("Root cannot be a non-directory");
1537 hashclr(root->versions[0].sha1);
1538 hashcpy(root->versions[1].sha1, sha1);
1539 if (root->tree)
1540 release_tree_content_recursive(root->tree);
1541 root->tree = newtree;
1542}
1543
1544static int tree_content_set(
1545 struct tree_entry *root,
1546 const char *p,
1547 const unsigned char *sha1,
1548 const uint16_t mode,
1549 struct tree_content *subtree)
1550{
1551 struct tree_content *t;
1552 const char *slash1;
1553 unsigned int i, n;
1554 struct tree_entry *e;
1555
1556 slash1 = strchrnulgitstrchrnul(p, '/');
1557 n = slash1 - p;
1558 if (!n)
1559 die("Empty path component found in input");
1560 if (!*slash1 && !S_ISDIR(mode)(((mode) & 0170000) == 0040000) && subtree)
1561 die("Non-directories cannot have subtrees");
1562
1563 if (!root->tree)
1564 load_tree(root);
1565 t = root->tree;
1566 for (i = 0; i < t->entry_count; i++) {
1567 e = t->entries[i];
1568 if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
1569 if (!*slash1) {
1570 if (!S_ISDIR(mode)(((mode) & 0170000) == 0040000)
1571 && e->versions[1].mode == mode
1572 && !hashcmp(e->versions[1].sha1, sha1))
1573 return 0;
1574 e->versions[1].mode = mode;
1575 hashcpy(e->versions[1].sha1, sha1);
1576 if (e->tree)
1577 release_tree_content_recursive(e->tree);
1578 e->tree = subtree;
1579
1580 /*
1581 * We need to leave e->versions[0].sha1 alone
1582 * to avoid modifying the preimage tree used
1583 * when writing out the parent directory.
1584 * But after replacing the subdir with a
1585 * completely different one, it's not a good
1586 * delta base any more, and besides, we've
1587 * thrown away the tree entries needed to
1588 * make a delta against it.
1589 *
1590 * So let's just explicitly disable deltas
1591 * for the subtree.
1592 */
1593 if (S_ISDIR(e->versions[0].mode)(((e->versions[0].mode) & 0170000) == 0040000))
1594 e->versions[0].mode |= NO_DELTA0004000;
1595
1596 hashclr(root->versions[1].sha1);
1597 return 1;
1598 }
1599 if (!S_ISDIR(e->versions[1].mode)(((e->versions[1].mode) & 0170000) == 0040000)) {
1600 e->tree = new_tree_content(8);
1601 e->versions[1].mode = S_IFDIR0040000;
1602 }
1603 if (!e->tree)
1604 load_tree(e);
1605 if (tree_content_set(e, slash1 + 1, sha1, mode, subtree)) {
1606 hashclr(root->versions[1].sha1);
1607 return 1;
1608 }
1609 return 0;
1610 }
1611 }
1612
1613 if (t->entry_count == t->entry_capacity)
1614 root->tree = t = grow_tree_content(t, t->entry_count);
1615 e = new_tree_entry();
1616 e->name = to_atom(p, n);
1617 e->versions[0].mode = 0;
1618 hashclr(e->versions[0].sha1);
1619 t->entries[t->entry_count++] = e;
1620 if (*slash1) {
1621 e->tree = new_tree_content(8);
1622 e->versions[1].mode = S_IFDIR0040000;
1623 tree_content_set(e, slash1 + 1, sha1, mode, subtree);
1624 } else {
1625 e->tree = subtree;
1626 e->versions[1].mode = mode;
1627 hashcpy(e->versions[1].sha1, sha1);
1628 }
1629 hashclr(root->versions[1].sha1);
1630 return 1;
1631}
1632
1633static int tree_content_remove(
1634 struct tree_entry *root,
1635 const char *p,
1636 struct tree_entry *backup_leaf,
1637 int allow_root)
1638{
1639 struct tree_content *t;
1640 const char *slash1;
1641 unsigned int i, n;
1642 struct tree_entry *e;
1643
1644 slash1 = strchrnulgitstrchrnul(p, '/');
1645 n = slash1 - p;
1646
1647 if (!root->tree)
1648 load_tree(root);
1649
1650 if (!*p && allow_root) {
1651 e = root;
1652 goto del_entry;
1653 }
1654
1655 t = root->tree;
1656 for (i = 0; i < t->entry_count; i++) {
1657 e = t->entries[i];
1658 if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
1659 if (*slash1 && !S_ISDIR(e->versions[1].mode)(((e->versions[1].mode) & 0170000) == 0040000))
1660 /*
1661 * If p names a file in some subdirectory, and a
1662 * file or symlink matching the name of the
1663 * parent directory of p exists, then p cannot
1664 * exist and need not be deleted.
1665 */
1666 return 1;
1667 if (!*slash1 || !S_ISDIR(e->versions[1].mode)(((e->versions[1].mode) & 0170000) == 0040000))
1668 goto del_entry;
1669 if (!e->tree)
1670 load_tree(e);
1671 if (tree_content_remove(e, slash1 + 1, backup_leaf, 0)) {
1672 for (n = 0; n < e->tree->entry_count; n++) {
1673 if (e->tree->entries[n]->versions[1].mode) {
1674 hashclr(root->versions[1].sha1);
1675 return 1;
1676 }
1677 }
1678 backup_leaf = NULL((void*)0);
1679 goto del_entry;
1680 }
1681 return 0;
1682 }
1683 }
1684 return 0;
1685
1686del_entry:
1687 if (backup_leaf)
1688 memcpy(backup_leaf, e, sizeof(*backup_leaf))__builtin___memcpy_chk (backup_leaf, e, sizeof(*backup_leaf),
__builtin_object_size (backup_leaf, 0))
;
1689 else if (e->tree)
1690 release_tree_content_recursive(e->tree);
1691 e->tree = NULL((void*)0);
1692 e->versions[1].mode = 0;
1693 hashclr(e->versions[1].sha1);
1694 hashclr(root->versions[1].sha1);
1695 return 1;
1696}
1697
1698static int tree_content_get(
1699 struct tree_entry *root,
1700 const char *p,
1701 struct tree_entry *leaf,
1702 int allow_root)
1703{
1704 struct tree_content *t;
1705 const char *slash1;
1706 unsigned int i, n;
1707 struct tree_entry *e;
1708
1709 slash1 = strchrnulgitstrchrnul(p, '/');
1710 n = slash1 - p;
1711 if (!n && !allow_root)
1712 die("Empty path component found in input");
1713
1714 if (!root->tree)
1715 load_tree(root);
1716
1717 if (!n) {
1718 e = root;
1719 goto found_entry;
1720 }
1721
1722 t = root->tree;
1723 for (i = 0; i < t->entry_count; i++) {
1724 e = t->entries[i];
1725 if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
1726 if (!*slash1)
1727 goto found_entry;
1728 if (!S_ISDIR(e->versions[1].mode)(((e->versions[1].mode) & 0170000) == 0040000))
1729 return 0;
1730 if (!e->tree)
1731 load_tree(e);
1732 return tree_content_get(e, slash1 + 1, leaf, 0);
1733 }
1734 }
1735 return 0;
1736
1737found_entry:
1738 memcpy(leaf, e, sizeof(*leaf))__builtin___memcpy_chk (leaf, e, sizeof(*leaf), __builtin_object_size
(leaf, 0))
;
1739 if (e->tree && is_null_sha1(e->versions[1].sha1))
1740 leaf->tree = dup_tree_content(e->tree);
1741 else
1742 leaf->tree = NULL((void*)0);
1743 return 1;
1744}
1745
1746static int update_branch(struct branch *b)
1747{
1748 static const char *msg = "fast-import";
1749 struct ref_transaction *transaction;
1750 unsigned char old_sha1[20];
1751 struct strbuf err = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
1752
1753 if (is_null_sha1(b->sha1)) {
1754 if (b->delete)
1755 delete_ref(b->name, NULL((void*)0), 0);
1756 return 0;
1757 }
1758 if (read_ref(b->name, old_sha1))
1759 hashclr(old_sha1);
1760 if (!force_update && !is_null_sha1(old_sha1)) {
1761 struct commit *old_cmit, *new_cmit;
1762
1763 old_cmit = lookup_commit_reference_gently(old_sha1, 0);
1764 new_cmit = lookup_commit_reference_gently(b->sha1, 0);
1765 if (!old_cmit || !new_cmit)
1766 return error("Branch %s is missing commits.", b->name)(error("Branch %s is missing commits.", b->name), const_error
())
;
1767
1768 if (!in_merge_bases(old_cmit, new_cmit)) {
1769 warning("Not updating %s"
1770 " (new tip %s does not contain %s)",
1771 b->name, sha1_to_hex(b->sha1), sha1_to_hex(old_sha1));
1772 return -1;
1773 }
1774 }
1775 transaction = ref_transaction_begin(&err);
1776 if (!transaction ||
1777 ref_transaction_update(transaction, b->name, b->sha1, old_sha1,
1778 0, msg, &err) ||
1779 ref_transaction_commit(transaction, &err)) {
1780 ref_transaction_free(transaction);
1781 error("%s", err.buf)(error("%s", err.buf), const_error());
1782 strbuf_release(&err);
1783 return -1;
1784 }
1785 ref_transaction_free(transaction);
1786 strbuf_release(&err);
1787 return 0;
1788}
1789
1790static void dump_branches(void)
1791{
1792 unsigned int i;
1793 struct branch *b;
1794
1795 for (i = 0; i < branch_table_sz; i++) {
1796 for (b = branch_table[i]; b; b = b->table_next_branch)
1797 failure |= update_branch(b);
1798 }
1799}
1800
1801static void dump_tags(void)
1802{
1803 static const char *msg = "fast-import";
1804 struct tag *t;
1805 struct strbuf ref_name = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
1806 struct strbuf err = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
1807 struct ref_transaction *transaction;
1808
1809 transaction = ref_transaction_begin(&err);
1810 if (!transaction) {
1811 failure |= error("%s", err.buf)(error("%s", err.buf), const_error());
1812 goto cleanup;
1813 }
1814 for (t = first_tag; t; t = t->next_tag) {
1815 strbuf_reset(&ref_name)strbuf_setlen(&ref_name, 0);
1816 strbuf_addf(&ref_name, "refs/tags/%s", t->name);
1817
1818 if (ref_transaction_update(transaction, ref_name.buf,
1819 t->sha1, NULL((void*)0), 0, msg, &err)) {
1820 failure |= error("%s", err.buf)(error("%s", err.buf), const_error());
1821 goto cleanup;
1822 }
1823 }
1824 if (ref_transaction_commit(transaction, &err))
1825 failure |= error("%s", err.buf)(error("%s", err.buf), const_error());
1826
1827 cleanup:
1828 ref_transaction_free(transaction);
1829 strbuf_release(&ref_name);
1830 strbuf_release(&err);
1831}
1832
1833static void dump_marks_helper(FILE *f,
1834 uintmax_t base,
1835 struct mark_set *m)
1836{
1837 uintmax_t k;
1838 if (m->shift) {
1839 for (k = 0; k < 1024; k++) {
1840 if (m->data.sets[k])
1841 dump_marks_helper(f, base + (k << m->shift),
1842 m->data.sets[k]);
1843 }
1844 } else {
1845 for (k = 0; k < 1024; k++) {
1846 if (m->data.marked[k])
1847 fprintf(f, ":%" PRIuMAX"j" "u" " %s\n", base + k,
1848 sha1_to_hex(m->data.marked[k]->idx.sha1));
1849 }
1850 }
1851}
1852
1853static void dump_marks(void)
1854{
1855 static struct lock_file mark_lock;
1856 FILE *f;
1857
1858 if (!export_marks_file || (import_marks_file && !import_marks_file_done))
1859 return;
1860
1861 if (hold_lock_file_for_update(&mark_lock, export_marks_file, 0) < 0) {
1862 failure |= error_errno("Unable to write marks file %s",(error_errno("Unable to write marks file %s", export_marks_file
), const_error())
1863 export_marks_file)(error_errno("Unable to write marks file %s", export_marks_file
), const_error())
;
1864 return;
1865 }
1866
1867 f = fdopen_lock_file(&mark_lock, "w");
1868 if (!f) {
1869 int saved_errno = errno(*__error());
1870 rollback_lock_file(&mark_lock);
1871 failure |= error("Unable to write marks file %s: %s",(error("Unable to write marks file %s: %s", export_marks_file
, strerror(saved_errno)), const_error())
1872 export_marks_file, strerror(saved_errno))(error("Unable to write marks file %s: %s", export_marks_file
, strerror(saved_errno)), const_error())
;
1873 return;
1874 }
1875
1876 dump_marks_helper(f, 0, marks);
1877 if (commit_lock_file(&mark_lock)) {
1878 failure |= error_errno("Unable to write file %s",(error_errno("Unable to write file %s", export_marks_file), const_error
())
1879 export_marks_file)(error_errno("Unable to write file %s", export_marks_file), const_error
())
;
1880 return;
1881 }
1882}
1883
1884static void read_marks(void)
1885{
1886 char line[512];
1887 FILE *f = fopen(import_marks_file, "r");
1888 if (f)
1889 ;
1890 else if (import_marks_file_ignore_missing && errno(*__error()) == ENOENT2)
1891 goto done; /* Marks file does not exist */
1892 else
1893 die_errno("cannot read '%s'", import_marks_file);
1894 while (fgets(line, sizeof(line), f)) {
1895 uintmax_t mark;
1896 char *end;
1897 unsigned char sha1[20];
1898 struct object_entry *e;
1899
1900 end = strchr(line, '\n');
1901 if (line[0] != ':' || !end)
1902 die("corrupt mark line: %s", line);
1903 *end = 0;
1904 mark = strtoumax(line + 1, &end, 10);
1905 if (!mark || end == line + 1
1906 || *end != ' ' || get_sha1_hex(end + 1, sha1))
1907 die("corrupt mark line: %s", line);
1908 e = find_object(sha1);
1909 if (!e) {
1910 enum object_type type = sha1_object_info(sha1, NULL((void*)0));
1911 if (type < 0)
1912 die("object not found: %s", sha1_to_hex(sha1));
1913 e = insert_object(sha1);
1914 e->type = type;
1915 e->pack_id = MAX_PACK_ID((1<<16)-1);
1916 e->idx.offset = 1; /* just not zero! */
1917 }
1918 insert_mark(mark, e);
1919 }
1920 fclose(f);
1921done:
1922 import_marks_file_done = 1;
1923}
1924
1925
1926static int read_next_command(void)
1927{
1928 static int stdin_eof = 0;
1929
1930 if (stdin_eof) {
61
Taking false branch
1931 unread_command_buf = 0;
1932 return EOF(-1);
1933 }
1934
1935 for (;;) {
62
Loop condition is true. Entering loop body
1936 const char *p;
1937
1938 if (unread_command_buf) {
63
Assuming 'unread_command_buf' is not equal to 0
64
Taking true branch
1939 unread_command_buf = 0;
1940 } else {
1941 struct recent_command *rc;
1942
1943 strbuf_detach(&command_buf, NULL((void*)0));
1944 stdin_eof = strbuf_getline_lf(&command_buf, stdin__stdinp);
1945 if (stdin_eof)
1946 return EOF(-1);
1947
1948 if (!seen_data_command
1949 && !starts_with(command_buf.buf, "feature ")
1950 && !starts_with(command_buf.buf, "option ")) {
1951 parse_argv();
1952 }
1953
1954 rc = rc_free;
1955 if (rc)
1956 rc_free = rc->next;
1957 else {
1958 rc = cmd_hist.next;
1959 cmd_hist.next = rc->next;
1960 cmd_hist.next->prev = &cmd_hist;
1961 free(rc->buf);
1962 }
1963
1964 rc->buf = command_buf.buf;
1965 rc->prev = cmd_tail;
1966 rc->next = cmd_hist.prev;
1967 rc->prev->next = rc;
1968 cmd_tail = rc;
1969 }
1970 if (skip_prefix(command_buf.buf, "get-mark ", &p)) {
65
Taking true branch
1971 parse_get_mark(p);
66
Calling 'parse_get_mark'
1972 continue;
1973 }
1974 if (skip_prefix(command_buf.buf, "cat-blob ", &p)) {
1975 parse_cat_blob(p);
1976 continue;
1977 }
1978 if (command_buf.buf[0] == '#')
1979 continue;
1980 return 0;
1981 }
1982}
1983
1984static void skip_optional_lf(void)
1985{
1986 int term_char = fgetc(stdin__stdinp);
1987 if (term_char != '\n' && term_char != EOF(-1))
1988 ungetc(term_char, stdin__stdinp);
1989}
1990
1991static void parse_mark(void)
1992{
1993 const char *v;
1994 if (skip_prefix(command_buf.buf, "mark :", &v)) {
1995 next_mark = strtoumax(v, NULL((void*)0), 10);
1996 read_next_command();
1997 }
1998 else
1999 next_mark = 0;
2000}
2001
2002static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res)
2003{
2004 const char *data;
2005 strbuf_reset(sb)strbuf_setlen(sb, 0);
2006
2007 if (!skip_prefix(command_buf.buf, "data ", &data))
2008 die("Expected 'data n' command, found: %s", command_buf.buf);
2009
2010 if (skip_prefix(data, "<<", &data)) {
2011 char *term = xstrdup(data);
2012 size_t term_len = command_buf.len - (data - command_buf.buf);
2013
2014 strbuf_detach(&command_buf, NULL((void*)0));
2015 for (;;) {
2016 if (strbuf_getline_lf(&command_buf, stdin__stdinp) == EOF(-1))
2017 die("EOF in data (terminator '%s' not found)", term);
2018 if (term_len == command_buf.len
2019 && !strcmp(term, command_buf.buf))
2020 break;
2021 strbuf_addbuf(sb, &command_buf);
2022 strbuf_addch(sb, '\n');
2023 }
2024 free(term);
2025 }
2026 else {
2027 uintmax_t len = strtoumax(data, NULL((void*)0), 10);
2028 size_t n = 0, length = (size_t)len;
2029
2030 if (limit && limit < len) {
2031 *len_res = len;
2032 return 0;
2033 }
2034 if (length < len)
2035 die("data is too large to use in this context");
2036
2037 while (n < length) {
2038 size_t s = strbuf_fread(sb, length - n, stdin__stdinp);
2039 if (!s && feof(stdin__stdinp))
2040 die("EOF in data (%lu bytes remaining)",
2041 (unsigned long)(length - n));
2042 n += s;
2043 }
2044 }
2045
2046 skip_optional_lf();
2047 return 1;
2048}
2049
2050static int validate_raw_date(const char *src, struct strbuf *result)
2051{
2052 const char *orig_src = src;
2053 char *endp;
2054 unsigned long num;
2055
2056 errno(*__error()) = 0;
2057
2058 num = strtoul(src, &endp, 10);
2059 /* NEEDSWORK: perhaps check for reasonable values? */
2060 if (errno(*__error()) || endp == src || *endp != ' ')
2061 return -1;
2062
2063 src = endp + 1;
2064 if (*src != '-' && *src != '+')
2065 return -1;
2066
2067 num = strtoul(src + 1, &endp, 10);
2068 if (errno(*__error()) || endp == src + 1 || *endp || 1400 < num)
2069 return -1;
2070
2071 strbuf_addstr(result, orig_src);
2072 return 0;
2073}
2074
2075static char *parse_ident(const char *buf)
2076{
2077 const char *ltgt;
2078 size_t name_len;
2079 struct strbuf ident = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2080
2081 /* ensure there is a space delimiter even if there is no name */
2082 if (*buf == '<')
2083 --buf;
2084
2085 ltgt = buf + strcspn(buf, "<>");
2086 if (*ltgt != '<')
2087 die("Missing < in ident string: %s", buf);
2088 if (ltgt != buf && ltgt[-1] != ' ')
2089 die("Missing space before < in ident string: %s", buf);
2090 ltgt = ltgt + 1 + strcspn(ltgt + 1, "<>");
2091 if (*ltgt != '>')
2092 die("Missing > in ident string: %s", buf);
2093 ltgt++;
2094 if (*ltgt != ' ')
2095 die("Missing space after > in ident string: %s", buf);
2096 ltgt++;
2097 name_len = ltgt - buf;
2098 strbuf_add(&ident, buf, name_len);
2099
2100 switch (whenspec) {
2101 case WHENSPEC_RAW:
2102 if (validate_raw_date(ltgt, &ident) < 0)
2103 die("Invalid raw date \"%s\" in ident: %s", ltgt, buf);
2104 break;
2105 case WHENSPEC_RFC2822:
2106 if (parse_date(ltgt, &ident) < 0)
2107 die("Invalid rfc2822 date \"%s\" in ident: %s", ltgt, buf);
2108 break;
2109 case WHENSPEC_NOW:
2110 if (strcmp("now", ltgt))
2111 die("Date in ident must be 'now': %s", buf);
2112 datestamp(&ident);
2113 break;
2114 }
2115
2116 return strbuf_detach(&ident, NULL((void*)0));
2117}
2118
2119static void parse_and_store_blob(
2120 struct last_object *last,
2121 unsigned char *sha1out,
2122 uintmax_t mark)
2123{
2124 static struct strbuf buf = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2125 uintmax_t len;
2126
2127 if (parse_data(&buf, big_file_threshold, &len))
2128 store_object(OBJ_BLOB, &buf, last, sha1out, mark);
2129 else {
2130 if (last) {
2131 strbuf_release(&last->data);
2132 last->offset = 0;
2133 last->depth = 0;
2134 }
2135 stream_blob(len, sha1out, mark);
2136 skip_optional_lf();
2137 }
2138}
2139
2140static void parse_new_blob(void)
2141{
2142 read_next_command();
2143 parse_mark();
2144 parse_and_store_blob(&last_blob, NULL((void*)0), next_mark);
2145}
2146
2147static void unload_one_branch(void)
2148{
2149 while (cur_active_branches
2150 && cur_active_branches >= max_active_branches) {
2151 uintmax_t min_commit = ULONG_MAX(9223372036854775807L *2UL+1UL);
2152 struct branch *e, *l = NULL((void*)0), *p = NULL((void*)0);
2153
2154 for (e = active_branches; e; e = e->active_next_branch) {
2155 if (e->last_commit < min_commit) {
2156 p = l;
2157 min_commit = e->last_commit;
2158 }
2159 l = e;
2160 }
2161
2162 if (p) {
2163 e = p->active_next_branch;
2164 p->active_next_branch = e->active_next_branch;
2165 } else {
2166 e = active_branches;
2167 active_branches = e->active_next_branch;
2168 }
2169 e->active = 0;
2170 e->active_next_branch = NULL((void*)0);
2171 if (e->branch_tree.tree) {
2172 release_tree_content_recursive(e->branch_tree.tree);
2173 e->branch_tree.tree = NULL((void*)0);
2174 }
2175 cur_active_branches--;
2176 }
2177}
2178
2179static void load_branch(struct branch *b)
2180{
2181 load_tree(&b->branch_tree);
2182 if (!b->active) {
2183 b->active = 1;
2184 b->active_next_branch = active_branches;
2185 active_branches = b;
2186 cur_active_branches++;
2187 branch_load_count++;
2188 }
2189}
2190
2191static unsigned char convert_num_notes_to_fanout(uintmax_t num_notes)
2192{
2193 unsigned char fanout = 0;
2194 while ((num_notes >>= 8))
2195 fanout++;
2196 return fanout;
2197}
2198
2199static void construct_path_with_fanout(const char *hex_sha1,
2200 unsigned char fanout, char *path)
2201{
2202 unsigned int i = 0, j = 0;
2203 if (fanout >= 20)
2204 die("Too large fanout (%u)", fanout);
2205 while (fanout) {
2206 path[i++] = hex_sha1[j++];
2207 path[i++] = hex_sha1[j++];
2208 path[i++] = '/';
2209 fanout--;
2210 }
2211 memcpy(path + i, hex_sha1 + j, 40 - j)__builtin___memcpy_chk (path + i, hex_sha1 + j, 40 - j, __builtin_object_size
(path + i, 0))
;
2212 path[i + 40 - j] = '\0';
2213}
2214
2215static uintmax_t do_change_note_fanout(
2216 struct tree_entry *orig_root, struct tree_entry *root,
2217 char *hex_sha1, unsigned int hex_sha1_len,
2218 char *fullpath, unsigned int fullpath_len,
2219 unsigned char fanout)
2220{
2221 struct tree_content *t;
2222 struct tree_entry *e, leaf;
2223 unsigned int i, tmp_hex_sha1_len, tmp_fullpath_len;
2224 uintmax_t num_notes = 0;
2225 unsigned char sha1[20];
2226 char realpath[60];
2227
2228 if (!root->tree)
2229 load_tree(root);
2230 t = root->tree;
2231
2232 for (i = 0; t && i < t->entry_count; i++) {
2233 e = t->entries[i];
2234 tmp_hex_sha1_len = hex_sha1_len + e->name->str_len;
2235 tmp_fullpath_len = fullpath_len;
2236
2237 /*
2238 * We're interested in EITHER existing note entries (entries
2239 * with exactly 40 hex chars in path, not including directory
2240 * separators), OR directory entries that may contain note
2241 * entries (with < 40 hex chars in path).
2242 * Also, each path component in a note entry must be a multiple
2243 * of 2 chars.
2244 */
2245 if (!e->versions[1].mode ||
2246 tmp_hex_sha1_len > 40 ||
2247 e->name->str_len % 2)
2248 continue;
2249
2250 /* This _may_ be a note entry, or a subdir containing notes */
2251 memcpy(hex_sha1 + hex_sha1_len, e->name->str_dat,__builtin___memcpy_chk (hex_sha1 + hex_sha1_len, e->name->
str_dat, e->name->str_len, __builtin_object_size (hex_sha1
+ hex_sha1_len, 0))
2252 e->name->str_len)__builtin___memcpy_chk (hex_sha1 + hex_sha1_len, e->name->
str_dat, e->name->str_len, __builtin_object_size (hex_sha1
+ hex_sha1_len, 0))
;
2253 if (tmp_fullpath_len)
2254 fullpath[tmp_fullpath_len++] = '/';
2255 memcpy(fullpath + tmp_fullpath_len, e->name->str_dat,__builtin___memcpy_chk (fullpath + tmp_fullpath_len, e->name
->str_dat, e->name->str_len, __builtin_object_size (
fullpath + tmp_fullpath_len, 0))
2256 e->name->str_len)__builtin___memcpy_chk (fullpath + tmp_fullpath_len, e->name
->str_dat, e->name->str_len, __builtin_object_size (
fullpath + tmp_fullpath_len, 0))
;
2257 tmp_fullpath_len += e->name->str_len;
2258 fullpath[tmp_fullpath_len] = '\0';
2259
2260 if (tmp_hex_sha1_len == 40 && !get_sha1_hex(hex_sha1, sha1)) {
2261 /* This is a note entry */
2262 if (fanout == 0xff) {
2263 /* Counting mode, no rename */
2264 num_notes++;
2265 continue;
2266 }
2267 construct_path_with_fanout(hex_sha1, fanout, realpath);
2268 if (!strcmp(fullpath, realpath)) {
2269 /* Note entry is in correct location */
2270 num_notes++;
2271 continue;
2272 }
2273
2274 /* Rename fullpath to realpath */
2275 if (!tree_content_remove(orig_root, fullpath, &leaf, 0))
2276 die("Failed to remove path %s", fullpath);
2277 tree_content_set(orig_root, realpath,
2278 leaf.versions[1].sha1,
2279 leaf.versions[1].mode,
2280 leaf.tree);
2281 } else if (S_ISDIR(e->versions[1].mode)(((e->versions[1].mode) & 0170000) == 0040000)) {
2282 /* This is a subdir that may contain note entries */
2283 num_notes += do_change_note_fanout(orig_root, e,
2284 hex_sha1, tmp_hex_sha1_len,
2285 fullpath, tmp_fullpath_len, fanout);
2286 }
2287
2288 /* The above may have reallocated the current tree_content */
2289 t = root->tree;
2290 }
2291 return num_notes;
2292}
2293
2294static uintmax_t change_note_fanout(struct tree_entry *root,
2295 unsigned char fanout)
2296{
2297 char hex_sha1[40], path[60];
2298 return do_change_note_fanout(root, root, hex_sha1, 0, path, 0, fanout);
2299}
2300
2301/*
2302 * Given a pointer into a string, parse a mark reference:
2303 *
2304 * idnum ::= ':' bigint;
2305 *
2306 * Return the first character after the value in *endptr.
2307 *
2308 * Complain if the following character is not what is expected,
2309 * either a space or end of the string.
2310 */
2311static uintmax_t parse_mark_ref(const char *p, char **endptr)
2312{
2313 uintmax_t mark;
2314
2315 assert(*p == ':')(__builtin_expect(!(*p == ':'), 0) ? __assert_rtn(__func__, "fast-import.c"
, 2315, "*p == ':'") : (void)0)
;
2316 p++;
2317 mark = strtoumax(p, endptr, 10);
2318 if (*endptr == p)
2319 die("No value after ':' in mark: %s", command_buf.buf);
2320 return mark;
2321}
2322
2323/*
2324 * Parse the mark reference, and complain if this is not the end of
2325 * the string.
2326 */
2327static uintmax_t parse_mark_ref_eol(const char *p)
2328{
2329 char *end;
2330 uintmax_t mark;
2331
2332 mark = parse_mark_ref(p, &end);
2333 if (*end != '\0')
2334 die("Garbage after mark: %s", command_buf.buf);
2335 return mark;
2336}
2337
2338/*
2339 * Parse the mark reference, demanding a trailing space. Return a
2340 * pointer to the space.
2341 */
2342static uintmax_t parse_mark_ref_space(const char **p)
2343{
2344 uintmax_t mark;
2345 char *end;
2346
2347 mark = parse_mark_ref(*p, &end);
2348 if (*end++ != ' ')
2349 die("Missing space after mark: %s", command_buf.buf);
2350 *p = end;
2351 return mark;
2352}
2353
2354static void file_change_m(const char *p, struct branch *b)
2355{
2356 static struct strbuf uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2357 const char *endp;
2358 struct object_entry *oe;
2359 unsigned char sha1[20];
2360 uint16_t mode, inline_data = 0;
2361
2362 p = get_mode(p, &mode);
2363 if (!p)
2364 die("Corrupt mode: %s", command_buf.buf);
2365 switch (mode) {
2366 case 0644:
2367 case 0755:
2368 mode |= S_IFREG0100000;
2369 case S_IFREG0100000 | 0644:
2370 case S_IFREG0100000 | 0755:
2371 case S_IFLNK0120000:
2372 case S_IFDIR0040000:
2373 case S_IFGITLINK0160000:
2374 /* ok */
2375 break;
2376 default:
2377 die("Corrupt mode: %s", command_buf.buf);
2378 }
2379
2380 if (*p == ':') {
2381 oe = find_mark(parse_mark_ref_space(&p));
2382 hashcpy(sha1, oe->idx.sha1);
2383 } else if (skip_prefix(p, "inline ", &p)) {
2384 inline_data = 1;
2385 oe = NULL((void*)0); /* not used with inline_data, but makes gcc happy */
2386 } else {
2387 if (get_sha1_hex(p, sha1))
2388 die("Invalid dataref: %s", command_buf.buf);
2389 oe = find_object(sha1);
2390 p += 40;
2391 if (*p++ != ' ')
2392 die("Missing space after SHA1: %s", command_buf.buf);
2393 }
2394
2395 strbuf_reset(&uq)strbuf_setlen(&uq, 0);
2396 if (!unquote_c_style(&uq, p, &endp)) {
2397 if (*endp)
2398 die("Garbage after path in: %s", command_buf.buf);
2399 p = uq.buf;
2400 }
2401
2402 /* Git does not track empty, non-toplevel directories. */
2403 if (S_ISDIR(mode)(((mode) & 0170000) == 0040000) && !hashcmp(sha1, EMPTY_TREE_SHA1_BIN(empty_tree_oid.hash)) && *p) {
2404 tree_content_remove(&b->branch_tree, p, NULL((void*)0), 0);
2405 return;
2406 }
2407
2408 if (S_ISGITLINK(mode)(((mode) & 0170000) == 0160000)) {
2409 if (inline_data)
2410 die("Git links cannot be specified 'inline': %s",
2411 command_buf.buf);
2412 else if (oe) {
2413 if (oe->type != OBJ_COMMIT)
2414 die("Not a commit (actually a %s): %s",
2415 typename(oe->type), command_buf.buf);
2416 }
2417 /*
2418 * Accept the sha1 without checking; it expected to be in
2419 * another repository.
2420 */
2421 } else if (inline_data) {
2422 if (S_ISDIR(mode)(((mode) & 0170000) == 0040000))
2423 die("Directories cannot be specified 'inline': %s",
2424 command_buf.buf);
2425 if (p != uq.buf) {
2426 strbuf_addstr(&uq, p);
2427 p = uq.buf;
2428 }
2429 read_next_command();
2430 parse_and_store_blob(&last_blob, sha1, 0);
2431 } else {
2432 enum object_type expected = S_ISDIR(mode)(((mode) & 0170000) == 0040000) ?
2433 OBJ_TREE: OBJ_BLOB;
2434 enum object_type type = oe ? oe->type :
2435 sha1_object_info(sha1, NULL((void*)0));
2436 if (type < 0)
2437 die("%s not found: %s",
2438 S_ISDIR(mode)(((mode) & 0170000) == 0040000) ? "Tree" : "Blob",
2439 command_buf.buf);
2440 if (type != expected)
2441 die("Not a %s (actually a %s): %s",
2442 typename(expected), typename(type),
2443 command_buf.buf);
2444 }
2445
2446 if (!*p) {
2447 tree_content_replace(&b->branch_tree, sha1, mode, NULL((void*)0));
2448 return;
2449 }
2450 tree_content_set(&b->branch_tree, p, sha1, mode, NULL((void*)0));
2451}
2452
2453static void file_change_d(const char *p, struct branch *b)
2454{
2455 static struct strbuf uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2456 const char *endp;
2457
2458 strbuf_reset(&uq)strbuf_setlen(&uq, 0);
2459 if (!unquote_c_style(&uq, p, &endp)) {
2460 if (*endp)
2461 die("Garbage after path in: %s", command_buf.buf);
2462 p = uq.buf;
2463 }
2464 tree_content_remove(&b->branch_tree, p, NULL((void*)0), 1);
2465}
2466
2467static void file_change_cr(const char *s, struct branch *b, int rename)
2468{
2469 const char *d;
2470 static struct strbuf s_uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2471 static struct strbuf d_uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2472 const char *endp;
2473 struct tree_entry leaf;
2474
2475 strbuf_reset(&s_uq)strbuf_setlen(&s_uq, 0);
2476 if (!unquote_c_style(&s_uq, s, &endp)) {
2477 if (*endp != ' ')
2478 die("Missing space after source: %s", command_buf.buf);
2479 } else {
2480 endp = strchr(s, ' ');
2481 if (!endp)
2482 die("Missing space after source: %s", command_buf.buf);
2483 strbuf_add(&s_uq, s, endp - s);
2484 }
2485 s = s_uq.buf;
2486
2487 endp++;
2488 if (!*endp)
2489 die("Missing dest: %s", command_buf.buf);
2490
2491 d = endp;
2492 strbuf_reset(&d_uq)strbuf_setlen(&d_uq, 0);
2493 if (!unquote_c_style(&d_uq, d, &endp)) {
2494 if (*endp)
2495 die("Garbage after dest in: %s", command_buf.buf);
2496 d = d_uq.buf;
2497 }
2498
2499 memset(&leaf, 0, sizeof(leaf))__builtin___memset_chk (&leaf, 0, sizeof(leaf), __builtin_object_size
(&leaf, 0))
;
2500 if (rename)
2501 tree_content_remove(&b->branch_tree, s, &leaf, 1);
2502 else
2503 tree_content_get(&b->branch_tree, s, &leaf, 1);
2504 if (!leaf.versions[1].mode)
2505 die("Path %s not in branch", s);
2506 if (!*d) { /* C "path/to/subdir" "" */
2507 tree_content_replace(&b->branch_tree,
2508 leaf.versions[1].sha1,
2509 leaf.versions[1].mode,
2510 leaf.tree);
2511 return;
2512 }
2513 tree_content_set(&b->branch_tree, d,
2514 leaf.versions[1].sha1,
2515 leaf.versions[1].mode,
2516 leaf.tree);
2517}
2518
2519static void note_change_n(const char *p, struct branch *b, unsigned char *old_fanout)
2520{
2521 static struct strbuf uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2522 struct object_entry *oe;
2523 struct branch *s;
2524 unsigned char sha1[20], commit_sha1[20];
2525 char path[60];
2526 uint16_t inline_data = 0;
2527 unsigned char new_fanout;
2528
2529 /*
2530 * When loading a branch, we don't traverse its tree to count the real
2531 * number of notes (too expensive to do this for all non-note refs).
2532 * This means that recently loaded notes refs might incorrectly have
2533 * b->num_notes == 0, and consequently, old_fanout might be wrong.
2534 *
2535 * Fix this by traversing the tree and counting the number of notes
2536 * when b->num_notes == 0. If the notes tree is truly empty, the
2537 * calculation should not take long.
2538 */
2539 if (b->num_notes == 0 && *old_fanout == 0) {
2540 /* Invoke change_note_fanout() in "counting mode". */
2541 b->num_notes = change_note_fanout(&b->branch_tree, 0xff);
2542 *old_fanout = convert_num_notes_to_fanout(b->num_notes);
2543 }
2544
2545 /* Now parse the notemodify command. */
2546 /* <dataref> or 'inline' */
2547 if (*p == ':') {
2548 oe = find_mark(parse_mark_ref_space(&p));
2549 hashcpy(sha1, oe->idx.sha1);
2550 } else if (skip_prefix(p, "inline ", &p)) {
2551 inline_data = 1;
2552 oe = NULL((void*)0); /* not used with inline_data, but makes gcc happy */
2553 } else {
2554 if (get_sha1_hex(p, sha1))
2555 die("Invalid dataref: %s", command_buf.buf);
2556 oe = find_object(sha1);
2557 p += 40;
2558 if (*p++ != ' ')
2559 die("Missing space after SHA1: %s", command_buf.buf);
2560 }
2561
2562 /* <commit-ish> */
2563 s = lookup_branch(p);
2564 if (s) {
2565 if (is_null_sha1(s->sha1))
2566 die("Can't add a note on empty branch.");
2567 hashcpy(commit_sha1, s->sha1);
2568 } else if (*p == ':') {
2569 uintmax_t commit_mark = parse_mark_ref_eol(p);
2570 struct object_entry *commit_oe = find_mark(commit_mark);
2571 if (commit_oe->type != OBJ_COMMIT)
2572 die("Mark :%" PRIuMAX"j" "u" " not a commit", commit_mark);
2573 hashcpy(commit_sha1, commit_oe->idx.sha1);
2574 } else if (!get_sha1(p, commit_sha1)) {
2575 unsigned long size;
2576 char *buf = read_object_with_reference(commit_sha1,
2577 commit_type, &size, commit_sha1);
2578 if (!buf || size < 46)
2579 die("Not a valid commit: %s", p);
2580 free(buf);
2581 } else
2582 die("Invalid ref name or SHA1 expression: %s", p);
2583
2584 if (inline_data) {
2585 if (p != uq.buf) {
2586 strbuf_addstr(&uq, p);
2587 p = uq.buf;
2588 }
2589 read_next_command();
2590 parse_and_store_blob(&last_blob, sha1, 0);
2591 } else if (oe) {
2592 if (oe->type != OBJ_BLOB)
2593 die("Not a blob (actually a %s): %s",
2594 typename(oe->type), command_buf.buf);
2595 } else if (!is_null_sha1(sha1)) {
2596 enum object_type type = sha1_object_info(sha1, NULL((void*)0));
2597 if (type < 0)
2598 die("Blob not found: %s", command_buf.buf);
2599 if (type != OBJ_BLOB)
2600 die("Not a blob (actually a %s): %s",
2601 typename(type), command_buf.buf);
2602 }
2603
2604 construct_path_with_fanout(sha1_to_hex(commit_sha1), *old_fanout, path);
2605 if (tree_content_remove(&b->branch_tree, path, NULL((void*)0), 0))
2606 b->num_notes--;
2607
2608 if (is_null_sha1(sha1))
2609 return; /* nothing to insert */
2610
2611 b->num_notes++;
2612 new_fanout = convert_num_notes_to_fanout(b->num_notes);
2613 construct_path_with_fanout(sha1_to_hex(commit_sha1), new_fanout, path);
2614 tree_content_set(&b->branch_tree, path, sha1, S_IFREG0100000 | 0644, NULL((void*)0));
2615}
2616
2617static void file_change_deleteall(struct branch *b)
2618{
2619 release_tree_content_recursive(b->branch_tree.tree);
2620 hashclr(b->branch_tree.versions[0].sha1);
2621 hashclr(b->branch_tree.versions[1].sha1);
2622 load_tree(&b->branch_tree);
2623 b->num_notes = 0;
2624}
2625
2626static void parse_from_commit(struct branch *b, char *buf, unsigned long size)
2627{
2628 if (!buf || size < 46)
2629 die("Not a valid commit: %s", sha1_to_hex(b->sha1));
2630 if (memcmp("tree ", buf, 5)
2631 || get_sha1_hex(buf + 5, b->branch_tree.versions[1].sha1))
2632 die("The commit %s is corrupt", sha1_to_hex(b->sha1));
2633 hashcpy(b->branch_tree.versions[0].sha1,
2634 b->branch_tree.versions[1].sha1);
2635}
2636
2637static void parse_from_existing(struct branch *b)
2638{
2639 if (is_null_sha1(b->sha1)) {
2640 hashclr(b->branch_tree.versions[0].sha1);
2641 hashclr(b->branch_tree.versions[1].sha1);
2642 } else {
2643 unsigned long size;
2644 char *buf;
2645
2646 buf = read_object_with_reference(b->sha1,
2647 commit_type, &size, b->sha1);
2648 parse_from_commit(b, buf, size);
2649 free(buf);
2650 }
2651}
2652
2653static int parse_from(struct branch *b)
2654{
2655 const char *from;
2656 struct branch *s;
2657 unsigned char sha1[20];
2658
2659 if (!skip_prefix(command_buf.buf, "from ", &from))
54
Taking false branch
2660 return 0;
2661
2662 hashcpy(sha1, b->branch_tree.versions[1].sha1);
2663
2664 s = lookup_branch(from);
2665 if (b == s)
55
Taking false branch
2666 die("Can't create a branch from itself: %s", b->name);
2667 else if (s) {
56
Taking false branch
2668 unsigned char *t = s->branch_tree.versions[1].sha1;
2669 hashcpy(b->sha1, s->sha1);
2670 hashcpy(b->branch_tree.versions[0].sha1, t);
2671 hashcpy(b->branch_tree.versions[1].sha1, t);
2672 } else if (*from == ':') {
57
Taking false branch
2673 uintmax_t idnum = parse_mark_ref_eol(from);
2674 struct object_entry *oe = find_mark(idnum);
2675 if (oe->type != OBJ_COMMIT)
2676 die("Mark :%" PRIuMAX"j" "u" " not a commit", idnum);
2677 if (hashcmp(b->sha1, oe->idx.sha1)) {
2678 hashcpy(b->sha1, oe->idx.sha1);
2679 if (oe->pack_id != MAX_PACK_ID((1<<16)-1)) {
2680 unsigned long size;
2681 char *buf = gfi_unpack_entry(oe, &size);
2682 parse_from_commit(b, buf, size);
2683 free(buf);
2684 } else
2685 parse_from_existing(b);
2686 }
2687 } else if (!get_sha1(from, b->sha1)) {
58
Taking true branch
2688 parse_from_existing(b);
2689 if (is_null_sha1(b->sha1))
59
Taking false branch
2690 b->delete = 1;
2691 }
2692 else
2693 die("Invalid ref name or SHA1 expression: %s", from);
2694
2695 if (b->branch_tree.tree && hashcmp(sha1, b->branch_tree.versions[1].sha1)) {
2696 release_tree_content_recursive(b->branch_tree.tree);
2697 b->branch_tree.tree = NULL((void*)0);
2698 }
2699
2700 read_next_command();
60
Calling 'read_next_command'
2701 return 1;
2702}
2703
2704static struct hash_list *parse_merge(unsigned int *count)
2705{
2706 struct hash_list *list = NULL((void*)0), **tail = &list, *n;
2707 const char *from;
2708 struct branch *s;
2709
2710 *count = 0;
2711 while (skip_prefix(command_buf.buf, "merge ", &from)) {
2712 n = xmalloc(sizeof(*n));
2713 s = lookup_branch(from);
2714 if (s)
2715 hashcpy(n->sha1, s->sha1);
2716 else if (*from == ':') {
2717 uintmax_t idnum = parse_mark_ref_eol(from);
2718 struct object_entry *oe = find_mark(idnum);
2719 if (oe->type != OBJ_COMMIT)
2720 die("Mark :%" PRIuMAX"j" "u" " not a commit", idnum);
2721 hashcpy(n->sha1, oe->idx.sha1);
2722 } else if (!get_sha1(from, n->sha1)) {
2723 unsigned long size;
2724 char *buf = read_object_with_reference(n->sha1,
2725 commit_type, &size, n->sha1);
2726 if (!buf || size < 46)
2727 die("Not a valid commit: %s", from);
2728 free(buf);
2729 } else
2730 die("Invalid ref name or SHA1 expression: %s", from);
2731
2732 n->next = NULL((void*)0);
2733 *tail = n;
2734 tail = &n->next;
2735
2736 (*count)++;
2737 read_next_command();
2738 }
2739 return list;
2740}
2741
2742static void parse_new_commit(const char *arg)
2743{
2744 static struct strbuf msg = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2745 struct branch *b;
2746 char *author = NULL((void*)0);
2747 char *committer = NULL((void*)0);
2748 struct hash_list *merge_list = NULL((void*)0);
2749 unsigned int merge_count;
2750 unsigned char prev_fanout, new_fanout;
2751 const char *v;
2752
2753 b = lookup_branch(arg);
2754 if (!b)
2755 b = new_branch(arg);
2756
2757 read_next_command();
2758 parse_mark();
2759 if (skip_prefix(command_buf.buf, "author ", &v)) {
2760 author = parse_ident(v);
2761 read_next_command();
2762 }
2763 if (skip_prefix(command_buf.buf, "committer ", &v)) {
2764 committer = parse_ident(v);
2765 read_next_command();
2766 }
2767 if (!committer)
2768 die("Expected committer but didn't get one");
2769 parse_data(&msg, 0, NULL((void*)0));
2770 read_next_command();
2771 parse_from(b);
2772 merge_list = parse_merge(&merge_count);
2773
2774 /* ensure the branch is active/loaded */
2775 if (!b->branch_tree.tree || !max_active_branches) {
2776 unload_one_branch();
2777 load_branch(b);
2778 }
2779
2780 prev_fanout = convert_num_notes_to_fanout(b->num_notes);
2781
2782 /* file_change* */
2783 while (command_buf.len > 0) {
2784 if (skip_prefix(command_buf.buf, "M ", &v))
2785 file_change_m(v, b);
2786 else if (skip_prefix(command_buf.buf, "D ", &v))
2787 file_change_d(v, b);
2788 else if (skip_prefix(command_buf.buf, "R ", &v))
2789 file_change_cr(v, b, 1);
2790 else if (skip_prefix(command_buf.buf, "C ", &v))
2791 file_change_cr(v, b, 0);
2792 else if (skip_prefix(command_buf.buf, "N ", &v))
2793 note_change_n(v, b, &prev_fanout);
2794 else if (!strcmp("deleteall", command_buf.buf))
2795 file_change_deleteall(b);
2796 else if (skip_prefix(command_buf.buf, "ls ", &v))
2797 parse_ls(v, b);
2798 else {
2799 unread_command_buf = 1;
2800 break;
2801 }
2802 if (read_next_command() == EOF(-1))
2803 break;
2804 }
2805
2806 new_fanout = convert_num_notes_to_fanout(b->num_notes);
2807 if (new_fanout != prev_fanout)
2808 b->num_notes = change_note_fanout(&b->branch_tree, new_fanout);
2809
2810 /* build the tree and the commit */
2811 store_tree(&b->branch_tree);
2812 hashcpy(b->branch_tree.versions[0].sha1,
2813 b->branch_tree.versions[1].sha1);
2814
2815 strbuf_reset(&new_data)strbuf_setlen(&new_data, 0);
2816 strbuf_addf(&new_data, "tree %s\n",
2817 sha1_to_hex(b->branch_tree.versions[1].sha1));
2818 if (!is_null_sha1(b->sha1))
2819 strbuf_addf(&new_data, "parent %s\n", sha1_to_hex(b->sha1));
2820 while (merge_list) {
2821 struct hash_list *next = merge_list->next;
2822 strbuf_addf(&new_data, "parent %s\n", sha1_to_hex(merge_list->sha1));
2823 free(merge_list);
2824 merge_list = next;
2825 }
2826 strbuf_addf(&new_data,
2827 "author %s\n"
2828 "committer %s\n"
2829 "\n",
2830 author ? author : committer, committer);
2831 strbuf_addbuf(&new_data, &msg);
2832 free(author);
2833 free(committer);
2834
2835 if (!store_object(OBJ_COMMIT, &new_data, NULL((void*)0), b->sha1, next_mark))
2836 b->pack_id = pack_id;
2837 b->last_commit = object_count_by_type[OBJ_COMMIT];
2838}
2839
2840static void parse_new_tag(const char *arg)
2841{
2842 static struct strbuf msg = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2843 const char *from;
2844 char *tagger;
2845 struct branch *s;
2846 struct tag *t;
2847 uintmax_t from_mark = 0;
2848 unsigned char sha1[20];
2849 enum object_type type;
2850 const char *v;
2851
2852 t = pool_alloc(sizeof(struct tag));
2853 memset(t, 0, sizeof(struct tag))__builtin___memset_chk (t, 0, sizeof(struct tag), __builtin_object_size
(t, 0))
;
2854 t->name = pool_strdup(arg);
2855 if (last_tag)
2856 last_tag->next_tag = t;
2857 else
2858 first_tag = t;
2859 last_tag = t;
2860 read_next_command();
2861
2862 /* from ... */
2863 if (!skip_prefix(command_buf.buf, "from ", &from))
2864 die("Expected from command, got %s", command_buf.buf);
2865 s = lookup_branch(from);
2866 if (s) {
2867 if (is_null_sha1(s->sha1))
2868 die("Can't tag an empty branch.");
2869 hashcpy(sha1, s->sha1);
2870 type = OBJ_COMMIT;
2871 } else if (*from == ':') {
2872 struct object_entry *oe;
2873 from_mark = parse_mark_ref_eol(from);
2874 oe = find_mark(from_mark);
2875 type = oe->type;
2876 hashcpy(sha1, oe->idx.sha1);
2877 } else if (!get_sha1(from, sha1)) {
2878 struct object_entry *oe = find_object(sha1);
2879 if (!oe) {
2880 type = sha1_object_info(sha1, NULL((void*)0));
2881 if (type < 0)
2882 die("Not a valid object: %s", from);
2883 } else
2884 type = oe->type;
2885 } else
2886 die("Invalid ref name or SHA1 expression: %s", from);
2887 read_next_command();
2888
2889 /* tagger ... */
2890 if (skip_prefix(command_buf.buf, "tagger ", &v)) {
2891 tagger = parse_ident(v);
2892 read_next_command();
2893 } else
2894 tagger = NULL((void*)0);
2895
2896 /* tag payload/message */
2897 parse_data(&msg, 0, NULL((void*)0));
2898
2899 /* build the tag object */
2900 strbuf_reset(&new_data)strbuf_setlen(&new_data, 0);
2901
2902 strbuf_addf(&new_data,
2903 "object %s\n"
2904 "type %s\n"
2905 "tag %s\n",
2906 sha1_to_hex(sha1), typename(type), t->name);
2907 if (tagger)
2908 strbuf_addf(&new_data,
2909 "tagger %s\n", tagger);
2910 strbuf_addch(&new_data, '\n');
2911 strbuf_addbuf(&new_data, &msg);
2912 free(tagger);
2913
2914 if (store_object(OBJ_TAG, &new_data, NULL((void*)0), t->sha1, 0))
2915 t->pack_id = MAX_PACK_ID((1<<16)-1);
2916 else
2917 t->pack_id = pack_id;
2918}
2919
2920static void parse_reset_branch(const char *arg)
2921{
2922 struct branch *b;
2923
2924 b = lookup_branch(arg);
2925 if (b) {
52
Taking false branch
2926 hashclr(b->sha1);
2927 hashclr(b->branch_tree.versions[0].sha1);
2928 hashclr(b->branch_tree.versions[1].sha1);
2929 if (b->branch_tree.tree) {
2930 release_tree_content_recursive(b->branch_tree.tree);
2931 b->branch_tree.tree = NULL((void*)0);
2932 }
2933 }
2934 else
2935 b = new_branch(arg);
2936 read_next_command();
2937 parse_from(b);
53
Calling 'parse_from'
2938 if (command_buf.len > 0)
2939 unread_command_buf = 1;
2940}
2941
2942static void cat_blob_write(const char *buf, unsigned long size)
2943{
2944 if (write_in_full(cat_blob_fd, buf, size) != size)
2945 die_errno("Write to frontend failed");
2946}
2947
2948static void cat_blob(struct object_entry *oe, unsigned char sha1[20])
2949{
2950 struct strbuf line = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
2951 unsigned long size;
2952 enum object_type type = 0;
2953 char *buf;
2954
2955 if (!oe || oe->pack_id == MAX_PACK_ID((1<<16)-1)) {
2956 buf = read_sha1_file(sha1, &type, &size);
2957 } else {
2958 type = oe->type;
2959 buf = gfi_unpack_entry(oe, &size);
2960 }
2961
2962 /*
2963 * Output based on batch_one_object() from cat-file.c.
2964 */
2965 if (type <= 0) {
2966 strbuf_reset(&line)strbuf_setlen(&line, 0);
2967 strbuf_addf(&line, "%s missing\n", sha1_to_hex(sha1));
2968 cat_blob_write(line.buf, line.len);
2969 strbuf_release(&line);
2970 free(buf);
2971 return;
2972 }
2973 if (!buf)
2974 die("Can't read object %s", sha1_to_hex(sha1));
2975 if (type != OBJ_BLOB)
2976 die("Object %s is a %s but a blob was expected.",
2977 sha1_to_hex(sha1), typename(type));
2978 strbuf_reset(&line)strbuf_setlen(&line, 0);
2979 strbuf_addf(&line, "%s %s %lu\n", sha1_to_hex(sha1),
2980 typename(type), size);
2981 cat_blob_write(line.buf, line.len);
2982 strbuf_release(&line);
2983 cat_blob_write(buf, size);
2984 cat_blob_write("\n", 1);
2985 if (oe && oe->pack_id == pack_id) {
2986 last_blob.offset = oe->idx.offset;
2987 strbuf_attach(&last_blob.data, buf, size, size);
2988 last_blob.depth = oe->depth;
2989 } else
2990 free(buf);
2991}
2992
2993static void parse_get_mark(const char *p)
2994{
2995 struct object_entry *oe = oe;
67
Assigned value is garbage or undefined
2996 char output[42];
2997
2998 /* get-mark SP <object> LF */
2999 if (*p != ':')
3000 die("Not a mark: %s", p);
3001
3002 oe = find_mark(parse_mark_ref_eol(p));
3003 if (!oe)
3004 die("Unknown mark: %s", command_buf.buf);
3005
3006 snprintf(output, sizeof(output), "%s\n", sha1_to_hex(oe->idx.sha1))__builtin___snprintf_chk (output, sizeof(output), 0, __builtin_object_size
(output, 2 > 1 ? 1 : 0), "%s\n", sha1_to_hex(oe->idx.sha1
))
;
3007 cat_blob_write(output, 41);
3008}
3009
3010static void parse_cat_blob(const char *p)
3011{
3012 struct object_entry *oe = oe;
3013 unsigned char sha1[20];
3014
3015 /* cat-blob SP <object> LF */
3016 if (*p == ':') {
3017 oe = find_mark(parse_mark_ref_eol(p));
3018 if (!oe)
3019 die("Unknown mark: %s", command_buf.buf);
3020 hashcpy(sha1, oe->idx.sha1);
3021 } else {
3022 if (get_sha1_hex(p, sha1))
3023 die("Invalid dataref: %s", command_buf.buf);
3024 if (p[40])
3025 die("Garbage after SHA1: %s", command_buf.buf);
3026 oe = find_object(sha1);
3027 }
3028
3029 cat_blob(oe, sha1);
3030}
3031
3032static struct object_entry *dereference(struct object_entry *oe,
3033 unsigned char sha1[20])
3034{
3035 unsigned long size;
3036 char *buf = NULL((void*)0);
3037 if (!oe) {
3038 enum object_type type = sha1_object_info(sha1, NULL((void*)0));
3039 if (type < 0)
3040 die("object not found: %s", sha1_to_hex(sha1));
3041 /* cache it! */
3042 oe = insert_object(sha1);
3043 oe->type = type;
3044 oe->pack_id = MAX_PACK_ID((1<<16)-1);
3045 oe->idx.offset = 1;
3046 }
3047 switch (oe->type) {
3048 case OBJ_TREE: /* easy case. */
3049 return oe;
3050 case OBJ_COMMIT:
3051 case OBJ_TAG:
3052 break;
3053 default:
3054 die("Not a tree-ish: %s", command_buf.buf);
3055 }
3056
3057 if (oe->pack_id != MAX_PACK_ID((1<<16)-1)) { /* in a pack being written */
3058 buf = gfi_unpack_entry(oe, &size);
3059 } else {
3060 enum object_type unused;
3061 buf = read_sha1_file(sha1, &unused, &size);
3062 }
3063 if (!buf)
3064 die("Can't load object %s", sha1_to_hex(sha1));
3065
3066 /* Peel one layer. */
3067 switch (oe->type) {
3068 case OBJ_TAG:
3069 if (size < 40 + strlen("object ") ||
3070 get_sha1_hex(buf + strlen("object "), sha1))
3071 die("Invalid SHA1 in tag: %s", command_buf.buf);
3072 break;
3073 case OBJ_COMMIT:
3074 if (size < 40 + strlen("tree ") ||
3075 get_sha1_hex(buf + strlen("tree "), sha1))
3076 die("Invalid SHA1 in commit: %s", command_buf.buf);
3077 }
3078
3079 free(buf);
3080 return find_object(sha1);
3081}
3082
3083static struct object_entry *parse_treeish_dataref(const char **p)
3084{
3085 unsigned char sha1[20];
3086 struct object_entry *e;
3087
3088 if (**p == ':') { /* <mark> */
3089 e = find_mark(parse_mark_ref_space(p));
3090 if (!e)
3091 die("Unknown mark: %s", command_buf.buf);
3092 hashcpy(sha1, e->idx.sha1);
3093 } else { /* <sha1> */
3094 if (get_sha1_hex(*p, sha1))
3095 die("Invalid dataref: %s", command_buf.buf);
3096 e = find_object(sha1);
3097 *p += 40;
3098 if (*(*p)++ != ' ')
3099 die("Missing space after tree-ish: %s", command_buf.buf);
3100 }
3101
3102 while (!e || e->type != OBJ_TREE)
3103 e = dereference(e, sha1);
3104 return e;
3105}
3106
3107static void print_ls(int mode, const unsigned char *sha1, const char *path)
3108{
3109 static struct strbuf line = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
3110
3111 /* See show_tree(). */
3112 const char *type =
3113 S_ISGITLINK(mode)(((mode) & 0170000) == 0160000) ? commit_type :
3114 S_ISDIR(mode)(((mode) & 0170000) == 0040000) ? tree_type :
3115 blob_type;
3116
3117 if (!mode) {
3118 /* missing SP path LF */
3119 strbuf_reset(&line)strbuf_setlen(&line, 0);
3120 strbuf_addstr(&line, "missing ");
3121 quote_c_style(path, &line, NULL((void*)0), 0);
3122 strbuf_addch(&line, '\n');
3123 } else {
3124 /* mode SP type SP object_name TAB path LF */
3125 strbuf_reset(&line)strbuf_setlen(&line, 0);
3126 strbuf_addf(&line, "%06o %s %s\t",
3127 mode & ~NO_DELTA0004000, type, sha1_to_hex(sha1));
3128 quote_c_style(path, &line, NULL((void*)0), 0);
3129 strbuf_addch(&line, '\n');
3130 }
3131 cat_blob_write(line.buf, line.len);
3132}
3133
3134static void parse_ls(const char *p, struct branch *b)
3135{
3136 struct tree_entry *root = NULL((void*)0);
3137 struct tree_entry leaf = {NULL((void*)0)};
3138
3139 /* ls SP (<tree-ish> SP)? <path> */
3140 if (*p == '"') {
3141 if (!b)
3142 die("Not in a commit: %s", command_buf.buf);
3143 root = &b->branch_tree;
3144 } else {
3145 struct object_entry *e = parse_treeish_dataref(&p);
3146 root = new_tree_entry();
3147 hashcpy(root->versions[1].sha1, e->idx.sha1);
3148 if (!is_null_sha1(root->versions[1].sha1))
3149 root->versions[1].mode = S_IFDIR0040000;
3150 load_tree(root);
3151 }
3152 if (*p == '"') {
3153 static struct strbuf uq = STRBUF_INIT{ 0, 0, strbuf_slopbuf };
3154 const char *endp;
3155 strbuf_reset(&uq)strbuf_setlen(&uq, 0);
3156 if (unquote_c_style(&uq, p, &endp))
3157 die("Invalid path: %s", command_buf.buf);
3158 if (*endp)
3159 die("Garbage after path in: %s", command_buf.buf);
3160 p = uq.buf;
3161 }
3162 tree_content_get(root, p, &leaf, 1);
3163 /*
3164 * A directory in preparation would have a sha1 of zero
3165 * until it is saved. Save, for simplicity.
3166 */
3167 if (S_ISDIR(leaf.versions[1].mode)(((leaf.versions[1].mode) & 0170000) == 0040000))
3168 store_tree(&leaf);
3169
3170 print_ls(leaf.versions[1].mode, leaf.versions[1].sha1, p);
3171 if (leaf.tree)
3172 release_tree_content_recursive(leaf.tree);
3173 if (!b || root != &b->branch_tree)
3174 release_tree_entry(root);
3175}
3176
3177static void checkpoint(void)
3178{
3179 checkpoint_requested = 0;
3180 if (object_count) {
3181 cycle_packfile();
3182 dump_branches();
3183 dump_tags();
3184 dump_marks();
3185 }
3186}
3187
3188static void parse_checkpoint(void)
3189{
3190 checkpoint_requested = 1;
3191 skip_optional_lf();
3192}
3193
3194static void parse_progress(void)
3195{
3196 fwrite(command_buf.buf, 1, command_buf.len, stdout__stdoutp);
3197 fputc('\n', stdout__stdoutp);
3198 fflush(stdout__stdoutp);
3199 skip_optional_lf();
3200}
3201
3202static char* make_fast_import_path(const char *path)
3203{
3204 if (!relative_marks_paths || is_absolute_path(path))
3205 return xstrdup(path);
3206 return xstrdup(git_path("info/fast-import/%s", path));
3207}
3208
3209static void option_import_marks(const char *marks,
3210 int from_stream, int ignore_missing)
3211{
3212 if (import_marks_file) {
3213 if (from_stream)
3214 die("Only one import-marks command allowed per stream");
3215
3216 /* read previous mark file */
3217 if(!import_marks_file_from_stream)
3218 read_marks();
3219 }
3220
3221 import_marks_file = make_fast_import_path(marks);
3222 safe_create_leading_directories_const(import_marks_file);
3223 import_marks_file_from_stream = from_stream;
3224 import_marks_file_ignore_missing = ignore_missing;
3225}
3226
3227static void option_date_format(const char *fmt)
3228{
3229 if (!strcmp(fmt, "raw"))
3230 whenspec = WHENSPEC_RAW;
3231 else if (!strcmp(fmt, "rfc2822"))
3232 whenspec = WHENSPEC_RFC2822;
3233 else if (!strcmp(fmt, "now"))
3234 whenspec = WHENSPEC_NOW;
3235 else
3236 die("unknown --date-format argument %s", fmt);
3237}
3238
3239static unsigned long ulong_arg(const char *option, const char *arg)
3240{
3241 char *endptr;
3242 unsigned long rv = strtoul(arg, &endptr, 0);
3243 if (strchr(arg, '-') || endptr == arg || *endptr)
3244 die("%s: argument must be a non-negative integer", option);
3245 return rv;
3246}
3247
3248static void option_depth(const char *depth)
3249{
3250 max_depth = ulong_arg("--depth", depth);
3251 if (max_depth > MAX_DEPTH((1<<13)-1))
3252 die("--depth cannot exceed %u", MAX_DEPTH((1<<13)-1));
3253}
3254
3255static void option_active_branches(const char *branches)
3256{
3257 max_active_branches = ulong_arg("--active-branches", branches);
3258}
3259
3260static void option_export_marks(const char *marks)
3261{
3262 export_marks_file = make_fast_import_path(marks);
3263 safe_create_leading_directories_const(export_marks_file);
3264}
3265
3266static void option_cat_blob_fd(const char *fd)
3267{
3268 unsigned long n = ulong_arg("--cat-blob-fd", fd);
3269 if (n > (unsigned long) INT_MAX2147483647)
3270 die("--cat-blob-fd cannot exceed %d", INT_MAX2147483647);
3271 cat_blob_fd = (int) n;
3272}
3273
3274static void option_export_pack_edges(const char *edges)
3275{
3276 if (pack_edges)
3277 fclose(pack_edges);
3278 pack_edges = fopen(edges, "a");
3279 if (!pack_edges)
3280 die_errno("Cannot open '%s'", edges);
3281}
3282
3283static int parse_one_option(const char *option)
3284{
3285 if (skip_prefix(option, "max-pack-size=", &option)) {
3286 unsigned long v;
3287 if (!git_parse_ulong(option, &v))
3288 return 0;
3289 if (v < 8192) {
3290 warning("max-pack-size is now in bytes, assuming --max-pack-size=%lum", v);
3291 v *= 1024 * 1024;
3292 } else if (v < 1024 * 1024) {
3293 warning("minimum max-pack-size is 1 MiB");
3294 v = 1024 * 1024;
3295 }
3296 max_packsize = v;
3297 } else if (skip_prefix(option, "big-file-threshold=", &option)) {
3298 unsigned long v;
3299 if (!git_parse_ulong(option, &v))
3300 return 0;
3301 big_file_threshold = v;
3302 } else if (skip_prefix(option, "depth=", &option)) {
3303 option_depth(option);
3304 } else if (skip_prefix(option, "active-branches=", &option)) {
3305 option_active_branches(option);
3306 } else if (skip_prefix(option, "export-pack-edges=", &option)) {
3307 option_export_pack_edges(option);
3308 } else if (starts_with(option, "quiet")) {
3309 show_stats = 0;
3310 } else if (starts_with(option, "stats")) {
3311 show_stats = 1;
3312 } else {
3313 return 0;
3314 }
3315
3316 return 1;
3317}
3318
3319static int parse_one_feature(const char *feature, int from_stream)
3320{
3321 const char *arg;
3322
3323 if (skip_prefix(feature, "date-format=", &arg)) {
3324 option_date_format(arg);
3325 } else if (skip_prefix(feature, "import-marks=", &arg)) {
3326 option_import_marks(arg, from_stream, 0);
3327 } else if (skip_prefix(feature, "import-marks-if-exists=", &arg)) {
3328 option_import_marks(arg, from_stream, 1);
3329 } else if (skip_prefix(feature, "export-marks=", &arg)) {
3330 option_export_marks(arg);
3331 } else if (!strcmp(feature, "get-mark")) {
3332 ; /* Don't die - this feature is supported */
3333 } else if (!strcmp(feature, "cat-blob")) {
3334 ; /* Don't die - this feature is supported */
3335 } else if (!strcmp(feature, "relative-marks")) {
3336 relative_marks_paths = 1;
3337 } else if (!strcmp(feature, "no-relative-marks")) {
3338 relative_marks_paths = 0;
3339 } else if (!strcmp(feature, "done")) {
3340 require_explicit_termination = 1;
3341 } else if (!strcmp(feature, "force")) {
3342 force_update = 1;
3343 } else if (!strcmp(feature, "notes") || !strcmp(feature, "ls")) {
3344 ; /* do nothing; we have the feature */
3345 } else {
3346 return 0;
3347 }
3348
3349 return 1;
3350}
3351
3352static void parse_feature(const char *feature)
3353{
3354 if (seen_data_command)
3355 die("Got feature command '%s' after data command", feature);
3356
3357 if (parse_one_feature(feature, 1))
3358 return;
3359
3360 die("This version of fast-import does not support feature %s.", feature);
3361}
3362
3363static void parse_option(const char *option)
3364{
3365 if (seen_data_command)
3366 die("Got option command '%s' after data command", option);
3367
3368 if (parse_one_option(option))
3369 return;
3370
3371 die("This version of fast-import does not support option: %s", option);
3372}
3373
3374static void git_pack_config(void)
3375{
3376 int indexversion_value;
3377 int limit;
3378 unsigned long packsizelimit_value;
3379
3380 if (!git_config_get_ulong("pack.depth", &max_depth)) {
3381 if (max_depth > MAX_DEPTH((1<<13)-1))
3382 max_depth = MAX_DEPTH((1<<13)-1);
3383 }
3384 if (!git_config_get_int("pack.indexversion", &indexversion_value)) {
3385 pack_idx_opts.version = indexversion_value;
3386 if (pack_idx_opts.version > 2)
3387 git_die_config("pack.indexversion",
3388 "bad pack.indexversion=%"PRIu32"u", pack_idx_opts.version);
3389 }
3390 if (!git_config_get_ulong("pack.packsizelimit", &packsizelimit_value))
3391 max_packsize = packsizelimit_value;
3392
3393 if (!git_config_get_int("fastimport.unpacklimit", &limit))
3394 unpack_limit = limit;
3395 else if (!git_config_get_int("transfer.unpacklimit", &limit))
3396 unpack_limit = limit;
3397
3398 git_config(git_default_config, NULL((void*)0));
3399}
3400
3401static const char fast_import_usage[] =
3402"git fast-import [--date-format=<f>] [--max-pack-size=<n>] [--big-file-threshold=<n>] [--depth=<n>] [--active-branches=<n>] [--export-marks=<marks.file>]";
3403
3404static void parse_argv(void)
3405{
3406 unsigned int i;
3407
3408 for (i = 1; i < global_argc; i++) {
3409 const char *a = global_argv[i];
3410
3411 if (*a != '-' || !strcmp(a, "--"))
3412 break;
3413
3414 if (!skip_prefix(a, "--", &a))
3415 die("unknown option %s", a);
3416
3417 if (parse_one_option(a))
3418 continue;
3419
3420 if (parse_one_feature(a, 0))
3421 continue;
3422
3423 if (skip_prefix(a, "cat-blob-fd=", &a)) {
3424 option_cat_blob_fd(a);
3425 continue;
3426 }
3427
3428 die("unknown option --%s", a);
3429 }
3430 if (i != global_argc)
3431 usage(fast_import_usage);
3432
3433 seen_data_command = 1;
3434 if (import_marks_file)
3435 read_marks();
3436}
3437
3438int cmd_main(int argc, const char **argv)
3439{
3440 unsigned int i;
3441
3442 if (argc == 2 && !strcmp(argv[1], "-h"))
1
Assuming 'argc' is not equal to 2
3443 usage(fast_import_usage);
3444
3445 setup_git_directory();
3446 reset_pack_idx_option(&pack_idx_opts);
3447 git_pack_config();
3448
3449 alloc_objects(object_entry_alloc);
3450 strbuf_init(&command_buf, 0);
3451 atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
3452 branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
3453 avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
3454 marks = pool_calloc(1, sizeof(struct mark_set));
3455
3456 global_argc = argc;
3457 global_argv = argv;
3458
3459 rc_free = pool_alloc(cmd_save * sizeof(*rc_free));
3460 for (i = 0; i < (cmd_save - 1); i++)
2
Loop condition is false. Execution continues on line 3462
3461 rc_free[i].next = &rc_free[i + 1];
3462 rc_free[cmd_save - 1].next = NULL((void*)0);
3463
3464 prepare_packed_git();
3465 start_packfile();
3466 set_die_routine(die_nicely);
3467 set_checkpoint_signal();
3468 while (read_next_command() != EOF(-1)) {
3
Loop condition is true. Entering loop body
17
Loop condition is true. Entering loop body
31
Loop condition is true. Entering loop body
45
Loop condition is true. Entering loop body
3469 const char *v;
3470 if (!strcmp("blob", command_buf.buf))
4
Taking false branch
18
Taking false branch
32
Taking false branch
46
Taking false branch
3471 parse_new_blob();
3472 else if (skip_prefix(command_buf.buf, "ls ", &v))
5
Taking false branch
19
Taking false branch
33
Taking false branch
47
Taking false branch
3473 parse_ls(v, NULL((void*)0));
3474 else if (skip_prefix(command_buf.buf, "commit ", &v))
6
Taking false branch
20
Taking false branch
34
Taking false branch
48
Taking false branch
3475 parse_new_commit(v);
3476 else if (skip_prefix(command_buf.buf, "tag ", &v))
7
Taking false branch
21
Taking false branch
35
Taking false branch
49
Taking false branch
3477 parse_new_tag(v);
3478 else if (skip_prefix(command_buf.buf, "reset ", &v))
8
Taking false branch
22
Taking false branch
36
Taking false branch
50
Taking true branch
3479 parse_reset_branch(v);
51
Calling 'parse_reset_branch'
3480 else if (!strcmp("checkpoint", command_buf.buf))
9
Taking false branch
23
Taking false branch
37
Taking false branch
3481 parse_checkpoint();
3482 else if (!strcmp("done", command_buf.buf))
10
Taking false branch
24
Taking false branch
38
Taking false branch
3483 break;
3484 else if (starts_with(command_buf.buf, "progress "))
11
Taking false branch
25
Taking false branch
39
Taking false branch
3485 parse_progress();
3486 else if (skip_prefix(command_buf.buf, "feature ", &v))
12
Taking false branch
26
Taking false branch
40
Taking false branch
3487 parse_feature(v);
3488 else if (skip_prefix(command_buf.buf, "option git ", &v))
13
Taking false branch
27
Taking false branch
41
Taking false branch
3489 parse_option(v);
3490 else if (starts_with(command_buf.buf, "option "))
14
Taking true branch
28
Taking true branch
42
Taking true branch
3491 /* ignore non-git options*/;
3492 else
3493 die("Unsupported command: %s", command_buf.buf);
3494
3495 if (checkpoint_requested)
15
Assuming 'checkpoint_requested' is 0
16
Taking false branch
29
Assuming 'checkpoint_requested' is 0
30
Taking false branch
43
Assuming 'checkpoint_requested' is 0
44
Taking false branch
3496 checkpoint();
3497 }
3498
3499 /* argv hasn't been parsed yet, do so */
3500 if (!seen_data_command)
3501 parse_argv();
3502
3503 if (require_explicit_termination && feof(stdin__stdinp))
3504 die("stream ends early");
3505
3506 end_packfile();
3507
3508 dump_branches();
3509 dump_tags();
3510 unkeep_all_packs();
3511 dump_marks();
3512
3513 if (pack_edges)
3514 fclose(pack_edges);
3515
3516 if (show_stats) {
3517 uintmax_t total_count = 0, duplicate_count = 0;
3518 for (i = 0; i < ARRAY_SIZE(object_count_by_type)(sizeof(object_count_by_type) / sizeof((object_count_by_type)
[0]) + (sizeof(char [1 - 2*!(!__builtin_types_compatible_p(__typeof__
(object_count_by_type), __typeof__(&(object_count_by_type
)[0])))]) - 1))
; i++)
3519 total_count += object_count_by_type[i];
3520 for (i = 0; i < ARRAY_SIZE(duplicate_count_by_type)(sizeof(duplicate_count_by_type) / sizeof((duplicate_count_by_type
)[0]) + (sizeof(char [1 - 2*!(!__builtin_types_compatible_p(__typeof__
(duplicate_count_by_type), __typeof__(&(duplicate_count_by_type
)[0])))]) - 1))
; i++)
3521 duplicate_count += duplicate_count_by_type[i];
3522
3523 fprintf(stderr__stderrp, "%s statistics:\n", argv[0]);
3524 fprintf(stderr__stderrp, "---------------------------------------------------------------------\n");
3525 fprintf(stderr__stderrp, "Alloc'd objects: %10" PRIuMAX"j" "u" "\n", alloc_count);
3526 fprintf(stderr__stderrp, "Total objects: %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " duplicates )\n", total_count, duplicate_count);
3527 fprintf(stderr__stderrp, " blobs : %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " duplicates %10" PRIuMAX"j" "u" " deltas of %10" PRIuMAX"j" "u"" attempts)\n", object_count_by_type[OBJ_BLOB], duplicate_count_by_type[OBJ_BLOB], delta_count_by_type[OBJ_BLOB], delta_count_attempts_by_type[OBJ_BLOB]);
3528 fprintf(stderr__stderrp, " trees : %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " duplicates %10" PRIuMAX"j" "u" " deltas of %10" PRIuMAX"j" "u"" attempts)\n", object_count_by_type[OBJ_TREE], duplicate_count_by_type[OBJ_TREE], delta_count_by_type[OBJ_TREE], delta_count_attempts_by_type[OBJ_TREE]);
3529 fprintf(stderr__stderrp, " commits: %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " duplicates %10" PRIuMAX"j" "u" " deltas of %10" PRIuMAX"j" "u"" attempts)\n", object_count_by_type[OBJ_COMMIT], duplicate_count_by_type[OBJ_COMMIT], delta_count_by_type[OBJ_COMMIT], delta_count_attempts_by_type[OBJ_COMMIT]);
3530 fprintf(stderr__stderrp, " tags : %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " duplicates %10" PRIuMAX"j" "u" " deltas of %10" PRIuMAX"j" "u"" attempts)\n", object_count_by_type[OBJ_TAG], duplicate_count_by_type[OBJ_TAG], delta_count_by_type[OBJ_TAG], delta_count_attempts_by_type[OBJ_TAG]);
3531 fprintf(stderr__stderrp, "Total branches: %10lu (%10lu loads )\n", branch_count, branch_load_count);
3532 fprintf(stderr__stderrp, " marks: %10" PRIuMAX"j" "u" " (%10" PRIuMAX"j" "u" " unique )\n", (((uintmax_t)1) << marks->shift) * 1024, marks_set_count);
3533 fprintf(stderr__stderrp, " atoms: %10u\n", atom_cnt);
3534 fprintf(stderr__stderrp, "Memory total: %10" PRIuMAX"j" "u" " KiB\n", (total_allocd + alloc_count*sizeof(struct object_entry))/1024);
3535 fprintf(stderr__stderrp, " pools: %10lu KiB\n", (unsigned long)(total_allocd/1024));
3536 fprintf(stderr__stderrp, " objects: %10" PRIuMAX"j" "u" " KiB\n", (alloc_count*sizeof(struct object_entry))/1024);
3537 fprintf(stderr__stderrp, "---------------------------------------------------------------------\n");
3538 pack_report();
3539 fprintf(stderr__stderrp, "---------------------------------------------------------------------\n");
3540 fprintf(stderr__stderrp, "\n");
3541 }
3542
3543 return failure ? 1 : 0;
3544}