diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2018-11-18 23:39:43 +0000 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2018-11-18 23:39:43 +0000 |
commit | 11d33df802b00acf5ef1e437c12751b3e6a5d39b (patch) | |
tree | 553a32212cd108dfd3602b095414b712d88aab47 /src | |
parent | 646a94be5f01001e09796d03d5f6c077b21b9532 (diff) | |
parent | e226ad8f2fd76211809cf7b381fb55bb600df82f (diff) | |
download | libgit2-11d33df802b00acf5ef1e437c12751b3e6a5d39b.tar.gz |
Merge branch 'tiennou/fix/logallrefupdates-always'
Diffstat (limited to 'src')
-rw-r--r-- | src/config_cache.c | 8 | ||||
-rw-r--r-- | src/refdb_fs.c | 32 | ||||
-rw-r--r-- | src/repository.h | 3 |
3 files changed, 30 insertions, 13 deletions
diff --git a/src/config_cache.c b/src/config_cache.c index 0efb1a789..2530217c9 100644 --- a/src/config_cache.c +++ b/src/config_cache.c @@ -58,6 +58,12 @@ static git_cvar_map _cvar_map_safecrlf[] = { {GIT_CVAR_STRING, "warn", GIT_SAFE_CRLF_WARN} }; +static git_cvar_map _cvar_map_logallrefupdates[] = { + {GIT_CVAR_FALSE, NULL, GIT_LOGALLREFUPDATES_FALSE}, + {GIT_CVAR_TRUE, NULL, GIT_LOGALLREFUPDATES_TRUE}, + {GIT_CVAR_STRING, "always", GIT_LOGALLREFUPDATES_ALWAYS}, +}; + /* * Generic map for integer values */ @@ -76,7 +82,7 @@ static struct map_data _cvar_maps[] = { {"core.abbrev", _cvar_map_int, 1, GIT_ABBREV_DEFAULT }, {"core.precomposeunicode", NULL, 0, GIT_PRECOMPOSE_DEFAULT }, {"core.safecrlf", _cvar_map_safecrlf, ARRAY_SIZE(_cvar_map_safecrlf), GIT_SAFE_CRLF_DEFAULT}, - {"core.logallrefupdates", NULL, 0, GIT_LOGALLREFUPDATES_DEFAULT }, + {"core.logallrefupdates", _cvar_map_logallrefupdates, ARRAY_SIZE(_cvar_map_logallrefupdates), GIT_LOGALLREFUPDATES_DEFAULT}, {"core.protecthfs", NULL, 0, GIT_PROTECTHFS_DEFAULT }, {"core.protectntfs", NULL, 0, GIT_PROTECTNTFS_DEFAULT }, {"core.fsyncobjectfiles", NULL, 0, GIT_FSYNCOBJECTFILES_DEFAULT }, diff --git a/src/refdb_fs.c b/src/refdb_fs.c index 49b567c08..49fc292a9 100644 --- a/src/refdb_fs.c +++ b/src/refdb_fs.c @@ -1090,7 +1090,6 @@ fail: static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, const git_oid *old, const git_oid *new, const git_signature *author, const char *message); static int has_reflog(git_repository *repo, const char *name); -/* We only write if it's under heads/, remotes/ or notes/ or if it already has a log */ static int should_write_reflog(int *write, git_repository *repo, const char *name) { int error, logall; @@ -1103,17 +1102,26 @@ static int should_write_reflog(int *write, git_repository *repo, const char *nam if (logall == GIT_LOGALLREFUPDATES_UNSET) logall = !git_repository_is_bare(repo); - if (!logall) { + *write = 0; + switch (logall) { + case GIT_LOGALLREFUPDATES_FALSE: *write = 0; - } else if (has_reflog(repo, name)) { - *write = 1; - } else if (!git__prefixcmp(name, GIT_REFS_HEADS_DIR) || - !git__strcmp(name, GIT_HEAD_FILE) || - !git__prefixcmp(name, GIT_REFS_REMOTES_DIR) || - !git__prefixcmp(name, GIT_REFS_NOTES_DIR)) { + break; + + case GIT_LOGALLREFUPDATES_TRUE: + /* Only write if it already has a log, + * or if it's under heads/, remotes/ or notes/ + */ + *write = has_reflog(repo, name) || + !git__prefixcmp(name, GIT_REFS_HEADS_DIR) || + !git__strcmp(name, GIT_HEAD_FILE) || + !git__prefixcmp(name, GIT_REFS_REMOTES_DIR) || + !git__prefixcmp(name, GIT_REFS_NOTES_DIR); + break; + + case GIT_LOGALLREFUPDATES_ALWAYS: *write = 1; - } else { - *write = 0; + break; } return 0; @@ -1713,7 +1721,7 @@ static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend, if ((error == GIT_ENOTFOUND) && ((error = create_new_reflog_file(git_buf_cstr(&log_path))) < 0)) goto cleanup; - + if ((error = reflog_parse(log, git_buf_cstr(&log_file), git_buf_len(&log_file))) < 0) goto cleanup; @@ -1973,7 +1981,7 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_ goto cleanup; } - if (git_path_isdir(git_buf_cstr(&new_path)) && + if (git_path_isdir(git_buf_cstr(&new_path)) && (git_futils_rmdir_r(git_buf_cstr(&new_path), NULL, GIT_RMDIR_SKIP_NONEMPTY) < 0)) { error = -1; goto cleanup; diff --git a/src/repository.h b/src/repository.h index fd6400cc1..1a7271799 100644 --- a/src/repository.h +++ b/src/repository.h @@ -105,7 +105,10 @@ typedef enum { /* core.safecrlf */ GIT_SAFE_CRLF_DEFAULT = GIT_CVAR_FALSE, /* core.logallrefupdates */ + GIT_LOGALLREFUPDATES_FALSE = GIT_CVAR_FALSE, + GIT_LOGALLREFUPDATES_TRUE = GIT_CVAR_TRUE, GIT_LOGALLREFUPDATES_UNSET = 2, + GIT_LOGALLREFUPDATES_ALWAYS = 3, GIT_LOGALLREFUPDATES_DEFAULT = GIT_LOGALLREFUPDATES_UNSET, /* core.protectHFS */ GIT_PROTECTHFS_DEFAULT = GIT_CVAR_FALSE, |