1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-31 06:17:56 +01:00

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>
This commit is contained in:
Jeff King 2011-06-11 19:04:11 +00:00 committed by Junio C Hamano
parent de9f14e26a
commit 188c35e36d
5 changed files with 54 additions and 0 deletions

1
.gitignore vendored
View file

@ -132,6 +132,7 @@
/git-show-branch
/git-show-index
/git-show-ref
/git-skew
/git-stage
/git-stash
/git-status

View file

@ -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

View file

@ -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
builtin/skew.c Normal file
View file

@ -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
git.c
View file

@ -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;