aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2011-06-11 19:04:11 +0000
committerJunio C Hamano <gitster@pobox.com>2011-06-30 12:21:13 -0700
commit188c35e36d22c39074a8b0ee411483a405065a9a (patch)
tree3103465c954583e709d61324abd55cd6d06b994a /builtin
parentde9f14e26a179462b3d4ed9de64ba7dd9fdbfa02 (diff)
downloadgit-188c35e36d22c39074a8b0ee411483a405065a9a.tar.gz
git-188c35e36d22c39074a8b0ee411483a405065a9a.tar.xz
git skew: a tool to find how big a clock skew exists in the history
> As you probably guessed from the specificity of the number, I wrote a > short program to actually traverse and find the worst skew. It takes > about 5 seconds to run (unsurprisingly, since it is doing the same full > traversal that we end up doing in the above numbers). So we could > "autoskew" by setting up the configuration on clone, and then > periodically updating it as part of "git gc". This patch doesn't implement auto-detection of skew, but is the program I used to calculate, and would provide the basis for such auto-detection. It would be interesting to see average skew numbers for popular repositories. You can run it as "git skew --all". Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/skew.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/builtin/skew.c b/builtin/skew.c
new file mode 100644
index 000000000..1046f5f54
--- /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;
+}