]> git.proxmox.com Git - libgit2.git/commitdiff
Make sure we use the `C` locale for `regcomp` on macOS.
authorArthur Schreiber <arthurschreiber@github.com>
Thu, 6 Oct 2016 11:15:31 +0000 (13:15 +0200)
committerArthur Schreiber <arthurschreiber@github.com>
Thu, 6 Oct 2016 11:15:31 +0000 (13:15 +0200)
CMakeLists.txt
src/config.c
src/config_file.c
src/diff_driver.c
src/revparse.c
src/unix/posix.h
src/win32/posix.h
tests/core/posix.c

index 635842f253b3a6a27fdf0bbfe38abdd5f6e92c7c..ed106e405e67c2c646240a807b773d1ccc3dc118 100644 (file)
@@ -20,6 +20,7 @@ SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Mo
 
 INCLUDE(CheckLibraryExists)
 INCLUDE(CheckFunctionExists)
+INCLUDE(CheckSymbolExists)
 INCLUDE(CheckStructHasMember)
 INCLUDE(AddCFlagIfSupported)
 INCLUDE(FindPkgConfig)
@@ -507,6 +508,11 @@ ELSE ()
        ENDIF ()
 ENDIF()
 
+CHECK_SYMBOL_EXISTS(regcomp_l "xlocale.h" HAVE_REGCOMP_L)
+IF (HAVE_REGCOMP_L)
+       ADD_DEFINITIONS(-DHAVE_REGCOMP_L)
+ENDIF ()
+
 CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
 IF (HAVE_FUTIMENS)
        ADD_DEFINITIONS(-DHAVE_FUTIMENS)
index f4d4cb2b9b1e8acdb7e0d3a48f551983337fb27b..403b7090d5b0252aa1bc6d381e5839f5b8bb212d 100644 (file)
@@ -478,7 +478,7 @@ int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cf
        iter = git__calloc(1, sizeof(all_iter));
        GITERR_CHECK_ALLOC(iter);
 
-       if ((result = regcomp(&iter->regex, regexp, REG_EXTENDED)) != 0) {
+       if ((result = p_regcomp(&iter->regex, regexp, REG_EXTENDED)) != 0) {
                giterr_set_regex(&iter->regex, result);
                git__free(iter);
                return -1;
@@ -512,7 +512,7 @@ int git_config_backend_foreach_match(
        int error = 0;
 
        if (regexp != NULL) {
-               if ((error = regcomp(&regex, regexp, REG_EXTENDED)) != 0) {
+               if ((error = p_regcomp(&regex, regexp, REG_EXTENDED)) != 0) {
                        giterr_set_regex(&regex, error);
                        regfree(&regex);
                        return -1;
@@ -1003,7 +1003,7 @@ int git_config_multivar_iterator_new(git_config_iterator **out, const git_config
                goto on_error;
 
        if (regexp != NULL) {
-               error = regcomp(&iter->regex, regexp, REG_EXTENDED);
+               error = p_regcomp(&iter->regex, regexp, REG_EXTENDED);
                if (error != 0) {
                        giterr_set_regex(&iter->regex, error);
                        error = -1;
index e33b8373879f0767a8ad095b236389efa6e6cc96..9ff021e7e0a5d55c3f4a53bfe7bbf269b6234063 100644 (file)
@@ -570,7 +570,7 @@ static int config_set_multivar(
        if ((result = git_config__normalize_name(name, &key)) < 0)
                return result;
 
-       result = regcomp(&preg, regexp, REG_EXTENDED);
+       result = p_regcomp(&preg, regexp, REG_EXTENDED);
        if (result != 0) {
                giterr_set_regex(&preg, result);
                result = -1;
@@ -657,7 +657,7 @@ static int config_delete_multivar(git_config_backend *cfg, const char *name, con
 
        refcounted_strmap_free(map);
 
-       result = regcomp(&preg, regexp, REG_EXTENDED);
+       result = p_regcomp(&preg, regexp, REG_EXTENDED);
        if (result != 0) {
                giterr_set_regex(&preg, result);
                result = -1;
@@ -1957,4 +1957,3 @@ done:
        git_buf_free(&reader->buffer);
        return result;
 }
-
index 14a898c4f53c3e78558c7c1d32f9dfe66acada6a..1a7f09a44432f7b5b980d7a029a5b69247d73d00 100644 (file)
@@ -114,7 +114,7 @@ static int diff_driver_add_patterns(
                if (error < 0)
                        break;
 
-               if ((error = regcomp(&pat->re, buf.ptr, regex_flags)) != 0) {
+               if ((error = p_regcomp(&pat->re, buf.ptr, regex_flags)) != 0) {
                        /*
                         * TODO: issue a warning
                         */
@@ -210,7 +210,7 @@ static int git_diff_driver_builtin(
                goto done;
 
        if (ddef->words &&
-               (error = regcomp(
+               (error = p_regcomp(
                        &drv->word_pattern, ddef->words, ddef->flags | REG_EXTENDED)))
        {
                error = giterr_set_regex(&drv->word_pattern, error);
@@ -314,7 +314,7 @@ static int git_diff_driver_load(
                goto done;
        if (!ce || !ce->value)
                /* no diff.<driver>.wordregex, so just continue */;
-       else if (!(error = regcomp(&drv->word_pattern, ce->value, REG_EXTENDED)))
+       else if (!(error = p_regcomp(&drv->word_pattern, ce->value, REG_EXTENDED)))
                found_driver = true;
        else {
                /* TODO: warn about bad regex instead of failure */
@@ -519,4 +519,3 @@ void git_diff_find_context_clear(git_diff_find_context_payload *payload)
                payload->driver = NULL;
        }
 }
-
index e0ec3941d4b1873d525bc595aedd9db4139128f7..aa7e0bd98ec176e62bd4af2f5063fe1b676f3678 100644 (file)
@@ -50,7 +50,7 @@ static int build_regex(regex_t *regex, const char *pattern)
                return GIT_EINVALIDSPEC;
        }
 
-       error = regcomp(regex, pattern, REG_EXTENDED);
+       error = p_regcomp(regex, pattern, REG_EXTENDED);
        if (!error)
                return 0;
 
index 482d2c8032af4d4dc49d6a667a08e6d979ec4f9b..ad13291e833a244757e37c4d5f42d27f39ea4a87 100644 (file)
@@ -80,4 +80,14 @@ GIT_INLINE(int) p_futimes(int f, const struct p_timeval t[2])
 # define p_futimes futimes
 #endif
 
+#ifdef HAVE_REGCOMP_L
+#include <xlocale.h>
+GIT_INLINE(int) p_regcomp(regex_t *preg, const char *pattern, int cflags)
+{
+       return regcomp_l(preg, pattern, cflags, (locale_t) 0);
+}
+#else
+# define p_regcomp regcomp
+#endif
+
 #endif
index 5fab267c2e67595b46e645e34c101811b0231f5f..73705fb2b3e136b6208fbf0c9e814cadf6c81f1d 100644 (file)
@@ -57,4 +57,7 @@ extern int p_lstat_posixly(const char *filename, struct stat *buf);
 extern struct tm * p_localtime_r(const time_t *timer, struct tm *result);
 extern struct tm * p_gmtime_r(const time_t *timer, struct tm *result);
 
+/* Use the bundled regcomp */
+#define p_regcomp regcomp
+
 #endif
index 34a67bf47b533f92ceeeb3a3e6f440360e2ccfe4..4e177b1f995fca8213e39e57447cf44f8c846524 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "clar_libgit2.h"
 #include "posix.h"
+#include "userdiff.h"
 
 void test_core_posix__initialize(void)
 {
@@ -39,7 +40,7 @@ void test_core_posix__inet_pton(void)
        struct in_addr addr;
        struct in6_addr addr6;
        size_t i;
-       
+
        struct in_addr_data {
                const char *p;
                const uint8_t n[4];
@@ -146,3 +147,27 @@ void test_core_posix__utimes(void)
 
        p_unlink("foo");
 }
+
+void test_core_posix__p_regcomp_compile_single_byte_regexps(void)
+{
+       regex_t preg;
+
+       cl_must_pass(p_regcomp(&preg, "[\xc0-\xff][\x80-\xbf]", REG_EXTENDED));
+
+       regfree(&preg);
+}
+
+void test_core_posix__p_regcomp_compile_userdiff_regexps(void)
+{
+       regex_t preg;
+       size_t idx;
+
+       for (idx = 0; idx < ARRAY_SIZE(builtin_defs); ++idx) {
+               git_diff_driver_definition ddef = builtin_defs[idx];
+
+               cl_must_pass(p_regcomp(&preg, ddef.fns, REG_EXTENDED | ddef.flags));
+               cl_must_pass(p_regcomp(&preg, ddef.words, REG_EXTENDED));
+       }
+
+       regfree(&preg);
+}