diff options
| author | Russell Belfer <rb@github.com> | 2013-03-18 15:54:35 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2013-03-18 15:54:35 -0700 |
| commit | 324602514fec5ba04fa236c67d633f9b18ad9845 (patch) | |
| tree | bdbf4505fd513029e03a4a1aaa027b23baa24e1e | |
| parent | 41954a49c12a72eda3b3fe02c2752f6831b5dbf9 (diff) | |
| download | libgit2-324602514fec5ba04fa236c67d633f9b18ad9845.tar.gz | |
Fixes and cleanups
Get rid of some dead code, tighten things up a bit, and fix a bug
with core::env test.
| -rw-r--r-- | include/git2/strarray.h | 26 | ||||
| -rw-r--r-- | src/fileops.c | 6 | ||||
| -rw-r--r-- | src/util.c | 60 | ||||
| -rw-r--r-- | src/win32/findfile.c | 20 | ||||
| -rw-r--r-- | src/win32/findfile.h | 15 | ||||
| -rw-r--r-- | tests-clar/core/env.c | 106 |
6 files changed, 75 insertions, 158 deletions
diff --git a/include/git2/strarray.h b/include/git2/strarray.h index df34a5b88..d338eb7ad 100644 --- a/include/git2/strarray.h +++ b/include/git2/strarray.h @@ -52,32 +52,6 @@ GIT_EXTERN(void) git_strarray_free(git_strarray *array); */ GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src); -/** - * Initialize a string array from a list of strings - * - * Note: target is overwritten and hence should be empty, otherwise its - * contents are leaked. Call git_strarray_free() if necessary. - * - * @param tgt target - * @param count number of strings to follow - * @return 0 on success, <0 on allocation failure - */ -GIT_EXTERN(int) git_strarray_set(git_strarray *tgt, size_t count, ...); - -/** - * Insert a strarray into the beginning of another - * - * In this case, tgt is an existing (initialized) strarray and the result - * will be reallocated with all the strings in src inserted before all of - * the existing strings in tgt. Strings in src will be strdup'ed, so - * you should still `git_strarray_free()` src when you are done with it. - * - * @param tgt strarray to update - * @param src strarray to copy from - * @return 0 on success, <0 on allocation failure (tgt will be unchanged) - */ -GIT_EXTERN(int) git_strarray_prepend(git_strarray *tgt, const git_strarray *src); - /** @} */ GIT_END_DECL diff --git a/src/fileops.c b/src/fileops.c index 9700eed3c..fc9fca022 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -562,7 +562,7 @@ clean_up: static int git_futils_guess_system_dirs(git_buf *out) { #ifdef GIT_WIN32 - return win32_find_system_dirs(out); + return git_win32__find_system_dirs(out); #else return git_buf_sets(out, "/etc"); #endif @@ -571,7 +571,7 @@ static int git_futils_guess_system_dirs(git_buf *out) static int git_futils_guess_global_dirs(git_buf *out) { #ifdef GIT_WIN32 - return win32_find_global_dirs(out); + return git_win32__find_global_dirs(out); #else return git_buf_sets(out, getenv("HOME")); #endif @@ -580,7 +580,7 @@ static int git_futils_guess_global_dirs(git_buf *out) static int git_futils_guess_xdg_dirs(git_buf *out) { #ifdef GIT_WIN32 - return win32_find_xdg_dirs(out); + return git_win32__find_xdg_dirs(out); #else const char *env = NULL; diff --git a/src/util.c b/src/util.c index ba867b440..f5b4a1d68 100644 --- a/src/util.c +++ b/src/util.c @@ -112,78 +112,32 @@ void git_strarray_free(git_strarray *array) int git_strarray_copy(git_strarray *tgt, const git_strarray *src) { - assert(tgt && src); - - memset(tgt, 0, sizeof(*tgt)); - return git_strarray_prepend(tgt, src); -} - -int git_strarray_set(git_strarray *tgt, size_t count, ...) -{ size_t i; - va_list ap; - assert(tgt); + assert(tgt && src); memset(tgt, 0, sizeof(*tgt)); - if (!count) + if (!src->count) return 0; - tgt->strings = git__calloc(count, sizeof(char *)); + tgt->strings = git__calloc(src->count, sizeof(char *)); GITERR_CHECK_ALLOC(tgt->strings); - va_start(ap, count); - for (i = 0; i < count; ++i) { - const char *str = va_arg(ap, const char *); - if (!str) + for (i = 0; i < src->count; ++i) { + if (!src->strings[i]) continue; - tgt->strings[tgt->count] = git__strdup(str); + tgt->strings[tgt->count] = git__strdup(src->strings[i]); if (!tgt->strings[tgt->count]) { git_strarray_free(tgt); - va_end(ap); + memset(tgt, 0, sizeof(*tgt)); return -1; } tgt->count++; } - va_end(ap); - - return 0; -} - -int git_strarray_prepend(git_strarray *tgt, const git_strarray *src) -{ - size_t i; - git_strarray merge; - - if (!src || !src->count) - return 0; - - merge.count = 0; - merge.strings = git__calloc(tgt->count + src->count, sizeof(char *)); - GITERR_CHECK_ALLOC(merge.strings); - - for (i = 0; i < src->count; ++i) { - if (!src->strings[i]) - continue; - - merge.strings[merge.count] = git__strdup(src->strings[i]); - if (!merge.strings[merge.count]) { - git_strarray_free(&merge); - return -1; - } - - merge.count++; - } - - for (i = 0; i < tgt->count; ++i) - if (tgt->strings[i]) - merge.strings[merge.count++] = tgt->strings[i]; - git__free(tgt->strings); - memcpy(tgt, &merge, sizeof(merge)); return 0; } diff --git a/src/win32/findfile.c b/src/win32/findfile.c index 6cdea8541..bc36b6b45 100644 --- a/src/win32/findfile.c +++ b/src/win32/findfile.c @@ -17,7 +17,7 @@ #define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1" #endif -int win32_expand_path(struct win32_path *s_root, const wchar_t *templ) +int git_win32__expand_path(struct git_win32__path *s_root, const wchar_t *templ) { s_root->len = ExpandEnvironmentStringsW(templ, s_root->path, MAX_PATH); return s_root->len ? 0 : -1; @@ -33,8 +33,8 @@ static int win32_path_utf16_to_8(git_buf *path_utf8, const wchar_t *path_utf16) return git_buf_sets(path_utf8, temp_utf8); } -int win32_find_file( - git_buf *path, const struct win32_path *root, const char *filename) +int git_win32__find_file( + git_buf *path, const struct git_win32__path *root, const char *filename) { size_t len, alloc_len; wchar_t *file_utf16 = NULL; @@ -89,7 +89,7 @@ static wchar_t* win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen) static int win32_find_git_in_path(git_buf *buf, const wchar_t *gitexe) { wchar_t *env = _wgetenv(L"PATH"), lastch; - struct win32_path root; + struct git_win32__path root; size_t gitexe_len = wcslen(gitexe); if (!env) @@ -126,7 +126,7 @@ static int win32_find_git_in_registry( { HKEY hKey; DWORD dwType = REG_SZ; - struct win32_path path16; + struct git_win32__path path16; assert(buf); @@ -158,13 +158,13 @@ static int win32_find_git_in_registry( static int win32_find_existing_dirs( git_buf *out, const wchar_t *tmpl[], char *temp[]) { - struct win32_path path16; + struct git_win32__path path16; git_buf buf = GIT_BUF_INIT; git_buf_clear(out); for (; *tmpl != NULL; tmpl++) { - if (!win32_expand_path(&path16, *tmpl) && + if (!git_win32__expand_path(&path16, *tmpl) && path16.path[0] != L'%' && !_waccess(path16.path, F_OK)) { @@ -180,7 +180,7 @@ static int win32_find_existing_dirs( return (git_buf_oom(out) ? -1 : 0); } -int win32_find_system_dirs(git_buf *out) +int git_win32__find_system_dirs(git_buf *out) { git_buf buf = GIT_BUF_INIT; @@ -207,7 +207,7 @@ int win32_find_system_dirs(git_buf *out) return (git_buf_oom(out) ? -1 : 0); } -int win32_find_global_dirs(git_buf *out) +int git_win32__find_global_dirs(git_buf *out) { char *temp[3]; static const wchar_t *global_tmpls[4] = { @@ -220,7 +220,7 @@ int win32_find_global_dirs(git_buf *out) return win32_find_existing_dirs(out, global_tmpls, temp); } -int win32_find_xdg_dirs(git_buf *out) +int git_win32__find_xdg_dirs(git_buf *out) { char *temp[6]; static const wchar_t *global_tmpls[7] = { diff --git a/src/win32/findfile.h b/src/win32/findfile.h index 300bd168d..fc79e1b72 100644 --- a/src/win32/findfile.h +++ b/src/win32/findfile.h @@ -8,19 +8,20 @@ #ifndef INCLUDE_git_findfile_h__ #define INCLUDE_git_findfile_h__ -struct win32_path { +struct git_win32__path { wchar_t path[MAX_PATH]; DWORD len; }; -extern int win32_expand_path(struct win32_path *s_root, const wchar_t *templ); +extern int git_win32__expand_path( + struct git_win32__path *s_root, const wchar_t *templ); -extern int win32_find_file( - git_buf *path, const struct win32_path *root, const char *filename); +extern int git_win32__find_file( + git_buf *path, const struct git_win32__path *root, const char *filename); -extern int win32_find_system_dirs(git_buf *out); -extern int win32_find_global_dirs(git_buf *out); -extern int win32_find_xdg_dirs(git_buf *out); +extern int git_win32__find_system_dirs(git_buf *out); +extern int git_win32__find_global_dirs(git_buf *out); +extern int git_win32__find_xdg_dirs(git_buf *out); #endif diff --git a/tests-clar/core/env.c b/tests-clar/core/env.c index d684f4ca0..0fa6472d7 100644 --- a/tests-clar/core/env.c +++ b/tests-clar/core/env.c @@ -32,7 +32,7 @@ void test_core_env__initialize(void) for (i = 0; i < NUM_VARS; ++i) { const char *original = cl_getenv(env_vars[i]); #ifdef GIT_WIN32 - env_save[i] = original; + env_save[i] = (char *)original; #else env_save[i] = original ? git__strdup(original) : NULL; #endif @@ -81,7 +81,9 @@ static void setenv_and_check(const char *name, const char *value) check = cl_getenv(name); cl_assert_equal_s(value, check); +#ifdef GIT_WIN32 git__free(check); +#endif } void test_core_env__0(void) @@ -212,6 +214,43 @@ void test_core_env__1(void) git_buf_free(&path); } +static void check_global_searchpath( + const char *path, int position, const char *file, git_buf *temp) +{ + char out[GIT_PATH_MAX]; + + /* build and set new path */ + if (position < 0) + cl_git_pass(git_buf_join(temp, GIT_PATH_LIST_SEPARATOR, path, "$PATH")); + else if (position > 0) + cl_git_pass(git_buf_join(temp, GIT_PATH_LIST_SEPARATOR, "$PATH", path)); + else + cl_git_pass(git_buf_sets(temp, path)); + + cl_git_pass(git_libgit2_opts( + GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, temp->ptr)); + + /* get path and make sure $PATH expansion worked */ + cl_git_pass(git_libgit2_opts( + GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, out, sizeof(out))); + + if (position < 0) + cl_assert(git__prefixcmp(out, path) == 0); + else if (position > 0) + cl_assert(git__suffixcmp(out, path) == 0); + else + cl_assert_equal_s(out, path); + + /* find file using new path */ + cl_git_pass(git_futils_find_global_file(temp, file)); + + /* reset path and confirm file not found */ + cl_git_pass(git_libgit2_opts( + GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, NULL)); + cl_assert_equal_i( + GIT_ENOTFOUND, git_futils_find_global_file(temp, file)); +} + void test_core_env__2(void) { git_buf path = GIT_BUF_INIT, found = GIT_BUF_INIT; @@ -219,7 +258,6 @@ void test_core_env__2(void) char **val; const char *testname = "alternate"; size_t testlen = strlen(testname); - char out[GIT_PATH_MAX]; strncpy(testfile, testname, sizeof(testfile)); cl_assert_equal_s(testname, testfile); @@ -237,9 +275,8 @@ void test_core_env__2(void) cl_git_pass(git_path_prettify(&path, *val, NULL)); - /* vary testfile name in each directory so accidentally leaving - * an environment variable set from a previous iteration won't - * accidentally make this test pass... + /* vary testfile name so any sloppiness is resetting variables or + * deleting files won't accidentally make a test pass. */ testfile[testlen] = tidx++; cl_git_pass(git_buf_joinpath(&path, path.ptr, testfile)); @@ -250,63 +287,14 @@ void test_core_env__2(void) cl_assert_equal_i( GIT_ENOTFOUND, git_futils_find_global_file(&found, testfile)); - /* set search path */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, out, sizeof(out))); - cl_assert_equal_s(out, path.ptr); - - cl_git_pass(git_futils_find_global_file(&found, testfile)); - - /* reset */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, NULL)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_futils_find_global_file(&found, testfile)); - - /* try prepend behavior */ - cl_git_pass(git_buf_putc(&path, GIT_PATH_LIST_SEPARATOR)); - cl_git_pass(git_buf_puts(&path, "$PATH")); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, path.ptr)); - - git_buf_rtruncate_at_char(&path, GIT_PATH_LIST_SEPARATOR); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, out, sizeof(out))); - cl_assert(git__prefixcmp(out, path.ptr) == 0); - - cl_git_pass(git_futils_find_global_file(&found, testfile)); - - /* reset */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, NULL)); - cl_assert_equal_i( - GIT_ENOTFOUND, git_futils_find_global_file(&found, testfile)); - - /* try append behavior */ - cl_git_pass(git_buf_join( - &found, GIT_PATH_LIST_SEPARATOR, "$PATH", path.ptr)); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, found.ptr)); - - cl_git_pass(git_libgit2_opts( - GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, out, sizeof(out))); - cl_assert(git__suffixcmp(out, path.ptr) == 0); - - cl_git_pass(git_futils_find_global_file(&found, testfile)); - - /* reset */ - cl_git_pass(git_libgit2_opts( - GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, NULL)); + /* try plain, append $PATH, and prepend $PATH */ + check_global_searchpath(path.ptr, 0, testfile, &found); + check_global_searchpath(path.ptr, -1, testfile, &found); + check_global_searchpath(path.ptr, 1, testfile, &found); + /* cleanup */ cl_git_pass(git_buf_joinpath(&path, path.ptr, testfile)); (void)p_unlink(path.ptr); - (void)p_rmdir(*val); } |
