Skip to content

Commit

Permalink
git skew: a tool to find how big a clock skew exists in the history
Browse files Browse the repository at this point 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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jun 30, 2011
1 parent de9f14e commit 188c35e
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@
/git-show-branch
/git-show-index
/git-show-ref
/git-skew
/git-stage
/git-stash
/git-status
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
50 changes: 50 additions & 0 deletions builtin/skew.c
Original file line number Diff line number Diff line change
@@ -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;
}
1 change: 1 addition & 0 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 188c35e

Please sign in to comment.