Teach git-graph to delete the graph previously referenced by 'graph_head' when writing a new graph file and updating 'graph_head'. This prevents data creep by storing a list of useless graphs. Be careful to not delete the graph if the file did not change. Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> --- Documentation/git-graph.txt | 8 ++++++-- builtin/graph.c | 14 +++++++++++++- t/t5319-graph.sh | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/Documentation/git-graph.txt b/Documentation/git-graph.txt index f690699570..f4f1048d28 100644 --- a/Documentation/git-graph.txt +++ b/Documentation/git-graph.txt @@ -39,6 +39,10 @@ OPTIONS When used with --write, update the graph-head file to point to the written graph file. +--delete-expired:: + When used with --write and --update-head, delete the graph file + previously referenced by graph-head. + EXAMPLES -------- @@ -55,10 +59,10 @@ $ git graph --write ------------------------------------------------ * Write a graph file for the packed commits in your local .git folder, -* and update graph-head. +* update graph-head, and delete the old graph-<oid>.graph file. + ------------------------------------------------ -$ git graph --write --update-head +$ git graph --write --update-head --delete-expired ------------------------------------------------ * Read basic information from a graph file. diff --git a/builtin/graph.c b/builtin/graph.c index ac15febc46..adf779b601 100644 --- a/builtin/graph.c +++ b/builtin/graph.c @@ -12,7 +12,7 @@ static char const * const builtin_graph_usage[] ={ N_("git graph [--pack-dir <packdir>]"), N_("git graph --clear [--pack-dir <packdir>]"), N_("git graph --read [--graph-id=<oid>]"), - N_("git graph --write [--pack-dir <packdir>] [--update-head]"), + N_("git graph --write [--pack-dir <packdir>] [--update-head] [--delete-expired]"), NULL }; @@ -23,6 +23,7 @@ static struct opts_graph { const char *graph_id; int write; int update_head; + int delete_expired; int has_existing; struct object_id old_graph_oid; } opts; @@ -120,6 +121,15 @@ static int graph_write(void) if (graph_id) printf("%s\n", oid_to_hex(graph_id)); + if (opts.delete_expired && opts.update_head && opts.has_existing && + oidcmp(graph_id, &opts.old_graph_oid)) { + char *old_path = get_graph_filename_oid(opts.pack_dir, &opts.old_graph_oid); + if (remove_path(old_path)) + die("failed to remove path %s", old_path); + + free(old_path); + } + free(graph_id); return 0; } @@ -138,6 +148,8 @@ int cmd_graph(int argc, const char **argv, const char *prefix) N_("write graph file")), OPT_BOOL('u', "update-head", &opts.update_head, N_("update graph-head to written graph file")), + OPT_BOOL('d', "delete-expired", &opts.delete_expired, + N_("delete expired head graph file")), { OPTION_STRING, 'M', "graph-id", &opts.graph_id, N_("oid"), N_("An OID for a specific graph file in the pack-dir."), diff --git a/t/t5319-graph.sh b/t/t5319-graph.sh index 311fb9dd67..a70c7bbb02 100755 --- a/t/t5319-graph.sh +++ b/t/t5319-graph.sh @@ -80,9 +80,42 @@ test_expect_success 'write graph with merges' \ _graph_read_expect "18" "${packdir}" && cmp expect output' +test_expect_success 'Add more commits' \ + 'git reset --hard commits/3 && + for i in $(test_seq 16 20) + do + git commit --allow-empty -m "commit $i" && + git branch commits/$i + done && + git repack' + +test_expect_success 'write graph with merges' \ + 'graph3=$(git graph --write --update-head --delete-expired) && + test_path_is_file ${packdir}/graph-${graph3}.graph && + test_path_is_missing ${packdir}/graph-${graph2}.graph && + test_path_is_file ${packdir}/graph-${graph1}.graph && + test_path_is_file ${packdir}/graph-head && + echo ${graph3} >expect && + cmp -n 40 expect ${packdir}/graph-head && + git graph --read --graph-id=${graph3} >output && + _graph_read_expect "23" "${packdir}" && + cmp expect output' + +test_expect_success 'write graph with nothing new' \ + 'graph4=$(git graph --write --update-head --delete-expired) && + test_path_is_file ${packdir}/graph-${graph4}.graph && + test_path_is_file ${packdir}/graph-${graph1}.graph && + test_path_is_file ${packdir}/graph-head && + echo ${graph4} >expect && + cmp -n 40 expect ${packdir}/graph-head && + git graph --read --graph-id=${graph4} >output && + _graph_read_expect "23" "${packdir}" && + cmp expect output' + test_expect_success 'clear graph' \ 'git graph --clear && - test_path_is_missing ${packdir}/graph-${graph2}.graph && + test_path_is_missing ${packdir}/graph-${graph3}.graph && + test_path_is_file ${packdir}/graph-${graph1}.graph && test_path_is_missing ${packdir}/graph-head' test_expect_success 'setup bare repo' \ @@ -100,7 +133,7 @@ test_expect_success 'write graph in bare repo' \ echo ${graphbare} >expect && cmp -n 40 expect ${baredir}/graph-head && git graph --read --graph-id=${graphbare} >output && - _graph_read_expect "18" "${baredir}" && + _graph_read_expect "23" "${baredir}" && cmp expect output' test_done -- 2.16.0