feat: ports - git port

This commit is contained in:
2026-08-09 10:47:07 +02:00
parent cfb8d91442
commit 6f3cf99667
34 changed files with 2255 additions and 2 deletions
+71
View File
@@ -0,0 +1,71 @@
/*
* montauk-paths.h -- teach git what an absolute path looks like on MontaukOS.
*
* FORCE-INCLUDED into every translation unit (-include, see the port
* Makefile), because it has to win the #ifndef guards in git-compat-util.h.
*
* MontaukOS paths are drive-prefixed: "0:/users/dan/repo". getcwd() returns
* one of those, and the kernel's path resolver (kernel/src/Api/Path.hpp)
* accepts three forms -- "N:/abs", "/abs" (the current drive's root) and
* "rel/ative" against the process cwd.
*
* Without this header git's is_absolute_path() is just is_dir_sep(path[0]),
* so every MontaukOS absolute path reads as RELATIVE and git helpfully
* prepends the cwd to it: "0:/users/dan/repo/0:/users/dan/repo". That breaks
* setup_git_directory(), real_path() and every worktree path it stores.
*
* The fix reuses git's existing Windows abstraction rather than inventing
* one: has_dos_drive_prefix / skip_dos_drive_prefix / offset_1st_component
* are exactly the hooks the DOS "C:/" case goes through, and a MontaukOS
* drive differs only in being a digit run rather than a letter. The bodies
* below mirror compat/win32/path-utils.c, minus the UNC handling, which has
* no MontaukOS equivalent.
*/
#ifndef _MONTAUK_GIT_PATHS_H_
#define _MONTAUK_GIT_PATHS_H_
/*
* "12:" as well as "0:" -- ParseDrivePrefix() accepts a multi-digit drive
* number, so this must too, or a two-digit drive would silently be treated
* as a relative path.
*/
static inline int montauk_has_drive_prefix(const char *path)
{
int i = 0;
if (!path)
return 0;
while (path[i] >= '0' && path[i] <= '9')
i++;
return i > 0 && path[i] == ':';
}
#define has_dos_drive_prefix montauk_has_drive_prefix
static inline int montauk_skip_drive_prefix(char **path)
{
int i = 0;
if (!montauk_has_drive_prefix(*path))
return 0;
while ((*path)[i] >= '0' && (*path)[i] <= '9')
i++;
*path += i + 1; /* the digits and the ':' */
return 1;
}
#define skip_dos_drive_prefix montauk_skip_drive_prefix
/*
* Length of the leading "root" of the path: the drive prefix plus one
* separator if present. Mirrors win32_offset_1st_component().
*/
static inline int montauk_offset_1st_component(const char *path)
{
char *pos = (char *)path;
montauk_skip_drive_prefix(&pos);
return (int)(pos - path) + (*pos == '/');
}
#define offset_1st_component montauk_offset_1st_component
#endif /* _MONTAUK_GIT_PATHS_H_ */