Added basic HEAD file creation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
diff --git a/src/git2/repository.h b/src/git2/repository.h
index 8a171cf..195a8aa 100644
--- a/src/git2/repository.h
+++ b/src/git2/repository.h
@@ -59,7 +59,7 @@ GIT_BEGIN_DECL
*
* @param repository pointer to the repo which will be opened
* @param path the path to the repository
- * @return 0 on sucess; error code otherwise
+ * @return 0 on success; error code otherwise
*/
GIT_EXTERN(int) git_repository_open(git_repository **repository, const char *path);
@@ -88,7 +88,7 @@ GIT_EXTERN(int) git_repository_open(git_repository **repository, const char *pat
* Equivalent to $GIT_WORK_TREE.
* If NULL, the repository is assumed to be bare.
*
- * @return 0 on sucess; error code otherwise
+ * @return 0 on success; error code otherwise
*/
GIT_EXTERN(int) git_repository_open2(git_repository **repository,
const char *git_dir,
@@ -162,7 +162,20 @@ GIT_EXTERN(int) git_repository_newobject(git_object **object, git_repository *re
*/
GIT_EXTERN(void) git_repository_free(git_repository *repo);
-//TODO: Add comments.
+/**
+ * Creates a new Git repository.
+ *
+ * Limits:
+ * - Reinit of an existing directory is not implemented yet. Will blindly return GIT_SUCCESS.
+ * - The parent directory structure of the repository has to already exist. Recursive building of the parent tree structure is not implmented yet.
+ * - Config file creation handling is not implemented yet.
+ *
+ * @param repo_out pointer to the repo which will be created or reinitialized
+ * @param path the path to the repository
+ * @param is_bare if true, a Git repository without a working directory is created at the pointed path.
+ * If false, provided path will be considered as the working directory into which the .git directory will be created.
+ * @return 0 on success; error code otherwise
+ */
GIT_EXTERN(int) git_repository_init(git_repository** repo_out, const char* path, unsigned is_bare);
/** @} */
diff --git a/src/repository.c b/src/repository.c
index 4e5e7e6..df15482 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -739,7 +739,24 @@ int git_repository_init__reinit(git_repository_init_results* results)
return GIT_SUCCESS;
}
-int git_repository_init__create_structure(git_repository_init_results* results)
+int git_repository_init__create_head(const char* head_path)
+{
+ git_file fd;
+ int error = GIT_SUCCESS;
+ const char* head_content = "ref: refs/heads/master\n";
+ if ((fd = gitfo_creat(head_path, S_IREAD | S_IWRITE)) < 0)
+ return GIT_ERROR;
+
+ error = gitfo_write(fd, (void*)head_content, strlen(head_content));
+ if (error < GIT_SUCCESS)
+ goto cleanup;
+
+cleanup:
+ gitfo_close(fd);
+ return error;
+}
+
+int git_repository_init__create_structure_or_reinit(git_repository_init_results* results)
{
char temp_path[GIT_PATH_MAX];
int path_len;
@@ -756,15 +773,27 @@ int git_repository_init__create_structure(git_repository_init_results* results)
/* Does HEAD file already exist ? */
strcpy(temp_path + path_len, GIT_HEAD_FILE);
+
+ if (!gitfo_exists(temp_path) && gitfo_isdir(temp_path) < GIT_SUCCESS)
+ {
+ /* Something very wrong has happened to this repository :-) */
+ return GIT_ERROR;
+ }
+
if (!gitfo_exists(temp_path))
{
return git_repository_init__reinit(results);
}
+ if (git_repository_init__create_head(temp_path) < GIT_SUCCESS)
+ return GIT_ERROR;
+
+ /* Creates the '/objects/' directory */
strcpy(temp_path + path_len, GIT_OBJECTS_FOLDER);
if (gitfo_mkdir(temp_path, mode))
return GIT_ERROR;
+ /* Creates the '/refs/' directory */
strcpy(temp_path + path_len, GIT_REFS_FOLDER);
if (gitfo_mkdir(temp_path, mode))
return GIT_ERROR;
@@ -818,14 +847,13 @@ int git_repository_init(git_repository** repo_out, const char* path, unsigned is
if (error < GIT_SUCCESS)
goto cleanup;
- error = git_repository_init__create_structure(&results);
+ error = git_repository_init__create_structure_or_reinit(&results);
if (error < GIT_SUCCESS)
goto cleanup;
- //TODO: Uncomment when the structure has been properly created
- //error = git_repository_open(repo_out, results->path_repository);
- //if (error < GIT_SUCCESS)
- // goto cleanup;
+ error = git_repository_open(repo_out, results.path_repository);
+ if (error < GIT_SUCCESS)
+ goto cleanup;
cleanup:
free(results.path_repository);