Merge pull request #497 from carlosmn/config Don't fail when opening a new config file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
diff --git a/src/config_file.c b/src/config_file.c
index 87a4307..5e862d4 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -256,7 +256,11 @@ static int config_open(git_config_file *cfg)
diskfile_backend *b = (diskfile_backend *)cfg;
error = git_futils_readbuffer(&b->reader.buffer, b->file_path);
- if(error < GIT_SUCCESS)
+ /* It's fine if the file doesn't exist */
+ if (error == GIT_ENOTFOUND)
+ return GIT_SUCCESS;
+
+ if (error < GIT_SUCCESS)
goto cleanup;
error = config_parse(b);
@@ -714,6 +718,9 @@ static int skip_bom(diskfile_backend *cfg)
{
static const char *utf8_bom = "\xef\xbb\xbf";
+ if (cfg->reader.buffer.len < sizeof(utf8_bom))
+ return GIT_SUCCESS;
+
if (memcmp(cfg->reader.read_ptr, utf8_bom, sizeof(utf8_bom)) == 0)
cfg->reader.read_ptr += sizeof(utf8_bom);
@@ -882,14 +889,23 @@ static int config_write(diskfile_backend *cfg, cvar_t *var)
/* We need to read in our own config file */
error = git_futils_readbuffer(&cfg->reader.buffer, cfg->file_path);
- if (error < GIT_SUCCESS) {
+ if (error < GIT_SUCCESS && error != GIT_ENOTFOUND) {
return git__rethrow(error, "Failed to read existing config file %s", cfg->file_path);
}
/* Initialise the reading position */
- cfg->reader.read_ptr = cfg->reader.buffer.data;
- cfg->reader.eof = 0;
- data_start = cfg->reader.read_ptr;
+ if (error == GIT_ENOTFOUND) {
+ error = GIT_SUCCESS;
+ cfg->reader.read_ptr = NULL;
+ cfg->reader.eof = 1;
+ data_start = NULL;
+ cfg->reader.buffer.len = 0;
+ cfg->reader.buffer.data = NULL;
+ } else {
+ cfg->reader.read_ptr = cfg->reader.buffer.data;
+ cfg->reader.eof = 0;
+ data_start = cfg->reader.read_ptr;
+ }
/* Lock the file */
error = git_filebuf_open(&file, cfg->file_path, 0);
diff --git a/tests-clay/clay.h b/tests-clay/clay.h
index 812209b..3db9600 100644
--- a/tests-clay/clay.h
+++ b/tests-clay/clay.h
@@ -59,6 +59,7 @@ void cl_fixture_cleanup(const char *fixture_name);
*/
extern void test_buf_basic__printf(void);
extern void test_buf_basic__resize(void);
+extern void test_config_new__write_new_config(void);
extern void test_config_stress__cleanup(void);
extern void test_config_stress__dont_break_on_invalid_input(void);
extern void test_config_stress__initialize(void);
diff --git a/tests-clay/clay_main.c b/tests-clay/clay_main.c
index 6d964b1..2f9a49d 100644
--- a/tests-clay/clay_main.c
+++ b/tests-clay/clay_main.c
@@ -108,6 +108,9 @@ static const struct clay_func _clay_cb_buf_basic[] = {
{"printf", &test_buf_basic__printf},
{"resize", &test_buf_basic__resize}
};
+static const struct clay_func _clay_cb_config_new[] = {
+ {"write_new_config", &test_config_new__write_new_config}
+};
static const struct clay_func _clay_cb_config_stress[] = {
{"dont_break_on_invalid_input", &test_config_stress__dont_break_on_invalid_input}
};
@@ -229,6 +232,12 @@ static const struct clay_suite _clay_suites[] = {
_clay_cb_buf_basic, 2
},
{
+ "config::new",
+ {NULL, NULL},
+ {NULL, NULL},
+ _clay_cb_config_new, 1
+ },
+ {
"config::stress",
{"initialize", &test_config_stress__initialize},
{"cleanup", &test_config_stress__cleanup},
@@ -362,8 +371,8 @@ static const struct clay_suite _clay_suites[] = {
}
};
-static size_t _clay_suite_count = 23;
-static size_t _clay_callback_count = 70;
+static size_t _clay_suite_count = 24;
+static size_t _clay_callback_count = 71;
/* Core test functions */
static void
diff --git a/tests-clay/config/new.c b/tests-clay/config/new.c
new file mode 100644
index 0000000..285cc4a
--- /dev/null
+++ b/tests-clay/config/new.c
@@ -0,0 +1,36 @@
+#include "clay_libgit2.h"
+
+#include "filebuf.h"
+#include "fileops.h"
+#include "posix.h"
+
+#define TEST_CONFIG "git-new-config"
+
+void test_config_new__write_new_config(void)
+{
+ const char *out;
+ struct git_config_file *file;
+ git_config *config;
+
+ cl_git_pass(git_config_file__ondisk(&file, TEST_CONFIG));
+ cl_git_pass(git_config_new(&config));
+ cl_git_pass(git_config_add_file(config, file, 0));
+
+ cl_git_pass(git_config_set_string(config, "color.ui", "auto"));
+ cl_git_pass(git_config_set_string(config, "core.editor", "ed"));
+
+ git_config_free(config);
+
+ cl_git_pass(git_config_file__ondisk(&file, TEST_CONFIG));
+ cl_git_pass(git_config_new(&config));
+ cl_git_pass(git_config_add_file(config, file, 0));
+
+ cl_git_pass(git_config_get_string(config, "color.ui", &out));
+ cl_assert(strcmp(out, "auto") == 0);
+ cl_git_pass(git_config_get_string(config, "core.editor", &out));
+ cl_assert(strcmp(out, "ed") == 0);
+
+ git_config_free(config);
+
+ p_unlink(TEST_CONFIG);
+}