Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c Fri Jan 14 14:01:45 2022 @@ -922,7 +922,7 @@ readline_apr_lf(apr_file_t *file, } /* Otherwise, prepare to read the next chunk. */ - svn_stringbuf_ensure(buf, buf->blocksize + SVN__LINE_CHUNK_SIZE); + svn_stringbuf_ensure(buf, buf->len + SVN__LINE_CHUNK_SIZE); } } @@ -982,7 +982,7 @@ readline_apr_generic(apr_file_t *file, } /* Prepare to read the next chunk. */ - svn_stringbuf_ensure(buf, buf->blocksize + SVN__LINE_CHUNK_SIZE); + svn_stringbuf_ensure(buf, buf->len + SVN__LINE_CHUNK_SIZE); } } @@ -2172,6 +2172,9 @@ struct install_baton_t { struct baton_apr baton_apr; const char *tmp_path; + svn_boolean_t set_read_only; + svn_boolean_t set_executable; + apr_time_t set_mtime; }; #ifdef WIN32 @@ -2313,6 +2316,9 @@ svn_stream__create_for_install(svn_strea (*install_stream)->baton = ib; ib->tmp_path = tmp_path; + ib->set_read_only = FALSE; + ib->set_executable = FALSE; + ib->set_mtime = -1; /* Don't close the file on stream close; flush instead */ svn_stream_set_close(*install_stream, install_close); @@ -2320,6 +2326,178 @@ svn_stream__create_for_install(svn_strea return SVN_NO_ERROR; } +void +svn_stream__install_set_read_only(svn_stream_t *install_stream, + svn_boolean_t read_only) +{ + struct install_baton_t *ib = install_stream->baton; + + ib->set_read_only = read_only; +} + +void +svn_stream__install_set_executable(svn_stream_t *install_stream, + svn_boolean_t executable) +{ + struct install_baton_t *ib = install_stream->baton; + + ib->set_executable = executable; +} + +void +svn_stream__install_set_affected_time(svn_stream_t *install_stream, + apr_time_t mtime) +{ + struct install_baton_t *ib = install_stream->baton; + + ib->set_mtime = mtime; +} + +/* Helper function that closes the underlying file of the install stream + and update the state in the baton. */ +static svn_error_t * +install_stream_close_file(struct install_baton_t *ib, + apr_pool_t *scratch_pool) +{ + if (ib->baton_apr.file) + { + SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool)); + ib->baton_apr.file = NULL; + } + + return SVN_NO_ERROR; +} + +svn_error_t * +svn_stream__install_finalize(apr_time_t *mtime_p, + apr_off_t *size_p, + svn_stream_t *install_stream, + apr_pool_t *scratch_pool) +{ + struct install_baton_t *ib = install_stream->baton; + svn_boolean_t finalized = FALSE; + apr_finfo_t finfo; + apr_int32_t wanted; + +#ifdef WIN32 + /* If the caller asked us for the timestamp with a non-null MTIME_P, + ensure that subsequent I/O operations won't change it; see below. + */ + if (ib->set_mtime >= 0 || ib->set_read_only || mtime_p) + { + apr_time_t set_mtime; + svn_error_t *err; + + /* On Windows, the file systems may defer processing of timestamps until + the file handle is closed, as specified in [1]. Since we peek and + return the current timestamp, we MUST ensure that the timestamp does + not change after the call to finalize(). + + Luckily, there are two options that guarantee that the file will keep + its current timestamp after close. We can either explicitly set a new + timestamp, or use a special option that instructs the file system to + suspend updates for timestamp values for all subsequent I/O operations. + Both of these options guarantee [2, 3] that no other operation will + change the final timestamp. So we use both of them, depending on + whether the caller wants us to set a specific timestamp, or not. + + [1: MS-FSA, 2.1.4.17, Note <42>] + File systems may choose to defer processing for a file that has been + modified to a later time, favoring performance over accuracy. The NTFS + file system on versions prior to Windows 10 v1809 operating system, + Windows Server v1809 operating system, and Windows Server 2019, and + non-NTFS file systems on all versions of Windows, defer this processing + until the Open gets closed. + https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/4e3695bd-7574-4f24-a223-b4679c065b63#Appendix_A_42 + + [2: MS-FSA 2.1.5.14.2] + If InputBuffer.LastWriteTime != 0: + If InputBuffer.LastWriteTime != -2: + The object store MUST set Open.UserSetModificationTime to TRUE. + https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/a36513b4-73c8-4888-ad29-8f3a196567e8 + + [3: MS-FSA 2.1.4.17] + If Open.UserSetModificationTime is FALSE, set Open.File.LastModificationTime + to the current system time. + https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/75cdaba1-4401-4c53-b09c-69ba6cd50ce6 + */ + if (ib->set_mtime >= 0) + set_mtime = ib->set_mtime; + else + set_mtime = SVN_IO__WIN_TIME_SUSPEND_UPDATE; + + err = svn_io__win_set_file_basic_info(ib->baton_apr.file, ib->tmp_path, + set_mtime, ib->set_read_only, + scratch_pool); + + if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE) + { + /* Setting information by handle is not supported on this platform: + fallback to setting it by path. */ + svn_error_clear(err); + } + else if (err) + { + return svn_error_trace(err); + } + else + { + finalized = TRUE; + } + } + else + { + finalized = TRUE; + } +#endif + + if (!finalized) + { + SVN_ERR(install_stream_close_file(ib, scratch_pool)); + + if (ib->set_read_only) + SVN_ERR(svn_io_set_file_read_only(ib->tmp_path, FALSE, + scratch_pool)); + if (ib->set_executable) + SVN_ERR(svn_io_set_file_executable(ib->tmp_path, TRUE, FALSE, + scratch_pool)); + if (ib->set_mtime >= 0) + SVN_ERR(svn_io_set_file_affected_time(ib->set_mtime, ib->tmp_path, + scratch_pool)); + + finalized = TRUE; + } + + wanted = 0; + if (mtime_p) + wanted |= APR_FINFO_MTIME; + if (size_p) + wanted |= APR_FINFO_SIZE; + + /* Note that we always fetch the values such as MTIME_P from the filesystem, + because it might have a lower timestamp granularity than apr_time_t. + */ + if (wanted) + { + apr_status_t status; + + if (ib->baton_apr.file) + status = apr_file_info_get(&finfo, wanted, ib->baton_apr.file); + else + status = apr_stat(&finfo, ib->tmp_path, wanted, scratch_pool); + + if (status) + return svn_error_wrap_apr(status, NULL); + } + + if (mtime_p) + *mtime_p = finfo.mtime; + if (size_p) + *size_p = finfo.size; + + return SVN_NO_ERROR; +} + svn_error_t * svn_stream__install_stream(svn_stream_t *install_stream, const char *final_abspath, @@ -2330,47 +2508,49 @@ svn_stream__install_stream(svn_stream_t svn_error_t *err; SVN_ERR_ASSERT(svn_dirent_is_absolute(final_abspath)); -#ifdef WIN32 - err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path, - final_abspath, scratch_pool); - if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err)) - { - svn_error_t *err2; - - err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath, - scratch_pool), - scratch_pool); - - if (err2) - return svn_error_trace(svn_error_compose_create(err, err2)); - else - svn_error_clear(err); + if (ib->baton_apr.file) + { +#ifdef WIN32 err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path, final_abspath, scratch_pool); - } + if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err)) + { + svn_error_t *err2; - /* ### rhuijben: I wouldn't be surprised if we later find out that we - have to fall back to close+rename on some specific - error values here, to support some non standard NAS - and filesystem scenarios. */ - if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE) - { - /* Rename open files is not supported on this platform: fallback to - svn_io_file_rename2(). */ - svn_error_clear(err); - err = SVN_NO_ERROR; - } - else - { - return svn_error_compose_create(err, - svn_io_file_close(ib->baton_apr.file, - scratch_pool)); - } + err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath, + scratch_pool), + scratch_pool); + + if (err2) + return svn_error_trace(svn_error_compose_create(err, err2)); + else + svn_error_clear(err); + + err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path, + final_abspath, scratch_pool); + } + + /* ### rhuijben: I wouldn't be surprised if we later find out that we + have to fall back to close+rename on some specific + error values here, to support some non standard NAS + and filesystem scenarios. */ + if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE) + { + /* Rename open files is not supported on this platform: fallback to + svn_io_file_rename2(). */ + svn_error_clear(err); + err = SVN_NO_ERROR; + } + else + { + return svn_error_compose_create( + err, install_stream_close_file(ib, scratch_pool)); + } #endif - /* Close temporary file. */ - SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool)); + SVN_ERR(install_stream_close_file(ib, scratch_pool)); + } err = svn_io_file_rename2(ib->tmp_path, final_abspath, FALSE, scratch_pool); @@ -2399,47 +2579,33 @@ svn_stream__install_stream(svn_stream_t } svn_error_t * -svn_stream__install_get_info(apr_finfo_t *finfo, - svn_stream_t *install_stream, - apr_int32_t wanted, - apr_pool_t *scratch_pool) -{ - struct install_baton_t *ib = install_stream->baton; - apr_status_t status; - - status = apr_file_info_get(finfo, wanted, ib->baton_apr.file); - - if (status) - return svn_error_wrap_apr(status, NULL); - - return SVN_NO_ERROR; -} - -svn_error_t * svn_stream__install_delete(svn_stream_t *install_stream, apr_pool_t *scratch_pool) { struct install_baton_t *ib = install_stream->baton; + if (ib->baton_apr.file) + { #ifdef WIN32 - svn_error_t *err; + svn_error_t *err; - /* Mark the file as delete on close to avoid having to reopen - the file as part of the delete handling. */ - err = svn_io__win_delete_file_on_close(ib->baton_apr.file, ib->tmp_path, - scratch_pool); - if (err == SVN_NO_ERROR) - { - SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool)); - return SVN_NO_ERROR; /* File is already gone */ - } + /* Mark the file as delete on close to avoid having to reopen + the file as part of the delete handling. */ + err = svn_io__win_delete_file_on_close(ib->baton_apr.file, ib->tmp_path, + scratch_pool); + if (err == SVN_NO_ERROR) + { + SVN_ERR(install_stream_close_file(ib, scratch_pool)); + return SVN_NO_ERROR; /* File is already gone */ + } - /* Deleting file on close may be unsupported, so ignore errors and - fallback to svn_io_remove_file2(). */ - svn_error_clear(err); + /* Deleting file on close may be unsupported, so ignore errors and + fallback to svn_io_remove_file2(). */ + svn_error_clear(err); #endif - SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool)); + SVN_ERR(install_stream_close_file(ib, scratch_pool)); + } return svn_error_trace(svn_io_remove_file2(ib->tmp_path, FALSE, scratch_pool));
Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c Fri Jan 14 14:01:45 2022 @@ -65,7 +65,7 @@ membuf_create(void **data, apr_size_t *s * this function does nothing. * * If *SIZE is 0, the allocated buffer size will be MINIMUM_SIZE - * rounded up to the nearest APR alignment boundary. Otherwse, *SIZE + * rounded up to the nearest APR alignment boundary. Otherwise, *SIZE * will be multiplied by a power of two such that the result is * greater or equal to MINIMUM_SIZE. The pointer to the new buffer * will be returned in *DATA, and its size in *SIZE. Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c Fri Jan 14 14:01:45 2022 @@ -111,7 +111,8 @@ svn_subst_translation_required(svn_subst svn_boolean_t special, svn_boolean_t force_eol_check) { - return (special || keywords + return (special + || (keywords && apr_hash_count(keywords) > 0) || (style != svn_subst_eol_style_none && force_eol_check) || (style == svn_subst_eol_style_native && strcmp(APR_EOL_STR, SVN_SUBST_NATIVE_EOL_STR) != 0) @@ -1483,10 +1484,6 @@ stream_translated(svn_stream_t *stream, svn_boolean_t expand, apr_pool_t *result_pool) { - struct translated_stream_baton *baton - = apr_palloc(result_pool, sizeof(*baton)); - svn_stream_t *s = svn_stream_create(baton, result_pool); - /* Make sure EOL_STR and KEYWORDS are allocated in RESULT_POOL so they have the same lifetime as the stream. */ if (eol_str) @@ -1519,32 +1516,44 @@ stream_translated(svn_stream_t *stream, } } - /* Setup the baton fields */ - baton->stream = stream; - baton->in_baton - = create_translation_baton(eol_str, translated_eol, repair, keywords, - expand, result_pool); - baton->out_baton - = create_translation_baton(eol_str, translated_eol, repair, keywords, - expand, result_pool); - baton->written = FALSE; - baton->readbuf = svn_stringbuf_create_empty(result_pool); - baton->readbuf_off = 0; - baton->iterpool = svn_pool_create(result_pool); - baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE); - - /* Setup the stream methods */ - svn_stream_set_read2(s, NULL /* only full read support */, - translated_stream_read); - svn_stream_set_write(s, translated_stream_write); - svn_stream_set_close(s, translated_stream_close); - if (svn_stream_supports_mark(stream)) + if (eol_str || keywords) { - svn_stream_set_mark(s, translated_stream_mark); - svn_stream_set_seek(s, translated_stream_seek); - } + struct translated_stream_baton *baton + = apr_palloc(result_pool, sizeof(*baton)); + svn_stream_t *s = svn_stream_create(baton, result_pool); + + /* Setup the baton fields */ + baton->stream = stream; + baton->in_baton + = create_translation_baton(eol_str, translated_eol, repair, keywords, + expand, result_pool); + baton->out_baton + = create_translation_baton(eol_str, translated_eol, repair, keywords, + expand, result_pool); + baton->written = FALSE; + baton->readbuf = svn_stringbuf_create_empty(result_pool); + baton->readbuf_off = 0; + baton->iterpool = svn_pool_create(result_pool); + baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE); + + /* Setup the stream methods */ + svn_stream_set_read2(s, NULL /* only full read support */, + translated_stream_read); + svn_stream_set_write(s, translated_stream_write); + svn_stream_set_close(s, translated_stream_close); + if (svn_stream_supports_mark(stream)) + { + svn_stream_set_mark(s, translated_stream_mark); + svn_stream_set_seek(s, translated_stream_seek); + } - return s; + return s; + } + else + { + /* No translation is necessary, return the original stream. */ + return stream; + } } svn_stream_t * Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c Fri Jan 14 14:01:45 2022 @@ -1,3 +1,4 @@ + /* * sysinfo.c : information about the running system * @@ -689,8 +690,8 @@ parse_pointer_value(const char *start, c || *end >= limit) /* representation too long */ return NULL; - ptr = (const unsigned char*)val; - if (val != (apr_uint64_t)ptr) /* truncated value */ + ptr = (const unsigned char*)(apr_uintptr_t)val; + if (val != (apr_uintptr_t)ptr)/* truncated value */ return NULL; return ptr; @@ -1076,7 +1077,7 @@ win32_release_name(apr_pool_t *pool) /* Get a list of handles of shared libs loaded by the current - process. Returns a NULL-terminated array alocated from POOL. */ + process. Returns a NULL-terminated array allocated from POOL. */ static HMODULE * enum_loaded_modules(apr_pool_t *pool) { @@ -1324,68 +1325,89 @@ value_from_dict(CFDictionaryRef plist, C return value; } -/* Return the minor version the operating system, given the number in - a format that matches the regular expression /^10\.\d+(\..*)?$/ */ -static int -macos_minor_version(const char *osver) +/* Return the major and minor versions the operating system, given + the number in a format that matches the regular expression + /^\d+\.\d+(\..*)?$/ */ +static void +macos_version_number(int *major, int *minor, const char *osver) { char *end = NULL; unsigned long num = strtoul(osver, &end, 10); - if (!end || *end != '.' || num != 10) - return -1; + if (!end || *end != '.' || num < 10) + return; + + if (major) + *major = (int)num; osver = end + 1; end = NULL; num = strtoul(osver, &end, 10); if (!end || (*end && *end != '.')) - return -1; + return; - return (int)num; + if (minor) + *minor = (int)num; } /* Return the product name of the operating system. */ static const char * -product_name_from_minor_version(int minor, const char* product_name) +product_name_from_version(int major, int minor, const char* product_name) { /* We can only do this if we know the official product name. */ if (0 != strcmp(product_name, "Mac OS X")) return product_name; - if (minor <= 7) - return product_name; + if (major == 10) + { + if (minor <= 7) + return product_name; - if (minor <= 11) - return "OS X"; + if (minor <= 11) + return "OS X"; + } return "macOS"; } /* Return the commercial name of the operating system. */ static const char * -release_name_from_minor_version(int minor, const char* product_name) +release_name_from_version(int major, int minor, const char* product_name) { /* We can only do this if we know the official product name. */ if (0 == strcmp(product_name, "Mac OS X")) { /* See https://en.wikipedia.org/wiki/MacOS_version_history#Releases */ - switch(minor) + switch(major) { - case 0: return "Cheetah"; - case 1: return "Puma"; - case 2: return "Jaguar"; - case 3: return "Panther"; - case 4: return "Tiger"; - case 5: return "Leopard"; - case 6: return "Snow Leopard"; - case 7: return "Lion"; - case 8: return "Mountain Lion"; - case 9: return "Mavericks"; - case 10: return "Yosemite"; - case 11: return "El Capitan"; - case 12: return "Sierra"; - case 13: return "High Sierra"; - case 14: return "Mojave"; + case 10: + switch(minor) + { + case 0: return "Cheetah"; + case 1: return "Puma"; + case 2: return "Jaguar"; + case 3: return "Panther"; + case 4: return "Tiger"; + case 5: return "Leopard"; + case 6: return "Snow Leopard"; + case 7: return "Lion"; + case 8: return "Mountain Lion"; + case 9: return "Mavericks"; + case 10: return "Yosemite"; + case 11: return "El Capitan"; + case 12: return "Sierra"; + case 13: return "High Sierra"; + case 14: return "Mojave"; + case 15: return "Catalina"; + } + break; + + case 11: + switch(minor) + { + case 0: return "Big Sur"; + } + break; } } return NULL; @@ -1410,13 +1432,14 @@ macos_release_name(apr_pool_t *pool) CFSTR("ProductBuildVersion"), pool); const char *release; - int minor_version; + int major_version = -1; + int minor_version = -1; if (!osver) osver = value_from_dict(plist, CFSTR("ProductVersion"), pool); - minor_version = macos_minor_version(osver); - release = release_name_from_minor_version(minor_version, osname); - osname = product_name_from_minor_version(minor_version, osname); + macos_version_number(&major_version, &minor_version, osver); + release = release_name_from_version(major_version, minor_version, osname); + osname = product_name_from_version(major_version, minor_version, osname); CFRelease(plist); return apr_psprintf(pool, "%s%s%s%s%s%s%s%s", Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c Fri Jan 14 14:01:45 2022 @@ -143,7 +143,7 @@ svn_temp_serializer__init(const void *so * been serialized to BUFFER but contains references to new objects yet to * serialize. The current size of the serialized data is given in * CURRENTLY_USED. If the allocated data buffer is actually larger, you may - * specifiy that in CURRENTLY_ALLOCATED to prevent unnecessary allocations. + * specify that in CURRENTLY_ALLOCATED to prevent unnecessary allocations. * Otherwise, set it to 0. All allocations will be made from POOl. */ svn_temp_serializer__context_t * @@ -261,7 +261,7 @@ svn_temp_serializer__push(svn_temp_seria svn_stringbuf_appendbytes(context->buffer, source, struct_size); } -/* Remove the lastest structure from the stack. +/* Remove the latest structure from the stack. */ void svn_temp_serializer__pop(svn_temp_serializer__context_t *context) Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c Fri Jan 14 14:01:45 2022 @@ -72,7 +72,7 @@ typedef apr_xlate_t xlate_handle_t; * If there is no handle for a particular key when needed, a new is * handle is created and put in the cache after use. * This means that there will be at most N handles open for a key, where N - * is the number of simultanous handles in use for that key. */ + * is the number of simultaneous handles in use for that key. */ typedef struct xlate_handle_node_t { xlate_handle_t *handle; Propchange: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc/ ------------------------------------------------------------------------------ Merged /subversion/branches/swig-py3/subversion/libsvn_subr/utf8proc:r1813660-1869353 Merged /subversion/trunk/subversion/libsvn_subr/utf8proc:r1819869-1897029 Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c (original) +++ subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c Fri Jan 14 14:01:45 2022 @@ -335,7 +335,7 @@ svn_utf__glob(svn_boolean_t *match, _("Cannot use a custom escape token" " in glob matching mode")); - /* Convert the patern to NFD UTF-8. We can't use the UCS-4 result + /* Convert the pattern to NFD UTF-8. We can't use the UCS-4 result because apr_fnmatch can't handle it.*/ SVN_ERR(decompose_normalized(&tempbuf_len, pattern, pattern_len, temp_buf)); if (!sql_like)
