| From 53b0b78673e950d66f7f21fac8e83fa324f9d83e Mon Sep 17 00:00:00 2001 |
| From: Johannes Schindelin <johannes.schindelin@gmx.de> |
| Date: Mon, 16 Sep 2019 20:44:31 +0200 |
| Subject: path.c: document the purpose of `is_ntfs_dotgit()` |
| |
| commit 525e7fba7854c23ee3530d0bf88d75f106f14c95 upstream. |
| |
| Previously, this function was completely undocumented. It is worth, |
| though, to explain what is going on, as it is not really obvious at all. |
| |
| Suggested-by: Garima Singh <garima.singh@microsoft.com> |
| Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> |
| Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> |
| --- |
| path.c | 28 ++++++++++++++++++++++++++++ |
| 1 file changed, 28 insertions(+) |
| |
| diff --git a/path.c b/path.c |
| index 98c35e0e9c..0444208dfb 100644 |
| --- a/path.c |
| +++ b/path.c |
| @@ -1233,6 +1233,34 @@ static int only_spaces_and_periods(const char *path, size_t len, size_t skip) |
| return 1; |
| } |
| |
| +/* |
| + * On NTFS, we need to be careful to disallow certain synonyms of the `.git/` |
| + * directory: |
| + * |
| + * - For historical reasons, file names that end in spaces or periods are |
| + * automatically trimmed. Therefore, `.git . . ./` is a valid way to refer |
| + * to `.git/`. |
| + * |
| + * - For other historical reasons, file names that do not conform to the 8.3 |
| + * format (up to eight characters for the basename, three for the file |
| + * extension, certain characters not allowed such as `+`, etc) are associated |
| + * with a so-called "short name", at least on the `C:` drive by default. |
| + * Which means that `git~1/` is a valid way to refer to `.git/`. |
| + * |
| + * Note: Technically, `.git/` could receive the short name `git~2` if the |
| + * short name `git~1` were already used. In Git, however, we guarantee that |
| + * `.git` is the first item in a directory, therefore it will be associated |
| + * with the short name `git~1` (unless short names are disabled). |
| + * |
| + * When this function returns 1, it indicates that the specified file/directory |
| + * name refers to a `.git` file or directory, or to any of these synonyms, and |
| + * Git should therefore not track it. |
| + * |
| + * This function is intended to be used by `git fsck` even on platforms where |
| + * the backslash is a regular filename character, therefore it needs to handle |
| + * backlash characters in the provided `name` specially: they are interpreted |
| + * as directory separators. |
| + */ |
| int is_ntfs_dotgit(const char *name) |
| { |
| size_t len; |
| -- |
| 2.24.0.393.g34dc348eaf |
| |