mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 12:24:11 +00:00
iconv: Do not fake an API when iconv is not available
This commit is contained in:
parent
95352b7058
commit
0bfa732342
30
src/path.c
30
src/path.c
@ -834,7 +834,12 @@ int git_path_direach(
|
||||
DIR *dir;
|
||||
path_dirent_data de_data;
|
||||
struct dirent *de, *de_buf = (struct dirent *)&de_data;
|
||||
|
||||
(void)flags;
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
|
||||
#endif
|
||||
|
||||
if (git_path_to_dir(path) < 0)
|
||||
return -1;
|
||||
@ -846,8 +851,10 @@ int git_path_direach(
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0)
|
||||
(void)git_path_iconv_init_precompose(&ic);
|
||||
#endif
|
||||
|
||||
while (p_readdir_r(dir, de_buf, &de) == 0 && de != NULL) {
|
||||
char *de_path = de->d_name;
|
||||
@ -856,8 +863,12 @@ int git_path_direach(
|
||||
if (git_path_is_dot_or_dotdot(de_path))
|
||||
continue;
|
||||
|
||||
if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0 ||
|
||||
(error = git_buf_put(path, de_path, de_len)) < 0)
|
||||
#ifdef GIT_USE_ICONV
|
||||
if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0)
|
||||
break;
|
||||
#endif
|
||||
|
||||
if ((error = git_buf_put(path, de_path, de_len)) < 0)
|
||||
break;
|
||||
|
||||
error = fn(arg, path);
|
||||
@ -871,7 +882,10 @@ int git_path_direach(
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_clear(&ic);
|
||||
#endif
|
||||
|
||||
return error;
|
||||
}
|
||||
@ -888,7 +902,12 @@ int git_path_dirload(
|
||||
size_t path_len;
|
||||
path_dirent_data de_data;
|
||||
struct dirent *de, *de_buf = (struct dirent *)&de_data;
|
||||
|
||||
(void)flags;
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
|
||||
#endif
|
||||
|
||||
assert(path && contents);
|
||||
|
||||
@ -903,8 +922,10 @@ int git_path_dirload(
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0)
|
||||
(void)git_path_iconv_init_precompose(&ic);
|
||||
#endif
|
||||
|
||||
path += prefix_len;
|
||||
path_len -= prefix_len;
|
||||
@ -917,8 +938,10 @@ int git_path_dirload(
|
||||
if (git_path_is_dot_or_dotdot(de_path))
|
||||
continue;
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0)
|
||||
break;
|
||||
#endif
|
||||
|
||||
alloc_size = path_len + need_slash + de_len + 1 + alloc_extra;
|
||||
if ((entry_path = git__calloc(alloc_size, 1)) == NULL) {
|
||||
@ -937,7 +960,10 @@ int git_path_dirload(
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_clear(&ic);
|
||||
#endif
|
||||
|
||||
if (error != 0)
|
||||
giterr_set(GITERR_OS, "Failed to process directory entry in '%s'", path);
|
||||
|
10
src/path.h
10
src/path.h
@ -425,16 +425,6 @@ extern void git_path_iconv_clear(git_path_iconv_t *ic);
|
||||
*/
|
||||
extern int git_path_iconv(git_path_iconv_t *ic, char **in, size_t *inlen);
|
||||
|
||||
#else
|
||||
|
||||
typedef struct {
|
||||
int unused;
|
||||
} git_path_iconv_t;
|
||||
#define GIT_PATH_ICONV_INIT { 0 }
|
||||
#define git_path_iconv_init_precompose(X) 0
|
||||
#define git_path_iconv_clear(X) (void)(X)
|
||||
#define git_path_iconv(X,Y,Z) 0
|
||||
|
||||
#endif /* GIT_USE_ICONV */
|
||||
|
||||
#endif
|
||||
|
@ -737,7 +737,10 @@ int git_reference__normalize_name(
|
||||
int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC;
|
||||
unsigned int process_flags;
|
||||
bool normalize = (buf != NULL);
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
|
||||
#endif
|
||||
|
||||
assert(name);
|
||||
|
||||
@ -750,6 +753,7 @@ int git_reference__normalize_name(
|
||||
if (normalize)
|
||||
git_buf_clear(buf);
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
if ((flags & GIT_REF_FORMAT__PRECOMPOSE_UNICODE) != 0) {
|
||||
size_t namelen = strlen(current);
|
||||
if ((error = git_path_iconv_init_precompose(&ic)) < 0 ||
|
||||
@ -757,6 +761,7 @@ int git_reference__normalize_name(
|
||||
goto cleanup;
|
||||
error = GIT_EINVALIDSPEC;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (true) {
|
||||
segment_len = ensure_segment_validity(current);
|
||||
@ -834,7 +839,9 @@ cleanup:
|
||||
if (error && normalize)
|
||||
git_buf_free(buf);
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_clear(&ic);
|
||||
#endif
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -1,22 +1,29 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "path.h"
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
static git_path_iconv_t ic;
|
||||
static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D";
|
||||
static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D";
|
||||
#endif
|
||||
|
||||
void test_core_iconv__initialize(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
cl_git_pass(git_path_iconv_init_precompose(&ic));
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_core_iconv__cleanup(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
git_path_iconv_clear(&ic);
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_core_iconv__unchanged(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
char *data = "Ascii data", *original = data;
|
||||
size_t datalen = strlen(data);
|
||||
|
||||
@ -25,10 +32,12 @@ void test_core_iconv__unchanged(void)
|
||||
|
||||
/* There are no high bits set, so this should leave data untouched */
|
||||
cl_assert(data == original);
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_core_iconv__decomposed_to_precomposed(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
char *data = nfd;
|
||||
size_t datalen = strlen(nfd);
|
||||
|
||||
@ -38,15 +47,13 @@ void test_core_iconv__decomposed_to_precomposed(void)
|
||||
/* The decomposed nfd string should be transformed to the nfc form
|
||||
* (on platforms where iconv is enabled, of course).
|
||||
*/
|
||||
#ifdef GIT_USE_ICONV
|
||||
cl_assert_equal_s(nfc, data);
|
||||
#else
|
||||
cl_assert_equal_s(nfd, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_core_iconv__precomposed_is_unmodified(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
char *data = nfc;
|
||||
size_t datalen = strlen(nfc);
|
||||
|
||||
@ -57,4 +64,5 @@ void test_core_iconv__precomposed_is_unmodified(void)
|
||||
* the high-bit set, the iconv transform should result in no change.
|
||||
*/
|
||||
cl_assert_equal_s(nfc, data);
|
||||
#endif
|
||||
}
|
||||
|
@ -232,6 +232,7 @@ void test_repo_init__detect_ignorecase(void)
|
||||
|
||||
void test_repo_init__detect_precompose_unicode_required(void)
|
||||
{
|
||||
#ifdef GIT_USE_ICONV
|
||||
char *composed = "ḱṷṓn", *decomposed = "ḱṷṓn";
|
||||
struct stat st;
|
||||
bool found_with_nfd;
|
||||
@ -240,7 +241,6 @@ void test_repo_init__detect_precompose_unicode_required(void)
|
||||
found_with_nfd = (p_stat(decomposed, &st) == 0);
|
||||
cl_must_pass(p_unlink(composed));
|
||||
|
||||
#ifdef GIT_USE_ICONV
|
||||
assert_config_entry_on_init("core.precomposeunicode", found_with_nfd);
|
||||
#else
|
||||
assert_config_entry_on_init("core.precomposeunicode", GIT_ENOTFOUND);
|
||||
|
Loading…
Reference in New Issue
Block a user