Very first git_repository_init() draft.
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
diff --git a/src/git2/repository.h b/src/git2/repository.h
index 24b411b..8a171cf 100644
--- a/src/git2/repository.h
+++ b/src/git2/repository.h
@@ -162,6 +162,9 @@ GIT_EXTERN(int) git_repository_newobject(git_object **object, git_repository *re
*/
GIT_EXTERN(void) git_repository_free(git_repository *repo);
+//TODO: Add comments.
+GIT_EXTERN(int) git_repository_init(git_repository** repo_out, const char* path, unsigned is_bare);
+
/** @} */
GIT_END_DECL
#endif
diff --git a/src/repository.c b/src/repository.c
index 098d098..3214a56 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -58,6 +58,14 @@ static struct {
{ "REF_DELTA", 0, 0 } /* 7 = GIT_OBJ_REF_DELTA */
};
+typedef struct git_repository_init_results {
+ char *path_repository;
+ char *path_workdir;
+
+ unsigned is_bare:1;
+ unsigned has_been_reinit:1;
+} git_repository_init_results;
+
/***********************************************************
*
* MISCELANEOUS HELPER FUNCTIONS
@@ -722,3 +730,124 @@ int git_object_typeisloose(git_otype type)
return git_objects_table[type].loose;
}
+
+
+void git_repository_init__results_free(git_repository_init_results* init_results)
+{
+ if (init_results == NULL)
+ return;
+
+ if (init_results->path_workdir)
+ free(init_results->path_workdir);
+ if (init_results->path_repository)
+ free(init_results->path_repository);
+
+ free(init_results);
+}
+
+git_repository_init_results *git_repository_init_results__alloc()
+{
+ git_repository_init_results *results = git__malloc(sizeof(git_repository_init_results));
+ if (!results)
+ return NULL;
+
+ memset(results, 0x0, sizeof(git_repository_init_results));
+
+ return results;
+}
+
+int git_repository_init__reinit(git_repository_init_results* results)
+{
+ /* To be implemented */
+
+ results->has_been_reinit = 1;
+ return GIT_SUCCESS;
+}
+
+int git_repository_init__create_structure(git_repository_init_results* results)
+{
+ char temp_path[GIT_PATH_MAX];
+ int path_len;
+
+ char* git_dir = results->path_repository;
+
+ path_len = strlen(git_dir);
+ strcpy(temp_path, git_dir);
+
+ /* Does HEAD file already exist ? */
+ strcpy(temp_path + path_len, GIT_HEAD_FILE);
+ if (!gitfo_exists(temp_path))
+ {
+ return git_repository_init__reinit(results);
+ }
+
+ /* To be implemented */
+
+ return GIT_SUCCESS;
+}
+
+int git_repository_init__assign_folders(git_repository_init_results* results, const char* path)
+{
+ const int MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH = 66; // TODO: How many ?
+ char temp_path[GIT_PATH_MAX];
+ int path_len;
+
+ path_len = strlen(path);
+ strcpy(temp_path, path);
+
+ /* Ensure path has a trailing slash */
+ if (temp_path[path_len - 1] != '/') {
+ temp_path[path_len] = '/';
+ temp_path[path_len + 1] = 0;
+
+ path_len = path_len + 1;
+ }
+
+ assert(path_len < GIT_PATH_MAX - MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH);
+
+ if (results->is_bare)
+ {
+ results->path_workdir = NULL;
+ }
+ else
+ {
+ results->path_workdir = git__strdup(temp_path);
+ strcpy(temp_path + path_len - 1, GIT_FOLDER);
+ path_len = path_len + strlen(GIT_FOLDER) - 1; /* Skip the leading slash from the constant */
+ }
+
+ results->path_repository = git__strdup(temp_path);
+
+ return GIT_SUCCESS;
+}
+
+int git_repository_init(git_repository** repo_out, const char* path, unsigned is_bare)
+{
+ git_repository_init_results* results;
+ int error = GIT_SUCCESS;
+
+ assert(repo_out && path);
+
+ results = git_repository_init_results__alloc();
+ if (results == NULL)
+ return GIT_ENOMEM;
+
+ results->is_bare = is_bare;
+
+ error = git_repository_init__assign_folders(results, path);
+ if (error < GIT_SUCCESS)
+ goto cleanup;
+
+ error = git_repository_init__create_structure(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;
+
+cleanup:
+ git_repository_init__results_free(results);
+ return error;
+}
\ No newline at end of file