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:
parent
de9f14e26a
commit
188c35e36d
5 changed files with 54 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -132,6 +132,7 @@
|
|||
/git-show-branch
|
||||
/git-show-index
|
||||
/git-show-ref
|
||||
/git-skew
|
||||
/git-stage
|
||||
/git-stash
|
||||
/git-status
|
||||
|
|
1
Makefile
1
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
|
||||
|
|
|
@ -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
50
builtin/skew.c
Normal 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
1
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;
|
||||
|
|
Loading…
Reference in a new issue