summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2018-11-18 23:39:43 +0000
committerEdward Thomson <ethomson@edwardthomson.com>2018-11-18 23:39:43 +0000
commit11d33df802b00acf5ef1e437c12751b3e6a5d39b (patch)
tree553a32212cd108dfd3602b095414b712d88aab47 /src
parent646a94be5f01001e09796d03d5f6c077b21b9532 (diff)
parente226ad8f2fd76211809cf7b381fb55bb600df82f (diff)
downloadlibgit2-11d33df802b00acf5ef1e437c12751b3e6a5d39b.tar.gz
Merge branch 'tiennou/fix/logallrefupdates-always'
Diffstat (limited to 'src')
-rw-r--r--src/config_cache.c8
-rw-r--r--src/refdb_fs.c32
-rw-r--r--src/repository.h3
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,