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}