summaryrefslogtreecommitdiff
path: root/src/index.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-04-24 00:31:43 +0300
committerVicent Marti <tanoku@gmail.com>2011-04-24 00:31:43 +0300
commitf7a5058aaf51635b3171eda182820a8f8c750060 (patch)
tree3920d3abc59d487622b88c622f4e97a2ddcdbf79 /src/index.c
parentf16c0a9db783548d7b28cad726c5af8923a3ac32 (diff)
downloadlibgit2-f7a5058aaf51635b3171eda182820a8f8c750060.tar.gz
index: Refactor add/replace methods
Removed the optional `replace` argument, we now have 4 add methods: `git_index_add`: add or update from path `git_index_add2`: add or update from struct `git_index_append`: add without replacing from path `git_index_append2`: add without replacing from struct Yes, this breaks the bindings.
Diffstat (limited to 'src/index.c')
-rw-r--r--src/index.c123
1 files changed, 77 insertions, 46 deletions
diff --git a/src/index.c b/src/index.c
index c066d24d7..850f5de85 100644
--- a/src/index.c
+++ b/src/index.c
@@ -289,56 +289,12 @@ git_index_entry *git_index_get(git_index *index, int n)
return git_vector_get(&index->entries, (unsigned int)n);
}
-int git_index_add(git_index *index, const char *rel_path, int stage)
-{
- git_index_entry entry;
- char full_path[GIT_PATH_MAX];
- struct stat st;
- int error;
-
- if (index->repository == NULL)
- return GIT_EBAREINDEX;
-
- git__joinpath(full_path, index->repository->path_workdir, rel_path);
-
- if (gitfo_exists(full_path) < 0)
- return GIT_ENOTFOUND;
-
- if (gitfo_stat(full_path, &st) < 0)
- return GIT_EOSERR;
-
- if (stage < 0 || stage > 3)
- return GIT_ERROR;
-
- memset(&entry, 0x0, sizeof(git_index_entry));
-
- entry.ctime.seconds = (git_time_t)st.st_ctime;
- entry.mtime.seconds = (git_time_t)st.st_mtime;
- /* entry.mtime.nanoseconds = st.st_mtimensec; */
- /* entry.ctime.nanoseconds = st.st_ctimensec; */
- entry.dev= st.st_rdev;
- entry.ino = st.st_ino;
- entry.mode = st.st_mode;
- entry.uid = st.st_uid;
- entry.gid = st.st_gid;
- entry.file_size = st.st_size;
-
- /* write the blob to disk and get the oid */
- if ((error = git_blob_create_fromfile(&entry.oid, index->repository, rel_path)) < GIT_SUCCESS)
- return error;
-
- entry.flags |= (stage << GIT_IDXENTRY_STAGESHIFT);
- entry.path = (char *)rel_path; /* do not duplicate; index_insert already does this */
-
- return git_index_insert(index, &entry, 1);
-}
-
-void sort_index(git_index *index)
+static void sort_index(git_index *index)
{
git_vector_sort(&index->entries);
}
-int git_index_insert(git_index *index, const git_index_entry *source_entry, int replace)
+static int index_insert(git_index *index, const git_index_entry *source_entry, int replace)
{
git_index_entry *entry;
size_t path_length;
@@ -395,6 +351,81 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry, int
return GIT_SUCCESS;
}
+static int index_init_entry(git_index_entry *entry, git_index *index, const char *rel_path, int stage)
+{
+ char full_path[GIT_PATH_MAX];
+ struct stat st;
+ int error;
+
+ if (index->repository == NULL)
+ return GIT_EBAREINDEX;
+
+ git__joinpath(full_path, index->repository->path_workdir, rel_path);
+
+ if (gitfo_exists(full_path) < 0)
+ return GIT_ENOTFOUND;
+
+ if (gitfo_stat(full_path, &st) < 0)
+ return GIT_EOSERR;
+
+ if (stage < 0 || stage > 3)
+ return GIT_ERROR;
+
+ memset(entry, 0x0, sizeof(git_index_entry));
+
+ entry->ctime.seconds = (git_time_t)st.st_ctime;
+ entry->mtime.seconds = (git_time_t)st.st_mtime;
+ /* entry.mtime.nanoseconds = st.st_mtimensec; */
+ /* entry.ctime.nanoseconds = st.st_ctimensec; */
+ entry->dev= st.st_rdev;
+ entry->ino = st.st_ino;
+ entry->mode = st.st_mode;
+ entry->uid = st.st_uid;
+ entry->gid = st.st_gid;
+ entry->file_size = st.st_size;
+
+ /* write the blob to disk and get the oid */
+ if ((error = git_blob_create_fromfile(&entry->oid, index->repository, rel_path)) < GIT_SUCCESS)
+ return error;
+
+ entry->flags |= (stage << GIT_IDXENTRY_STAGESHIFT);
+ entry->path = (char *)rel_path; /* do not duplicate; index_insert already does this */
+ return GIT_SUCCESS;
+}
+
+int git_index_add(git_index *index, const char *path, int stage)
+{
+ int error;
+ git_index_entry entry;
+
+ if ((error = index_init_entry(&entry, index, path, stage)) < GIT_SUCCESS)
+ return error;
+
+ return index_insert(index, &entry, 1);
+}
+
+int git_index_append(git_index *index, const char *path, int stage)
+{
+ int error;
+ git_index_entry entry;
+
+ if ((error = index_init_entry(&entry, index, path, stage)) < GIT_SUCCESS)
+ return error;
+
+ return index_insert(index, &entry, 0);
+}
+
+int git_index_add2(git_index *index, const git_index_entry *source_entry)
+{
+ return index_insert(index, source_entry, 1);
+}
+
+int git_index_apppend2(git_index *index, const git_index_entry *source_entry)
+{
+ return index_insert(index, source_entry, 0);
+}
+
+
int git_index_remove(git_index *index, int position)
{
assert(index);