From 56b82e0ecf58dd1f2b7585425dbdebbbbe5668a4 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Fri, 19 Jun 2015 11:45:24 -0700 Subject: Git storage: change time encoding in directory names We used to use [[yyyy-]mm-]nn-ddd-hh:mm:ss[~hex] in our git storage format for directory that contained dives. Problem with the is that on Windows the colon ':' is an illegal character in a filename. So libgit2 refuses to clone such a repository on Windows. So instead we now always write dive directories in git repositories as [[yyyy-]mm-]nn-ddd-hh=mm=ss[~hex] which replaces the ':' with an '='. Of course we load / parse both formats so that older formats still work. The next time they are written all the names change which causes rather huge commits, but that's the only way I see for cloud storage to work on Windows. Signed-off-by: Dirk Hohndel --- load-git.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'load-git.c') diff --git a/load-git.c b/load-git.c index 08eef085d..6a054e887 100644 --- a/load-git.c +++ b/load-git.c @@ -1129,7 +1129,8 @@ static int dive_trip_directory(const char *root, const char *name) } /* - * Dive directory, name is [[yyyy-]mm-]nn-ddd-hh:mm:ss[~hex], + * Dive directory, name is [[yyyy-]mm-]nn-ddd-hh:mm:ss[~hex] in older git repositories + * but [[yyyy-]mm-]nn-ddd-hh=mm=ss[~hex] in newer repos as ':' is an illegal character for Windows files * and 'timeoff' points to what should be the time part of * the name (the first digit of the hour). * @@ -1156,8 +1157,8 @@ static int dive_directory(const char *root, const char *name, int timeoff) if (mday_off < 0) return GIT_WALK_SKIP; - /* Get the time of day */ - if (sscanf(name+timeoff, "%d:%d:%d", &h, &m, &s) != 3) + /* Get the time of day -- parse both time formats so we can read old repos when not on Windows */ + if (sscanf(name+timeoff, "%d:%d:%d", &h, &m, &s) != 3 && sscanf(name+timeoff, "%d=%d=%d", &h, &m, &s) != 3) return GIT_WALK_SKIP; if (!validate_time(h, m, s)) return GIT_WALK_SKIP; @@ -1307,7 +1308,7 @@ static int walk_tree_directory(const char *root, const git_tree_entry *entry) * We know the len is at least 3, because we had at least * two digits and a dash */ - if (name[len-3] == ':') + if (name[len-3] == ':' || name[len-3] == '=') return dive_directory(root, name, len-8); if (digits != 2) -- cgit v1.2.3-70-g09d2