зеркало из https://github.com/microsoft/git.git
commit-graph: implement git-commit-graph write
Teach git-commit-graph to write graph files. Create new test script to verify this command succeeds without failure. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
08fd81c9b6
Коммит
f237c8b6fe
|
@ -5,6 +5,47 @@ NAME
|
|||
----
|
||||
git-commit-graph - Write and verify Git commit graph files
|
||||
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git commit-graph write' <options> [--object-dir <dir>]
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
Manage the serialized commit graph file.
|
||||
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
--object-dir::
|
||||
Use given directory for the location of packfiles and commit graph
|
||||
file. This parameter exists to specify the location of an alternate
|
||||
that only has the objects directory, not a full .git directory. The
|
||||
commit graph file is expected to be at <dir>/info/commit-graph and
|
||||
the packfiles are expected to be in <dir>/pack.
|
||||
|
||||
|
||||
COMMANDS
|
||||
--------
|
||||
'write'::
|
||||
|
||||
Write a commit graph file based on the commits found in packfiles.
|
||||
Includes all commits from the existing commit graph file.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
* Write a commit graph file for the packed commits in your local .git folder.
|
||||
+
|
||||
------------------------------------------------
|
||||
$ git commit-graph write
|
||||
------------------------------------------------
|
||||
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the linkgit:git[1] suite
|
||||
|
|
|
@ -1,9 +1,18 @@
|
|||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "lockfile.h"
|
||||
#include "parse-options.h"
|
||||
#include "commit-graph.h"
|
||||
|
||||
static char const * const builtin_commit_graph_usage[] = {
|
||||
N_("git commit-graph [--object-dir <objdir>]"),
|
||||
N_("git commit-graph write [--object-dir <objdir>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char * const builtin_commit_graph_write_usage[] = {
|
||||
N_("git commit-graph write [--object-dir <objdir>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -11,6 +20,25 @@ static struct opts_commit_graph {
|
|||
const char *obj_dir;
|
||||
} opts;
|
||||
|
||||
static int graph_write(int argc, const char **argv)
|
||||
{
|
||||
static struct option builtin_commit_graph_write_options[] = {
|
||||
OPT_STRING(0, "object-dir", &opts.obj_dir,
|
||||
N_("dir"),
|
||||
N_("The object directory to store the graph")),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
argc = parse_options(argc, argv, NULL,
|
||||
builtin_commit_graph_write_options,
|
||||
builtin_commit_graph_write_usage, 0);
|
||||
|
||||
if (!opts.obj_dir)
|
||||
opts.obj_dir = get_object_directory();
|
||||
|
||||
write_commit_graph(opts.obj_dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cmd_commit_graph(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
|
@ -31,6 +59,11 @@ int cmd_commit_graph(int argc, const char **argv, const char *prefix)
|
|||
builtin_commit_graph_usage,
|
||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||
|
||||
if (argc > 0) {
|
||||
if (!strcmp(argv[0], "write"))
|
||||
return graph_write(argc, argv);
|
||||
}
|
||||
|
||||
usage_with_options(builtin_commit_graph_usage,
|
||||
builtin_commit_graph_options);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,124 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='commit graph'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup full repo' '
|
||||
mkdir full &&
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git init &&
|
||||
objdir=".git/objects"
|
||||
'
|
||||
|
||||
test_expect_success 'write graph with no packs' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git commit-graph write --object-dir . &&
|
||||
test_path_is_file info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'create commits and repack' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
for i in $(test_seq 3)
|
||||
do
|
||||
test_commit $i &&
|
||||
git branch commits/$i
|
||||
done &&
|
||||
git repack
|
||||
'
|
||||
|
||||
test_expect_success 'write graph' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
graph1=$(git commit-graph write) &&
|
||||
test_path_is_file $objdir/info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'Add more commits' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git reset --hard commits/1 &&
|
||||
for i in $(test_seq 4 5)
|
||||
do
|
||||
test_commit $i &&
|
||||
git branch commits/$i
|
||||
done &&
|
||||
git reset --hard commits/2 &&
|
||||
for i in $(test_seq 6 7)
|
||||
do
|
||||
test_commit $i &&
|
||||
git branch commits/$i
|
||||
done &&
|
||||
git reset --hard commits/2 &&
|
||||
git merge commits/4 &&
|
||||
git branch merge/1 &&
|
||||
git reset --hard commits/4 &&
|
||||
git merge commits/6 &&
|
||||
git branch merge/2 &&
|
||||
git reset --hard commits/3 &&
|
||||
git merge commits/5 commits/7 &&
|
||||
git branch merge/3 &&
|
||||
git repack
|
||||
'
|
||||
|
||||
# Current graph structure:
|
||||
#
|
||||
# __M3___
|
||||
# / | \
|
||||
# 3 M1 5 M2 7
|
||||
# |/ \|/ \|
|
||||
# 2 4 6
|
||||
# |___/____/
|
||||
# 1
|
||||
|
||||
|
||||
test_expect_success 'write graph with merges' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git commit-graph write &&
|
||||
test_path_is_file $objdir/info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'Add one more commit' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
test_commit 8 &&
|
||||
git branch commits/8 &&
|
||||
ls $objdir/pack | grep idx >existing-idx &&
|
||||
git repack &&
|
||||
ls $objdir/pack| grep idx | grep -v --file=existing-idx >new-idx
|
||||
'
|
||||
|
||||
# Current graph structure:
|
||||
#
|
||||
# 8
|
||||
# |
|
||||
# __M3___
|
||||
# / | \
|
||||
# 3 M1 5 M2 7
|
||||
# |/ \|/ \|
|
||||
# 2 4 6
|
||||
# |___/____/
|
||||
# 1
|
||||
|
||||
test_expect_success 'write graph with new commit' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git commit-graph write &&
|
||||
test_path_is_file $objdir/info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'write graph with nothing new' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git commit-graph write &&
|
||||
test_path_is_file $objdir/info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'setup bare repo' '
|
||||
cd "$TRASH_DIRECTORY" &&
|
||||
git clone --bare --no-local full bare &&
|
||||
cd bare &&
|
||||
baredir="./objects"
|
||||
'
|
||||
|
||||
test_expect_success 'write graph in bare repo' '
|
||||
cd "$TRASH_DIRECTORY/bare" &&
|
||||
git commit-graph write &&
|
||||
test_path_is_file $baredir/info/commit-graph
|
||||
'
|
||||
|
||||
test_done
|
Загрузка…
Ссылка в новой задаче