l10n: git.pot: v2.23.0 round 2 (4 new, 6 removed)
[git] / commit.c
1 #include "cache.h"
2 #include "tag.h"
3 #include "commit.h"
4 #include "commit-graph.h"
5 #include "repository.h"
6 #include "object-store.h"
7 #include "pkt-line.h"
8 #include "utf8.h"
9 #include "diff.h"
10 #include "revision.h"
11 #include "notes.h"
12 #include "alloc.h"
13 #include "gpg-interface.h"
14 #include "mergesort.h"
15 #include "commit-slab.h"
16 #include "prio-queue.h"
17 #include "sha1-lookup.h"
18 #include "wt-status.h"
19 #include "advice.h"
20 #include "refs.h"
21 #include "commit-reach.h"
22
23 static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
24
25 int save_commit_buffer = 1;
26
27 const char *commit_type = "commit";
28
29 struct commit *lookup_commit_reference_gently(struct repository *r,
30                 const struct object_id *oid, int quiet)
31 {
32         struct object *obj = deref_tag(r,
33                                        parse_object(r, oid),
34                                        NULL, 0);
35
36         if (!obj)
37                 return NULL;
38         return object_as_type(r, obj, OBJ_COMMIT, quiet);
39 }
40
41 struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid)
42 {
43         return lookup_commit_reference_gently(r, oid, 0);
44 }
45
46 struct commit *lookup_commit_or_die(const struct object_id *oid, const char *ref_name)
47 {
48         struct commit *c = lookup_commit_reference(the_repository, oid);
49         if (!c)
50                 die(_("could not parse %s"), ref_name);
51         if (!oideq(oid, &c->object.oid)) {
52                 warning(_("%s %s is not a commit!"),
53                         ref_name, oid_to_hex(oid));
54         }
55         return c;
56 }
57
58 struct commit *lookup_commit(struct repository *r, const struct object_id *oid)
59 {
60         struct object *obj = lookup_object(r, oid);
61         if (!obj)
62                 return create_object(r, oid, alloc_commit_node(r));
63         return object_as_type(r, obj, OBJ_COMMIT, 0);
64 }
65
66 struct commit *lookup_commit_reference_by_name(const char *name)
67 {
68         struct object_id oid;
69         struct commit *commit;
70
71         if (get_oid_committish(name, &oid))
72                 return NULL;
73         commit = lookup_commit_reference(the_repository, &oid);
74         if (parse_commit(commit))
75                 return NULL;
76         return commit;
77 }
78
79 static timestamp_t parse_commit_date(const char *buf, const char *tail)
80 {
81         const char *dateptr;
82
83         if (buf + 6 >= tail)
84                 return 0;
85         if (memcmp(buf, "author", 6))
86                 return 0;
87         while (buf < tail && *buf++ != '\n')
88                 /* nada */;
89         if (buf + 9 >= tail)
90                 return 0;
91         if (memcmp(buf, "committer", 9))
92                 return 0;
93         while (buf < tail && *buf++ != '>')
94                 /* nada */;
95         if (buf >= tail)
96                 return 0;
97         dateptr = buf;
98         while (buf < tail && *buf++ != '\n')
99                 /* nada */;
100         if (buf >= tail)
101                 return 0;
102         /* dateptr < buf && buf[-1] == '\n', so parsing will stop at buf-1 */
103         return parse_timestamp(dateptr, NULL, 10);
104 }
105
106 static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
107 {
108         struct commit_graft **commit_graft_table = table;
109         return commit_graft_table[index]->oid.hash;
110 }
111
112 static int commit_graft_pos(struct repository *r, const unsigned char *sha1)
113 {
114         return sha1_pos(sha1, r->parsed_objects->grafts,
115                         r->parsed_objects->grafts_nr,
116                         commit_graft_sha1_access);
117 }
118
119 int register_commit_graft(struct repository *r, struct commit_graft *graft,
120                           int ignore_dups)
121 {
122         int pos = commit_graft_pos(r, graft->oid.hash);
123
124         if (0 <= pos) {
125                 if (ignore_dups)
126                         free(graft);
127                 else {
128                         free(r->parsed_objects->grafts[pos]);
129                         r->parsed_objects->grafts[pos] = graft;
130                 }
131                 return 1;
132         }
133         pos = -pos - 1;
134         ALLOC_GROW(r->parsed_objects->grafts,
135                    r->parsed_objects->grafts_nr + 1,
136                    r->parsed_objects->grafts_alloc);
137         r->parsed_objects->grafts_nr++;
138         if (pos < r->parsed_objects->grafts_nr)
139                 memmove(r->parsed_objects->grafts + pos + 1,
140                         r->parsed_objects->grafts + pos,
141                         (r->parsed_objects->grafts_nr - pos - 1) *
142                         sizeof(*r->parsed_objects->grafts));
143         r->parsed_objects->grafts[pos] = graft;
144         return 0;
145 }
146
147 struct commit_graft *read_graft_line(struct strbuf *line)
148 {
149         /* The format is just "Commit Parent1 Parent2 ...\n" */
150         int i, phase;
151         const char *tail = NULL;
152         struct commit_graft *graft = NULL;
153         struct object_id dummy_oid, *oid;
154
155         strbuf_rtrim(line);
156         if (!line->len || line->buf[0] == '#')
157                 return NULL;
158         /*
159          * phase 0 verifies line, counts hashes in line and allocates graft
160          * phase 1 fills graft
161          */
162         for (phase = 0; phase < 2; phase++) {
163                 oid = graft ? &graft->oid : &dummy_oid;
164                 if (parse_oid_hex(line->buf, oid, &tail))
165                         goto bad_graft_data;
166                 for (i = 0; *tail != '\0'; i++) {
167                         oid = graft ? &graft->parent[i] : &dummy_oid;
168                         if (!isspace(*tail++) || parse_oid_hex(tail, oid, &tail))
169                                 goto bad_graft_data;
170                 }
171                 if (!graft) {
172                         graft = xmalloc(st_add(sizeof(*graft),
173                                                st_mult(sizeof(struct object_id), i)));
174                         graft->nr_parent = i;
175                 }
176         }
177         return graft;
178
179 bad_graft_data:
180         error("bad graft data: %s", line->buf);
181         assert(!graft);
182         return NULL;
183 }
184
185 static int read_graft_file(struct repository *r, const char *graft_file)
186 {
187         FILE *fp = fopen_or_warn(graft_file, "r");
188         struct strbuf buf = STRBUF_INIT;
189         if (!fp)
190                 return -1;
191         if (advice_graft_file_deprecated)
192                 advise(_("Support for <GIT_DIR>/info/grafts is deprecated\n"
193                          "and will be removed in a future Git version.\n"
194                          "\n"
195                          "Please use \"git replace --convert-graft-file\"\n"
196                          "to convert the grafts into replace refs.\n"
197                          "\n"
198                          "Turn this message off by running\n"
199                          "\"git config advice.graftFileDeprecated false\""));
200         while (!strbuf_getwholeline(&buf, fp, '\n')) {
201                 /* The format is just "Commit Parent1 Parent2 ...\n" */
202                 struct commit_graft *graft = read_graft_line(&buf);
203                 if (!graft)
204                         continue;
205                 if (register_commit_graft(r, graft, 1))
206                         error("duplicate graft data: %s", buf.buf);
207         }
208         fclose(fp);
209         strbuf_release(&buf);
210         return 0;
211 }
212
213 void prepare_commit_graft(struct repository *r)
214 {
215         char *graft_file;
216
217         if (r->parsed_objects->commit_graft_prepared)
218                 return;
219         if (!startup_info->have_repository)
220                 return;
221
222         graft_file = get_graft_file(r);
223         read_graft_file(r, graft_file);
224         /* make sure shallows are read */
225         is_repository_shallow(r);
226         r->parsed_objects->commit_graft_prepared = 1;
227 }
228
229 struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid)
230 {
231         int pos;
232         prepare_commit_graft(r);
233         pos = commit_graft_pos(r, oid->hash);
234         if (pos < 0)
235                 return NULL;
236         return r->parsed_objects->grafts[pos];
237 }
238
239 int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
240 {
241         int i, ret;
242         for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
243                 ret = fn(the_repository->parsed_objects->grafts[i], cb_data);
244         return ret;
245 }
246
247 int unregister_shallow(const struct object_id *oid)
248 {
249         int pos = commit_graft_pos(the_repository, oid->hash);
250         if (pos < 0)
251                 return -1;
252         if (pos + 1 < the_repository->parsed_objects->grafts_nr)
253                 MOVE_ARRAY(the_repository->parsed_objects->grafts + pos,
254                            the_repository->parsed_objects->grafts + pos + 1,
255                            the_repository->parsed_objects->grafts_nr - pos - 1);
256         the_repository->parsed_objects->grafts_nr--;
257         return 0;
258 }
259
260 struct commit_buffer {
261         void *buffer;
262         unsigned long size;
263 };
264 define_commit_slab(buffer_slab, struct commit_buffer);
265
266 struct buffer_slab *allocate_commit_buffer_slab(void)
267 {
268         struct buffer_slab *bs = xmalloc(sizeof(*bs));
269         init_buffer_slab(bs);
270         return bs;
271 }
272
273 void free_commit_buffer_slab(struct buffer_slab *bs)
274 {
275         clear_buffer_slab(bs);
276         free(bs);
277 }
278
279 void set_commit_buffer(struct repository *r, struct commit *commit, void *buffer, unsigned long size)
280 {
281         struct commit_buffer *v = buffer_slab_at(
282                 r->parsed_objects->buffer_slab, commit);
283         v->buffer = buffer;
284         v->size = size;
285 }
286
287 const void *get_cached_commit_buffer(struct repository *r, const struct commit *commit, unsigned long *sizep)
288 {
289         struct commit_buffer *v = buffer_slab_peek(
290                 r->parsed_objects->buffer_slab, commit);
291         if (!v) {
292                 if (sizep)
293                         *sizep = 0;
294                 return NULL;
295         }
296         if (sizep)
297                 *sizep = v->size;
298         return v->buffer;
299 }
300
301 const void *repo_get_commit_buffer(struct repository *r,
302                                    const struct commit *commit,
303                                    unsigned long *sizep)
304 {
305         const void *ret = get_cached_commit_buffer(r, commit, sizep);
306         if (!ret) {
307                 enum object_type type;
308                 unsigned long size;
309                 ret = repo_read_object_file(r, &commit->object.oid, &type, &size);
310                 if (!ret)
311                         die("cannot read commit object %s",
312                             oid_to_hex(&commit->object.oid));
313                 if (type != OBJ_COMMIT)
314                         die("expected commit for %s, got %s",
315                             oid_to_hex(&commit->object.oid), type_name(type));
316                 if (sizep)
317                         *sizep = size;
318         }
319         return ret;
320 }
321
322 void repo_unuse_commit_buffer(struct repository *r,
323                               const struct commit *commit,
324                               const void *buffer)
325 {
326         struct commit_buffer *v = buffer_slab_peek(
327                 r->parsed_objects->buffer_slab, commit);
328         if (!(v && v->buffer == buffer))
329                 free((void *)buffer);
330 }
331
332 void free_commit_buffer(struct parsed_object_pool *pool, struct commit *commit)
333 {
334         struct commit_buffer *v = buffer_slab_peek(
335                 pool->buffer_slab, commit);
336         if (v) {
337                 FREE_AND_NULL(v->buffer);
338                 v->size = 0;
339         }
340 }
341
342 static inline void set_commit_tree(struct commit *c, struct tree *t)
343 {
344         c->maybe_tree = t;
345 }
346
347 struct tree *repo_get_commit_tree(struct repository *r,
348                                   const struct commit *commit)
349 {
350         if (commit->maybe_tree || !commit->object.parsed)
351                 return commit->maybe_tree;
352
353         if (commit->graph_pos != COMMIT_NOT_FROM_GRAPH)
354                 return get_commit_tree_in_graph(r, commit);
355
356         return NULL;
357 }
358
359 struct object_id *get_commit_tree_oid(const struct commit *commit)
360 {
361         return &get_commit_tree(commit)->object.oid;
362 }
363
364 void release_commit_memory(struct parsed_object_pool *pool, struct commit *c)
365 {
366         set_commit_tree(c, NULL);
367         c->index = 0;
368         free_commit_buffer(pool, c);
369         free_commit_list(c->parents);
370
371         c->object.parsed = 0;
372 }
373
374 const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
375 {
376         struct commit_buffer *v = buffer_slab_peek(
377                 the_repository->parsed_objects->buffer_slab, commit);
378         void *ret;
379
380         if (!v) {
381                 if (sizep)
382                         *sizep = 0;
383                 return NULL;
384         }
385         ret = v->buffer;
386         if (sizep)
387                 *sizep = v->size;
388
389         v->buffer = NULL;
390         v->size = 0;
391         return ret;
392 }
393
394 int parse_commit_buffer(struct repository *r, struct commit *item, const void *buffer, unsigned long size, int check_graph)
395 {
396         const char *tail = buffer;
397         const char *bufptr = buffer;
398         struct object_id parent;
399         struct commit_list **pptr;
400         struct commit_graft *graft;
401         const int tree_entry_len = the_hash_algo->hexsz + 5;
402         const int parent_entry_len = the_hash_algo->hexsz + 7;
403
404         if (item->object.parsed)
405                 return 0;
406         item->object.parsed = 1;
407         tail += size;
408         if (tail <= bufptr + tree_entry_len + 1 || memcmp(bufptr, "tree ", 5) ||
409                         bufptr[tree_entry_len] != '\n')
410                 return error("bogus commit object %s", oid_to_hex(&item->object.oid));
411         if (get_oid_hex(bufptr + 5, &parent) < 0)
412                 return error("bad tree pointer in commit %s",
413                              oid_to_hex(&item->object.oid));
414         set_commit_tree(item, lookup_tree(r, &parent));
415         bufptr += tree_entry_len + 1; /* "tree " + "hex sha1" + "\n" */
416         pptr = &item->parents;
417
418         graft = lookup_commit_graft(r, &item->object.oid);
419         while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
420                 struct commit *new_parent;
421
422                 if (tail <= bufptr + parent_entry_len + 1 ||
423                     get_oid_hex(bufptr + 7, &parent) ||
424                     bufptr[parent_entry_len] != '\n')
425                         return error("bad parents in commit %s", oid_to_hex(&item->object.oid));
426                 bufptr += parent_entry_len + 1;
427                 /*
428                  * The clone is shallow if nr_parent < 0, and we must
429                  * not traverse its real parents even when we unhide them.
430                  */
431                 if (graft && (graft->nr_parent < 0 || grafts_replace_parents))
432                         continue;
433                 new_parent = lookup_commit(r, &parent);
434                 if (new_parent)
435                         pptr = &commit_list_insert(new_parent, pptr)->next;
436         }
437         if (graft) {
438                 int i;
439                 struct commit *new_parent;
440                 for (i = 0; i < graft->nr_parent; i++) {
441                         new_parent = lookup_commit(r,
442                                                    &graft->parent[i]);
443                         if (!new_parent)
444                                 continue;
445                         pptr = &commit_list_insert(new_parent, pptr)->next;
446                 }
447         }
448         item->date = parse_commit_date(bufptr, tail);
449
450         if (check_graph)
451                 load_commit_graph_info(r, item);
452
453         return 0;
454 }
455
456 int repo_parse_commit_internal(struct repository *r,
457                                struct commit *item,
458                                int quiet_on_missing,
459                                int use_commit_graph)
460 {
461         enum object_type type;
462         void *buffer;
463         unsigned long size;
464         int ret;
465
466         if (!item)
467                 return -1;
468         if (item->object.parsed)
469                 return 0;
470         if (use_commit_graph && parse_commit_in_graph(r, item))
471                 return 0;
472         buffer = repo_read_object_file(r, &item->object.oid, &type, &size);
473         if (!buffer)
474                 return quiet_on_missing ? -1 :
475                         error("Could not read %s",
476                              oid_to_hex(&item->object.oid));
477         if (type != OBJ_COMMIT) {
478                 free(buffer);
479                 return error("Object %s not a commit",
480                              oid_to_hex(&item->object.oid));
481         }
482
483         ret = parse_commit_buffer(r, item, buffer, size, 0);
484         if (save_commit_buffer && !ret) {
485                 set_commit_buffer(r, item, buffer, size);
486                 return 0;
487         }
488         free(buffer);
489         return ret;
490 }
491
492 int repo_parse_commit_gently(struct repository *r,
493                              struct commit *item, int quiet_on_missing)
494 {
495         return repo_parse_commit_internal(r, item, quiet_on_missing, 1);
496 }
497
498 void parse_commit_or_die(struct commit *item)
499 {
500         if (parse_commit(item))
501                 die("unable to parse commit %s",
502                     item ? oid_to_hex(&item->object.oid) : "(null)");
503 }
504
505 int find_commit_subject(const char *commit_buffer, const char **subject)
506 {
507         const char *eol;
508         const char *p = commit_buffer;
509
510         while (*p && (*p != '\n' || p[1] != '\n'))
511                 p++;
512         if (*p) {
513                 p = skip_blank_lines(p + 2);
514                 eol = strchrnul(p, '\n');
515         } else
516                 eol = p;
517
518         *subject = p;
519
520         return eol - p;
521 }
522
523 struct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p)
524 {
525         struct commit_list *new_list = xmalloc(sizeof(struct commit_list));
526         new_list->item = item;
527         new_list->next = *list_p;
528         *list_p = new_list;
529         return new_list;
530 }
531
532 unsigned commit_list_count(const struct commit_list *l)
533 {
534         unsigned c = 0;
535         for (; l; l = l->next )
536                 c++;
537         return c;
538 }
539
540 struct commit_list *copy_commit_list(struct commit_list *list)
541 {
542         struct commit_list *head = NULL;
543         struct commit_list **pp = &head;
544         while (list) {
545                 pp = commit_list_append(list->item, pp);
546                 list = list->next;
547         }
548         return head;
549 }
550
551 void free_commit_list(struct commit_list *list)
552 {
553         while (list)
554                 pop_commit(&list);
555 }
556
557 struct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list)
558 {
559         struct commit_list **pp = list;
560         struct commit_list *p;
561         while ((p = *pp) != NULL) {
562                 if (p->item->date < item->date) {
563                         break;
564                 }
565                 pp = &p->next;
566         }
567         return commit_list_insert(item, pp);
568 }
569
570 static int commit_list_compare_by_date(const void *a, const void *b)
571 {
572         timestamp_t a_date = ((const struct commit_list *)a)->item->date;
573         timestamp_t b_date = ((const struct commit_list *)b)->item->date;
574         if (a_date < b_date)
575                 return 1;
576         if (a_date > b_date)
577                 return -1;
578         return 0;
579 }
580
581 static void *commit_list_get_next(const void *a)
582 {
583         return ((const struct commit_list *)a)->next;
584 }
585
586 static void commit_list_set_next(void *a, void *next)
587 {
588         ((struct commit_list *)a)->next = next;
589 }
590
591 void commit_list_sort_by_date(struct commit_list **list)
592 {
593         *list = llist_mergesort(*list, commit_list_get_next, commit_list_set_next,
594                                 commit_list_compare_by_date);
595 }
596
597 struct commit *pop_most_recent_commit(struct commit_list **list,
598                                       unsigned int mark)
599 {
600         struct commit *ret = pop_commit(list);
601         struct commit_list *parents = ret->parents;
602
603         while (parents) {
604                 struct commit *commit = parents->item;
605                 if (!parse_commit(commit) && !(commit->object.flags & mark)) {
606                         commit->object.flags |= mark;
607                         commit_list_insert_by_date(commit, list);
608                 }
609                 parents = parents->next;
610         }
611         return ret;
612 }
613
614 static void clear_commit_marks_1(struct commit_list **plist,
615                                  struct commit *commit, unsigned int mark)
616 {
617         while (commit) {
618                 struct commit_list *parents;
619
620                 if (!(mark & commit->object.flags))
621                         return;
622
623                 commit->object.flags &= ~mark;
624
625                 parents = commit->parents;
626                 if (!parents)
627                         return;
628
629                 while ((parents = parents->next))
630                         commit_list_insert(parents->item, plist);
631
632                 commit = commit->parents->item;
633         }
634 }
635
636 void clear_commit_marks_many(int nr, struct commit **commit, unsigned int mark)
637 {
638         struct commit_list *list = NULL;
639
640         while (nr--) {
641                 clear_commit_marks_1(&list, *commit, mark);
642                 commit++;
643         }
644         while (list)
645                 clear_commit_marks_1(&list, pop_commit(&list), mark);
646 }
647
648 void clear_commit_marks(struct commit *commit, unsigned int mark)
649 {
650         clear_commit_marks_many(1, &commit, mark);
651 }
652
653 struct commit *pop_commit(struct commit_list **stack)
654 {
655         struct commit_list *top = *stack;
656         struct commit *item = top ? top->item : NULL;
657
658         if (top) {
659                 *stack = top->next;
660                 free(top);
661         }
662         return item;
663 }
664
665 /*
666  * Topological sort support
667  */
668
669 /* count number of children that have not been emitted */
670 define_commit_slab(indegree_slab, int);
671
672 define_commit_slab(author_date_slab, timestamp_t);
673
674 void record_author_date(struct author_date_slab *author_date,
675                         struct commit *commit)
676 {
677         const char *buffer = get_commit_buffer(commit, NULL);
678         struct ident_split ident;
679         const char *ident_line;
680         size_t ident_len;
681         char *date_end;
682         timestamp_t date;
683
684         ident_line = find_commit_header(buffer, "author", &ident_len);
685         if (!ident_line)
686                 goto fail_exit; /* no author line */
687         if (split_ident_line(&ident, ident_line, ident_len) ||
688             !ident.date_begin || !ident.date_end)
689                 goto fail_exit; /* malformed "author" line */
690
691         date = parse_timestamp(ident.date_begin, &date_end, 10);
692         if (date_end != ident.date_end)
693                 goto fail_exit; /* malformed date */
694         *(author_date_slab_at(author_date, commit)) = date;
695
696 fail_exit:
697         unuse_commit_buffer(commit, buffer);
698 }
699
700 int compare_commits_by_author_date(const void *a_, const void *b_,
701                                    void *cb_data)
702 {
703         const struct commit *a = a_, *b = b_;
704         struct author_date_slab *author_date = cb_data;
705         timestamp_t a_date = *(author_date_slab_at(author_date, a));
706         timestamp_t b_date = *(author_date_slab_at(author_date, b));
707
708         /* newer commits with larger date first */
709         if (a_date < b_date)
710                 return 1;
711         else if (a_date > b_date)
712                 return -1;
713         return 0;
714 }
715
716 int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void *unused)
717 {
718         const struct commit *a = a_, *b = b_;
719
720         /* newer commits first */
721         if (a->generation < b->generation)
722                 return 1;
723         else if (a->generation > b->generation)
724                 return -1;
725
726         /* use date as a heuristic when generations are equal */
727         if (a->date < b->date)
728                 return 1;
729         else if (a->date > b->date)
730                 return -1;
731         return 0;
732 }
733
734 int compare_commits_by_commit_date(const void *a_, const void *b_, void *unused)
735 {
736         const struct commit *a = a_, *b = b_;
737         /* newer commits with larger date first */
738         if (a->date < b->date)
739                 return 1;
740         else if (a->date > b->date)
741                 return -1;
742         return 0;
743 }
744
745 /*
746  * Performs an in-place topological sort on the list supplied.
747  */
748 void sort_in_topological_order(struct commit_list **list, enum rev_sort_order sort_order)
749 {
750         struct commit_list *next, *orig = *list;
751         struct commit_list **pptr;
752         struct indegree_slab indegree;
753         struct prio_queue queue;
754         struct commit *commit;
755         struct author_date_slab author_date;
756
757         if (!orig)
758                 return;
759         *list = NULL;
760
761         init_indegree_slab(&indegree);
762         memset(&queue, '\0', sizeof(queue));
763
764         switch (sort_order) {
765         default: /* REV_SORT_IN_GRAPH_ORDER */
766                 queue.compare = NULL;
767                 break;
768         case REV_SORT_BY_COMMIT_DATE:
769                 queue.compare = compare_commits_by_commit_date;
770                 break;
771         case REV_SORT_BY_AUTHOR_DATE:
772                 init_author_date_slab(&author_date);
773                 queue.compare = compare_commits_by_author_date;
774                 queue.cb_data = &author_date;
775                 break;
776         }
777
778         /* Mark them and clear the indegree */
779         for (next = orig; next; next = next->next) {
780                 struct commit *commit = next->item;
781                 *(indegree_slab_at(&indegree, commit)) = 1;
782                 /* also record the author dates, if needed */
783                 if (sort_order == REV_SORT_BY_AUTHOR_DATE)
784                         record_author_date(&author_date, commit);
785         }
786
787         /* update the indegree */
788         for (next = orig; next; next = next->next) {
789                 struct commit_list *parents = next->item->parents;
790                 while (parents) {
791                         struct commit *parent = parents->item;
792                         int *pi = indegree_slab_at(&indegree, parent);
793
794                         if (*pi)
795                                 (*pi)++;
796                         parents = parents->next;
797                 }
798         }
799
800         /*
801          * find the tips
802          *
803          * tips are nodes not reachable from any other node in the list
804          *
805          * the tips serve as a starting set for the work queue.
806          */
807         for (next = orig; next; next = next->next) {
808                 struct commit *commit = next->item;
809
810                 if (*(indegree_slab_at(&indegree, commit)) == 1)
811                         prio_queue_put(&queue, commit);
812         }
813
814         /*
815          * This is unfortunate; the initial tips need to be shown
816          * in the order given from the revision traversal machinery.
817          */
818         if (sort_order == REV_SORT_IN_GRAPH_ORDER)
819                 prio_queue_reverse(&queue);
820
821         /* We no longer need the commit list */
822         free_commit_list(orig);
823
824         pptr = list;
825         *list = NULL;
826         while ((commit = prio_queue_get(&queue)) != NULL) {
827                 struct commit_list *parents;
828
829                 for (parents = commit->parents; parents ; parents = parents->next) {
830                         struct commit *parent = parents->item;
831                         int *pi = indegree_slab_at(&indegree, parent);
832
833                         if (!*pi)
834                                 continue;
835
836                         /*
837                          * parents are only enqueued for emission
838                          * when all their children have been emitted thereby
839                          * guaranteeing topological order.
840                          */
841                         if (--(*pi) == 1)
842                                 prio_queue_put(&queue, parent);
843                 }
844                 /*
845                  * all children of commit have already been
846                  * emitted. we can emit it now.
847                  */
848                 *(indegree_slab_at(&indegree, commit)) = 0;
849
850                 pptr = &commit_list_insert(commit, pptr)->next;
851         }
852
853         clear_indegree_slab(&indegree);
854         clear_prio_queue(&queue);
855         if (sort_order == REV_SORT_BY_AUTHOR_DATE)
856                 clear_author_date_slab(&author_date);
857 }
858
859 struct rev_collect {
860         struct commit **commit;
861         int nr;
862         int alloc;
863         unsigned int initial : 1;
864 };
865
866 static void add_one_commit(struct object_id *oid, struct rev_collect *revs)
867 {
868         struct commit *commit;
869
870         if (is_null_oid(oid))
871                 return;
872
873         commit = lookup_commit(the_repository, oid);
874         if (!commit ||
875             (commit->object.flags & TMP_MARK) ||
876             parse_commit(commit))
877                 return;
878
879         ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc);
880         revs->commit[revs->nr++] = commit;
881         commit->object.flags |= TMP_MARK;
882 }
883
884 static int collect_one_reflog_ent(struct object_id *ooid, struct object_id *noid,
885                                   const char *ident, timestamp_t timestamp,
886                                   int tz, const char *message, void *cbdata)
887 {
888         struct rev_collect *revs = cbdata;
889
890         if (revs->initial) {
891                 revs->initial = 0;
892                 add_one_commit(ooid, revs);
893         }
894         add_one_commit(noid, revs);
895         return 0;
896 }
897
898 struct commit *get_fork_point(const char *refname, struct commit *commit)
899 {
900         struct object_id oid;
901         struct rev_collect revs;
902         struct commit_list *bases;
903         int i;
904         struct commit *ret = NULL;
905
906         memset(&revs, 0, sizeof(revs));
907         revs.initial = 1;
908         for_each_reflog_ent(refname, collect_one_reflog_ent, &revs);
909
910         if (!revs.nr && !get_oid(refname, &oid))
911                 add_one_commit(&oid, &revs);
912
913         for (i = 0; i < revs.nr; i++)
914                 revs.commit[i]->object.flags &= ~TMP_MARK;
915
916         bases = get_merge_bases_many(commit, revs.nr, revs.commit);
917
918         /*
919          * There should be one and only one merge base, when we found
920          * a common ancestor among reflog entries.
921          */
922         if (!bases || bases->next)
923                 goto cleanup_return;
924
925         /* And the found one must be one of the reflog entries */
926         for (i = 0; i < revs.nr; i++)
927                 if (&bases->item->object == &revs.commit[i]->object)
928                         break; /* found */
929         if (revs.nr <= i)
930                 goto cleanup_return;
931
932         ret = bases->item;
933
934 cleanup_return:
935         free_commit_list(bases);
936         return ret;
937 }
938
939 static const char gpg_sig_header[] = "gpgsig";
940 static const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1;
941
942 static int do_sign_commit(struct strbuf *buf, const char *keyid)
943 {
944         struct strbuf sig = STRBUF_INIT;
945         int inspos, copypos;
946         const char *eoh;
947
948         /* find the end of the header */
949         eoh = strstr(buf->buf, "\n\n");
950         if (!eoh)
951                 inspos = buf->len;
952         else
953                 inspos = eoh - buf->buf + 1;
954
955         if (!keyid || !*keyid)
956                 keyid = get_signing_key();
957         if (sign_buffer(buf, &sig, keyid)) {
958                 strbuf_release(&sig);
959                 return -1;
960         }
961
962         for (copypos = 0; sig.buf[copypos]; ) {
963                 const char *bol = sig.buf + copypos;
964                 const char *eol = strchrnul(bol, '\n');
965                 int len = (eol - bol) + !!*eol;
966
967                 if (!copypos) {
968                         strbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len);
969                         inspos += gpg_sig_header_len;
970                 }
971                 strbuf_insert(buf, inspos++, " ", 1);
972                 strbuf_insert(buf, inspos, bol, len);
973                 inspos += len;
974                 copypos += len;
975         }
976         strbuf_release(&sig);
977         return 0;
978 }
979
980 int parse_signed_commit(const struct commit *commit,
981                         struct strbuf *payload, struct strbuf *signature)
982 {
983
984         unsigned long size;
985         const char *buffer = get_commit_buffer(commit, &size);
986         int in_signature, saw_signature = -1;
987         const char *line, *tail;
988
989         line = buffer;
990         tail = buffer + size;
991         in_signature = 0;
992         saw_signature = 0;
993         while (line < tail) {
994                 const char *sig = NULL;
995                 const char *next = memchr(line, '\n', tail - line);
996
997                 next = next ? next + 1 : tail;
998                 if (in_signature && line[0] == ' ')
999                         sig = line + 1;
1000                 else if (starts_with(line, gpg_sig_header) &&
1001                          line[gpg_sig_header_len] == ' ')
1002                         sig = line + gpg_sig_header_len + 1;
1003                 if (sig) {
1004                         strbuf_add(signature, sig, next - sig);
1005                         saw_signature = 1;
1006                         in_signature = 1;
1007                 } else {
1008                         if (*line == '\n')
1009                                 /* dump the whole remainder of the buffer */
1010                                 next = tail;
1011                         strbuf_add(payload, line, next - line);
1012                         in_signature = 0;
1013                 }
1014                 line = next;
1015         }
1016         unuse_commit_buffer(commit, buffer);
1017         return saw_signature;
1018 }
1019
1020 int remove_signature(struct strbuf *buf)
1021 {
1022         const char *line = buf->buf;
1023         const char *tail = buf->buf + buf->len;
1024         int in_signature = 0;
1025         const char *sig_start = NULL;
1026         const char *sig_end = NULL;
1027
1028         while (line < tail) {
1029                 const char *next = memchr(line, '\n', tail - line);
1030                 next = next ? next + 1 : tail;
1031
1032                 if (in_signature && line[0] == ' ')
1033                         sig_end = next;
1034                 else if (starts_with(line, gpg_sig_header) &&
1035                          line[gpg_sig_header_len] == ' ') {
1036                         sig_start = line;
1037                         sig_end = next;
1038                         in_signature = 1;
1039                 } else {
1040                         if (*line == '\n')
1041                                 /* dump the whole remainder of the buffer */
1042                                 next = tail;
1043                         in_signature = 0;
1044                 }
1045                 line = next;
1046         }
1047
1048         if (sig_start)
1049                 strbuf_remove(buf, sig_start - buf->buf, sig_end - sig_start);
1050
1051         return sig_start != NULL;
1052 }
1053
1054 static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)
1055 {
1056         struct merge_remote_desc *desc;
1057         struct commit_extra_header *mergetag;
1058         char *buf;
1059         unsigned long size, len;
1060         enum object_type type;
1061
1062         desc = merge_remote_util(parent);
1063         if (!desc || !desc->obj)
1064                 return;
1065         buf = read_object_file(&desc->obj->oid, &type, &size);
1066         if (!buf || type != OBJ_TAG)
1067                 goto free_return;
1068         len = parse_signature(buf, size);
1069         if (size == len)
1070                 goto free_return;
1071         /*
1072          * We could verify this signature and either omit the tag when
1073          * it does not validate, but the integrator may not have the
1074          * public key of the signer of the tag he is merging, while a
1075          * later auditor may have it while auditing, so let's not run
1076          * verify-signed-buffer here for now...
1077          *
1078          * if (verify_signed_buffer(buf, len, buf + len, size - len, ...))
1079          *      warn("warning: signed tag unverified.");
1080          */
1081         mergetag = xcalloc(1, sizeof(*mergetag));
1082         mergetag->key = xstrdup("mergetag");
1083         mergetag->value = buf;
1084         mergetag->len = size;
1085
1086         **tail = mergetag;
1087         *tail = &mergetag->next;
1088         return;
1089
1090 free_return:
1091         free(buf);
1092 }
1093
1094 int check_commit_signature(const struct commit *commit, struct signature_check *sigc)
1095 {
1096         struct strbuf payload = STRBUF_INIT;
1097         struct strbuf signature = STRBUF_INIT;
1098         int ret = 1;
1099
1100         sigc->result = 'N';
1101
1102         if (parse_signed_commit(commit, &payload, &signature) <= 0)
1103                 goto out;
1104         ret = check_signature(payload.buf, payload.len, signature.buf,
1105                 signature.len, sigc);
1106
1107  out:
1108         strbuf_release(&payload);
1109         strbuf_release(&signature);
1110
1111         return ret;
1112 }
1113
1114 void verify_merge_signature(struct commit *commit, int verbosity)
1115 {
1116         char hex[GIT_MAX_HEXSZ + 1];
1117         struct signature_check signature_check;
1118         memset(&signature_check, 0, sizeof(signature_check));
1119
1120         check_commit_signature(commit, &signature_check);
1121
1122         find_unique_abbrev_r(hex, &commit->object.oid, DEFAULT_ABBREV);
1123         switch (signature_check.result) {
1124         case 'G':
1125                 break;
1126         case 'U':
1127                 die(_("Commit %s has an untrusted GPG signature, "
1128                       "allegedly by %s."), hex, signature_check.signer);
1129         case 'B':
1130                 die(_("Commit %s has a bad GPG signature "
1131                       "allegedly by %s."), hex, signature_check.signer);
1132         default: /* 'N' */
1133                 die(_("Commit %s does not have a GPG signature."), hex);
1134         }
1135         if (verbosity >= 0 && signature_check.result == 'G')
1136                 printf(_("Commit %s has a good GPG signature by %s\n"),
1137                        hex, signature_check.signer);
1138
1139         signature_check_clear(&signature_check);
1140 }
1141
1142 void append_merge_tag_headers(struct commit_list *parents,
1143                               struct commit_extra_header ***tail)
1144 {
1145         while (parents) {
1146                 struct commit *parent = parents->item;
1147                 handle_signed_tag(parent, tail);
1148                 parents = parents->next;
1149         }
1150 }
1151
1152 static void add_extra_header(struct strbuf *buffer,
1153                              struct commit_extra_header *extra)
1154 {
1155         strbuf_addstr(buffer, extra->key);
1156         if (extra->len)
1157                 strbuf_add_lines(buffer, " ", extra->value, extra->len);
1158         else
1159                 strbuf_addch(buffer, '\n');
1160 }
1161
1162 struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
1163                                                       const char **exclude)
1164 {
1165         struct commit_extra_header *extra = NULL;
1166         unsigned long size;
1167         const char *buffer = get_commit_buffer(commit, &size);
1168         extra = read_commit_extra_header_lines(buffer, size, exclude);
1169         unuse_commit_buffer(commit, buffer);
1170         return extra;
1171 }
1172
1173 int for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
1174 {
1175         struct commit_extra_header *extra, *to_free;
1176         int res = 0;
1177
1178         to_free = read_commit_extra_headers(commit, NULL);
1179         for (extra = to_free; !res && extra; extra = extra->next) {
1180                 if (strcmp(extra->key, "mergetag"))
1181                         continue; /* not a merge tag */
1182                 res = fn(commit, extra, data);
1183         }
1184         free_commit_extra_headers(to_free);
1185         return res;
1186 }
1187
1188 static inline int standard_header_field(const char *field, size_t len)
1189 {
1190         return ((len == 4 && !memcmp(field, "tree", 4)) ||
1191                 (len == 6 && !memcmp(field, "parent", 6)) ||
1192                 (len == 6 && !memcmp(field, "author", 6)) ||
1193                 (len == 9 && !memcmp(field, "committer", 9)) ||
1194                 (len == 8 && !memcmp(field, "encoding", 8)));
1195 }
1196
1197 static int excluded_header_field(const char *field, size_t len, const char **exclude)
1198 {
1199         if (!exclude)
1200                 return 0;
1201
1202         while (*exclude) {
1203                 size_t xlen = strlen(*exclude);
1204                 if (len == xlen && !memcmp(field, *exclude, xlen))
1205                         return 1;
1206                 exclude++;
1207         }
1208         return 0;
1209 }
1210
1211 static struct commit_extra_header *read_commit_extra_header_lines(
1212         const char *buffer, size_t size,
1213         const char **exclude)
1214 {
1215         struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL;
1216         const char *line, *next, *eof, *eob;
1217         struct strbuf buf = STRBUF_INIT;
1218
1219         for (line = buffer, eob = line + size;
1220              line < eob && *line != '\n';
1221              line = next) {
1222                 next = memchr(line, '\n', eob - line);
1223                 next = next ? next + 1 : eob;
1224                 if (*line == ' ') {
1225                         /* continuation */
1226                         if (it)
1227                                 strbuf_add(&buf, line + 1, next - (line + 1));
1228                         continue;
1229                 }
1230                 if (it)
1231                         it->value = strbuf_detach(&buf, &it->len);
1232                 strbuf_reset(&buf);
1233                 it = NULL;
1234
1235                 eof = memchr(line, ' ', next - line);
1236                 if (!eof)
1237                         eof = next;
1238                 else if (standard_header_field(line, eof - line) ||
1239                          excluded_header_field(line, eof - line, exclude))
1240                         continue;
1241
1242                 it = xcalloc(1, sizeof(*it));
1243                 it->key = xmemdupz(line, eof-line);
1244                 *tail = it;
1245                 tail = &it->next;
1246                 if (eof + 1 < next)
1247                         strbuf_add(&buf, eof + 1, next - (eof + 1));
1248         }
1249         if (it)
1250                 it->value = strbuf_detach(&buf, &it->len);
1251         return extra;
1252 }
1253
1254 void free_commit_extra_headers(struct commit_extra_header *extra)
1255 {
1256         while (extra) {
1257                 struct commit_extra_header *next = extra->next;
1258                 free(extra->key);
1259                 free(extra->value);
1260                 free(extra);
1261                 extra = next;
1262         }
1263 }
1264
1265 int commit_tree(const char *msg, size_t msg_len, const struct object_id *tree,
1266                 struct commit_list *parents, struct object_id *ret,
1267                 const char *author, const char *sign_commit)
1268 {
1269         struct commit_extra_header *extra = NULL, **tail = &extra;
1270         int result;
1271
1272         append_merge_tag_headers(parents, &tail);
1273         result = commit_tree_extended(msg, msg_len, tree, parents, ret,
1274                                       author, sign_commit, extra);
1275         free_commit_extra_headers(extra);
1276         return result;
1277 }
1278
1279 static int find_invalid_utf8(const char *buf, int len)
1280 {
1281         int offset = 0;
1282         static const unsigned int max_codepoint[] = {
1283                 0x7f, 0x7ff, 0xffff, 0x10ffff
1284         };
1285
1286         while (len) {
1287                 unsigned char c = *buf++;
1288                 int bytes, bad_offset;
1289                 unsigned int codepoint;
1290                 unsigned int min_val, max_val;
1291
1292                 len--;
1293                 offset++;
1294
1295                 /* Simple US-ASCII? No worries. */
1296                 if (c < 0x80)
1297                         continue;
1298
1299                 bad_offset = offset-1;
1300
1301                 /*
1302                  * Count how many more high bits set: that's how
1303                  * many more bytes this sequence should have.
1304                  */
1305                 bytes = 0;
1306                 while (c & 0x40) {
1307                         c <<= 1;
1308                         bytes++;
1309                 }
1310
1311                 /*
1312                  * Must be between 1 and 3 more bytes.  Longer sequences result in
1313                  * codepoints beyond U+10FFFF, which are guaranteed never to exist.
1314                  */
1315                 if (bytes < 1 || 3 < bytes)
1316                         return bad_offset;
1317
1318                 /* Do we *have* that many bytes? */
1319                 if (len < bytes)
1320                         return bad_offset;
1321
1322                 /*
1323                  * Place the encoded bits at the bottom of the value and compute the
1324                  * valid range.
1325                  */
1326                 codepoint = (c & 0x7f) >> bytes;
1327                 min_val = max_codepoint[bytes-1] + 1;
1328                 max_val = max_codepoint[bytes];
1329
1330                 offset += bytes;
1331                 len -= bytes;
1332
1333                 /* And verify that they are good continuation bytes */
1334                 do {
1335                         codepoint <<= 6;
1336                         codepoint |= *buf & 0x3f;
1337                         if ((*buf++ & 0xc0) != 0x80)
1338                                 return bad_offset;
1339                 } while (--bytes);
1340
1341                 /* Reject codepoints that are out of range for the sequence length. */
1342                 if (codepoint < min_val || codepoint > max_val)
1343                         return bad_offset;
1344                 /* Surrogates are only for UTF-16 and cannot be encoded in UTF-8. */
1345                 if ((codepoint & 0x1ff800) == 0xd800)
1346                         return bad_offset;
1347                 /* U+xxFFFE and U+xxFFFF are guaranteed non-characters. */
1348                 if ((codepoint & 0xfffe) == 0xfffe)
1349                         return bad_offset;
1350                 /* So are anything in the range U+FDD0..U+FDEF. */
1351                 if (codepoint >= 0xfdd0 && codepoint <= 0xfdef)
1352                         return bad_offset;
1353         }
1354         return -1;
1355 }
1356
1357 /*
1358  * This verifies that the buffer is in proper utf8 format.
1359  *
1360  * If it isn't, it assumes any non-utf8 characters are Latin1,
1361  * and does the conversion.
1362  */
1363 static int verify_utf8(struct strbuf *buf)
1364 {
1365         int ok = 1;
1366         long pos = 0;
1367
1368         for (;;) {
1369                 int bad;
1370                 unsigned char c;
1371                 unsigned char replace[2];
1372
1373                 bad = find_invalid_utf8(buf->buf + pos, buf->len - pos);
1374                 if (bad < 0)
1375                         return ok;
1376                 pos += bad;
1377                 ok = 0;
1378                 c = buf->buf[pos];
1379                 strbuf_remove(buf, pos, 1);
1380
1381                 /* We know 'c' must be in the range 128-255 */
1382                 replace[0] = 0xc0 + (c >> 6);
1383                 replace[1] = 0x80 + (c & 0x3f);
1384                 strbuf_insert(buf, pos, replace, 2);
1385                 pos += 2;
1386         }
1387 }
1388
1389 static const char commit_utf8_warn[] =
1390 N_("Warning: commit message did not conform to UTF-8.\n"
1391    "You may want to amend it after fixing the message, or set the config\n"
1392    "variable i18n.commitencoding to the encoding your project uses.\n");
1393
1394 int commit_tree_extended(const char *msg, size_t msg_len,
1395                          const struct object_id *tree,
1396                          struct commit_list *parents, struct object_id *ret,
1397                          const char *author, const char *sign_commit,
1398                          struct commit_extra_header *extra)
1399 {
1400         int result;
1401         int encoding_is_utf8;
1402         struct strbuf buffer;
1403
1404         assert_oid_type(tree, OBJ_TREE);
1405
1406         if (memchr(msg, '\0', msg_len))
1407                 return error("a NUL byte in commit log message not allowed.");
1408
1409         /* Not having i18n.commitencoding is the same as having utf-8 */
1410         encoding_is_utf8 = is_encoding_utf8(git_commit_encoding);
1411
1412         strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */
1413         strbuf_addf(&buffer, "tree %s\n", oid_to_hex(tree));
1414
1415         /*
1416          * NOTE! This ordering means that the same exact tree merged with a
1417          * different order of parents will be a _different_ changeset even
1418          * if everything else stays the same.
1419          */
1420         while (parents) {
1421                 struct commit *parent = pop_commit(&parents);
1422                 strbuf_addf(&buffer, "parent %s\n",
1423                             oid_to_hex(&parent->object.oid));
1424         }
1425
1426         /* Person/date information */
1427         if (!author)
1428                 author = git_author_info(IDENT_STRICT);
1429         strbuf_addf(&buffer, "author %s\n", author);
1430         strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_STRICT));
1431         if (!encoding_is_utf8)
1432                 strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding);
1433
1434         while (extra) {
1435                 add_extra_header(&buffer, extra);
1436                 extra = extra->next;
1437         }
1438         strbuf_addch(&buffer, '\n');
1439
1440         /* And add the comment */
1441         strbuf_add(&buffer, msg, msg_len);
1442
1443         /* And check the encoding */
1444         if (encoding_is_utf8 && !verify_utf8(&buffer))
1445                 fprintf(stderr, _(commit_utf8_warn));
1446
1447         if (sign_commit && do_sign_commit(&buffer, sign_commit)) {
1448                 result = -1;
1449                 goto out;
1450         }
1451
1452         result = write_object_file(buffer.buf, buffer.len, commit_type, ret);
1453 out:
1454         strbuf_release(&buffer);
1455         return result;
1456 }
1457
1458 define_commit_slab(merge_desc_slab, struct merge_remote_desc *);
1459 static struct merge_desc_slab merge_desc_slab = COMMIT_SLAB_INIT(1, merge_desc_slab);
1460
1461 struct merge_remote_desc *merge_remote_util(struct commit *commit)
1462 {
1463         return *merge_desc_slab_at(&merge_desc_slab, commit);
1464 }
1465
1466 void set_merge_remote_desc(struct commit *commit,
1467                            const char *name, struct object *obj)
1468 {
1469         struct merge_remote_desc *desc;
1470         FLEX_ALLOC_STR(desc, name, name);
1471         desc->obj = obj;
1472         *merge_desc_slab_at(&merge_desc_slab, commit) = desc;
1473 }
1474
1475 struct commit *get_merge_parent(const char *name)
1476 {
1477         struct object *obj;
1478         struct commit *commit;
1479         struct object_id oid;
1480         if (get_oid(name, &oid))
1481                 return NULL;
1482         obj = parse_object(the_repository, &oid);
1483         commit = (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
1484         if (commit && !merge_remote_util(commit))
1485                 set_merge_remote_desc(commit, name, obj);
1486         return commit;
1487 }
1488
1489 /*
1490  * Append a commit to the end of the commit_list.
1491  *
1492  * next starts by pointing to the variable that holds the head of an
1493  * empty commit_list, and is updated to point to the "next" field of
1494  * the last item on the list as new commits are appended.
1495  *
1496  * Usage example:
1497  *
1498  *     struct commit_list *list;
1499  *     struct commit_list **next = &list;
1500  *
1501  *     next = commit_list_append(c1, next);
1502  *     next = commit_list_append(c2, next);
1503  *     assert(commit_list_count(list) == 2);
1504  *     return list;
1505  */
1506 struct commit_list **commit_list_append(struct commit *commit,
1507                                         struct commit_list **next)
1508 {
1509         struct commit_list *new_commit = xmalloc(sizeof(struct commit_list));
1510         new_commit->item = commit;
1511         *next = new_commit;
1512         new_commit->next = NULL;
1513         return &new_commit->next;
1514 }
1515
1516 const char *find_commit_header(const char *msg, const char *key, size_t *out_len)
1517 {
1518         int key_len = strlen(key);
1519         const char *line = msg;
1520
1521         while (line) {
1522                 const char *eol = strchrnul(line, '\n');
1523
1524                 if (line == eol)
1525                         return NULL;
1526
1527                 if (eol - line > key_len &&
1528                     !strncmp(line, key, key_len) &&
1529                     line[key_len] == ' ') {
1530                         *out_len = eol - line - key_len - 1;
1531                         return line + key_len + 1;
1532                 }
1533                 line = *eol ? eol + 1 : NULL;
1534         }
1535         return NULL;
1536 }
1537
1538 /*
1539  * Inspect the given string and determine the true "end" of the log message, in
1540  * order to find where to put a new Signed-off-by: line.  Ignored are
1541  * trailing comment lines and blank lines.  To support "git commit -s
1542  * --amend" on an existing commit, we also ignore "Conflicts:".  To
1543  * support "git commit -v", we truncate at cut lines.
1544  *
1545  * Returns the number of bytes from the tail to ignore, to be fed as
1546  * the second parameter to append_signoff().
1547  */
1548 size_t ignore_non_trailer(const char *buf, size_t len)
1549 {
1550         size_t boc = 0;
1551         size_t bol = 0;
1552         int in_old_conflicts_block = 0;
1553         size_t cutoff = wt_status_locate_end(buf, len);
1554
1555         while (bol < cutoff) {
1556                 const char *next_line = memchr(buf + bol, '\n', len - bol);
1557
1558                 if (!next_line)
1559                         next_line = buf + len;
1560                 else
1561                         next_line++;
1562
1563                 if (buf[bol] == comment_line_char || buf[bol] == '\n') {
1564                         /* is this the first of the run of comments? */
1565                         if (!boc)
1566                                 boc = bol;
1567                         /* otherwise, it is just continuing */
1568                 } else if (starts_with(buf + bol, "Conflicts:\n")) {
1569                         in_old_conflicts_block = 1;
1570                         if (!boc)
1571                                 boc = bol;
1572                 } else if (in_old_conflicts_block && buf[bol] == '\t') {
1573                         ; /* a pathname in the conflicts block */
1574                 } else if (boc) {
1575                         /* the previous was not trailing comment */
1576                         boc = 0;
1577                         in_old_conflicts_block = 0;
1578                 }
1579                 bol = next_line - buf;
1580         }
1581         return boc ? len - boc : len - cutoff;
1582 }