Git fork
1#define USE_THE_REPOSITORY_VARIABLE
2
3#include "git-compat-util.h"
4#include "tag.h"
5#include "commit.h"
6#include "commit-graph.h"
7#include "environment.h"
8#include "gettext.h"
9#include "hex.h"
10#include "repository.h"
11#include "object-name.h"
12#include "odb.h"
13#include "utf8.h"
14#include "diff.h"
15#include "revision.h"
16#include "notes.h"
17#include "alloc.h"
18#include "gpg-interface.h"
19#include "mergesort.h"
20#include "commit-slab.h"
21#include "prio-queue.h"
22#include "hash-lookup.h"
23#include "wt-status.h"
24#include "advice.h"
25#include "refs.h"
26#include "commit-reach.h"
27#include "setup.h"
28#include "shallow.h"
29#include "tree.h"
30#include "hook.h"
31#include "parse.h"
32#include "object-file.h"
33#include "object-file-convert.h"
34#include "prio-queue.h"
35
36static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
37
38int save_commit_buffer = 1;
39int no_graft_file_deprecated_advice;
40
41const char *commit_type = "commit";
42
43struct commit *lookup_commit_reference_gently(struct repository *r,
44 const struct object_id *oid, int quiet)
45{
46 struct object *obj = deref_tag(r,
47 parse_object(r, oid),
48 NULL, 0);
49
50 if (!obj)
51 return NULL;
52 return object_as_type(obj, OBJ_COMMIT, quiet);
53}
54
55struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid)
56{
57 return lookup_commit_reference_gently(r, oid, 0);
58}
59
60struct commit *lookup_commit_or_die(const struct object_id *oid, const char *ref_name)
61{
62 struct commit *c = lookup_commit_reference(the_repository, oid);
63 if (!c)
64 die(_("could not parse %s"), ref_name);
65 if (!oideq(oid, &c->object.oid)) {
66 warning(_("%s %s is not a commit!"),
67 ref_name, oid_to_hex(oid));
68 }
69 return c;
70}
71
72struct commit *lookup_commit_object(struct repository *r,
73 const struct object_id *oid)
74{
75 struct object *obj = parse_object(r, oid);
76 return obj ? object_as_type(obj, OBJ_COMMIT, 0) : NULL;
77
78}
79
80struct commit *lookup_commit(struct repository *r, const struct object_id *oid)
81{
82 struct object *obj = lookup_object(r, oid);
83 if (!obj)
84 return create_object(r, oid, alloc_commit_node(r));
85 return object_as_type(obj, OBJ_COMMIT, 0);
86}
87
88struct commit *lookup_commit_reference_by_name(const char *name)
89{
90 return lookup_commit_reference_by_name_gently(name, 0);
91}
92
93struct commit *lookup_commit_reference_by_name_gently(const char *name,
94 int quiet)
95{
96 struct object_id oid;
97 struct commit *commit;
98
99 if (repo_get_oid_committish(the_repository, name, &oid))
100 return NULL;
101 commit = lookup_commit_reference_gently(the_repository, &oid, quiet);
102 if (repo_parse_commit(the_repository, commit))
103 return NULL;
104 return commit;
105}
106
107static timestamp_t parse_commit_date(const char *buf, const char *tail)
108{
109 const char *dateptr;
110 const char *eol;
111
112 if (buf + 6 >= tail)
113 return 0;
114 if (memcmp(buf, "author", 6))
115 return 0;
116 while (buf < tail && *buf++ != '\n')
117 /* nada */;
118 if (buf + 9 >= tail)
119 return 0;
120 if (memcmp(buf, "committer", 9))
121 return 0;
122
123 /*
124 * Jump to end-of-line so that we can walk backwards to find the
125 * end-of-email ">". This is more forgiving of malformed cases
126 * because unexpected characters tend to be in the name and email
127 * fields.
128 */
129 eol = memchr(buf, '\n', tail - buf);
130 if (!eol)
131 return 0;
132 dateptr = eol;
133 while (dateptr > buf && dateptr[-1] != '>')
134 dateptr--;
135 if (dateptr == buf)
136 return 0;
137
138 /*
139 * Trim leading whitespace, but make sure we have at least one
140 * non-whitespace character, as parse_timestamp() will otherwise walk
141 * right past the newline we found in "eol" when skipping whitespace
142 * itself.
143 *
144 * In theory it would be sufficient to allow any character not matched
145 * by isspace(), but there's a catch: our isspace() does not
146 * necessarily match the behavior of parse_timestamp(), as the latter
147 * is implemented by system routines which match more exotic control
148 * codes, or even locale-dependent sequences.
149 *
150 * Since we expect the timestamp to be a number, we can check for that.
151 * Anything else (e.g., a non-numeric token like "foo") would just
152 * cause parse_timestamp() to return 0 anyway.
153 */
154 while (dateptr < eol && isspace(*dateptr))
155 dateptr++;
156 if (!isdigit(*dateptr) && *dateptr != '-')
157 return 0;
158
159 /*
160 * We know there is at least one digit (or dash), so we'll begin
161 * parsing there and stop at worst case at eol.
162 *
163 * Note that we may feed parse_timestamp() extra characters here if the
164 * commit is malformed, and it will parse as far as it can. For
165 * example, "123foo456" would return "123". That might be questionable
166 * (versus returning "0"), but it would help in a hypothetical case
167 * like "123456+0100", where the whitespace from the timezone is
168 * missing. Since such syntactic errors may be baked into history and
169 * hard to correct now, let's err on trying to make our best guess
170 * here, rather than insist on perfect syntax.
171 */
172 return parse_timestamp(dateptr, NULL, 10);
173}
174
175static const struct object_id *commit_graft_oid_access(size_t index, const void *table)
176{
177 const struct commit_graft * const *commit_graft_table = table;
178 return &commit_graft_table[index]->oid;
179}
180
181int commit_graft_pos(struct repository *r, const struct object_id *oid)
182{
183 return oid_pos(oid, r->parsed_objects->grafts,
184 r->parsed_objects->grafts_nr,
185 commit_graft_oid_access);
186}
187
188void unparse_commit(struct repository *r, const struct object_id *oid)
189{
190 struct commit *c = lookup_commit(r, oid);
191
192 if (!c->object.parsed)
193 return;
194 free_commit_list(c->parents);
195 c->parents = NULL;
196 c->object.parsed = 0;
197}
198
199int register_commit_graft(struct repository *r, struct commit_graft *graft,
200 int ignore_dups)
201{
202 int pos = commit_graft_pos(r, &graft->oid);
203
204 if (0 <= pos) {
205 if (ignore_dups)
206 free(graft);
207 else {
208 free(r->parsed_objects->grafts[pos]);
209 r->parsed_objects->grafts[pos] = graft;
210 }
211 return 1;
212 }
213 pos = -pos - 1;
214 ALLOC_GROW(r->parsed_objects->grafts,
215 r->parsed_objects->grafts_nr + 1,
216 r->parsed_objects->grafts_alloc);
217 r->parsed_objects->grafts_nr++;
218 if (pos < r->parsed_objects->grafts_nr)
219 memmove(r->parsed_objects->grafts + pos + 1,
220 r->parsed_objects->grafts + pos,
221 (r->parsed_objects->grafts_nr - pos - 1) *
222 sizeof(*r->parsed_objects->grafts));
223 r->parsed_objects->grafts[pos] = graft;
224 unparse_commit(r, &graft->oid);
225 return 0;
226}
227
228struct commit_graft *read_graft_line(struct strbuf *line)
229{
230 /* The format is just "Commit Parent1 Parent2 ...\n" */
231 int i, phase;
232 const char *tail = NULL;
233 struct commit_graft *graft = NULL;
234 struct object_id dummy_oid, *oid;
235
236 strbuf_rtrim(line);
237 if (!line->len || line->buf[0] == '#')
238 return NULL;
239 /*
240 * phase 0 verifies line, counts hashes in line and allocates graft
241 * phase 1 fills graft
242 */
243 for (phase = 0; phase < 2; phase++) {
244 oid = graft ? &graft->oid : &dummy_oid;
245 if (parse_oid_hex(line->buf, oid, &tail))
246 goto bad_graft_data;
247 for (i = 0; *tail != '\0'; i++) {
248 oid = graft ? &graft->parent[i] : &dummy_oid;
249 if (!isspace(*tail++) || parse_oid_hex(tail, oid, &tail))
250 goto bad_graft_data;
251 }
252 if (!graft) {
253 graft = xmalloc(st_add(sizeof(*graft),
254 st_mult(sizeof(struct object_id), i)));
255 graft->nr_parent = i;
256 }
257 }
258 return graft;
259
260bad_graft_data:
261 error("bad graft data: %s", line->buf);
262 assert(!graft);
263 return NULL;
264}
265
266static int read_graft_file(struct repository *r, const char *graft_file)
267{
268 FILE *fp = fopen_or_warn(graft_file, "r");
269 struct strbuf buf = STRBUF_INIT;
270 if (!fp)
271 return -1;
272 if (!no_graft_file_deprecated_advice &&
273 advice_enabled(ADVICE_GRAFT_FILE_DEPRECATED))
274 advise(_("Support for <GIT_DIR>/info/grafts is deprecated\n"
275 "and will be removed in a future Git version.\n"
276 "\n"
277 "Please use \"git replace --convert-graft-file\"\n"
278 "to convert the grafts into replace refs.\n"
279 "\n"
280 "Turn this message off by running\n"
281 "\"git config set advice.graftFileDeprecated false\""));
282 while (!strbuf_getwholeline(&buf, fp, '\n')) {
283 /* The format is just "Commit Parent1 Parent2 ...\n" */
284 struct commit_graft *graft = read_graft_line(&buf);
285 if (!graft)
286 continue;
287 if (register_commit_graft(r, graft, 1))
288 error("duplicate graft data: %s", buf.buf);
289 }
290 fclose(fp);
291 strbuf_release(&buf);
292 return 0;
293}
294
295void prepare_commit_graft(struct repository *r)
296{
297 const char *graft_file;
298
299 if (r->parsed_objects->commit_graft_prepared)
300 return;
301 if (!startup_info->have_repository)
302 return;
303
304 graft_file = repo_get_graft_file(r);
305 read_graft_file(r, graft_file);
306 /* make sure shallows are read */
307 is_repository_shallow(r);
308 r->parsed_objects->commit_graft_prepared = 1;
309}
310
311struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid)
312{
313 int pos;
314 prepare_commit_graft(r);
315 pos = commit_graft_pos(r, oid);
316 if (pos < 0)
317 return NULL;
318 return r->parsed_objects->grafts[pos];
319}
320
321int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
322{
323 int i, ret;
324 for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
325 ret = fn(the_repository->parsed_objects->grafts[i], cb_data);
326 return ret;
327}
328
329struct commit_buffer {
330 void *buffer;
331 unsigned long size;
332};
333define_commit_slab(buffer_slab, struct commit_buffer);
334
335struct buffer_slab *allocate_commit_buffer_slab(void)
336{
337 struct buffer_slab *bs = xmalloc(sizeof(*bs));
338 init_buffer_slab(bs);
339 return bs;
340}
341
342void free_commit_buffer_slab(struct buffer_slab *bs)
343{
344 clear_buffer_slab(bs);
345 free(bs);
346}
347
348void set_commit_buffer(struct repository *r, struct commit *commit, void *buffer, unsigned long size)
349{
350 struct commit_buffer *v = buffer_slab_at(
351 r->parsed_objects->buffer_slab, commit);
352 v->buffer = buffer;
353 v->size = size;
354}
355
356const void *get_cached_commit_buffer(struct repository *r, const struct commit *commit, unsigned long *sizep)
357{
358 struct commit_buffer *v = buffer_slab_peek(
359 r->parsed_objects->buffer_slab, commit);
360 if (!v) {
361 if (sizep)
362 *sizep = 0;
363 return NULL;
364 }
365 if (sizep)
366 *sizep = v->size;
367 return v->buffer;
368}
369
370const void *repo_get_commit_buffer(struct repository *r,
371 const struct commit *commit,
372 unsigned long *sizep)
373{
374 const void *ret = get_cached_commit_buffer(r, commit, sizep);
375 if (!ret) {
376 enum object_type type;
377 unsigned long size;
378 ret = odb_read_object(r->objects, &commit->object.oid, &type, &size);
379 if (!ret)
380 die("cannot read commit object %s",
381 oid_to_hex(&commit->object.oid));
382 if (type != OBJ_COMMIT)
383 die("expected commit for %s, got %s",
384 oid_to_hex(&commit->object.oid), type_name(type));
385 if (sizep)
386 *sizep = size;
387 }
388 return ret;
389}
390
391void repo_unuse_commit_buffer(struct repository *r,
392 const struct commit *commit,
393 const void *buffer)
394{
395 struct commit_buffer *v = buffer_slab_peek(
396 r->parsed_objects->buffer_slab, commit);
397 if (!(v && v->buffer == buffer))
398 free((void *)buffer);
399}
400
401void free_commit_buffer(struct parsed_object_pool *pool, struct commit *commit)
402{
403 struct commit_buffer *v = buffer_slab_peek(
404 pool->buffer_slab, commit);
405 if (v) {
406 FREE_AND_NULL(v->buffer);
407 v->size = 0;
408 }
409}
410
411static inline void set_commit_tree(struct commit *c, struct tree *t)
412{
413 c->maybe_tree = t;
414}
415
416struct tree *repo_get_commit_tree(struct repository *r,
417 const struct commit *commit)
418{
419 if (commit->maybe_tree || !commit->object.parsed)
420 return commit->maybe_tree;
421
422 if (commit_graph_position(commit) != COMMIT_NOT_FROM_GRAPH)
423 return get_commit_tree_in_graph(r, commit);
424
425 return NULL;
426}
427
428struct object_id *get_commit_tree_oid(const struct commit *commit)
429{
430 struct tree *tree = repo_get_commit_tree(the_repository, commit);
431 return tree ? &tree->object.oid : NULL;
432}
433
434void release_commit_memory(struct parsed_object_pool *pool, struct commit *c)
435{
436 set_commit_tree(c, NULL);
437 free_commit_buffer(pool, c);
438 c->index = 0;
439 free_commit_list(c->parents);
440
441 c->object.parsed = 0;
442}
443
444const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
445{
446 struct commit_buffer *v = buffer_slab_peek(
447 the_repository->parsed_objects->buffer_slab, commit);
448 void *ret;
449
450 if (!v) {
451 if (sizep)
452 *sizep = 0;
453 return NULL;
454 }
455 ret = v->buffer;
456 if (sizep)
457 *sizep = v->size;
458
459 v->buffer = NULL;
460 v->size = 0;
461 return ret;
462}
463
464int parse_commit_buffer(struct repository *r, struct commit *item, const void *buffer, unsigned long size, int check_graph)
465{
466 const char *tail = buffer;
467 const char *bufptr = buffer;
468 struct object_id parent;
469 struct commit_list **pptr;
470 struct commit_graft *graft;
471 const int tree_entry_len = the_hash_algo->hexsz + 5;
472 const int parent_entry_len = the_hash_algo->hexsz + 7;
473 struct tree *tree;
474
475 if (item->object.parsed)
476 return 0;
477 /*
478 * Presumably this is leftover from an earlier failed parse;
479 * clear it out in preparation for us re-parsing (we'll hit the
480 * same error, but that's good, since it lets our caller know
481 * the result cannot be trusted.
482 */
483 free_commit_list(item->parents);
484 item->parents = NULL;
485
486 tail += size;
487 if (tail <= bufptr + tree_entry_len + 1 || memcmp(bufptr, "tree ", 5) ||
488 bufptr[tree_entry_len] != '\n')
489 return error("bogus commit object %s", oid_to_hex(&item->object.oid));
490 if (get_oid_hex(bufptr + 5, &parent) < 0)
491 return error("bad tree pointer in commit %s",
492 oid_to_hex(&item->object.oid));
493 tree = lookup_tree(r, &parent);
494 if (!tree)
495 return error("bad tree pointer %s in commit %s",
496 oid_to_hex(&parent),
497 oid_to_hex(&item->object.oid));
498 set_commit_tree(item, tree);
499 bufptr += tree_entry_len + 1; /* "tree " + "hex sha1" + "\n" */
500 pptr = &item->parents;
501
502 graft = lookup_commit_graft(r, &item->object.oid);
503 if (graft)
504 r->parsed_objects->substituted_parent = 1;
505 while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
506 struct commit *new_parent;
507
508 if (tail <= bufptr + parent_entry_len + 1 ||
509 get_oid_hex(bufptr + 7, &parent) ||
510 bufptr[parent_entry_len] != '\n')
511 return error("bad parents in commit %s", oid_to_hex(&item->object.oid));
512 bufptr += parent_entry_len + 1;
513 /*
514 * The clone is shallow if nr_parent < 0, and we must
515 * not traverse its real parents even when we unhide them.
516 */
517 if (graft && (graft->nr_parent < 0 || !grafts_keep_true_parents))
518 continue;
519 new_parent = lookup_commit(r, &parent);
520 if (!new_parent)
521 return error("bad parent %s in commit %s",
522 oid_to_hex(&parent),
523 oid_to_hex(&item->object.oid));
524 pptr = &commit_list_insert(new_parent, pptr)->next;
525 }
526 if (graft) {
527 int i;
528 struct commit *new_parent;
529 for (i = 0; i < graft->nr_parent; i++) {
530 new_parent = lookup_commit(r,
531 &graft->parent[i]);
532 if (!new_parent)
533 return error("bad graft parent %s in commit %s",
534 oid_to_hex(&graft->parent[i]),
535 oid_to_hex(&item->object.oid));
536 pptr = &commit_list_insert(new_parent, pptr)->next;
537 }
538 }
539 item->date = parse_commit_date(bufptr, tail);
540
541 if (check_graph)
542 load_commit_graph_info(r, item);
543
544 item->object.parsed = 1;
545 return 0;
546}
547
548int repo_parse_commit_internal(struct repository *r,
549 struct commit *item,
550 int quiet_on_missing,
551 int use_commit_graph)
552{
553 enum object_type type;
554 void *buffer;
555 unsigned long size;
556 struct object_info oi = {
557 .typep = &type,
558 .sizep = &size,
559 .contentp = &buffer,
560 };
561 /*
562 * Git does not support partial clones that exclude commits, so set
563 * OBJECT_INFO_SKIP_FETCH_OBJECT to fail fast when an object is missing.
564 */
565 int flags = OBJECT_INFO_LOOKUP_REPLACE | OBJECT_INFO_SKIP_FETCH_OBJECT |
566 OBJECT_INFO_DIE_IF_CORRUPT;
567 int ret;
568
569 if (!item)
570 return -1;
571 if (item->object.parsed)
572 return 0;
573 if (use_commit_graph && parse_commit_in_graph(r, item)) {
574 static int commit_graph_paranoia = -1;
575
576 if (commit_graph_paranoia == -1)
577 commit_graph_paranoia = git_env_bool(GIT_COMMIT_GRAPH_PARANOIA, 0);
578
579 if (commit_graph_paranoia && !odb_has_object(r->objects, &item->object.oid, 0)) {
580 unparse_commit(r, &item->object.oid);
581 return quiet_on_missing ? -1 :
582 error(_("commit %s exists in commit-graph but not in the object database"),
583 oid_to_hex(&item->object.oid));
584 }
585
586 return 0;
587 }
588
589 if (odb_read_object_info_extended(r->objects, &item->object.oid,
590 &oi, flags) < 0)
591 return quiet_on_missing ? -1 :
592 error("Could not read %s",
593 oid_to_hex(&item->object.oid));
594 if (type != OBJ_COMMIT) {
595 free(buffer);
596 return error("Object %s not a commit",
597 oid_to_hex(&item->object.oid));
598 }
599
600 ret = parse_commit_buffer(r, item, buffer, size, 0);
601 if (save_commit_buffer && !ret &&
602 !get_cached_commit_buffer(r, item, NULL)) {
603 set_commit_buffer(r, item, buffer, size);
604 return 0;
605 }
606 free(buffer);
607 return ret;
608}
609
610int repo_parse_commit_gently(struct repository *r,
611 struct commit *item, int quiet_on_missing)
612{
613 return repo_parse_commit_internal(r, item, quiet_on_missing, 1);
614}
615
616void parse_commit_or_die(struct commit *item)
617{
618 if (repo_parse_commit(the_repository, item))
619 die("unable to parse commit %s",
620 item ? oid_to_hex(&item->object.oid) : "(null)");
621}
622
623int find_commit_subject(const char *commit_buffer, const char **subject)
624{
625 const char *eol;
626 const char *p = commit_buffer;
627
628 while (*p && (*p != '\n' || p[1] != '\n'))
629 p++;
630 if (*p) {
631 p = skip_blank_lines(p + 2);
632 eol = strchrnul(p, '\n');
633 } else
634 eol = p;
635
636 *subject = p;
637
638 return eol - p;
639}
640
641size_t commit_subject_length(const char *body)
642{
643 const char *p = body;
644 while (*p) {
645 const char *next = skip_blank_lines(p);
646 if (next != p)
647 break;
648 p = strchrnul(p, '\n');
649 if (*p)
650 p++;
651 }
652 return p - body;
653}
654
655struct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p)
656{
657 struct commit_list *new_list = xmalloc(sizeof(struct commit_list));
658 new_list->item = item;
659 new_list->next = *list_p;
660 *list_p = new_list;
661 return new_list;
662}
663
664int commit_list_contains(struct commit *item, struct commit_list *list)
665{
666 while (list) {
667 if (list->item == item)
668 return 1;
669 list = list->next;
670 }
671
672 return 0;
673}
674
675unsigned commit_list_count(const struct commit_list *l)
676{
677 unsigned c = 0;
678 for (; l; l = l->next )
679 c++;
680 return c;
681}
682
683struct commit_list *copy_commit_list(const struct commit_list *list)
684{
685 struct commit_list *head = NULL;
686 struct commit_list **pp = &head;
687 while (list) {
688 pp = commit_list_append(list->item, pp);
689 list = list->next;
690 }
691 return head;
692}
693
694struct commit_list *reverse_commit_list(struct commit_list *list)
695{
696 struct commit_list *next = NULL, *current, *backup;
697 for (current = list; current; current = backup) {
698 backup = current->next;
699 current->next = next;
700 next = current;
701 }
702 return next;
703}
704
705void free_commit_list(struct commit_list *list)
706{
707 while (list)
708 pop_commit(&list);
709}
710
711struct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list)
712{
713 struct commit_list **pp = list;
714 struct commit_list *p;
715 while ((p = *pp) != NULL) {
716 if (p->item->date < item->date) {
717 break;
718 }
719 pp = &p->next;
720 }
721 return commit_list_insert(item, pp);
722}
723
724static int commit_list_compare_by_date(const struct commit_list *a,
725 const struct commit_list *b)
726{
727 timestamp_t a_date = a->item->date;
728 timestamp_t b_date = b->item->date;
729 if (a_date < b_date)
730 return 1;
731 if (a_date > b_date)
732 return -1;
733 return 0;
734}
735
736DEFINE_LIST_SORT(static, commit_list_sort, struct commit_list, next);
737
738void commit_list_sort_by_date(struct commit_list **list)
739{
740 commit_list_sort(list, commit_list_compare_by_date);
741}
742
743struct commit *pop_most_recent_commit(struct prio_queue *queue,
744 unsigned int mark)
745{
746 struct commit *ret = prio_queue_peek(queue);
747 int get_pending = 1;
748 struct commit_list *parents = ret->parents;
749
750 while (parents) {
751 struct commit *commit = parents->item;
752 if (!repo_parse_commit(the_repository, commit) && !(commit->object.flags & mark)) {
753 commit->object.flags |= mark;
754 if (get_pending)
755 prio_queue_replace(queue, commit);
756 else
757 prio_queue_put(queue, commit);
758 get_pending = 0;
759 }
760 parents = parents->next;
761 }
762 if (get_pending)
763 prio_queue_get(queue);
764 return ret;
765}
766
767static void clear_commit_marks_1(struct commit_list **plist,
768 struct commit *commit, unsigned int mark)
769{
770 while (commit) {
771 struct commit_list *parents;
772
773 if (!(mark & commit->object.flags))
774 return;
775
776 commit->object.flags &= ~mark;
777
778 parents = commit->parents;
779 if (!parents)
780 return;
781
782 while ((parents = parents->next)) {
783 if (parents->item->object.flags & mark)
784 commit_list_insert(parents->item, plist);
785 }
786
787 commit = commit->parents->item;
788 }
789}
790
791void clear_commit_marks_many(size_t nr, struct commit **commit, unsigned int mark)
792{
793 for (size_t i = 0; i < nr; i++)
794 clear_commit_marks(commit[i], mark);
795}
796
797void clear_commit_marks(struct commit *commit, unsigned int mark)
798{
799 struct commit_list *list = NULL;
800
801 clear_commit_marks_1(&list, commit, mark);
802 while (list)
803 clear_commit_marks_1(&list, pop_commit(&list), mark);
804}
805
806struct commit *pop_commit(struct commit_list **stack)
807{
808 struct commit_list *top = *stack;
809 struct commit *item = top ? top->item : NULL;
810
811 if (top) {
812 *stack = top->next;
813 free(top);
814 }
815 return item;
816}
817
818/*
819 * Topological sort support
820 */
821
822/* count number of children that have not been emitted */
823define_commit_slab(indegree_slab, int);
824
825define_commit_slab(author_date_slab, timestamp_t);
826
827void record_author_date(struct author_date_slab *author_date,
828 struct commit *commit)
829{
830 const char *buffer = repo_get_commit_buffer(the_repository, commit,
831 NULL);
832 struct ident_split ident;
833 const char *ident_line;
834 size_t ident_len;
835 char *date_end;
836 timestamp_t date;
837
838 ident_line = find_commit_header(buffer, "author", &ident_len);
839 if (!ident_line)
840 goto fail_exit; /* no author line */
841 if (split_ident_line(&ident, ident_line, ident_len) ||
842 !ident.date_begin || !ident.date_end)
843 goto fail_exit; /* malformed "author" line */
844
845 date = parse_timestamp(ident.date_begin, &date_end, 10);
846 if (date_end != ident.date_end)
847 goto fail_exit; /* malformed date */
848 *(author_date_slab_at(author_date, commit)) = date;
849
850fail_exit:
851 repo_unuse_commit_buffer(the_repository, commit, buffer);
852}
853
854int compare_commits_by_author_date(const void *a_, const void *b_,
855 void *cb_data)
856{
857 const struct commit *a = a_, *b = b_;
858 struct author_date_slab *author_date = cb_data;
859 timestamp_t a_date = *(author_date_slab_at(author_date, a));
860 timestamp_t b_date = *(author_date_slab_at(author_date, b));
861
862 /* newer commits with larger date first */
863 if (a_date < b_date)
864 return 1;
865 else if (a_date > b_date)
866 return -1;
867 return 0;
868}
869
870int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_,
871 void *unused UNUSED)
872{
873 const struct commit *a = a_, *b = b_;
874 const timestamp_t generation_a = commit_graph_generation(a),
875 generation_b = commit_graph_generation(b);
876
877 /* newer commits first */
878 if (generation_a < generation_b)
879 return 1;
880 else if (generation_a > generation_b)
881 return -1;
882
883 /* use date as a heuristic when generations are equal */
884 if (a->date < b->date)
885 return 1;
886 else if (a->date > b->date)
887 return -1;
888 return 0;
889}
890
891int compare_commits_by_commit_date(const void *a_, const void *b_,
892 void *unused UNUSED)
893{
894 const struct commit *a = a_, *b = b_;
895 /* newer commits with larger date first */
896 if (a->date < b->date)
897 return 1;
898 else if (a->date > b->date)
899 return -1;
900 return 0;
901}
902
903/*
904 * Performs an in-place topological sort on the list supplied.
905 */
906void sort_in_topological_order(struct commit_list **list, enum rev_sort_order sort_order)
907{
908 struct commit_list *next, *orig = *list;
909 struct commit_list **pptr;
910 struct indegree_slab indegree;
911 struct prio_queue queue;
912 struct commit *commit;
913 struct author_date_slab author_date;
914
915 if (!orig)
916 return;
917 *list = NULL;
918
919 init_indegree_slab(&indegree);
920 memset(&queue, '\0', sizeof(queue));
921
922 switch (sort_order) {
923 default: /* REV_SORT_IN_GRAPH_ORDER */
924 queue.compare = NULL;
925 break;
926 case REV_SORT_BY_COMMIT_DATE:
927 queue.compare = compare_commits_by_commit_date;
928 break;
929 case REV_SORT_BY_AUTHOR_DATE:
930 init_author_date_slab(&author_date);
931 queue.compare = compare_commits_by_author_date;
932 queue.cb_data = &author_date;
933 break;
934 }
935
936 /* Mark them and clear the indegree */
937 for (next = orig; next; next = next->next) {
938 struct commit *commit = next->item;
939 *(indegree_slab_at(&indegree, commit)) = 1;
940 /* also record the author dates, if needed */
941 if (sort_order == REV_SORT_BY_AUTHOR_DATE)
942 record_author_date(&author_date, commit);
943 }
944
945 /* update the indegree */
946 for (next = orig; next; next = next->next) {
947 struct commit_list *parents = next->item->parents;
948 while (parents) {
949 struct commit *parent = parents->item;
950 int *pi = indegree_slab_at(&indegree, parent);
951
952 if (*pi)
953 (*pi)++;
954 parents = parents->next;
955 }
956 }
957
958 /*
959 * find the tips
960 *
961 * tips are nodes not reachable from any other node in the list
962 *
963 * the tips serve as a starting set for the work queue.
964 */
965 for (next = orig; next; next = next->next) {
966 struct commit *commit = next->item;
967
968 if (*(indegree_slab_at(&indegree, commit)) == 1)
969 prio_queue_put(&queue, commit);
970 }
971
972 /*
973 * This is unfortunate; the initial tips need to be shown
974 * in the order given from the revision traversal machinery.
975 */
976 if (sort_order == REV_SORT_IN_GRAPH_ORDER)
977 prio_queue_reverse(&queue);
978
979 /* We no longer need the commit list */
980 free_commit_list(orig);
981
982 pptr = list;
983 *list = NULL;
984 while ((commit = prio_queue_get(&queue)) != NULL) {
985 struct commit_list *parents;
986
987 for (parents = commit->parents; parents ; parents = parents->next) {
988 struct commit *parent = parents->item;
989 int *pi = indegree_slab_at(&indegree, parent);
990
991 if (!*pi)
992 continue;
993
994 /*
995 * parents are only enqueued for emission
996 * when all their children have been emitted thereby
997 * guaranteeing topological order.
998 */
999 if (--(*pi) == 1)
1000 prio_queue_put(&queue, parent);
1001 }
1002 /*
1003 * all children of commit have already been
1004 * emitted. we can emit it now.
1005 */
1006 *(indegree_slab_at(&indegree, commit)) = 0;
1007
1008 pptr = &commit_list_insert(commit, pptr)->next;
1009 }
1010
1011 clear_indegree_slab(&indegree);
1012 clear_prio_queue(&queue);
1013 if (sort_order == REV_SORT_BY_AUTHOR_DATE)
1014 clear_author_date_slab(&author_date);
1015}
1016
1017struct rev_collect {
1018 struct commit **commit;
1019 int nr;
1020 int alloc;
1021 unsigned int initial : 1;
1022};
1023
1024static void add_one_commit(struct object_id *oid, struct rev_collect *revs)
1025{
1026 struct commit *commit;
1027
1028 if (is_null_oid(oid))
1029 return;
1030
1031 commit = lookup_commit(the_repository, oid);
1032 if (!commit ||
1033 (commit->object.flags & TMP_MARK) ||
1034 repo_parse_commit(the_repository, commit))
1035 return;
1036
1037 ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc);
1038 revs->commit[revs->nr++] = commit;
1039 commit->object.flags |= TMP_MARK;
1040}
1041
1042static int collect_one_reflog_ent(const char *refname UNUSED,
1043 struct object_id *ooid, struct object_id *noid,
1044 const char *ident UNUSED,
1045 timestamp_t timestamp UNUSED, int tz UNUSED,
1046 const char *message UNUSED, void *cbdata)
1047{
1048 struct rev_collect *revs = cbdata;
1049
1050 if (revs->initial) {
1051 revs->initial = 0;
1052 add_one_commit(ooid, revs);
1053 }
1054 add_one_commit(noid, revs);
1055 return 0;
1056}
1057
1058struct commit *get_fork_point(const char *refname, struct commit *commit)
1059{
1060 struct object_id oid;
1061 struct rev_collect revs;
1062 struct commit_list *bases = NULL;
1063 int i;
1064 struct commit *ret = NULL;
1065 char *full_refname;
1066
1067 switch (repo_dwim_ref(the_repository, refname, strlen(refname), &oid,
1068 &full_refname, 0)) {
1069 case 0:
1070 die("No such ref: '%s'", refname);
1071 case 1:
1072 break; /* good */
1073 default:
1074 die("Ambiguous refname: '%s'", refname);
1075 }
1076
1077 memset(&revs, 0, sizeof(revs));
1078 revs.initial = 1;
1079 refs_for_each_reflog_ent(get_main_ref_store(the_repository),
1080 full_refname, collect_one_reflog_ent, &revs);
1081
1082 if (!revs.nr)
1083 add_one_commit(&oid, &revs);
1084
1085 for (i = 0; i < revs.nr; i++)
1086 revs.commit[i]->object.flags &= ~TMP_MARK;
1087
1088 if (repo_get_merge_bases_many(the_repository, commit, revs.nr,
1089 revs.commit, &bases) < 0)
1090 exit(128);
1091
1092 /*
1093 * There should be one and only one merge base, when we found
1094 * a common ancestor among reflog entries.
1095 */
1096 if (!bases || bases->next)
1097 goto cleanup_return;
1098
1099 /* And the found one must be one of the reflog entries */
1100 for (i = 0; i < revs.nr; i++)
1101 if (&bases->item->object == &revs.commit[i]->object)
1102 break; /* found */
1103 if (revs.nr <= i)
1104 goto cleanup_return;
1105
1106 ret = bases->item;
1107
1108cleanup_return:
1109 free(revs.commit);
1110 free_commit_list(bases);
1111 free(full_refname);
1112 return ret;
1113}
1114
1115/*
1116 * Indexed by hash algorithm identifier.
1117 */
1118static const char *gpg_sig_headers[] = {
1119 NULL,
1120 "gpgsig",
1121 "gpgsig-sha256",
1122};
1123
1124int add_header_signature(struct strbuf *buf, struct strbuf *sig, const struct git_hash_algo *algo)
1125{
1126 int inspos, copypos;
1127 const char *eoh;
1128 const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algo)];
1129 int gpg_sig_header_len = strlen(gpg_sig_header);
1130
1131 /* find the end of the header */
1132 eoh = strstr(buf->buf, "\n\n");
1133 if (!eoh)
1134 inspos = buf->len;
1135 else
1136 inspos = eoh - buf->buf + 1;
1137
1138 for (copypos = 0; sig->buf[copypos]; ) {
1139 const char *bol = sig->buf + copypos;
1140 const char *eol = strchrnul(bol, '\n');
1141 int len = (eol - bol) + !!*eol;
1142
1143 if (!copypos) {
1144 strbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len);
1145 inspos += gpg_sig_header_len;
1146 }
1147 strbuf_insertstr(buf, inspos++, " ");
1148 strbuf_insert(buf, inspos, bol, len);
1149 inspos += len;
1150 copypos += len;
1151 }
1152 return 0;
1153}
1154
1155static int sign_commit_to_strbuf(struct strbuf *sig, struct strbuf *buf, const char *keyid)
1156{
1157 char *keyid_to_free = NULL;
1158 int ret = 0;
1159 if (!keyid || !*keyid)
1160 keyid = keyid_to_free = get_signing_key();
1161 if (sign_buffer(buf, sig, keyid))
1162 ret = -1;
1163 free(keyid_to_free);
1164 return ret;
1165}
1166
1167int parse_signed_commit(const struct commit *commit,
1168 struct strbuf *payload, struct strbuf *signature,
1169 const struct git_hash_algo *algop)
1170{
1171 unsigned long size;
1172 const char *buffer = repo_get_commit_buffer(the_repository, commit,
1173 &size);
1174 int ret = parse_buffer_signed_by_header(buffer, size, payload, signature, algop);
1175
1176 repo_unuse_commit_buffer(the_repository, commit, buffer);
1177 return ret;
1178}
1179
1180int parse_buffer_signed_by_header(const char *buffer,
1181 unsigned long size,
1182 struct strbuf *payload,
1183 struct strbuf *signature,
1184 const struct git_hash_algo *algop)
1185{
1186 int in_signature = 0, saw_signature = 0, other_signature = 0;
1187 const char *line, *tail, *p;
1188 const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algop)];
1189
1190 line = buffer;
1191 tail = buffer + size;
1192 while (line < tail) {
1193 const char *sig = NULL;
1194 const char *next = memchr(line, '\n', tail - line);
1195
1196 next = next ? next + 1 : tail;
1197 if (in_signature && line[0] == ' ')
1198 sig = line + 1;
1199 else if (skip_prefix(line, gpg_sig_header, &p) &&
1200 *p == ' ') {
1201 sig = line + strlen(gpg_sig_header) + 1;
1202 other_signature = 0;
1203 }
1204 else if (starts_with(line, "gpgsig"))
1205 other_signature = 1;
1206 else if (other_signature && line[0] != ' ')
1207 other_signature = 0;
1208 if (sig) {
1209 strbuf_add(signature, sig, next - sig);
1210 saw_signature = 1;
1211 in_signature = 1;
1212 } else {
1213 if (*line == '\n')
1214 /* dump the whole remainder of the buffer */
1215 next = tail;
1216 if (!other_signature)
1217 strbuf_add(payload, line, next - line);
1218 in_signature = 0;
1219 }
1220 line = next;
1221 }
1222 return saw_signature;
1223}
1224
1225int remove_signature(struct strbuf *buf)
1226{
1227 const char *line = buf->buf;
1228 const char *tail = buf->buf + buf->len;
1229 int in_signature = 0;
1230 struct sigbuf {
1231 const char *start;
1232 const char *end;
1233 } sigs[2], *sigp = &sigs[0];
1234 int i;
1235 const char *orig_buf = buf->buf;
1236
1237 memset(sigs, 0, sizeof(sigs));
1238
1239 while (line < tail) {
1240 const char *next = memchr(line, '\n', tail - line);
1241 next = next ? next + 1 : tail;
1242
1243 if (in_signature && line[0] == ' ')
1244 sigp->end = next;
1245 else if (starts_with(line, "gpgsig")) {
1246 int i;
1247 for (i = 1; i < GIT_HASH_NALGOS; i++) {
1248 const char *p;
1249 if (skip_prefix(line, gpg_sig_headers[i], &p) &&
1250 *p == ' ') {
1251 sigp->start = line;
1252 sigp->end = next;
1253 in_signature = 1;
1254 }
1255 }
1256 } else {
1257 if (*line == '\n')
1258 /* dump the whole remainder of the buffer */
1259 next = tail;
1260 if (in_signature && sigp - sigs != ARRAY_SIZE(sigs))
1261 sigp++;
1262 in_signature = 0;
1263 }
1264 line = next;
1265 }
1266
1267 for (i = ARRAY_SIZE(sigs) - 1; i >= 0; i--)
1268 if (sigs[i].start)
1269 strbuf_remove(buf, sigs[i].start - orig_buf, sigs[i].end - sigs[i].start);
1270
1271 return sigs[0].start != NULL;
1272}
1273
1274static void handle_signed_tag(const struct commit *parent, struct commit_extra_header ***tail)
1275{
1276 struct merge_remote_desc *desc;
1277 struct commit_extra_header *mergetag;
1278 char *buf;
1279 unsigned long size;
1280 enum object_type type;
1281 struct strbuf payload = STRBUF_INIT;
1282 struct strbuf signature = STRBUF_INIT;
1283
1284 desc = merge_remote_util(parent);
1285 if (!desc || !desc->obj)
1286 return;
1287 buf = odb_read_object(the_repository->objects, &desc->obj->oid,
1288 &type, &size);
1289 if (!buf || type != OBJ_TAG)
1290 goto free_return;
1291 if (!parse_signature(buf, size, &payload, &signature))
1292 goto free_return;
1293 /*
1294 * We could verify this signature and either omit the tag when
1295 * it does not validate, but the integrator may not have the
1296 * public key of the signer of the tag being merged, while a
1297 * later auditor may have it while auditing, so let's not run
1298 * verify-signed-buffer here for now...
1299 *
1300 * if (verify_signed_buffer(buf, len, buf + len, size - len, ...))
1301 * warn("warning: signed tag unverified.");
1302 */
1303 CALLOC_ARRAY(mergetag, 1);
1304 mergetag->key = xstrdup("mergetag");
1305 mergetag->value = buf;
1306 mergetag->len = size;
1307
1308 **tail = mergetag;
1309 *tail = &mergetag->next;
1310 strbuf_release(&payload);
1311 strbuf_release(&signature);
1312 return;
1313
1314free_return:
1315 free(buf);
1316}
1317
1318int check_commit_signature(const struct commit *commit, struct signature_check *sigc)
1319{
1320 struct strbuf payload = STRBUF_INIT;
1321 struct strbuf signature = STRBUF_INIT;
1322 int ret = 1;
1323
1324 sigc->result = 'N';
1325
1326 if (parse_signed_commit(commit, &payload, &signature, the_hash_algo) <= 0)
1327 goto out;
1328
1329 sigc->payload_type = SIGNATURE_PAYLOAD_COMMIT;
1330 sigc->payload = strbuf_detach(&payload, &sigc->payload_len);
1331 ret = check_signature(sigc, signature.buf, signature.len);
1332
1333 out:
1334 strbuf_release(&payload);
1335 strbuf_release(&signature);
1336
1337 return ret;
1338}
1339
1340void verify_merge_signature(struct commit *commit, int verbosity,
1341 int check_trust)
1342{
1343 char hex[GIT_MAX_HEXSZ + 1];
1344 struct signature_check signature_check;
1345 int ret;
1346 memset(&signature_check, 0, sizeof(signature_check));
1347
1348 ret = check_commit_signature(commit, &signature_check);
1349
1350 repo_find_unique_abbrev_r(the_repository, hex, &commit->object.oid,
1351 DEFAULT_ABBREV);
1352 switch (signature_check.result) {
1353 case 'G':
1354 if (ret || (check_trust && signature_check.trust_level < TRUST_MARGINAL))
1355 die(_("Commit %s has an untrusted GPG signature, "
1356 "allegedly by %s."), hex, signature_check.signer);
1357 break;
1358 case 'B':
1359 die(_("Commit %s has a bad GPG signature "
1360 "allegedly by %s."), hex, signature_check.signer);
1361 default: /* 'N' */
1362 die(_("Commit %s does not have a GPG signature."), hex);
1363 }
1364 if (verbosity >= 0 && signature_check.result == 'G')
1365 printf(_("Commit %s has a good GPG signature by %s\n"),
1366 hex, signature_check.signer);
1367
1368 signature_check_clear(&signature_check);
1369}
1370
1371void append_merge_tag_headers(const struct commit_list *parents,
1372 struct commit_extra_header ***tail)
1373{
1374 while (parents) {
1375 const struct commit *parent = parents->item;
1376 handle_signed_tag(parent, tail);
1377 parents = parents->next;
1378 }
1379}
1380
1381static int convert_commit_extra_headers(const struct commit_extra_header *orig,
1382 struct commit_extra_header **result)
1383{
1384 const struct git_hash_algo *compat = the_repository->compat_hash_algo;
1385 const struct git_hash_algo *algo = the_repository->hash_algo;
1386 struct commit_extra_header *extra = NULL, **tail = &extra;
1387 struct strbuf out = STRBUF_INIT;
1388 while (orig) {
1389 struct commit_extra_header *new;
1390 CALLOC_ARRAY(new, 1);
1391 if (!strcmp(orig->key, "mergetag")) {
1392 if (convert_object_file(the_repository, &out, algo, compat,
1393 orig->value, orig->len,
1394 OBJ_TAG, 1)) {
1395 free(new);
1396 free_commit_extra_headers(extra);
1397 return -1;
1398 }
1399 new->key = xstrdup("mergetag");
1400 new->value = strbuf_detach(&out, &new->len);
1401 } else {
1402 new->key = xstrdup(orig->key);
1403 new->len = orig->len;
1404 new->value = xmemdupz(orig->value, orig->len);
1405 }
1406 *tail = new;
1407 tail = &new->next;
1408 orig = orig->next;
1409 }
1410 *result = extra;
1411 return 0;
1412}
1413
1414static void add_extra_header(struct strbuf *buffer,
1415 const struct commit_extra_header *extra)
1416{
1417 strbuf_addstr(buffer, extra->key);
1418 if (extra->len)
1419 strbuf_add_lines(buffer, " ", extra->value, extra->len);
1420 else
1421 strbuf_addch(buffer, '\n');
1422}
1423
1424struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
1425 const char **exclude)
1426{
1427 struct commit_extra_header *extra = NULL;
1428 unsigned long size;
1429 const char *buffer = repo_get_commit_buffer(the_repository, commit,
1430 &size);
1431 extra = read_commit_extra_header_lines(buffer, size, exclude);
1432 repo_unuse_commit_buffer(the_repository, commit, buffer);
1433 return extra;
1434}
1435
1436int for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
1437{
1438 struct commit_extra_header *extra, *to_free;
1439 int res = 0;
1440
1441 to_free = read_commit_extra_headers(commit, NULL);
1442 for (extra = to_free; !res && extra; extra = extra->next) {
1443 if (strcmp(extra->key, "mergetag"))
1444 continue; /* not a merge tag */
1445 res = fn(commit, extra, data);
1446 }
1447 free_commit_extra_headers(to_free);
1448 return res;
1449}
1450
1451static inline int standard_header_field(const char *field, size_t len)
1452{
1453 return ((len == 4 && !memcmp(field, "tree", 4)) ||
1454 (len == 6 && !memcmp(field, "parent", 6)) ||
1455 (len == 6 && !memcmp(field, "author", 6)) ||
1456 (len == 9 && !memcmp(field, "committer", 9)) ||
1457 (len == 8 && !memcmp(field, "encoding", 8)));
1458}
1459
1460static int excluded_header_field(const char *field, size_t len, const char **exclude)
1461{
1462 if (!exclude)
1463 return 0;
1464
1465 while (*exclude) {
1466 size_t xlen = strlen(*exclude);
1467 if (len == xlen && !memcmp(field, *exclude, xlen))
1468 return 1;
1469 exclude++;
1470 }
1471 return 0;
1472}
1473
1474static struct commit_extra_header *read_commit_extra_header_lines(
1475 const char *buffer, size_t size,
1476 const char **exclude)
1477{
1478 struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL;
1479 const char *line, *next, *eof, *eob;
1480 struct strbuf buf = STRBUF_INIT;
1481
1482 for (line = buffer, eob = line + size;
1483 line < eob && *line != '\n';
1484 line = next) {
1485 next = memchr(line, '\n', eob - line);
1486 next = next ? next + 1 : eob;
1487 if (*line == ' ') {
1488 /* continuation */
1489 if (it)
1490 strbuf_add(&buf, line + 1, next - (line + 1));
1491 continue;
1492 }
1493 if (it)
1494 it->value = strbuf_detach(&buf, &it->len);
1495 strbuf_reset(&buf);
1496 it = NULL;
1497
1498 eof = memchr(line, ' ', next - line);
1499 if (!eof)
1500 eof = next;
1501 else if (standard_header_field(line, eof - line) ||
1502 excluded_header_field(line, eof - line, exclude))
1503 continue;
1504
1505 CALLOC_ARRAY(it, 1);
1506 it->key = xmemdupz(line, eof-line);
1507 *tail = it;
1508 tail = &it->next;
1509 if (eof + 1 < next)
1510 strbuf_add(&buf, eof + 1, next - (eof + 1));
1511 }
1512 if (it)
1513 it->value = strbuf_detach(&buf, &it->len);
1514 return extra;
1515}
1516
1517void free_commit_extra_headers(struct commit_extra_header *extra)
1518{
1519 while (extra) {
1520 struct commit_extra_header *next = extra->next;
1521 free(extra->key);
1522 free(extra->value);
1523 free(extra);
1524 extra = next;
1525 }
1526}
1527
1528int commit_tree(const char *msg, size_t msg_len, const struct object_id *tree,
1529 const struct commit_list *parents, struct object_id *ret,
1530 const char *author, const char *sign_commit)
1531{
1532 struct commit_extra_header *extra = NULL, **tail = &extra;
1533 int result;
1534
1535 append_merge_tag_headers(parents, &tail);
1536 result = commit_tree_extended(msg, msg_len, tree, parents, ret, author,
1537 NULL, sign_commit, extra);
1538 free_commit_extra_headers(extra);
1539 return result;
1540}
1541
1542static int find_invalid_utf8(const char *buf, int len)
1543{
1544 int offset = 0;
1545 static const unsigned int max_codepoint[] = {
1546 0x7f, 0x7ff, 0xffff, 0x10ffff
1547 };
1548
1549 while (len) {
1550 unsigned char c = *buf++;
1551 int bytes, bad_offset;
1552 unsigned int codepoint;
1553 unsigned int min_val, max_val;
1554
1555 len--;
1556 offset++;
1557
1558 /* Simple US-ASCII? No worries. */
1559 if (c < 0x80)
1560 continue;
1561
1562 bad_offset = offset-1;
1563
1564 /*
1565 * Count how many more high bits set: that's how
1566 * many more bytes this sequence should have.
1567 */
1568 bytes = 0;
1569 while (c & 0x40) {
1570 c <<= 1;
1571 bytes++;
1572 }
1573
1574 /*
1575 * Must be between 1 and 3 more bytes. Longer sequences result in
1576 * codepoints beyond U+10FFFF, which are guaranteed never to exist.
1577 */
1578 if (bytes < 1 || 3 < bytes)
1579 return bad_offset;
1580
1581 /* Do we *have* that many bytes? */
1582 if (len < bytes)
1583 return bad_offset;
1584
1585 /*
1586 * Place the encoded bits at the bottom of the value and compute the
1587 * valid range.
1588 */
1589 codepoint = (c & 0x7f) >> bytes;
1590 min_val = max_codepoint[bytes-1] + 1;
1591 max_val = max_codepoint[bytes];
1592
1593 offset += bytes;
1594 len -= bytes;
1595
1596 /* And verify that they are good continuation bytes */
1597 do {
1598 codepoint <<= 6;
1599 codepoint |= *buf & 0x3f;
1600 if ((*buf++ & 0xc0) != 0x80)
1601 return bad_offset;
1602 } while (--bytes);
1603
1604 /* Reject codepoints that are out of range for the sequence length. */
1605 if (codepoint < min_val || codepoint > max_val)
1606 return bad_offset;
1607 /* Surrogates are only for UTF-16 and cannot be encoded in UTF-8. */
1608 if ((codepoint & 0x1ff800) == 0xd800)
1609 return bad_offset;
1610 /* U+xxFFFE and U+xxFFFF are guaranteed non-characters. */
1611 if ((codepoint & 0xfffe) == 0xfffe)
1612 return bad_offset;
1613 /* So are anything in the range U+FDD0..U+FDEF. */
1614 if (codepoint >= 0xfdd0 && codepoint <= 0xfdef)
1615 return bad_offset;
1616 }
1617 return -1;
1618}
1619
1620/*
1621 * This verifies that the buffer is in proper utf8 format.
1622 *
1623 * If it isn't, it assumes any non-utf8 characters are Latin1,
1624 * and does the conversion.
1625 */
1626static int verify_utf8(struct strbuf *buf)
1627{
1628 int ok = 1;
1629 long pos = 0;
1630
1631 for (;;) {
1632 int bad;
1633 unsigned char c;
1634 unsigned char replace[2];
1635
1636 bad = find_invalid_utf8(buf->buf + pos, buf->len - pos);
1637 if (bad < 0)
1638 return ok;
1639 pos += bad;
1640 ok = 0;
1641 c = buf->buf[pos];
1642 strbuf_remove(buf, pos, 1);
1643
1644 /* We know 'c' must be in the range 128-255 */
1645 replace[0] = 0xc0 + (c >> 6);
1646 replace[1] = 0x80 + (c & 0x3f);
1647 strbuf_insert(buf, pos, replace, 2);
1648 pos += 2;
1649 }
1650}
1651
1652static const char commit_utf8_warn[] =
1653N_("Warning: commit message did not conform to UTF-8.\n"
1654 "You may want to amend it after fixing the message, or set the config\n"
1655 "variable i18n.commitEncoding to the encoding your project uses.\n");
1656
1657static void write_commit_tree(struct strbuf *buffer, const char *msg, size_t msg_len,
1658 const struct object_id *tree,
1659 const struct object_id *parents, size_t parents_len,
1660 const char *author, const char *committer,
1661 const struct commit_extra_header *extra)
1662{
1663 int encoding_is_utf8;
1664 size_t i;
1665
1666 /* Not having i18n.commitencoding is the same as having utf-8 */
1667 encoding_is_utf8 = is_encoding_utf8(git_commit_encoding);
1668
1669 strbuf_grow(buffer, 8192); /* should avoid reallocs for the headers */
1670 strbuf_addf(buffer, "tree %s\n", oid_to_hex(tree));
1671
1672 /*
1673 * NOTE! This ordering means that the same exact tree merged with a
1674 * different order of parents will be a _different_ changeset even
1675 * if everything else stays the same.
1676 */
1677 for (i = 0; i < parents_len; i++)
1678 strbuf_addf(buffer, "parent %s\n", oid_to_hex(&parents[i]));
1679
1680 /* Person/date information */
1681 if (!author)
1682 author = git_author_info(IDENT_STRICT);
1683 strbuf_addf(buffer, "author %s\n", author);
1684 if (!committer)
1685 committer = git_committer_info(IDENT_STRICT);
1686 strbuf_addf(buffer, "committer %s\n", committer);
1687 if (!encoding_is_utf8)
1688 strbuf_addf(buffer, "encoding %s\n", git_commit_encoding);
1689
1690 while (extra) {
1691 add_extra_header(buffer, extra);
1692 extra = extra->next;
1693 }
1694 strbuf_addch(buffer, '\n');
1695
1696 /* And add the comment */
1697 strbuf_add(buffer, msg, msg_len);
1698}
1699
1700int commit_tree_extended(const char *msg, size_t msg_len,
1701 const struct object_id *tree,
1702 const struct commit_list *parents, struct object_id *ret,
1703 const char *author, const char *committer,
1704 const char *sign_commit,
1705 const struct commit_extra_header *extra)
1706{
1707 struct repository *r = the_repository;
1708 int result = 0;
1709 int encoding_is_utf8;
1710 struct strbuf buffer = STRBUF_INIT, compat_buffer = STRBUF_INIT;
1711 struct strbuf sig = STRBUF_INIT, compat_sig = STRBUF_INIT;
1712 struct object_id *parent_buf = NULL, *compat_oid = NULL;
1713 struct object_id compat_oid_buf;
1714 size_t i, nparents;
1715
1716 /* Not having i18n.commitencoding is the same as having utf-8 */
1717 encoding_is_utf8 = is_encoding_utf8(git_commit_encoding);
1718
1719 odb_assert_oid_type(the_repository->objects, tree, OBJ_TREE);
1720
1721 if (memchr(msg, '\0', msg_len))
1722 return error("a NUL byte in commit log message not allowed.");
1723
1724 nparents = commit_list_count(parents);
1725 CALLOC_ARRAY(parent_buf, nparents);
1726 i = 0;
1727 for (const struct commit_list *p = parents; p; p = p->next)
1728 oidcpy(&parent_buf[i++], &p->item->object.oid);
1729
1730 write_commit_tree(&buffer, msg, msg_len, tree, parent_buf, nparents, author, committer, extra);
1731 if (sign_commit && sign_commit_to_strbuf(&sig, &buffer, sign_commit)) {
1732 result = -1;
1733 goto out;
1734 }
1735 if (r->compat_hash_algo) {
1736 struct commit_extra_header *compat_extra = NULL;
1737 struct object_id mapped_tree;
1738 struct object_id *mapped_parents;
1739
1740 CALLOC_ARRAY(mapped_parents, nparents);
1741
1742 if (repo_oid_to_algop(r, tree, r->compat_hash_algo, &mapped_tree)) {
1743 result = -1;
1744 free(mapped_parents);
1745 goto out;
1746 }
1747 for (i = 0; i < nparents; i++)
1748 if (repo_oid_to_algop(r, &parent_buf[i], r->compat_hash_algo, &mapped_parents[i])) {
1749 result = -1;
1750 free(mapped_parents);
1751 goto out;
1752 }
1753 if (convert_commit_extra_headers(extra, &compat_extra)) {
1754 result = -1;
1755 free(mapped_parents);
1756 goto out;
1757 }
1758 write_commit_tree(&compat_buffer, msg, msg_len, &mapped_tree,
1759 mapped_parents, nparents, author, committer, compat_extra);
1760 free_commit_extra_headers(compat_extra);
1761 free(mapped_parents);
1762
1763 if (sign_commit && sign_commit_to_strbuf(&compat_sig, &compat_buffer, sign_commit)) {
1764 result = -1;
1765 goto out;
1766 }
1767 }
1768
1769 if (sign_commit) {
1770 struct sig_pairs {
1771 struct strbuf *sig;
1772 const struct git_hash_algo *algo;
1773 } bufs [2] = {
1774 { &compat_sig, r->compat_hash_algo },
1775 { &sig, r->hash_algo },
1776 };
1777
1778 /*
1779 * We write algorithms in the order they were implemented in
1780 * Git to produce a stable hash when multiple algorithms are
1781 * used.
1782 */
1783 if (r->compat_hash_algo && hash_algo_by_ptr(bufs[0].algo) > hash_algo_by_ptr(bufs[1].algo))
1784 SWAP(bufs[0], bufs[1]);
1785
1786 /*
1787 * We traverse each algorithm in order, and apply the signature
1788 * to each buffer.
1789 */
1790 for (size_t i = 0; i < ARRAY_SIZE(bufs); i++) {
1791 if (!bufs[i].algo)
1792 continue;
1793 add_header_signature(&buffer, bufs[i].sig, bufs[i].algo);
1794 if (r->compat_hash_algo)
1795 add_header_signature(&compat_buffer, bufs[i].sig, bufs[i].algo);
1796 }
1797 }
1798
1799 /* And check the encoding. */
1800 if (encoding_is_utf8 && (!verify_utf8(&buffer) || !verify_utf8(&compat_buffer)))
1801 fprintf(stderr, _(commit_utf8_warn));
1802
1803 if (r->compat_hash_algo) {
1804 hash_object_file(r->compat_hash_algo, compat_buffer.buf, compat_buffer.len,
1805 OBJ_COMMIT, &compat_oid_buf);
1806 compat_oid = &compat_oid_buf;
1807 }
1808
1809 result = odb_write_object_ext(the_repository->objects, buffer.buf, buffer.len,
1810 OBJ_COMMIT, ret, compat_oid, 0);
1811out:
1812 free(parent_buf);
1813 strbuf_release(&buffer);
1814 strbuf_release(&compat_buffer);
1815 strbuf_release(&sig);
1816 strbuf_release(&compat_sig);
1817 return result;
1818}
1819
1820define_commit_slab(merge_desc_slab, struct merge_remote_desc *);
1821static struct merge_desc_slab merge_desc_slab = COMMIT_SLAB_INIT(1, merge_desc_slab);
1822
1823struct merge_remote_desc *merge_remote_util(const struct commit *commit)
1824{
1825 return *merge_desc_slab_at(&merge_desc_slab, commit);
1826}
1827
1828void set_merge_remote_desc(struct commit *commit,
1829 const char *name, struct object *obj)
1830{
1831 struct merge_remote_desc *desc;
1832 FLEX_ALLOC_STR(desc, name, name);
1833 desc->obj = obj;
1834 *merge_desc_slab_at(&merge_desc_slab, commit) = desc;
1835}
1836
1837struct commit *get_merge_parent(const char *name)
1838{
1839 struct object *obj;
1840 struct commit *commit;
1841 struct object_id oid;
1842 if (repo_get_oid(the_repository, name, &oid))
1843 return NULL;
1844 obj = parse_object(the_repository, &oid);
1845 commit = (struct commit *)repo_peel_to_type(the_repository, name, 0,
1846 obj, OBJ_COMMIT);
1847 if (commit && !merge_remote_util(commit))
1848 set_merge_remote_desc(commit, name, obj);
1849 return commit;
1850}
1851
1852/*
1853 * Append a commit to the end of the commit_list.
1854 *
1855 * next starts by pointing to the variable that holds the head of an
1856 * empty commit_list, and is updated to point to the "next" field of
1857 * the last item on the list as new commits are appended.
1858 *
1859 * Usage example:
1860 *
1861 * struct commit_list *list;
1862 * struct commit_list **next = &list;
1863 *
1864 * next = commit_list_append(c1, next);
1865 * next = commit_list_append(c2, next);
1866 * assert(commit_list_count(list) == 2);
1867 * return list;
1868 */
1869struct commit_list **commit_list_append(struct commit *commit,
1870 struct commit_list **next)
1871{
1872 struct commit_list *new_commit = xmalloc(sizeof(struct commit_list));
1873 new_commit->item = commit;
1874 *next = new_commit;
1875 new_commit->next = NULL;
1876 return &new_commit->next;
1877}
1878
1879const char *find_commit_header(const char *msg, const char *key, size_t *out_len)
1880{
1881 int key_len = strlen(key);
1882 const char *line = msg;
1883
1884 while (line) {
1885 const char *eol = strchrnul(line, '\n');
1886
1887 if (line == eol)
1888 return NULL;
1889
1890 if (eol - line > key_len &&
1891 !strncmp(line, key, key_len) &&
1892 line[key_len] == ' ') {
1893 *out_len = eol - line - key_len - 1;
1894 return line + key_len + 1;
1895 }
1896 line = *eol ? eol + 1 : NULL;
1897 }
1898 return NULL;
1899}
1900
1901/*
1902 * Inspect the given string and determine the true "end" of the log message, in
1903 * order to find where to put a new Signed-off-by trailer. Ignored are
1904 * trailing comment lines and blank lines. To support "git commit -s
1905 * --amend" on an existing commit, we also ignore "Conflicts:". To
1906 * support "git commit -v", we truncate at cut lines.
1907 *
1908 * Returns the number of bytes from the tail to ignore, to be fed as
1909 * the second parameter to append_signoff().
1910 */
1911size_t ignored_log_message_bytes(const char *buf, size_t len)
1912{
1913 size_t boc = 0;
1914 size_t bol = 0;
1915 int in_old_conflicts_block = 0;
1916 size_t cutoff = wt_status_locate_end(buf, len);
1917
1918 while (bol < cutoff) {
1919 const char *next_line = memchr(buf + bol, '\n', len - bol);
1920
1921 if (!next_line)
1922 next_line = buf + len;
1923 else
1924 next_line++;
1925
1926 if (starts_with_mem(buf + bol, cutoff - bol, comment_line_str) ||
1927 buf[bol] == '\n') {
1928 /* is this the first of the run of comments? */
1929 if (!boc)
1930 boc = bol;
1931 /* otherwise, it is just continuing */
1932 } else if (starts_with(buf + bol, "Conflicts:\n")) {
1933 in_old_conflicts_block = 1;
1934 if (!boc)
1935 boc = bol;
1936 } else if (in_old_conflicts_block && buf[bol] == '\t') {
1937 ; /* a pathname in the conflicts block */
1938 } else if (boc) {
1939 /* the previous was not trailing comment */
1940 boc = 0;
1941 in_old_conflicts_block = 0;
1942 }
1943 bol = next_line - buf;
1944 }
1945 return boc ? len - boc : len - cutoff;
1946}
1947
1948int run_commit_hook(int editor_is_used, const char *index_file,
1949 int *invoked_hook, const char *name, ...)
1950{
1951 struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
1952 va_list args;
1953 const char *arg;
1954
1955 strvec_pushf(&opt.env, "GIT_INDEX_FILE=%s", index_file);
1956
1957 /*
1958 * Let the hook know that no editor will be launched.
1959 */
1960 if (!editor_is_used)
1961 strvec_push(&opt.env, "GIT_EDITOR=:");
1962
1963 va_start(args, name);
1964 while ((arg = va_arg(args, const char *)))
1965 strvec_push(&opt.args, arg);
1966 va_end(args);
1967
1968 opt.invoked_hook = invoked_hook;
1969 return run_hooks_opt(the_repository, name, &opt);
1970}