Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> wrote: > Aside from this change, I wonder if making "fetch" optionally "exit 1" > if no refs were updated would be useful, as in the below WIP. Of course > it would be better to distinguish errors from "no refs to update". Yes, we should've had this feature all along :) And it's easy for me to build off your WIP to have fetch update server info iff info/refs already exists: -------8<------- Subject: [PATCH 2/1] server-info: conditionally update on fetch Since fetch can invalidate existing server info files, use the new `updated_refs' counter to update server info files iff info/refs already exists. Note: this depends on Ævar's WIP in: https://public-inbox.org/git/87ftphw7mv.fsf@xxxxxxxxxxxxxxxxxxx/ Signed-off-by: Eric Wong <e@xxxxxxxxx> --- builtin/fetch.c | 3 +++ server-info.c | 22 +++++++++++++++++++--- t/t5513-fetch-track.sh | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/builtin/fetch.c b/builtin/fetch.c index da5414d9db..b35d4d105d 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1681,6 +1681,9 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) close_all_packs(the_repository->objects); + if (updated_refs) + update_server_info(-1); + argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL); if (verbosity < 0) argv_array_push(&argv_gc_auto, "--quiet"); diff --git a/server-info.c b/server-info.c index e68f785c2f..d4065d56a3 100644 --- a/server-info.c +++ b/server-info.c @@ -7,6 +7,7 @@ #include "packfile.h" #include "object-store.h" #include "strbuf.h" +#include "dir.h" struct update_info_ctx { FILE *cur_fp; @@ -170,10 +171,25 @@ static int generate_info_refs(struct update_info_ctx *uic) return for_each_ref(add_info_ref, uic); } -static int update_info_refs(int force) +static int want_update(int *force, const char *path) +{ + if (*force < 0) { + if (file_exists(path)) + *force = 0; /* continue to normal update */ + else + return 0; + } + return 1; +} + +static int update_info_refs(int *force) { char *path = git_pathdup("info/refs"); - int ret = update_info_file(path, generate_info_refs, force); + int ret = 0; + + if (want_update(force, path)) + ret = update_info_file(path, generate_info_refs, *force); + free(path); return ret; } @@ -361,7 +377,7 @@ int update_server_info(int force) */ int errs = 0; - errs = errs | update_info_refs(force); + errs = errs | update_info_refs(&force); errs = errs | update_info_packs(force); /* remove leftover rev-cache file if there is any */ diff --git a/t/t5513-fetch-track.sh b/t/t5513-fetch-track.sh index 65d1e05bd6..421f16ddfd 100755 --- a/t/t5513-fetch-track.sh +++ b/t/t5513-fetch-track.sh @@ -27,4 +27,25 @@ test_expect_success fetch ' ) ' +test_expect_success 'info/refs not created by fetch' ' + ( + cd other && + test_path_is_dir .git/info && + ! test_path_is_file .git/info/refs + ) +' + +test_expect_success 'info/refs updated by fetch if it already exists' ' + git branch b/for-info-refs && + ( + cd other && + git update-server-info && + test_path_is_file .git/info/refs && + ! grep b/for-info-refs .git/info/refs && + git fetch && + test_path_is_file .git/info/refs && + grep b/for-info-refs .git/info/refs + ) +' + test_done -- EW