From: Jeff King <peff@xxxxxxxx> On Mon, Jul 05, 2010 at 08:27:23AM -0400, Jeff King wrote: > 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@xxxxxxxxx> Signed-off-by: Ãvar ArnfjÃrà Bjarmason <avarab@xxxxxxxxx> --- .gitignore | 1 + Makefile | 1 + builtin.h | 1 + builtin/skew.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ git.c | 1 + 5 files changed, 54 insertions(+), 0 deletions(-) create mode 100644 builtin/skew.c diff --git a/.gitignore b/.gitignore index acffdfa..503ef8b 100644 --- a/.gitignore +++ b/.gitignore @@ -137,6 +137,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 e40ac0c..4ba5542 100644 --- a/Makefile +++ b/Makefile @@ -763,6 +763,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 0e9da90..0be47ca 100644 --- a/builtin.h +++ b/builtin.h @@ -143,5 +143,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 0000000..1046f5f --- /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 89721d4..2404bf3 100644 --- a/git.c +++ b/git.c @@ -434,6 +434,7 @@ static void handle_internal_command(int argc, const char **argv) { "version", cmd_version }, { "whatchanged", cmd_whatchanged, RUN_SETUP }, { "write-tree", cmd_write_tree, RUN_SETUP }, + { "skew", cmd_skew, RUN_SETUP }, }; int i; static const char ext[] = STRIP_EXTENSION; -- 1.7.5.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html