summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile1
-rw-r--r--builtin.h1
-rw-r--r--builtin/skew.c50
-rw-r--r--git.c1
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
diff --git a/Makefile b/Makefile
index 9aca8a16d9..e673bdf603 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/builtin.h b/builtin.h
index ed6ee26933..5f5dc0abb8 100644
--- a/builtin.h
+++ b/builtin.h
@@ -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;
+}
diff --git a/git.c b/git.c
index 265fa09d8d..8a77fe314c 100644
--- a/git.c
+++ b/git.c
@@ -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;