mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Start splitting out git repo helper routines
This doesn't actually change any code, but it moves the 'is_git_repo()' function that is used by both loading and saving into a new git-access.c file. This is where I'll start doing remote repo syncing too. Knock wood. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
4a146f9e57
commit
e287590e4b
4 changed files with 82 additions and 67 deletions
|
@ -103,6 +103,7 @@ SET(SUBSURFACE_CORE_LIB_SRCS
|
||||||
divelist.c
|
divelist.c
|
||||||
equipment.c
|
equipment.c
|
||||||
file.c
|
file.c
|
||||||
|
git-access.c
|
||||||
libdivecomputer.c
|
libdivecomputer.c
|
||||||
liquivision.c
|
liquivision.c
|
||||||
load-git.c
|
load-git.c
|
||||||
|
|
80
git-access.c
Normal file
80
git-access.c
Normal file
|
@ -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;
|
||||||
|
}
|
67
save-git.c
67
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);
|
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 git_save_dives(struct git_repository *repo, const char *branch, bool select_only)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -124,6 +124,7 @@ SOURCES = \
|
||||||
equipment.c \
|
equipment.c \
|
||||||
file.c \
|
file.c \
|
||||||
gettextfromc.cpp \
|
gettextfromc.cpp \
|
||||||
|
git-access.c \
|
||||||
libdivecomputer.c \
|
libdivecomputer.c \
|
||||||
liquivision.c \
|
liquivision.c \
|
||||||
load-git.c \
|
load-git.c \
|
||||||
|
|
Loading…
Add table
Reference in a new issue