mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +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
|
||||
equipment.c
|
||||
file.c
|
||||
git-access.c
|
||||
libdivecomputer.c
|
||||
liquivision.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);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
|
|
@ -124,6 +124,7 @@ SOURCES = \
|
|||
equipment.c \
|
||||
file.c \
|
||||
gettextfromc.cpp \
|
||||
git-access.c \
|
||||
libdivecomputer.c \
|
||||
liquivision.c \
|
||||
load-git.c \
|
||||
|
|
Loading…
Reference in a new issue