Merge branch 'repo-init' of https://github.com/nulltoken/libgit2 into nulltoken-repo-init

This commit is contained in:
Vicent Marti 2011-01-03 21:37:14 +02:00
commit d5f2520413
2 changed files with 50 additions and 22 deletions

View File

@ -1,5 +1,6 @@
#include "common.h"
#include "fileops.h"
#include <ctype.h>
int gitfo_open(const char *path, int flags)
{
@ -311,6 +312,19 @@ int gitfo_dirent(
return GIT_SUCCESS;
}
#ifdef GIT_WIN32
static int is_windows_rooted_path(const char *path)
{
/* Does the root of the path look like a windows drive ? */
if (isalpha(path[0]) && (path[1] == ':'))
return GIT_SUCCESS;
return GIT_ERROR;
}
#endif
int gitfo_mkdir_recurs(const char *path, int mode)
{
int error;
@ -323,10 +337,22 @@ int gitfo_mkdir_recurs(const char *path, int mode)
error = GIT_SUCCESS;
pp = path_copy;
while (error == 0 && (sp = strchr(pp, '/')) != 0) {
#ifdef GIT_WIN32
if (!is_windows_rooted_path(pp))
pp += 2; /* Skip the drive name (eg. C: or D:) */
#endif
while (error == GIT_SUCCESS && (sp = strchr(pp, '/')) != 0) {
if (sp != pp && gitfo_isdir(path_copy) < GIT_SUCCESS) {
*sp = 0;
error = gitfo_mkdir(path_copy, mode);
/* Do not choke while trying to recreate an existing directory */
if (errno == EEXIST)
error = GIT_SUCCESS;
*sp = '/';
}

View File

@ -35,9 +35,11 @@
#define GIT_DIR "/.git/"
#define GIT_OBJECTS_DIR "objects/"
#define GIT_OBJECTS_INFO_DIR GIT_OBJECTS_DIR "info/"
#define GIT_OBJECTS_PACK_DIR GIT_OBJECTS_DIR "pack/"
#define GIT_REFS_DIR "refs/"
#define GIT_REFS_HEADS_DIR "refs/heads/"
#define GIT_REFS_TAGS_DIR "refs/tags/"
#define GIT_REFS_HEADS_DIR GIT_REFS_DIR "heads/"
#define GIT_REFS_TAGS_DIR GIT_REFS_DIR "tags/"
#define GIT_INDEX_FILE "index"
#define GIT_HEAD_FILE "HEAD"
@ -786,19 +788,19 @@ int repo_init_structure(repo_init *results)
if (repo_init_createhead(temp_path) < GIT_SUCCESS)
return GIT_ERROR;
/* Creates the '/objects/' directory */
strcpy(temp_path + path_len, GIT_OBJECTS_DIR);
if (gitfo_mkdir(temp_path, mode))
/* Creates the '/objects/info/' directory */
strcpy(temp_path + path_len, GIT_OBJECTS_INFO_DIR);
if (gitfo_mkdir_recurs(temp_path, mode))
return GIT_ERROR;
/* Creates the '/refs/' directory */
strcpy(temp_path + path_len, GIT_REFS_DIR);
/* Creates the '/objects/pack/' directory */
strcpy(temp_path + path_len, GIT_OBJECTS_PACK_DIR);
if (gitfo_mkdir(temp_path, mode))
return GIT_ERROR;
/* Creates the '/refs/heads/' directory */
strcpy(temp_path + path_len, GIT_REFS_HEADS_DIR);
if (gitfo_mkdir(temp_path, mode))
if (gitfo_mkdir_recurs(temp_path, mode))
return GIT_ERROR;
/* Creates the '/refs/tags/' directory */