summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--git-access.c80
-rw-r--r--save-git.c67
-rw-r--r--subsurface.pro1
4 files changed, 82 insertions, 67 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4a260e729..16b8b9f52 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -103,6 +103,7 @@ SET(SUBSURFACE_CORE_LIB_SRCS
divelist.c
equipment.c
file.c
+ git-access.c
libdivecomputer.c
liquivision.c
load-git.c
diff --git a/git-access.c b/git-access.c
new file mode 100644
index 000000000..3b01623b9
--- /dev/null
+++ b/git-access.c
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <git2.h>
+
+#include "dive.h"
+
+/*
+ * If it's not a git repo, return NULL. Be very conservative.
+ */
+struct git_repository *is_git_repository(const char *filename, const char **branchp)
+{
+ int flen, blen, ret;
+ struct stat st;
+ git_repository *repo;
+ char *loc, *branch;
+
+ flen = strlen(filename);
+ if (!flen || filename[--flen] != ']')
+ return NULL;
+
+ /* Find the matching '[' */
+ blen = 0;
+ while (flen && filename[--flen] != '[')
+ blen++;
+
+ if (!flen)
+ return NULL;
+
+ /*
+ * This is the "point of no return": the name matches
+ * the git repository name rules, and we will no longer
+ * return NULL.
+ *
+ * We will either return "dummy_git_repository" and the
+ * branch pointer will have the _whole_ filename in it,
+ * or we will return a real git repository with the
+ * branch pointer being filled in with just the branch
+ * name.
+ *
+ * The actual git reading/writing routines can use this
+ * to generate proper error messages.
+ */
+ *branchp = filename;
+ loc = malloc(flen+1);
+ if (!loc)
+ return dummy_git_repository;
+ memcpy(loc, filename, flen);
+ loc[flen] = 0;
+
+ branch = malloc(blen+1);
+ if (!branch) {
+ free(loc);
+ return dummy_git_repository;
+ }
+ memcpy(branch, filename+flen+1, blen);
+ branch[blen] = 0;
+
+ if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) {
+ free(loc);
+ free(branch);
+ return dummy_git_repository;
+ }
+
+ ret = git_repository_open(&repo, loc);
+ free(loc);
+ if (ret < 0) {
+ free(branch);
+ return dummy_git_repository;
+ }
+ *branchp = branch;
+ return repo;
+}
diff --git a/save-git.c b/save-git.c
index 84eb1a316..0aef48f0b 100644
--- a/save-git.c
+++ b/save-git.c
@@ -1127,73 +1127,6 @@ static int do_git_save(git_repository *repo, const char *branch, bool select_onl
return create_new_commit(repo, branch, &id);
}
-/*
- * If it's not a git repo, return NULL. Be very conservative.
- */
-struct git_repository *is_git_repository(const char *filename, const char **branchp)
-{
- int flen, blen, ret;
- struct stat st;
- git_repository *repo;
- char *loc, *branch;
-
- flen = strlen(filename);
- if (!flen || filename[--flen] != ']')
- return NULL;
-
- /* Find the matching '[' */
- blen = 0;
- while (flen && filename[--flen] != '[')
- blen++;
-
- if (!flen)
- return NULL;
-
- /*
- * This is the "point of no return": the name matches
- * the git repository name rules, and we will no longer
- * return NULL.
- *
- * We will either return "dummy_git_repository" and the
- * branch pointer will have the _whole_ filename in it,
- * or we will return a real git repository with the
- * branch pointer being filled in with just the branch
- * name.
- *
- * The actual git reading/writing routines can use this
- * to generate proper error messages.
- */
- *branchp = filename;
- loc = malloc(flen+1);
- if (!loc)
- return dummy_git_repository;
- memcpy(loc, filename, flen);
- loc[flen] = 0;
-
- branch = malloc(blen+1);
- if (!branch) {
- free(loc);
- return dummy_git_repository;
- }
- memcpy(branch, filename+flen+1, blen);
- branch[blen] = 0;
-
- if (stat(loc, &st) < 0 || !S_ISDIR(st.st_mode)) {
- free(loc);
- free(branch);
- return dummy_git_repository;
- }
-
- ret = git_repository_open(&repo, loc);
- free(loc);
- if (ret < 0) {
- free(branch);
- return dummy_git_repository;
- }
- *branchp = branch;
- return repo;
-}
-
int git_save_dives(struct git_repository *repo, const char *branch, bool select_only)
{
int ret;
diff --git a/subsurface.pro b/subsurface.pro
index 4853796c0..7a00d7492 100644
--- a/subsurface.pro
+++ b/subsurface.pro
@@ -124,6 +124,7 @@ SOURCES = \
equipment.c \
file.c \
gettextfromc.cpp \
+ git-access.c \
libdivecomputer.c \
liquivision.c \
load-git.c \