summaryrefslogtreecommitdiff
path: root/src/path.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2019-12-03 17:47:31 +1100
committerEdward Thomson <ethomson@edwardthomson.com>2019-12-10 18:01:06 +1000
commitb8464342f3605917b238a111e3c1ce14b254da8a (patch)
treebdbbbea781b55ec0d61c8a821d9f76662b901676 /src/path.c
parente1832eb20a7089f6383cfce474f213157f5300cb (diff)
downloadlibgit2-b8464342f3605917b238a111e3c1ce14b254da8a.tar.gz
path: rename function that detects end of filename
The function `only_spaces_and_dots` used to detect the end of the filename on win32. Now we look at spaces and dots _before_ the end of the string _or_ a `:` character, which would signify a win32 alternate data stream. Thus, rename the function `ntfs_end_of_filename` to indicate that it detects the (virtual) end of a filename, that any further characters would be elided to the given path.
Diffstat (limited to 'src/path.c')
-rw-r--r--src/path.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/path.c b/src/path.c
index b3a8fc32f..5ac3bf0d2 100644
--- a/src/path.c
+++ b/src/path.c
@@ -1641,7 +1641,16 @@ GIT_INLINE(bool) verify_dotgit_ntfs(git_repository *repo, const char *path, size
return false;
}
-GIT_INLINE(bool) only_spaces_and_dots(const char *path)
+/*
+ * Windows paths that end with spaces and/or dots are elided to the
+ * path without them for backward compatibility. That is to say
+ * that opening file "foo ", "foo." or even "foo . . ." will all
+ * map to a filename of "foo". This function identifies spaces and
+ * dots at the end of a filename, whether the proper end of the
+ * filename (end of string) or a colon (which would indicate a
+ * Windows alternate data stream.)
+ */
+GIT_INLINE(bool) ntfs_end_of_filename(const char *path)
{
const char *c = path;
@@ -1661,13 +1670,13 @@ GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, size_t len, const
if (name[0] == '.' && len >= dotgit_len &&
!strncasecmp(name + 1, dotgit_name, dotgit_len)) {
- return !only_spaces_and_dots(name + dotgit_len + 1);
+ return !ntfs_end_of_filename(name + dotgit_len + 1);
}
/* Detect the basic NTFS shortname with the first six chars */
if (!strncasecmp(name, dotgit_name, 6) && name[6] == '~' &&
name[7] >= '1' && name[7] <= '4')
- return !only_spaces_and_dots(name + 8);
+ return !ntfs_end_of_filename(name + 8);
/* Catch fallback names */
for (i = 0, saw_tilde = 0; i < 8; i++) {
@@ -1689,7 +1698,7 @@ GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, size_t len, const
}
}
- return !only_spaces_and_dots(name + i);
+ return !ntfs_end_of_filename(name + i);
}
GIT_INLINE(bool) verify_char(unsigned char c, unsigned int flags)