1046f5f546044a49a926539e1c4f520dbefcc8bd
1#include "cache.h"
2#include "commit.h"
3#include "diff.h"
4#include "revision.h"
5
6unsigned long worst_skew = 0;
7
8static void check_skew_recurse(struct commit *c, unsigned long when)
9{
10 struct commit_list *p;
11
12 if (c->object.flags & SEEN)
13 return;
14 c->object.flags |= SEEN;
15
16 if (parse_commit(c) < 0)
17 return;
18
19 if (c->date > when) {
20 unsigned long skew = c->date - when;
21 if (skew > worst_skew)
22 worst_skew = skew;
23 }
24
25 for (p = c->parents; p; p = p->next)
26 check_skew_recurse(p->item, c->date < when ? c->date : when);
27}
28
29static void check_skew(struct commit *c)
30{
31 check_skew_recurse(c, time(NULL));
32}
33
34int cmd_skew(int argc, const char **argv, const char *prefix) {
35 struct rev_info revs;
36 int i;
37
38 git_config(git_default_config, NULL);
39 init_revisions(&revs, prefix);
40 argc = setup_revisions(argc, argv, &revs, NULL);
41
42 for (i = 0; i < revs.pending.nr; i++) {
43 struct object *o = revs.pending.objects[i].item;
44 if (o->type == OBJ_COMMIT)
45 check_skew((struct commit *)o);
46 }
47
48 printf("%lu\n", worst_skew);
49 return 0;
50}