mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-21 22:21:37 +00:00
Repository: Added some util functions that we'll need to discover repository path.
retrieve_device returns the file device for a given path (so that we can detect device change while walking through parent directories). abspath returns a canonicalized path, symbolic link free. retrieive_ceiling_directories_offset returns the biggest path offset that path match in the ceiling directory list (so that we can stop at ceiling directories).
This commit is contained in:
parent
1549cba9a4
commit
f2e6b8776e
@ -334,7 +334,7 @@ int gitfo_dirent(
|
|||||||
return GIT_SUCCESS;
|
return GIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void posixify_path(char *path)
|
void gitfo_posixify_path(char *path)
|
||||||
{
|
{
|
||||||
#if GIT_PLATFORM_PATH_SEP != '/'
|
#if GIT_PLATFORM_PATH_SEP != '/'
|
||||||
while (*path) {
|
while (*path) {
|
||||||
@ -456,7 +456,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path, con
|
|||||||
return git__throw(GIT_EOVERFLOW, "Failed to prettify dir path: the base path is too long for the buffer.");
|
return git__throw(GIT_EOVERFLOW, "Failed to prettify dir path: the base path is too long for the buffer.");
|
||||||
|
|
||||||
strcpy(buffer_out, base_path);
|
strcpy(buffer_out, base_path);
|
||||||
posixify_path(buffer_out);
|
gitfo_posixify_path(buffer_out);
|
||||||
git__joinpath(buffer_out, buffer_out, "");
|
git__joinpath(buffer_out, buffer_out, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -587,7 +587,7 @@ int gitfo_getcwd(char *buffer_out, size_t size)
|
|||||||
if (cwd_buffer == NULL)
|
if (cwd_buffer == NULL)
|
||||||
return git__throw(GIT_EOSERR, "Failed to retrieve current working directory");
|
return git__throw(GIT_EOSERR, "Failed to retrieve current working directory");
|
||||||
|
|
||||||
posixify_path(buffer_out);
|
gitfo_posixify_path(buffer_out);
|
||||||
|
|
||||||
git__joinpath(buffer_out, buffer_out, ""); //Ensure the path ends with a trailing slash
|
git__joinpath(buffer_out, buffer_out, ""); //Ensure the path ends with a trailing slash
|
||||||
|
|
||||||
|
@ -198,6 +198,8 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path, con
|
|||||||
*/
|
*/
|
||||||
int gitfo_prettify_file_path(char *buffer_out, size_t size, const char *path, const char *base_path);
|
int gitfo_prettify_file_path(char *buffer_out, size_t size, const char *path, const char *base_path);
|
||||||
|
|
||||||
|
void gitfo_posixify_path(char *path);
|
||||||
|
|
||||||
int gitfo_retrieve_path_root_offset(const char *path);
|
int gitfo_retrieve_path_root_offset(const char *path);
|
||||||
|
|
||||||
#endif /* INCLUDE_fileops_h__ */
|
#endif /* INCLUDE_fileops_h__ */
|
||||||
|
@ -299,6 +299,81 @@ cleanup:
|
|||||||
return git__rethrow(error, "Failed to open repository");
|
return git__rethrow(error, "Failed to open repository");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int abspath(char *buffer_out, size_t size, const char *path)
|
||||||
|
{
|
||||||
|
assert(buffer_out && size >= GIT_PATH_MAX);
|
||||||
|
|
||||||
|
#ifdef GIT_WIN32
|
||||||
|
if (_fullpath(buffer_out, path, size) == NULL)
|
||||||
|
return git__throw(GIT_EOSERR, "Failed to retrieve real path: %s causing errors", buffer_out);
|
||||||
|
#else
|
||||||
|
if (realpath(path, buffer_out) == NULL)
|
||||||
|
return git__throw(GIT_EOSERR, "Failed to retrieve real path: %s causing errors", buffer_out);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gitfo_posixify_path(buffer_out);
|
||||||
|
|
||||||
|
return GIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dev_t retrieve_device(dev_t *device_out, const char *path)
|
||||||
|
{
|
||||||
|
struct stat path_info;
|
||||||
|
|
||||||
|
assert(device_out);
|
||||||
|
|
||||||
|
if (gitfo_stat(path, &path_info))
|
||||||
|
return git__throw(GIT_EOSERR, "Failed to get file informations: %s", path);
|
||||||
|
|
||||||
|
*device_out = path_info.st_dev;
|
||||||
|
|
||||||
|
return GIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int retrieve_ceiling_directories_offset(const char *path, const char *ceiling_directories)
|
||||||
|
{
|
||||||
|
char buf[GIT_PATH_MAX + 1];
|
||||||
|
char buf2[GIT_PATH_MAX + 1];
|
||||||
|
const char *ceil, *sep;
|
||||||
|
int len, max_len = -1;
|
||||||
|
int min_len;
|
||||||
|
|
||||||
|
assert(path);
|
||||||
|
|
||||||
|
min_len = gitfo_retrieve_path_root_offset(path) + 1;
|
||||||
|
|
||||||
|
if (ceiling_directories == NULL || min_len == 0)
|
||||||
|
return min_len;
|
||||||
|
|
||||||
|
for (sep = ceil = ceiling_directories; *sep; ceil = sep + 1) {
|
||||||
|
for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++);
|
||||||
|
len = sep - ceil;
|
||||||
|
|
||||||
|
if (len == 0 || len > GIT_PATH_MAX || gitfo_retrieve_path_root_offset(ceil) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
strncpy(buf, ceil, len);
|
||||||
|
buf[len] = '\0';
|
||||||
|
|
||||||
|
gitfo_posixify_path(buf);
|
||||||
|
if (gitfo_prettify_dir_path(buf2, sizeof(buf2), buf, NULL) < GIT_SUCCESS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
len = strlen(buf2);
|
||||||
|
if (len > 0 && buf2[len-1] == '/')
|
||||||
|
buf[--len] = '\0';
|
||||||
|
|
||||||
|
if (!strncmp(path, buf2, len) &&
|
||||||
|
path[len] == '/' &&
|
||||||
|
len > max_len)
|
||||||
|
{
|
||||||
|
max_len = len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return max_len <= min_len ? min_len : max_len;
|
||||||
|
}
|
||||||
|
|
||||||
void git_repository_free(git_repository *repo)
|
void git_repository_free(git_repository *repo)
|
||||||
{
|
{
|
||||||
if (repo == NULL)
|
if (repo == NULL)
|
||||||
|
Loading…
Reference in New Issue
Block a user