diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | builtin.h | 1 | ||||
-rw-r--r-- | builtin/skew.c | 50 | ||||
-rw-r--r-- | git.c | 1 |
5 files changed, 54 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore index 14e2b6bde9..90aff17860 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,7 @@ /git-show-branch /git-show-index /git-show-ref +/git-skew /git-stage /git-stash /git-status @@ -725,6 +725,7 @@ BUILTIN_OBJS += builtin/send-pack.o BUILTIN_OBJS += builtin/shortlog.o BUILTIN_OBJS += builtin/show-branch.o BUILTIN_OBJS += builtin/show-ref.o +BUILTIN_OBJS += builtin/skew.o BUILTIN_OBJS += builtin/stripspace.o BUILTIN_OBJS += builtin/symbolic-ref.o BUILTIN_OBJS += builtin/tag.o @@ -141,5 +141,6 @@ extern int cmd_verify_pack(int argc, const char **argv, const char *prefix); extern int cmd_show_ref(int argc, const char **argv, const char *prefix); extern int cmd_pack_refs(int argc, const char **argv, const char *prefix); extern int cmd_replace(int argc, const char **argv, const char *prefix); +extern int cmd_skew(int argc, const char **argv, const char *prefix); #endif diff --git a/builtin/skew.c b/builtin/skew.c new file mode 100644 index 0000000000..1046f5f546 --- /dev/null +++ b/builtin/skew.c @@ -0,0 +1,50 @@ +#include "cache.h" +#include "commit.h" +#include "diff.h" +#include "revision.h" + +unsigned long worst_skew = 0; + +static void check_skew_recurse(struct commit *c, unsigned long when) +{ + struct commit_list *p; + + if (c->object.flags & SEEN) + return; + c->object.flags |= SEEN; + + if (parse_commit(c) < 0) + return; + + if (c->date > when) { + unsigned long skew = c->date - when; + if (skew > worst_skew) + worst_skew = skew; + } + + for (p = c->parents; p; p = p->next) + check_skew_recurse(p->item, c->date < when ? c->date : when); +} + +static void check_skew(struct commit *c) +{ + check_skew_recurse(c, time(NULL)); +} + +int cmd_skew(int argc, const char **argv, const char *prefix) { + struct rev_info revs; + int i; + + git_config(git_default_config, NULL); + init_revisions(&revs, prefix); + argc = setup_revisions(argc, argv, &revs, NULL); + + for (i = 0; i < revs.pending.nr; i++) { + struct object *o = revs.pending.objects[i].item; + if (o->type == OBJ_COMMIT) + check_skew((struct commit *)o); + } + + printf("%lu\n", worst_skew); + return 0; +} @@ -399,6 +399,7 @@ static void handle_internal_command(int argc, const char **argv) { "verify-pack", cmd_verify_pack }, { "show-ref", cmd_show_ref, RUN_SETUP }, { "pack-refs", cmd_pack_refs, RUN_SETUP }, + { "skew", cmd_skew, RUN_SETUP }, }; int i; static const char ext[] = STRIP_EXTENSION; |