mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-02 16:34:37 +00:00
Change git_repository initialization to use a path
The constructor to git_repository is now called 'git_repository_open(path)' and takes a path to a git repository instead of an existing ODB object. Unit tests have been updated accordingly and the two test repositories have been merged into one. Signed-off-by: Vicent Marti <tanoku@gmail.com>
This commit is contained in:
parent
d80e9d55aa
commit
6fd195d76c
@ -53,6 +53,13 @@ int gitfo_write(git_file fd, void *buf, size_t cnt)
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
int gitfo_isdir(const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
return (path && gitfo_stat(path, &st) == 0 && S_ISDIR(st.st_mode)) ?
|
||||
GIT_SUCCESS : GIT_ENOTFOUND;
|
||||
}
|
||||
|
||||
int gitfo_exists(const char *path)
|
||||
{
|
||||
return access(path, F_OK);
|
||||
|
@ -57,6 +57,7 @@ typedef struct { /* file io buffer */
|
||||
extern int gitfo_exists(const char *path);
|
||||
extern int gitfo_open(const char *path, int flags);
|
||||
extern int gitfo_creat(const char *path, int mode);
|
||||
extern int gitfo_isdir(const char *path);
|
||||
#define gitfo_close(fd) close(fd)
|
||||
|
||||
extern int gitfo_read(git_file fd, void *buf, size_t cnt);
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef INCLUDE_git_index_h__
|
||||
#define INCLUDE_git_index_h__
|
||||
|
||||
#include <stdint.h>
|
||||
#include "common.h"
|
||||
#include "oid.h"
|
||||
|
||||
@ -16,18 +17,50 @@ GIT_BEGIN_DECL
|
||||
/** Memory representation of an index file. */
|
||||
typedef struct git_index git_index;
|
||||
|
||||
|
||||
/** Time used in a git index entry */
|
||||
typedef struct {
|
||||
uint32_t seconds;
|
||||
uint32_t nanoseconds;
|
||||
} git_index_time;
|
||||
|
||||
/** Memory representation of a file entry in the index. */
|
||||
typedef struct git_index_entry git_index_entry;
|
||||
typedef struct git_index_entry {
|
||||
git_index_time ctime;
|
||||
git_index_time mtime;
|
||||
|
||||
uint32_t dev;
|
||||
uint32_t ino;
|
||||
uint32_t mode;
|
||||
uint32_t uid;
|
||||
uint32_t gid;
|
||||
uint32_t file_size;
|
||||
|
||||
git_oid oid;
|
||||
|
||||
uint16_t flags;
|
||||
uint16_t flags_extended;
|
||||
|
||||
char *path;
|
||||
} git_index_entry;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new Git index object as a memory representation
|
||||
* of the Git index file in 'index_path'.
|
||||
*
|
||||
* The argument 'working_dir' is the root path of the indexed
|
||||
* files in the index and is used to calculate the relative path
|
||||
* when inserting new entries from existing files on disk.
|
||||
*
|
||||
* If 'working _dir' is NULL (e.g for bare repositories), the
|
||||
* methods working on on-disk files will fail.
|
||||
*
|
||||
* @param index_path the path to the index file in disk
|
||||
* @param working_dir working dir for the git repository
|
||||
* @return the index object; NULL if the index could not be created
|
||||
*/
|
||||
GIT_EXTERN(git_index *) git_index_alloc(const char *index_path);
|
||||
GIT_EXTERN(git_index *) git_index_alloc(const char *index_path, const char *working_dir);
|
||||
|
||||
/**
|
||||
* Clear the contents (all the entries) of an index object.
|
||||
@ -83,6 +116,19 @@ GIT_EXTERN(int) git_index_find(git_index *index, const char *path);
|
||||
*/
|
||||
GIT_EXTERN(int) git_index_add(git_index *index, const char *path, int stage);
|
||||
|
||||
/**
|
||||
* Get a pointer to one of the entries in the index
|
||||
*
|
||||
* This entry can be modified, and the changes will be written
|
||||
* back to disk on the next write() call.
|
||||
*
|
||||
* @param index an existing index object
|
||||
* @param n the position of the entry
|
||||
* @return a pointer to the entry; NULL if out of bounds
|
||||
*/
|
||||
GIT_EXTERN(git_index_entry *) git_index_get(git_index *index, int n);
|
||||
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
#endif
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "common.h"
|
||||
#include "odb.h"
|
||||
#include "commit.h"
|
||||
#include "index.h"
|
||||
|
||||
/**
|
||||
* @file git/repository.h
|
||||
@ -15,15 +16,28 @@
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* Allocate a new repository object.
|
||||
* Open a git repository.
|
||||
*
|
||||
* TODO: specify the repository's path instead
|
||||
* of its object database
|
||||
* The 'path' argument must point to an existing git repository
|
||||
* folder, e.g.
|
||||
*
|
||||
* @param odb an existing object database to back the repo
|
||||
* /path/to/my_repo/.git/ (normal repository)
|
||||
* objects/
|
||||
* index
|
||||
* HEAD
|
||||
*
|
||||
* /path/to/bare_repo/ (bare repository)
|
||||
* objects/
|
||||
* index
|
||||
* HEAD
|
||||
*
|
||||
* The method will automatically detect if 'path' is a normal
|
||||
* or bare repository or fail is 'path' is neither.
|
||||
*
|
||||
* @param path the path to the repository
|
||||
* @return the new repository handle; NULL on error
|
||||
*/
|
||||
GIT_EXTERN(git_repository *) git_repository_alloc(git_odb *odb);
|
||||
GIT_EXTERN(git_repository *) git_repository_open(const char *path);
|
||||
|
||||
|
||||
/**
|
||||
@ -57,6 +71,15 @@ GIT_EXTERN(git_object *) git_repository_lookup(git_repository *repo, const git_o
|
||||
*/
|
||||
GIT_EXTERN(git_odb *) git_repository_database(git_repository *repo);
|
||||
|
||||
/**
|
||||
* Get the Index file of a Git repository
|
||||
*
|
||||
* @param repo a repository object
|
||||
* @return a pointer to the Index object;
|
||||
* NULL if the index cannot be opened
|
||||
*/
|
||||
GIT_EXTERN(git_index *) git_repository_index(git_repository *rpeo);
|
||||
|
||||
/**
|
||||
* Create a new in-memory repository object with
|
||||
* the given type.
|
||||
|
18
src/index.c
18
src/index.c
@ -97,7 +97,7 @@ static int read_tree(git_index *index, const char *buffer, size_t buffer_size);
|
||||
static git_index_tree *read_tree_internal(const char **, const char *, git_index_tree *);
|
||||
|
||||
|
||||
git_index *git_index_alloc(const char *index_path)
|
||||
git_index *git_index_alloc(const char *index_path, const char *work_dir)
|
||||
{
|
||||
git_index *index;
|
||||
|
||||
@ -116,6 +116,9 @@ git_index *git_index_alloc(const char *index_path)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (work_dir != NULL)
|
||||
index->working_path = git__strdup(work_dir);
|
||||
|
||||
/* Check if index file is stored on disk already */
|
||||
if (gitfo_exists(index->index_file_path) == 0)
|
||||
index->on_disk = 1;
|
||||
@ -126,6 +129,9 @@ git_index *git_index_alloc(const char *index_path)
|
||||
void git_index_clear(git_index *index)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
assert(index);
|
||||
|
||||
for (i = 0; i < index->entry_count; ++i)
|
||||
free(index->entries[i].path);
|
||||
|
||||
@ -139,6 +145,9 @@ void git_index_clear(git_index *index)
|
||||
|
||||
void git_index_free(git_index *index)
|
||||
{
|
||||
if (index == NULL)
|
||||
return;
|
||||
|
||||
git_index_clear(index);
|
||||
free(index->entries);
|
||||
index->entries = NULL;
|
||||
@ -213,6 +222,11 @@ int git_index_write(git_index *index)
|
||||
return 0;
|
||||
}
|
||||
|
||||
git_index_entry *git_index_get(git_index *index, int n)
|
||||
{
|
||||
return (n >= 0 && (unsigned int)n < index->entry_count) ? &index->entries[n] : NULL;
|
||||
}
|
||||
|
||||
int git_index_add(git_index *index, const char *filename, int stage)
|
||||
{
|
||||
git_index_entry entry;
|
||||
@ -225,7 +239,7 @@ int git_index_add(git_index *index, const char *filename, int stage)
|
||||
if (path_length < GIT_IDXENTRY_NAMEMASK)
|
||||
entry.flags |= path_length;
|
||||
else
|
||||
entry.flags |= path_length;
|
||||
entry.flags |= GIT_IDXENTRY_NAMEMASK;;
|
||||
|
||||
if (stage < 0 || stage > 3)
|
||||
return GIT_ERROR;
|
||||
|
27
src/index.h
27
src/index.h
@ -12,31 +12,6 @@
|
||||
#define GIT_IDXENTRY_VALID (0x8000)
|
||||
#define GIT_IDXENTRY_STAGESHIFT 12
|
||||
|
||||
typedef struct {
|
||||
uint32_t seconds;
|
||||
uint32_t nanoseconds;
|
||||
} git_index_time;
|
||||
|
||||
struct git_index_entry {
|
||||
git_index_time ctime;
|
||||
git_index_time mtime;
|
||||
|
||||
uint32_t dev;
|
||||
uint32_t ino;
|
||||
uint32_t mode;
|
||||
uint32_t uid;
|
||||
uint32_t gid;
|
||||
uint32_t file_size;
|
||||
|
||||
git_oid oid;
|
||||
|
||||
uint16_t flags;
|
||||
uint16_t flags_extended;
|
||||
|
||||
char *path;
|
||||
};
|
||||
|
||||
|
||||
struct git_index_tree {
|
||||
char *name;
|
||||
|
||||
@ -53,6 +28,8 @@ typedef struct git_index_tree git_index_tree;
|
||||
struct git_index {
|
||||
|
||||
char *index_file_path;
|
||||
char *working_path;
|
||||
|
||||
time_t last_modified;
|
||||
|
||||
git_index_entry *entries;
|
||||
|
101
src/repository.c
101
src/repository.c
@ -28,6 +28,7 @@
|
||||
#include "repository.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
#include "fileops.h"
|
||||
|
||||
static const int default_table_size = 32;
|
||||
static const double max_load_factor = 0.65;
|
||||
@ -43,7 +44,7 @@ static const size_t object_sizes[] = {
|
||||
};
|
||||
|
||||
|
||||
uint32_t git_object_hash(const void *key)
|
||||
uint32_t git__objtable_hash(const void *key)
|
||||
{
|
||||
uint32_t r;
|
||||
git_oid *id;
|
||||
@ -53,7 +54,7 @@ uint32_t git_object_hash(const void *key)
|
||||
return r;
|
||||
}
|
||||
|
||||
int git_object_haskey(void *object, const void *key)
|
||||
int git__objtable_haskey(void *object, const void *key)
|
||||
{
|
||||
git_object *obj;
|
||||
git_oid *oid;
|
||||
@ -64,7 +65,62 @@ int git_object_haskey(void *object, const void *key)
|
||||
return (git_oid_cmp(oid, &obj->id) == 0);
|
||||
}
|
||||
|
||||
git_repository *git_repository_alloc(git_odb *odb)
|
||||
static int parse_repository_folders(git_repository *repo, const char *repository_path)
|
||||
{
|
||||
char path_aux[GIT_PATH_MAX];
|
||||
int path_len, i;
|
||||
|
||||
if (gitfo_isdir(repository_path) < 0)
|
||||
return GIT_ERROR;
|
||||
|
||||
path_len = strlen(repository_path);
|
||||
strcpy(path_aux, repository_path);
|
||||
|
||||
if (path_aux[path_len - 1] != '/') {
|
||||
path_aux[path_len] = '/';
|
||||
path_aux[path_len + 1] = 0;
|
||||
|
||||
path_len = path_len + 1;
|
||||
}
|
||||
|
||||
repo->path_repository = git__strdup(path_aux);
|
||||
|
||||
/* objects database */
|
||||
strcpy(path_aux + path_len, "objects/");
|
||||
if (gitfo_isdir(path_aux) < 0)
|
||||
return GIT_ERROR;
|
||||
repo->path_odb = git__strdup(path_aux);
|
||||
|
||||
/* index file */
|
||||
strcpy(path_aux + path_len, "index");
|
||||
if (gitfo_exists(path_aux) < 0)
|
||||
return GIT_ERROR;
|
||||
repo->path_index = git__strdup(path_aux);
|
||||
|
||||
/* HEAD file */
|
||||
strcpy(path_aux + path_len, "HEAD");
|
||||
if (gitfo_exists(path_aux) < 0)
|
||||
return GIT_ERROR;
|
||||
|
||||
i = path_len - 2;
|
||||
while (path_aux[i] != '/')
|
||||
i--;
|
||||
|
||||
if (strcmp(path_aux, "/.git/") == 0) {
|
||||
repo->is_bare = 0;
|
||||
|
||||
path_aux[i + 1] = 0;
|
||||
repo->path_workdir = git__strdup(path_aux);
|
||||
|
||||
} else {
|
||||
repo->is_bare = 1;
|
||||
repo->path_workdir = NULL;
|
||||
}
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
git_repository *git_repository__alloc()
|
||||
{
|
||||
git_repository *repo = git__malloc(sizeof(git_repository));
|
||||
if (!repo)
|
||||
@ -74,15 +130,30 @@ git_repository *git_repository_alloc(git_odb *odb)
|
||||
|
||||
repo->objects = git_hashtable_alloc(
|
||||
default_table_size,
|
||||
git_object_hash,
|
||||
git_object_haskey);
|
||||
git__objtable_hash,
|
||||
git__objtable_haskey);
|
||||
|
||||
if (repo->objects == NULL) {
|
||||
free(repo);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
repo->db = odb; /* TODO: create ODB manually! */
|
||||
return repo;
|
||||
}
|
||||
|
||||
git_repository *git_repository_open(const char *path)
|
||||
{
|
||||
git_repository *repo;
|
||||
|
||||
repo = git_repository__alloc();
|
||||
if (repo == NULL)
|
||||
return NULL;
|
||||
|
||||
if (parse_repository_folders(repo, path) < 0 ||
|
||||
git_odb_open(&repo->db, repo->path_odb) < 0) {
|
||||
git_repository_free(repo);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return repo;
|
||||
}
|
||||
@ -92,6 +163,11 @@ void git_repository_free(git_repository *repo)
|
||||
git_hashtable_iterator it;
|
||||
git_object *object;
|
||||
|
||||
free(repo->path_workdir);
|
||||
free(repo->path_index);
|
||||
free(repo->path_repository);
|
||||
free(repo->path_odb);
|
||||
|
||||
git_hashtable_iterator_init(repo->objects, &it);
|
||||
|
||||
while ((object = (git_object *)
|
||||
@ -99,10 +175,21 @@ void git_repository_free(git_repository *repo)
|
||||
git_object_free(object);
|
||||
|
||||
git_hashtable_free(repo->objects);
|
||||
/* TODO: free odb */
|
||||
git_odb_close(repo->db);
|
||||
git_index_free(repo->index);
|
||||
free(repo);
|
||||
}
|
||||
|
||||
git_index *git_repository_index(git_repository *repo)
|
||||
{
|
||||
if (repo->index == NULL) {
|
||||
repo->index = git_index_alloc(repo->path_index, repo->path_workdir);
|
||||
assert(repo->index && repo->index->on_disk);
|
||||
}
|
||||
|
||||
return repo->index;
|
||||
}
|
||||
|
||||
static int source_resize(git_odb_source *src)
|
||||
{
|
||||
size_t write_offset, new_size;
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "git/repository.h"
|
||||
|
||||
#include "hashtable.h"
|
||||
#include "index.h"
|
||||
|
||||
typedef struct {
|
||||
git_rawobj raw;
|
||||
@ -24,7 +25,15 @@ struct git_object {
|
||||
|
||||
struct git_repository {
|
||||
git_odb *db;
|
||||
git_index *index;
|
||||
git_hashtable *objects;
|
||||
|
||||
char *path_repository;
|
||||
char *path_index;
|
||||
char *path_odb;
|
||||
char *path_workdir;
|
||||
|
||||
unsigned is_bare:1;
|
||||
};
|
||||
|
||||
|
||||
|
Binary file not shown.
0
tests/resources/testrepo.git/HEAD
Normal file
0
tests/resources/testrepo.git/HEAD
Normal file
@ -2,8 +2,6 @@
|
||||
#include "test_helpers.h"
|
||||
#include <git/odb.h>
|
||||
|
||||
#define ODB_FOLDER "../resources/pack-odb"
|
||||
|
||||
static const char *packed_objects[] = {
|
||||
"0266163a49e280c4f5ed1e08facd36a2bd716bcf",
|
||||
"53fc32d17276939fc79ed05badaef2db09990016",
|
||||
|
@ -2,9 +2,6 @@
|
||||
#include "test_helpers.h"
|
||||
#include <git/odb.h>
|
||||
|
||||
#define PACK_ODB_FOLDER "../resources/pack-odb"
|
||||
#define LOOSE_ODB_FOLDER "../resources/sample-odb"
|
||||
|
||||
static const char *packed_objects[] = {
|
||||
"0266163a49e280c4f5ed1e08facd36a2bd716bcf",
|
||||
"53fc32d17276939fc79ed05badaef2db09990016",
|
||||
@ -161,7 +158,7 @@ BEGIN_TEST(readheader_packed_test)
|
||||
unsigned int i;
|
||||
git_odb *db;
|
||||
|
||||
must_pass(git_odb_open(&db, PACK_ODB_FOLDER));
|
||||
must_pass(git_odb_open(&db, ODB_FOLDER));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(packed_objects); ++i) {
|
||||
git_oid id;
|
||||
@ -186,7 +183,7 @@ BEGIN_TEST(readheader_loose_test)
|
||||
unsigned int i;
|
||||
git_odb *db;
|
||||
|
||||
must_pass(git_odb_open(&db, LOOSE_ODB_FOLDER));
|
||||
must_pass(git_odb_open(&db, ODB_FOLDER));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(loose_objects); ++i) {
|
||||
git_oid id;
|
||||
|
@ -6,8 +6,6 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/pack-odb";
|
||||
|
||||
static char *test_commits_broken[] = {
|
||||
|
||||
/* empty commit */
|
||||
@ -225,11 +223,8 @@ BEGIN_TEST(parse_buffer_test)
|
||||
|
||||
int i;
|
||||
git_repository *repo;
|
||||
git_odb *db;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
for (i = 0; i < broken_commit_count; ++i) {
|
||||
@ -265,6 +260,4 @@ BEGIN_TEST(parse_buffer_test)
|
||||
}
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
|
||||
END_TEST
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/sample-odb";
|
||||
static const char *commit_ids[] = {
|
||||
"a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */
|
||||
"9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */
|
||||
@ -21,14 +20,10 @@ BEGIN_TEST(query_details_test)
|
||||
const size_t commit_count = sizeof(commit_ids) / sizeof(const char *);
|
||||
|
||||
unsigned int i;
|
||||
git_odb *db;
|
||||
git_repository *repo;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
|
||||
for (i = 0; i < commit_count; ++i) {
|
||||
git_oid id;
|
||||
@ -59,5 +54,4 @@ BEGIN_TEST(query_details_test)
|
||||
}
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/sample-odb";
|
||||
static const char *commit_ids[] = {
|
||||
"a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */
|
||||
"9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */
|
||||
@ -21,16 +20,13 @@ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
|
||||
#define COMMITTER_EMAIL "vicent@github.com"
|
||||
|
||||
BEGIN_TEST(writenew_test)
|
||||
git_odb *db;
|
||||
git_repository *repo;
|
||||
git_commit *commit, *parent;
|
||||
git_tree *tree;
|
||||
git_oid id;
|
||||
/* char hex_oid[41]; */
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
/* Create commit in memory */
|
||||
@ -71,27 +67,22 @@ This is a commit created in memory and it will be written back to disk\n");
|
||||
printf("Written new commit, SHA1: %s\n", hex_oid);
|
||||
*/
|
||||
|
||||
must_pass(remove_loose_object(odb_dir, (git_object *)commit));
|
||||
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
|
||||
|
||||
//git_person_free(&author);
|
||||
//git_person_free(&committer);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(writeback_test)
|
||||
git_odb *db;
|
||||
git_repository *repo;
|
||||
git_oid id;
|
||||
git_commit *commit, *parent;
|
||||
const char *message;
|
||||
/* char hex_oid[41]; */
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id, commit_ids[0]);
|
||||
@ -123,8 +114,7 @@ BEGIN_TEST(writeback_test)
|
||||
printf("New SHA1: %s\n", hex_oid);
|
||||
*/
|
||||
|
||||
must_pass(remove_loose_object(odb_dir, (git_object *)commit));
|
||||
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/sample-odb";
|
||||
/*
|
||||
$ git log --oneline --graph --decorate
|
||||
* a4a7dce (HEAD, br2) Merge branch 'master' into br2
|
||||
@ -91,15 +90,12 @@ static int test_walk(git_revwalk *walk, git_commit *start_from,
|
||||
}
|
||||
|
||||
BEGIN_TEST(simple_walk_test)
|
||||
git_odb *db;
|
||||
git_oid id;
|
||||
git_repository *repo;
|
||||
git_revwalk *walk;
|
||||
git_commit *head = NULL;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
walk = git_revwalk_alloc(repo);
|
||||
@ -130,5 +126,4 @@ BEGIN_TEST(simple_walk_test)
|
||||
|
||||
git_revwalk_free(walk);
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <git/odb.h>
|
||||
#include <git/index.h>
|
||||
|
||||
#define TEST_INDEX_PATH "../resources/index"
|
||||
#define TEST_INDEX_PATH "../resources/testrepo.git/index"
|
||||
#define TEST_INDEX2_PATH "../resources/gitgit.index"
|
||||
|
||||
#define TEST_INDEX_ENTRY_COUNT 109
|
||||
@ -29,7 +29,7 @@ struct test_entry TEST_ENTRIES[] = {
|
||||
BEGIN_TEST(index_loadempty_test)
|
||||
git_index *index;
|
||||
|
||||
index = git_index_alloc("in-memory-index");
|
||||
index = git_index_alloc("in-memory-index", NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_be_true(index->on_disk == 0);
|
||||
|
||||
@ -46,7 +46,7 @@ BEGIN_TEST(index_load_test)
|
||||
git_index *index;
|
||||
unsigned int i;
|
||||
|
||||
index = git_index_alloc(TEST_INDEX_PATH);
|
||||
index = git_index_alloc(TEST_INDEX_PATH, NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_be_true(index->on_disk);
|
||||
|
||||
@ -70,7 +70,7 @@ END_TEST
|
||||
BEGIN_TEST(index2_load_test)
|
||||
git_index *index;
|
||||
|
||||
index = git_index_alloc(TEST_INDEX2_PATH);
|
||||
index = git_index_alloc(TEST_INDEX2_PATH, NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_be_true(index->on_disk);
|
||||
|
||||
@ -88,7 +88,7 @@ BEGIN_TEST(index_find_test)
|
||||
git_index *index;
|
||||
unsigned int i;
|
||||
|
||||
index = git_index_alloc(TEST_INDEX_PATH);
|
||||
index = git_index_alloc(TEST_INDEX_PATH, NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_pass(git_index_read(index));
|
||||
|
||||
@ -104,7 +104,7 @@ BEGIN_TEST(index_findempty_test)
|
||||
git_index *index;
|
||||
unsigned int i;
|
||||
|
||||
index = git_index_alloc("fake-index");
|
||||
index = git_index_alloc("fake-index", NULL);
|
||||
must_be_true(index != NULL);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) {
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <git/odb.h>
|
||||
#include <git/index.h>
|
||||
|
||||
#define TEST_INDEX_PATH "../resources/index"
|
||||
#define TEST_INDEX_PATH "../resources/testrepo.git/index"
|
||||
|
||||
int filecmp(const char *filename1, const char *filename2)
|
||||
{
|
||||
@ -35,7 +35,7 @@ BEGIN_TEST(index_load_test)
|
||||
git_index *index;
|
||||
git_filelock out_file;
|
||||
|
||||
index = git_index_alloc(TEST_INDEX_PATH);
|
||||
index = git_index_alloc(TEST_INDEX_PATH, NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_pass(git_index_read(index));
|
||||
must_be_true(index->on_disk);
|
||||
|
@ -36,7 +36,7 @@ BEGIN_TEST(index_sort_test)
|
||||
git_index *index;
|
||||
unsigned int i;
|
||||
|
||||
index = git_index_alloc(TEST_INDEX_PATH);
|
||||
index = git_index_alloc(TEST_INDEX_PATH, NULL);
|
||||
must_be_true(index != NULL);
|
||||
must_pass(git_index_read(index));
|
||||
|
||||
@ -54,7 +54,7 @@ END_TEST
|
||||
|
||||
BEGIN_TEST(index_sort_empty_test)
|
||||
git_index *index;
|
||||
index = git_index_alloc("fake-index");
|
||||
index = git_index_alloc("fake-index", NULL);
|
||||
must_be_true(index != NULL);
|
||||
|
||||
git_index__sort(index);
|
||||
|
@ -6,21 +6,17 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/tag.h>
|
||||
|
||||
static const char *odb_dir = "../resources/pack-odb";
|
||||
static const char *tag1_id = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1";
|
||||
static const char *tag2_id = "7b4384978d2493e851f9cca7858815fac9b10980";
|
||||
static const char *tagged_commit = "e90810b8df3e80c413d903f631643c716887138d";
|
||||
|
||||
BEGIN_TEST(readtag)
|
||||
git_odb *db;
|
||||
git_repository *repo;
|
||||
git_tag *tag1, *tag2;
|
||||
git_commit *commit;
|
||||
git_oid id1, id2, id_commit;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id1, tag1_id);
|
||||
@ -44,5 +40,4 @@ BEGIN_TEST(readtag)
|
||||
must_be_true(git_oid_cmp(&id_commit, git_commit_id(commit)) == 0);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -6,19 +6,15 @@
|
||||
#include <git/tag.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/pack-odb";
|
||||
static const char *tag_id = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1";
|
||||
|
||||
BEGIN_TEST(tag_writeback_test)
|
||||
git_odb *db;
|
||||
git_oid id;
|
||||
git_repository *repo;
|
||||
git_tag *tag;
|
||||
/* char hex_oid[41]; */
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id, tag_id);
|
||||
@ -36,8 +32,7 @@ BEGIN_TEST(tag_writeback_test)
|
||||
printf("TAG New SHA1: %s\n", hex_oid);
|
||||
*/
|
||||
|
||||
must_pass(remove_loose_object(odb_dir, (git_object *)tag));
|
||||
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)tag));
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -6,18 +6,14 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/sample-odb";
|
||||
static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
|
||||
|
||||
BEGIN_TEST(tree_entry_access_test)
|
||||
git_odb *db;
|
||||
git_oid id;
|
||||
git_repository *repo;
|
||||
git_tree *tree;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id, tree_oid);
|
||||
@ -34,19 +30,15 @@ BEGIN_TEST(tree_entry_access_test)
|
||||
must_be_true(git_tree_entry_byindex(tree, -1) == NULL);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(tree_read_test)
|
||||
git_odb *db;
|
||||
git_oid id;
|
||||
git_repository *repo;
|
||||
git_tree *tree;
|
||||
git_tree_entry *entry;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id, tree_oid);
|
||||
@ -61,9 +53,7 @@ BEGIN_TEST(tree_read_test)
|
||||
|
||||
must_be_true(strcmp(git_tree_entry_name(entry), "README") == 0);
|
||||
|
||||
|
||||
must_be_true(git_tree_entry_2object(entry) != NULL);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -6,22 +6,17 @@
|
||||
#include <git/commit.h>
|
||||
#include <git/revwalk.h>
|
||||
|
||||
static const char *odb_dir = "../resources/sample-odb";
|
||||
static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
|
||||
|
||||
BEGIN_TEST(tree_in_memory_add_test)
|
||||
const unsigned int entry_count = 128;
|
||||
|
||||
|
||||
git_odb *db;
|
||||
git_repository *repo;
|
||||
git_tree *tree;
|
||||
unsigned int i;
|
||||
git_oid entry_id;
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
tree = git_tree_new(repo);
|
||||
@ -36,16 +31,14 @@ BEGIN_TEST(tree_in_memory_add_test)
|
||||
|
||||
must_be_true(git_tree_entrycount(tree) == entry_count);
|
||||
must_pass(git_object_write((git_object *)tree));
|
||||
must_pass(remove_loose_object(odb_dir, (git_object *)tree));
|
||||
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)tree));
|
||||
|
||||
git_object_free((git_object *)tree);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(tree_add_entry_test)
|
||||
git_odb *db;
|
||||
git_oid id;
|
||||
git_repository *repo;
|
||||
git_tree *tree;
|
||||
@ -53,9 +46,7 @@ BEGIN_TEST(tree_add_entry_test)
|
||||
unsigned int i;
|
||||
/* char hex_oid[41]; */
|
||||
|
||||
must_pass(git_odb_open(&db, odb_dir));
|
||||
|
||||
repo = git_repository_alloc(db);
|
||||
repo = git_repository_open(REPOSITORY_FOLDER);
|
||||
must_be_true(repo != NULL);
|
||||
|
||||
git_oid_mkstr(&id, tree_oid);
|
||||
@ -92,10 +83,7 @@ BEGIN_TEST(tree_add_entry_test)
|
||||
printf("TREE New SHA1: %s\n", hex_oid);
|
||||
*/
|
||||
|
||||
must_pass(remove_loose_object(odb_dir, (git_object *)tree));
|
||||
|
||||
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)tree));
|
||||
git_object_free((git_object *)tree);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_odb_close(db);
|
||||
END_TEST
|
||||
|
@ -84,18 +84,23 @@ int remove_object_files(const char *odb_dir, object_data *d)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int remove_loose_object(const char *odb_dir, git_object *object)
|
||||
int remove_loose_object(const char *repository_folder, git_object *object)
|
||||
{
|
||||
static const char *objects_folder = "objects/";
|
||||
|
||||
char *ptr, *full_path, *top_folder;
|
||||
int path_length;
|
||||
int path_length, objects_length;
|
||||
|
||||
assert(odb_dir && object);
|
||||
assert(repository_folder && object);
|
||||
|
||||
path_length = strlen(odb_dir);
|
||||
ptr = full_path = git__malloc(path_length + GIT_OID_HEXSZ + 3);
|
||||
objects_length = strlen(objects_folder);
|
||||
path_length = strlen(repository_folder);
|
||||
ptr = full_path = git__malloc(path_length + objects_length + GIT_OID_HEXSZ + 3);
|
||||
|
||||
strcpy(ptr, odb_dir);
|
||||
ptr = top_folder = ptr + path_length;
|
||||
strcpy(ptr, repository_folder);
|
||||
strcpy(ptr + path_length, objects_folder);
|
||||
|
||||
ptr = top_folder = ptr + path_length + objects_length;
|
||||
*ptr++ = '/';
|
||||
git_oid_pathfmt(ptr, git_object_id(object));
|
||||
ptr += GIT_OID_HEXSZ + 1;
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include "test_lib.h"
|
||||
#include <git/odb.h>
|
||||
|
||||
#define ODB_FOLDER "../resources/testrepo.git/objects/"
|
||||
#define REPOSITORY_FOLDER "../resources/testrepo.git/"
|
||||
|
||||
typedef struct object_data {
|
||||
unsigned char *bytes; /* (compressed) bytes stored in object store */
|
||||
|
Loading…
Reference in New Issue
Block a user