int gitfo_prettify_file_path(char *buffer_out, const char *path) { int error, path_len, i; const char* pattern = "/.."; path_len = strlen(path); /* Let's make sure the filename doesn't end with "/", "/." or "/.." */ for (i = 1; path_len > i && i < 4; i++) { if (!strncmp(path + path_len - i, pattern, i)) return GIT_EINVALIDPATH; } error = gitfo_prettify_dir_path(buffer_out, path); if (error < GIT_SUCCESS) return error; path_len = strlen(buffer_out); if (path_len < 2) return GIT_EINVALIDPATH; /* Remove the trailing slash */ buffer_out[path_len - 1] = '\0'; return GIT_SUCCESS; }
static int guess_repository_DIRs(git_repository *repo, const char *repository_path) { char path_aux[GIT_PATH_MAX], *last_DIR; int path_len; int error = GIT_SUCCESS; error = gitfo_prettify_dir_path(path_aux, repository_path); if (error < GIT_SUCCESS) return error; if (gitfo_isdir(path_aux) < GIT_SUCCESS) return GIT_ENOTAREPO; path_len = strlen(path_aux); repo->path_repository = git__strdup(path_aux); /* objects database */ strcpy(path_aux + path_len, GIT_OBJECTS_DIR); if (gitfo_isdir(path_aux) < GIT_SUCCESS) return GIT_ENOTAREPO; repo->path_odb = git__strdup(path_aux); /* HEAD file */ strcpy(path_aux + path_len, GIT_HEAD_FILE); if (gitfo_exists(path_aux) < 0) return GIT_ENOTAREPO; path_aux[path_len] = 0; last_DIR = (path_aux + path_len - 2); while (*last_DIR != '/') last_DIR--; if (strcmp(last_DIR, GIT_DIR) == 0) { repo->is_bare = 0; /* index file */ strcpy(path_aux + path_len, GIT_INDEX_FILE); repo->path_index = git__strdup(path_aux); /* working dir */ *(last_DIR + 1) = 0; repo->path_workdir = git__strdup(path_aux); } else { repo->is_bare = 1; repo->path_workdir = NULL; } return GIT_SUCCESS; }
static int repo_init_find_dir(repo_init *results, const char* path) { char temp_path[GIT_PATH_MAX]; int error = GIT_SUCCESS; error = gitfo_prettify_dir_path(temp_path, sizeof(temp_path), path); if (error < GIT_SUCCESS) return error; if (!results->is_bare) { git__joinpath(temp_path, temp_path, GIT_DIR); } results->path_repository = git__strdup(temp_path); if (results->path_repository == NULL) return GIT_ENOMEM; return GIT_SUCCESS; }
static int repo_init_find_dir(repo_init *results, const char* path) { char temp_path[GIT_PATH_MAX]; int path_len; int error = GIT_SUCCESS; error = gitfo_prettify_dir_path(temp_path, path); if (error < GIT_SUCCESS) return error; path_len = strlen(temp_path); if (!results->is_bare) { strcpy(temp_path + path_len - 1, GIT_DIR); path_len = path_len + strlen(GIT_DIR) - 1; /* Skip the leading slash from the constant */ } if (path_len >= GIT_PATH_MAX - MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH) return GIT_ENOTAREPO; results->path_repository = git__strdup(temp_path); return GIT_SUCCESS; }
/* * Git repository open methods * * Open a repository object from its path */ static int assign_repository_dirs( git_repository *repo, const char *git_dir, const char *git_object_directory, const char *git_index_file, const char *git_work_tree) { char path_aux[GIT_PATH_MAX]; int error = GIT_SUCCESS; assert(repo); if (git_dir == NULL) return GIT_ENOTFOUND; error = gitfo_prettify_dir_path(path_aux, sizeof(path_aux), git_dir); if (error < GIT_SUCCESS) return error; /* store GIT_DIR */ repo->path_repository = git__strdup(path_aux); if (repo->path_repository == NULL) return GIT_ENOMEM; /* path to GIT_OBJECT_DIRECTORY */ if (git_object_directory == NULL) git__joinpath(path_aux, repo->path_repository, GIT_OBJECTS_DIR); else { error = gitfo_prettify_dir_path(path_aux, sizeof(path_aux), git_object_directory); if (error < GIT_SUCCESS) return error; } /* Store GIT_OBJECT_DIRECTORY */ repo->path_odb = git__strdup(path_aux); if (repo->path_odb == NULL) return GIT_ENOMEM; /* path to GIT_WORK_TREE */ if (git_work_tree == NULL) repo->is_bare = 1; else { error = gitfo_prettify_dir_path(path_aux, sizeof(path_aux), git_work_tree); if (error < GIT_SUCCESS) return error; /* Store GIT_WORK_TREE */ repo->path_workdir = git__strdup(path_aux); if (repo->path_workdir == NULL) return GIT_ENOMEM; /* Path to GIT_INDEX_FILE */ if (git_index_file == NULL) git__joinpath(path_aux, repo->path_repository, GIT_INDEX_FILE); else { error = gitfo_prettify_file_path(path_aux, sizeof(path_aux), git_index_file); if (error < GIT_SUCCESS) return error; } /* store GIT_INDEX_FILE */ repo->path_index = git__strdup(path_aux); if (repo->path_index == NULL) return GIT_ENOMEM; } return GIT_SUCCESS; }
/* * Git repository open methods * * Open a repository object from its path */ static int assign_repository_DIRs(git_repository *repo, const char *git_dir, const char *git_object_directory, const char *git_index_file, const char *git_work_tree) { char path_aux[GIT_PATH_MAX]; size_t git_dir_path_len; int error = GIT_SUCCESS; assert(repo); if (git_dir == NULL) return GIT_ENOTFOUND; error = gitfo_prettify_dir_path(path_aux, git_dir); if (error < GIT_SUCCESS) return error; if (gitfo_isdir(path_aux) < GIT_SUCCESS) return GIT_ENOTFOUND; git_dir_path_len = strlen(path_aux); /* store GIT_DIR */ repo->path_repository = git__strdup(path_aux); /* store GIT_OBJECT_DIRECTORY */ if (git_object_directory == NULL) strcpy(repo->path_repository + git_dir_path_len, GIT_OBJECTS_DIR); else { error = gitfo_prettify_dir_path(path_aux, git_object_directory); if (error < GIT_SUCCESS) return error; } if (gitfo_isdir(path_aux) < GIT_SUCCESS) return GIT_ENOTFOUND; repo->path_odb = git__strdup(path_aux); /* store GIT_INDEX_FILE */ if (git_index_file == NULL) strcpy(repo->path_repository + git_dir_path_len, GIT_INDEX_FILE); else { error = gitfo_prettify_file_path(path_aux, git_index_file); if (error < GIT_SUCCESS) return error; } if (gitfo_exists(path_aux) < 0) return GIT_ENOTFOUND; repo->path_index = git__strdup(path_aux); /* store GIT_WORK_TREE */ if (git_work_tree == NULL) repo->is_bare = 1; else { error = gitfo_prettify_dir_path(path_aux, git_work_tree); if (error < GIT_SUCCESS) return error; repo->path_workdir = git__strdup(path_aux); } return GIT_SUCCESS; }