Commit ca8d2dfc by Carlos Martín Nieto

Merge remote-tracking branch 'upstream/development' into config

parents 094aaaae cc3b82e3
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#define LIBGIT2_VERSION "0.11.0" #define LIBGIT2_VERSION "0.11.0"
#define LIBGIT2_VER_MAJOR 0 #define LIBGIT2_VER_MAJOR 0
#define LIBGIT2_VER_MINOR 10 #define LIBGIT2_VER_MINOR 11
#define LIBGIT2_VER_REVISION 0 #define LIBGIT2_VER_REVISION 0
#include "git2/common.h" #include "git2/common.h"
......
...@@ -51,39 +51,29 @@ GIT_BEGIN_DECL ...@@ -51,39 +51,29 @@ GIT_BEGIN_DECL
* *
* In-memory only flags: * In-memory only flags:
*/ */
#define GIT_IDXENTRY_UPDATE (1 << 16) #define GIT_IDXENTRY_UPDATE (1 << 0)
#define GIT_IDXENTRY_REMOVE (1 << 17) #define GIT_IDXENTRY_REMOVE (1 << 1)
#define GIT_IDXENTRY_UPTODATE (1 << 18) #define GIT_IDXENTRY_UPTODATE (1 << 2)
#define GIT_IDXENTRY_ADDED (1 << 19) #define GIT_IDXENTRY_ADDED (1 << 3)
#define GIT_IDXENTRY_HASHED (1 << 20) #define GIT_IDXENTRY_HASHED (1 << 4)
#define GIT_IDXENTRY_UNHASHED (1 << 21) #define GIT_IDXENTRY_UNHASHED (1 << 5)
#define GIT_IDXENTRY_WT_REMOVE (1 << 22) /* remove in work directory */ #define GIT_IDXENTRY_WT_REMOVE (1 << 6) /* remove in work directory */
#define GIT_IDXENTRY_CONFLICTED (1 << 23) #define GIT_IDXENTRY_CONFLICTED (1 << 7)
#define GIT_IDXENTRY_UNPACKED (1 << 24) #define GIT_IDXENTRY_UNPACKED (1 << 8)
#define GIT_IDXENTRY_NEW_SKIP_WORKTREE (1 << 25) #define GIT_IDXENTRY_NEW_SKIP_WORKTREE (1 << 9)
/* /*
* Extended on-disk flags: * Extended on-disk flags:
*/ */
#define GIT_IDXENTRY_INTENT_TO_ADD (1 << 29) #define GIT_IDXENTRY_INTENT_TO_ADD (1 << 13)
#define GIT_IDXENTRY_SKIP_WORKTREE (1 << 30) #define GIT_IDXENTRY_SKIP_WORKTREE (1 << 14)
/* GIT_IDXENTRY_EXTENDED2 is for future extension */ /* GIT_IDXENTRY_EXTENDED2 is for future extension */
#define GIT_IDXENTRY_EXTENDED2 (1 << 31) #define GIT_IDXENTRY_EXTENDED2 (1 << 15)
#define GIT_IDXENTRY_EXTENDED_FLAGS (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE) #define GIT_IDXENTRY_EXTENDED_FLAGS (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE)
/*
* Safeguard to avoid saving wrong flags:
* - GIT_IDXENTRY_EXTENDED2 won't get saved until its semantic is known
* - Bits in 0x0000FFFF have been saved in flags already
* - Bits in 0x003F0000 are currently in-memory flags
*/
#if GIT_IDXENTRY_EXTENDED_FLAGS & 0x803FFFFF
#error "GIT_IDXENTRY_EXTENDED_FLAGS out of range"
#endif
/** Time used in a git index entry */ /** Time used in a git index entry */
typedef struct { typedef struct {
git_time_t seconds; git_time_t seconds;
...@@ -182,7 +172,12 @@ GIT_EXTERN(int) git_index_write(git_index *index); ...@@ -182,7 +172,12 @@ GIT_EXTERN(int) git_index_write(git_index *index);
GIT_EXTERN(int) git_index_find(git_index *index, const char *path); GIT_EXTERN(int) git_index_find(git_index *index, const char *path);
/** /**
* Add or update an index entry from a file in disk. * Add or update an index entry from a file in disk
*
* The file `path` must be relative to the repository's
* working folder and must be readable.
*
* This method will fail in bare index instances.
* *
* @param index an existing index object * @param index an existing index object
* @param path filename to add * @param path filename to add
...@@ -192,26 +187,62 @@ GIT_EXTERN(int) git_index_find(git_index *index, const char *path); ...@@ -192,26 +187,62 @@ 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); GIT_EXTERN(int) git_index_add(git_index *index, const char *path, int stage);
/** /**
* Remove an entry from the index * Add or update an index entry from an in-memory struct
*
* A full copy (including the 'path' string) of the given
* 'source_entry' will be inserted on the index.
* *
* @param index an existing index object * @param index an existing index object
* @param position position of the entry to remove * @param source_entry new entry object
* @return 0 on success, otherwise an error code * @return 0 on success, otherwise an error code
*/ */
GIT_EXTERN(int) git_index_remove(git_index *index, int position); GIT_EXTERN(int) git_index_add2(git_index *index, const git_index_entry *source_entry);
/** /**
* Insert an entry into the index. * Add (append) an index entry from a file in disk
*
* A new entry will always be inserted into the index;
* if the index already contains an entry for such
* path, the old entry will **not** be replaced.
*
* The file `path` must be relative to the repository's
* working folder and must be readable.
*
* This method will fail in bare index instances.
*
* @param index an existing index object
* @param path filename to add
* @param stage stage for the entry
* @return 0 on success, otherwise an error code
*/
GIT_EXTERN(int) git_index_append(git_index *index, const char *path, int stage);
/**
* Add (append) an index entry from an in-memory struct
*
* A new entry will always be inserted into the index;
* if the index already contains an entry for the path
* in the `entry` struct, the old entry will **not** be
* replaced.
*
* A full copy (including the 'path' string) of the given * A full copy (including the 'path' string) of the given
* 'source_entry' will be inserted on the index; if the index * 'source_entry' will be inserted on the index.
* already contains an entry for the same path, the entry
* will be updated.
* *
* @param index an existing index object * @param index an existing index object
* @param source_entry new entry object * @param source_entry new entry object
* @return 0 on success, otherwise an error code * @return 0 on success, otherwise an error code
*/ */
GIT_EXTERN(int) git_index_insert(git_index *index, const git_index_entry *source_entry); GIT_EXTERN(int) git_index_apppend2(git_index *index, const git_index_entry *source_entry);
/**
* Remove an entry from the index
*
* @param index an existing index object
* @param position position of the entry to remove
* @return 0 on success, otherwise an error code
*/
GIT_EXTERN(int) git_index_remove(git_index *index, int position);
/** /**
* Get a pointer to one of the entries in the index * Get a pointer to one of the entries in the index
......
...@@ -275,6 +275,23 @@ GIT_EXTERN(int) git_tag_delete( ...@@ -275,6 +275,23 @@ GIT_EXTERN(int) git_tag_delete(
git_repository *repo, git_repository *repo,
const char *tag_name); const char *tag_name);
/**
* Fill a list with all the tags in the Repository
*
* The string array will be filled with the names of the
* matching tags; these values are owned by the user and
* should be free'd manually when no longer needed, using
* `git_strarray_free`.
*
* @param array Pointer to a git_strarray structure where
* the tag names will be stored
* @param repo Repository where to find the tags
* @return 0 on success; error code otherwise
*/
GIT_EXTERN(int) git_tag_list(
git_strarray *tag_names,
git_repository *repo);
/** @} */ /** @} */
GIT_END_DECL GIT_END_DECL
#endif #endif
...@@ -115,6 +115,7 @@ int git_blob_create_fromfile(git_oid *oid, git_repository *repo, const char *pat ...@@ -115,6 +115,7 @@ int git_blob_create_fromfile(git_oid *oid, git_repository *repo, const char *pat
error = stream->finalize_write(oid, stream); error = stream->finalize_write(oid, stream);
stream->free(stream); stream->free(stream);
gitfo_close(fd);
return error; return error;
} }
......
...@@ -224,9 +224,18 @@ int git_commit_create( ...@@ -224,9 +224,18 @@ int git_commit_create(
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return error;
if (git_reference_type(head) == GIT_REF_SYMBOLIC) { error = git_reference_resolve(&head, head);
if ((error = git_reference_resolve(&head, head)) < GIT_SUCCESS) if (error < GIT_SUCCESS) {
if (error != GIT_ENOTFOUND)
return error; return error;
/*
* The target of the reference was not found. This can happen
* just after a repository has been initialized (the master
* branch doesn't exist yet, as it doesn't have anything to
* point to) or after an orphan checkout, so if the target
* branch doesn't exist yet, create it and return.
*/
return git_reference_create_oid_f(&head, repo, git_reference_target(head), oid);
} }
error = git_reference_set_oid(head, oid); error = git_reference_set_oid(head, oid);
......
...@@ -101,6 +101,7 @@ static int read_tree(git_index *index, const char *buffer, size_t buffer_size); ...@@ -101,6 +101,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 *); static git_index_tree *read_tree_internal(const char **, const char *, git_index_tree *);
static int parse_index(git_index *index, const char *buffer, size_t buffer_size); static int parse_index(git_index *index, const char *buffer, size_t buffer_size);
static int is_index_extended(git_index *index);
static void sort_index(git_index *index); static void sort_index(git_index *index);
static int write_index(git_index *index, git_filebuf *file); static int write_index(git_index *index, git_filebuf *file);
...@@ -289,56 +290,12 @@ git_index_entry *git_index_get(git_index *index, int n) ...@@ -289,56 +290,12 @@ git_index_entry *git_index_get(git_index *index, int n)
return git_vector_get(&index->entries, (unsigned int)n); return git_vector_get(&index->entries, (unsigned int)n);
} }
int git_index_add(git_index *index, const char *rel_path, int stage) static void sort_index(git_index *index)
{
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);
}
void sort_index(git_index *index)
{ {
git_vector_sort(&index->entries); git_vector_sort(&index->entries);
} }
int git_index_insert(git_index *index, const git_index_entry *source_entry) static int index_insert(git_index *index, const git_index_entry *source_entry, int replace)
{ {
git_index_entry *entry; git_index_entry *entry;
size_t path_length; size_t path_length;
...@@ -374,13 +331,15 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry) ...@@ -374,13 +331,15 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry)
/* look if an entry with this path already exists */ /* look if an entry with this path already exists */
position = git_index_find(index, source_entry->path); position = git_index_find(index, source_entry->path);
/* if no entry exists, add the entry at the end; /* if no entry exists and replace is not set,
* add the entry at the end;
* the index is no longer sorted */ * the index is no longer sorted */
if (position == GIT_ENOTFOUND) { if (!replace || position == GIT_ENOTFOUND) {
if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS) if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS)
return GIT_ENOMEM; return GIT_ENOMEM;
/* if a previous entry exists, replace it */ /* if a previous entry exists and replace is set,
* replace it */
} else { } else {
git_index_entry **entry_array = (git_index_entry **)index->entries.contents; git_index_entry **entry_array = (git_index_entry **)index->entries.contents;
...@@ -393,6 +352,81 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry) ...@@ -393,6 +352,81 @@ int git_index_insert(git_index *index, const git_index_entry *source_entry)
return GIT_SUCCESS; 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) int git_index_remove(git_index *index, int position)
{ {
assert(index); assert(index);
...@@ -685,6 +719,24 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size) ...@@ -685,6 +719,24 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
return GIT_SUCCESS; return GIT_SUCCESS;
} }
static int is_index_extended(git_index *index)
{
unsigned int i, extended;
extended = 0;
for (i = 0; i < index->entries.length; ++i) {
git_index_entry *entry;
entry = git_vector_get(&index->entries, i);
entry->flags &= ~GIT_IDXENTRY_EXTENDED;
if (entry->flags_extended & GIT_IDXENTRY_EXTENDED_FLAGS) {
extended++;
entry->flags |= GIT_IDXENTRY_EXTENDED;
}
}
return extended;
}
static int write_disk_entry(git_filebuf *file, git_index_entry *entry) static int write_disk_entry(git_filebuf *file, git_index_entry *entry)
{ {
struct entry_short *ondisk; struct entry_short *ondisk;
...@@ -753,12 +805,14 @@ static int write_index(git_index *index, git_filebuf *file) ...@@ -753,12 +805,14 @@ static int write_index(git_index *index, git_filebuf *file)
struct index_header header; struct index_header header;
int is_extended = 1; int is_extended;
assert(index && file); assert(index && file);
is_extended = is_index_extended(index);
header.signature = htonl(INDEX_HEADER_SIG); header.signature = htonl(INDEX_HEADER_SIG);
header.version = htonl(is_extended ? INDEX_VERSION_NUMBER : INDEX_VERSION_NUMBER_EXT); header.version = htonl(is_extended ? INDEX_VERSION_NUMBER_EXT : INDEX_VERSION_NUMBER);
header.entry_count = htonl(index->entries.length); header.entry_count = htonl(index->entries.length);
git_filebuf_write(file, &header, sizeof(struct index_header)); git_filebuf_write(file, &header, sizeof(struct index_header));
......
...@@ -434,6 +434,9 @@ static int read_header_loose(git_rawobj *out, const char *loc) ...@@ -434,6 +434,9 @@ static int read_header_loose(git_rawobj *out, const char *loc)
if ((read_bytes = read(fd, raw_buffer, sizeof(raw_buffer))) > 0) { if ((read_bytes = read(fd, raw_buffer, sizeof(raw_buffer))) > 0) {
set_stream_input(&zs, raw_buffer, read_bytes); set_stream_input(&zs, raw_buffer, read_bytes);
z_return = inflate(&zs, 0); z_return = inflate(&zs, 0);
} else {
z_return = Z_STREAM_END;
break;
} }
} while (z_return == Z_OK); } while (z_return == Z_OK);
......
...@@ -108,15 +108,12 @@ struct pack_entry { ...@@ -108,15 +108,12 @@ struct pack_entry {
struct pack_file *p; struct pack_file *p;
}; };
struct pack__dirent {
struct pack_backend *backend;
int is_pack_local;
};
struct pack_backend { struct pack_backend {
git_odb_backend parent; git_odb_backend parent;
git_vector packs; git_vector packs;
struct pack_file *last_found; struct pack_file *last_found;
char *pack_folder;
time_t pack_folder_mtime;
size_t window_size; /* needs default value */ size_t window_size; /* needs default value */
...@@ -259,9 +256,9 @@ static int pack_index_open(struct pack_file *p); ...@@ -259,9 +256,9 @@ static int pack_index_open(struct pack_file *p);
static struct pack_file *packfile_alloc(int extra); static struct pack_file *packfile_alloc(int extra);
static int packfile_open(struct pack_file *p); static int packfile_open(struct pack_file *p);
static int packfile_check(struct pack_file **pack_out, const char *path, int local); static int packfile_check(struct pack_file **pack_out, const char *path);
static int packfile_load__cb(void *_data, char *path); static int packfile_load__cb(void *_data, char *path);
static int packfile_load_all(struct pack_backend *backend, const char *odb_path, int local); static int packfile_refresh_all(struct pack_backend *backend);
static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n); static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n);
...@@ -790,7 +787,7 @@ cleanup: ...@@ -790,7 +787,7 @@ cleanup:
return GIT_EPACKCORRUPTED; return GIT_EPACKCORRUPTED;
} }
static int packfile_check(struct pack_file **pack_out, const char *path, int local) static int packfile_check(struct pack_file **pack_out, const char *path)
{ {
struct stat st; struct stat st;
struct pack_file *p; struct pack_file *p;
...@@ -826,7 +823,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path, int loc ...@@ -826,7 +823,7 @@ static int packfile_check(struct pack_file **pack_out, const char *path, int loc
* actually mapping the pack file. * actually mapping the pack file.
*/ */
p->pack_size = (off_t)st.st_size; p->pack_size = (off_t)st.st_size;
p->pack_local = local; p->pack_local = 1;
p->mtime = (git_time_t)st.st_mtime; p->mtime = (git_time_t)st.st_mtime;
/* see if we can parse the sha1 oid in the packfile name */ /* see if we can parse the sha1 oid in the packfile name */
...@@ -840,22 +837,25 @@ static int packfile_check(struct pack_file **pack_out, const char *path, int loc ...@@ -840,22 +837,25 @@ static int packfile_check(struct pack_file **pack_out, const char *path, int loc
static int packfile_load__cb(void *_data, char *path) static int packfile_load__cb(void *_data, char *path)
{ {
struct pack__dirent *data = (struct pack__dirent *)_data; struct pack_backend *backend = (struct pack_backend *)_data;
struct pack_file *pack; struct pack_file *pack;
int error; int error;
size_t i;
if (git__suffixcmp(path, ".idx") != 0) if (git__suffixcmp(path, ".idx") != 0)
return GIT_SUCCESS; /* not an index */ return GIT_SUCCESS; /* not an index */
/* FIXME: git.git checks for duplicate packs. for (i = 0; i < backend->packs.length; ++i) {
* But that makes no fucking sense. Our dirent is not struct pack_file *p = git_vector_get(&backend->packs, i);
* going to generate dupicate entries */ if (memcmp(p->pack_name, path, strlen(path) - STRLEN(".idx")) == 0)
return GIT_SUCCESS;
}
error = packfile_check(&pack, path, data->is_pack_local); error = packfile_check(&pack, path);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return error;
if (git_vector_insert(&data->backend->packs, pack) < GIT_SUCCESS) { if (git_vector_insert(&backend->packs, pack) < GIT_SUCCESS) {
free(pack); free(pack);
return GIT_ENOMEM; return GIT_ENOMEM;
} }
...@@ -863,25 +863,29 @@ static int packfile_load__cb(void *_data, char *path) ...@@ -863,25 +863,29 @@ static int packfile_load__cb(void *_data, char *path)
return GIT_SUCCESS; return GIT_SUCCESS;
} }
static int packfile_load_all(struct pack_backend *backend, const char *odb_path, int local) static int packfile_refresh_all(struct pack_backend *backend)
{ {
int error; int error;
char path[GIT_PATH_MAX]; struct stat st;
struct pack__dirent data;
data.backend = backend;
data.is_pack_local = local;
git__joinpath(path, odb_path, "pack"); if (backend->pack_folder == NULL)
if (gitfo_isdir(path) < GIT_SUCCESS)
return GIT_SUCCESS; return GIT_SUCCESS;
error = gitfo_dirent(path, GIT_PATH_MAX, packfile_load__cb, (void *)&data); if (gitfo_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode))
if (error < GIT_SUCCESS) return GIT_ENOTFOUND;
return error;
git_vector_sort(&backend->packs); if (st.st_mtime != backend->pack_folder_mtime) {
backend->last_found = git_vector_get(&backend->packs, 0); char path[GIT_PATH_MAX];
strcpy(path, backend->pack_folder);
/* reload all packs */
error = gitfo_dirent(path, GIT_PATH_MAX, packfile_load__cb, (void *)backend);
if (error < GIT_SUCCESS)
return error;
git_vector_sort(&backend->packs);
backend->pack_folder_mtime = st.st_mtime;
}
return GIT_SUCCESS; return GIT_SUCCESS;
} }
...@@ -1026,8 +1030,12 @@ static int pack_entry_find1( ...@@ -1026,8 +1030,12 @@ static int pack_entry_find1(
static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, const git_oid *oid) static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, const git_oid *oid)
{ {
int error;
size_t i; size_t i;
if ((error = packfile_refresh_all(backend)) < GIT_SUCCESS)
return error;
if (backend->last_found && if (backend->last_found &&
pack_entry_find1(e, backend->last_found, oid) == GIT_SUCCESS) pack_entry_find1(e, backend->last_found, oid) == GIT_SUCCESS)
return GIT_SUCCESS; return GIT_SUCCESS;
...@@ -1377,13 +1385,14 @@ void pack_backend__free(git_odb_backend *_backend) ...@@ -1377,13 +1385,14 @@ void pack_backend__free(git_odb_backend *_backend)
} }
git_vector_free(&backend->packs); git_vector_free(&backend->packs);
free(backend->pack_folder);
free(backend); free(backend);
} }
int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir) int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir)
{ {
int error;
struct pack_backend *backend; struct pack_backend *backend;
char path[GIT_PATH_MAX];
backend = git__calloc(1, sizeof(struct pack_backend)); backend = git__calloc(1, sizeof(struct pack_backend));
if (backend == NULL) if (backend == NULL)
...@@ -1397,10 +1406,15 @@ int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir) ...@@ -1397,10 +1406,15 @@ int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir)
backend->window_size = DEFAULT_WINDOW_SIZE; backend->window_size = DEFAULT_WINDOW_SIZE;
backend->mapped_limit = DEFAULT_MAPPED_LIMIT; backend->mapped_limit = DEFAULT_MAPPED_LIMIT;
error = packfile_load_all(backend, objects_dir, 1); git__joinpath(path, objects_dir, "pack");
if (error < GIT_SUCCESS) { if (gitfo_isdir(path) == GIT_SUCCESS) {
pack_backend__free((git_odb_backend *)backend); backend->pack_folder = git__strdup(path);
return error; backend->pack_folder_mtime = 0;
if (backend->pack_folder == NULL) {
free(backend);
return GIT_ENOMEM;
}
} }
backend->parent.read = &pack_backend__read; backend->parent.read = &pack_backend__read;
......
...@@ -684,7 +684,7 @@ static int packed_loadloose(git_repository *repository) ...@@ -684,7 +684,7 @@ static int packed_loadloose(git_repository *repository)
/* Remove any loose references from the cache */ /* Remove any loose references from the cache */
{ {
const void *_unused; const void *GIT_UNUSED(_unused);
git_reference *reference; git_reference *reference;
GIT_HASHTABLE_FOREACH(repository->references.loose_cache, _unused, reference, GIT_HASHTABLE_FOREACH(repository->references.loose_cache, _unused, reference,
...@@ -787,6 +787,8 @@ static int packed_find_peel(reference_oid *ref) ...@@ -787,6 +787,8 @@ static int packed_find_peel(reference_oid *ref)
*/ */
} }
git_object_close(object);
return GIT_SUCCESS; return GIT_SUCCESS;
} }
...@@ -868,7 +870,7 @@ static int packed_write(git_repository *repo) ...@@ -868,7 +870,7 @@ static int packed_write(git_repository *repo)
/* Load all the packfile into a vector */ /* Load all the packfile into a vector */
{ {
git_reference *reference; git_reference *reference;
const void *_unused; const void *GIT_UNUSED(_unused);
GIT_HASHTABLE_FOREACH(repo->references.packfile, _unused, reference, GIT_HASHTABLE_FOREACH(repo->references.packfile, _unused, reference,
git_vector_insert(&packing_list, reference); /* cannot fail: vector already has the right size */ git_vector_insert(&packing_list, reference); /* cannot fail: vector already has the right size */
...@@ -1480,8 +1482,9 @@ int git_reference_resolve(git_reference **resolved_ref, git_reference *ref) ...@@ -1480,8 +1482,9 @@ int git_reference_resolve(git_reference **resolved_ref, git_reference *ref)
for (i = 0; i < MAX_NESTING_LEVEL; ++i) { for (i = 0; i < MAX_NESTING_LEVEL; ++i) {
reference_symbolic *ref_sym; reference_symbolic *ref_sym;
*resolved_ref = ref;
if (ref->type & GIT_REF_OID) { if (ref->type & GIT_REF_OID) {
*resolved_ref = ref;
return GIT_SUCCESS; return GIT_SUCCESS;
} }
...@@ -1518,7 +1521,7 @@ int git_reference_listcb(git_repository *repo, unsigned int list_flags, int (*ca ...@@ -1518,7 +1521,7 @@ int git_reference_listcb(git_repository *repo, unsigned int list_flags, int (*ca
/* list all the packed references first */ /* list all the packed references first */
if (list_flags & GIT_REF_PACKED) { if (list_flags & GIT_REF_PACKED) {
const char *ref_name; const char *ref_name;
void *_unused; void *GIT_UNUSED(_unused);
if ((error = packed_load(repo)) < GIT_SUCCESS) if ((error = packed_load(repo)) < GIT_SUCCESS)
return error; return error;
...@@ -1597,7 +1600,7 @@ int git_repository__refcache_init(git_refcache *refs) ...@@ -1597,7 +1600,7 @@ int git_repository__refcache_init(git_refcache *refs)
void git_repository__refcache_free(git_refcache *refs) void git_repository__refcache_free(git_refcache *refs)
{ {
git_reference *reference; git_reference *reference;
const void *_unused; const void *GIT_UNUSED(_unused);
assert(refs); assert(refs);
...@@ -1692,8 +1695,9 @@ static int normalize_name(char *buffer_out, const char *name, int is_oid_ref) ...@@ -1692,8 +1695,9 @@ static int normalize_name(char *buffer_out, const char *name, int is_oid_ref)
} }
/* Object id refname have to contain at least one slash, except /* Object id refname have to contain at least one slash, except
* for HEAD in a detached state */ * for HEAD in a detached state or MERGE_HEAD if we're in the
if (is_oid_ref && !contains_a_slash && strcmp(name, GIT_HEAD_FILE)) * middle of a merge */
if (is_oid_ref && !contains_a_slash && (strcmp(name, GIT_HEAD_FILE) && strcmp(name, GIT_MERGE_HEAD_FILE)))
return GIT_EINVALIDREFNAME; return GIT_EINVALIDREFNAME;
/* A refname can not end with ".lock" */ /* A refname can not end with ".lock" */
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#define MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH 100 #define MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH 100
#define GIT_HEAD_FILE "HEAD" #define GIT_HEAD_FILE "HEAD"
#define GIT_MERGE_HEAD_FILE "MERGE_HEAD"
#define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master" #define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master"
struct git_reference { struct git_reference {
......
...@@ -58,7 +58,6 @@ static int assign_repository_dirs( ...@@ -58,7 +58,6 @@ static int assign_repository_dirs(
const char *git_work_tree) const char *git_work_tree)
{ {
char path_aux[GIT_PATH_MAX]; char path_aux[GIT_PATH_MAX];
size_t git_dir_path_len;
int error = GIT_SUCCESS; int error = GIT_SUCCESS;
assert(repo); assert(repo);
...@@ -70,8 +69,6 @@ static int assign_repository_dirs( ...@@ -70,8 +69,6 @@ static int assign_repository_dirs(
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return error;
git_dir_path_len = strlen(path_aux);
/* store GIT_DIR */ /* store GIT_DIR */
repo->path_repository = git__strdup(path_aux); repo->path_repository = git__strdup(path_aux);
if (repo->path_repository == NULL) if (repo->path_repository == NULL)
......
...@@ -483,7 +483,7 @@ int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo) ...@@ -483,7 +483,7 @@ int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)
void git_revwalk_free(git_revwalk *walk) void git_revwalk_free(git_revwalk *walk)
{ {
unsigned int i; unsigned int i;
const void *_unused; const void *GIT_UNUSED(_unused);
commit_object *commit; commit_object *commit;
if (walk == NULL) if (walk == NULL)
...@@ -558,7 +558,7 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk) ...@@ -558,7 +558,7 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk)
void git_revwalk_reset(git_revwalk *walk) void git_revwalk_reset(git_revwalk *walk)
{ {
const void *_unused; const void *GIT_UNUSED(_unused);
commit_object *commit; commit_object *commit;
assert(walk); assert(walk);
......
...@@ -377,3 +377,29 @@ int git_tag__parse(git_tag *tag, git_odb_object *obj) ...@@ -377,3 +377,29 @@ int git_tag__parse(git_tag *tag, git_odb_object *obj)
return parse_tag_buffer(tag, obj->raw.data, (char *)obj->raw.data + obj->raw.len); return parse_tag_buffer(tag, obj->raw.data, (char *)obj->raw.data + obj->raw.len);
} }
static int tag_list_cb(const char *tag_name, void *payload)
{
if (git__prefixcmp(tag_name, GIT_REFS_TAGS_DIR) == 0)
return git_vector_insert((git_vector *)payload, git__strdup(tag_name));
return GIT_SUCCESS;
}
int git_tag_list(git_strarray *tag_names, git_repository *repo)
{
int error;
git_vector taglist;
if (git_vector_init(&taglist, 8, NULL) < GIT_SUCCESS)
return GIT_ENOMEM;
error = git_reference_listcb(repo, GIT_REF_OID|GIT_REF_PACKED, &tag_list_cb, (void *)&taglist);
if (error < GIT_SUCCESS) {
git_vector_free(&taglist);
return error;
}
tag_names->strings = (char **)taglist.contents;
tag_names->count = taglist.length;
return GIT_SUCCESS;
}
...@@ -424,7 +424,8 @@ int git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *b ...@@ -424,7 +424,8 @@ int git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *b
if (entry->removed) if (entry->removed)
continue; continue;
size += (entry->attr > 0x7FF) ? 7 : 6; snprintf(filemode, sizeof(filemode), "%o ", entry->attr);
size += strlen(filemode);
size += entry->filename_len + 1; size += entry->filename_len + 1;
size += GIT_OID_RAWSZ; size += GIT_OID_RAWSZ;
} }
......
...@@ -368,7 +368,7 @@ BEGIN_TEST(details0, "query the details on a parsed commit") ...@@ -368,7 +368,7 @@ BEGIN_TEST(details0, "query the details on a parsed commit")
const char *message, *message_short; const char *message, *message_short;
git_time_t commit_time; git_time_t commit_time;
unsigned int parents, p; unsigned int parents, p;
git_commit *parent; git_commit *parent = NULL, *old_parent = NULL;
git_oid_mkstr(&id, commit_ids[i]); git_oid_mkstr(&id, commit_ids[i]);
...@@ -390,11 +390,19 @@ BEGIN_TEST(details0, "query the details on a parsed commit") ...@@ -390,11 +390,19 @@ BEGIN_TEST(details0, "query the details on a parsed commit")
must_be_true(commit_time > 0); must_be_true(commit_time > 0);
must_be_true(parents <= 2); must_be_true(parents <= 2);
for (p = 0;p < parents;p++) { for (p = 0;p < parents;p++) {
if (old_parent != NULL)
git_commit_close(old_parent);
old_parent = parent;
must_pass(git_commit_parent(&parent, commit, p)); must_pass(git_commit_parent(&parent, commit, p));
must_be_true(parent != NULL); must_be_true(parent != NULL);
must_be_true(git_commit_author(parent) != NULL); // is it really a commit? must_be_true(git_commit_author(parent) != NULL); // is it really a commit?
} }
git_commit_close(old_parent);
git_commit_close(parent);
must_fail(git_commit_parent(&parent, commit, parents)); must_fail(git_commit_parent(&parent, commit, parents));
git_commit_close(commit);
} }
git_repository_free(repo); git_repository_free(repo);
...@@ -462,9 +470,76 @@ BEGIN_TEST(write0, "write a new commit object from memory to disk") ...@@ -462,9 +470,76 @@ BEGIN_TEST(write0, "write a new commit object from memory to disk")
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit)); must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
git_commit_close(commit);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
#define ROOT_COMMIT_MESSAGE "This is a root commit\n\
This is a root commit and should be the only one in this branch\n"
BEGIN_TEST(root0, "create a root commit")
git_repository *repo;
git_commit *commit;
git_oid tree_id, commit_id;
const git_oid *branch_oid;
const git_signature *author, *committer;
const char *branch_name = "refs/heads/root-commit-branch";
git_reference *head, *branch;
char *head_old;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
git_oid_mkstr(&tree_id, tree_oid);
/* create signatures */
committer = git_signature_new(COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60);
must_be_true(committer != NULL);
author = git_signature_new(COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90);
must_be_true(author != NULL);
/* First we need to update HEAD so it points to our non-existant branch */
must_pass(git_reference_lookup(&head, repo, "HEAD"));
must_be_true(git_reference_type(head) == GIT_REF_SYMBOLIC);
head_old = git__strdup(git_reference_target(head));
must_be_true(head_old != NULL);
must_pass(git_reference_set_target(head, branch_name));
must_pass(git_commit_create_v(
&commit_id, /* out id */
repo,
"HEAD",
author,
committer,
ROOT_COMMIT_MESSAGE,
&tree_id,
0));
git_signature_free((git_signature *)committer);
git_signature_free((git_signature *)author);
/*
* The fact that creating a commit works has already been
* tested. Here we just make sure it's our commit and that it was
* written as a root commit.
*/
must_pass(git_commit_lookup(&commit, repo, &commit_id));
must_be_true(git_commit_parentcount(commit) == 0);
must_pass(git_reference_lookup(&branch, repo, branch_name));
branch_oid = git_reference_oid(branch);
must_pass(git_oid_cmp(branch_oid, &commit_id));
must_be_true(!strcmp(git_commit_message(commit), ROOT_COMMIT_MESSAGE));
/* Remove the data we just added to the repo */
must_pass(git_reference_lookup(&head, repo, "HEAD"));
must_pass(git_reference_set_target(head, head_old));
must_pass(git_reference_delete(branch));
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
free(head_old);
git_commit_close(commit);
git_repository_free(repo);
END_TEST
BEGIN_SUITE(commit) BEGIN_SUITE(commit)
ADD_TEST(parse0); ADD_TEST(parse0);
...@@ -474,4 +549,6 @@ BEGIN_SUITE(commit) ...@@ -474,4 +549,6 @@ BEGIN_SUITE(commit)
ADD_TEST(write0); ADD_TEST(write0);
//ADD_TEST(write1); //ADD_TEST(write1);
ADD_TEST(root0);
END_SUITE END_SUITE
...@@ -155,7 +155,7 @@ BEGIN_TEST(tableit0, "iterate through all the contents of the table") ...@@ -155,7 +155,7 @@ BEGIN_TEST(tableit0, "iterate through all the contents of the table")
const int objects_n = 32; const int objects_n = 32;
int i; int i;
table_item *objects, *ob; table_item *objects, *ob;
const void *_unused; const void *GIT_UNUSED(_unused);
git_hashtable *table = NULL; git_hashtable *table = NULL;
......
...@@ -64,6 +64,19 @@ BEGIN_TEST(read0, "read and parse a tag from the repository") ...@@ -64,6 +64,19 @@ BEGIN_TEST(read0, "read and parse a tag from the repository")
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(read1, "list all tag names from the repository")
git_repository *repo;
git_strarray tag_list;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
must_pass(git_tag_list(&tag_list, repo));
must_be_true(tag_list.count == 3);
git_strarray_free(&tag_list);
git_repository_free(repo);
END_TEST
#define TAGGER_NAME "Vicent Marti" #define TAGGER_NAME "Vicent Marti"
#define TAGGER_EMAIL "vicent@github.com" #define TAGGER_EMAIL "vicent@github.com"
...@@ -227,6 +240,7 @@ END_TEST ...@@ -227,6 +240,7 @@ END_TEST
BEGIN_SUITE(tag) BEGIN_SUITE(tag)
ADD_TEST(read0); ADD_TEST(read0);
ADD_TEST(read1);
ADD_TEST(write0); ADD_TEST(write0);
ADD_TEST(write1); ADD_TEST(write1);
ADD_TEST(write2); ADD_TEST(write2);
......
...@@ -32,6 +32,7 @@ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd"; ...@@ -32,6 +32,7 @@ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
static const char *blob_oid = "fa49b077972391ad58037050f2a75f74e3671e92"; static const char *blob_oid = "fa49b077972391ad58037050f2a75f74e3671e92";
static const char *first_tree = "181037049a54a1eb5fab404658a3a250b44335d7"; static const char *first_tree = "181037049a54a1eb5fab404658a3a250b44335d7";
static const char *second_tree = "f60079018b664e4e79329a7ef9559c8d9e0378d1"; static const char *second_tree = "f60079018b664e4e79329a7ef9559c8d9e0378d1";
static const char *third_tree = "eb86d8b81d6adbd5290a935d6c9976882de98488";
#if 0 #if 0
static int print_tree(git_repository *repo, const git_oid *tree_oid, int depth) static int print_tree(git_repository *repo, const git_oid *tree_oid, int depth)
...@@ -82,6 +83,7 @@ BEGIN_TEST(read0, "acces randomly the entries on a loaded tree") ...@@ -82,6 +83,7 @@ BEGIN_TEST(read0, "acces randomly the entries on a loaded tree")
must_be_true(git_tree_entry_byindex(tree, 3) == NULL); must_be_true(git_tree_entry_byindex(tree, 3) == NULL);
must_be_true(git_tree_entry_byindex(tree, -1) == NULL); must_be_true(git_tree_entry_byindex(tree, -1) == NULL);
git_tree_close(tree);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -102,7 +104,9 @@ BEGIN_TEST(read1, "read a tree from the repository") ...@@ -102,7 +104,9 @@ BEGIN_TEST(read1, "read a tree from the repository")
/* GH-86: git_object_lookup() should also check the type if the object comes from the cache */ /* GH-86: git_object_lookup() should also check the type if the object comes from the cache */
must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_TREE) == 0); must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_TREE) == 0);
git_object_close(obj);
must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_BLOB) == GIT_EINVALIDTYPE); must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_BLOB) == GIT_EINVALIDTYPE);
git_object_close(obj);
entry = git_tree_entry_byname(tree, "README"); entry = git_tree_entry_byname(tree, "README");
must_be_true(entry != NULL); must_be_true(entry != NULL);
...@@ -111,6 +115,8 @@ BEGIN_TEST(read1, "read a tree from the repository") ...@@ -111,6 +115,8 @@ BEGIN_TEST(read1, "read a tree from the repository")
must_pass(git_tree_entry_2object(&obj, repo, entry)); must_pass(git_tree_entry_2object(&obj, repo, entry));
git_object_close(obj);
git_tree_close(tree);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -148,9 +154,50 @@ BEGIN_TEST(write2, "write a tree from a memory") ...@@ -148,9 +154,50 @@ BEGIN_TEST(write2, "write a tree from a memory")
must_pass(git_treebuilder_write(&rid,repo,builder)); must_pass(git_treebuilder_write(&rid,repo,builder));
must_be_true(git_oid_cmp(&rid, &id2) == 0); must_be_true(git_oid_cmp(&rid, &id2) == 0);
git_treebuilder_free(builder);
git_tree_close(tree);
close_temp_repo(repo); close_temp_repo(repo);
END_TEST END_TEST
BEGIN_TEST(write3, "write a hierarchical tree from a memory")
git_repository *repo;
git_treebuilder *builder;
git_tree *tree;
git_oid id, bid, subtree_id, id2, id3;
git_oid id_hiearar;
must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
git_oid_mkstr(&id, first_tree);
git_oid_mkstr(&id2, second_tree);
git_oid_mkstr(&id3, third_tree);
git_oid_mkstr(&bid, blob_oid);
//create subtree
must_pass(git_treebuilder_create(&builder, NULL));
must_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644));
must_pass(git_treebuilder_write(&subtree_id,repo,builder));
git_treebuilder_free(builder);
// create parent tree
must_pass(git_tree_lookup(&tree, repo, &id));
must_pass(git_treebuilder_create(&builder, tree));
must_pass(git_treebuilder_insert(NULL,builder,"new",&subtree_id,040000));
must_pass(git_treebuilder_write(&id_hiearar,repo,builder));
git_treebuilder_free(builder);
git_tree_close(tree);
must_be_true(git_oid_cmp(&id_hiearar, &id3) == 0);
// check data is correct
must_pass(git_tree_lookup(&tree, repo, &id_hiearar));
must_be_true(2 == git_tree_entrycount(tree));
git_tree_close(tree);
close_temp_repo(repo);
END_TEST
BEGIN_SUITE(tree) BEGIN_SUITE(tree)
//ADD_TEST(print0); //ADD_TEST(print0);
ADD_TEST(read0); ADD_TEST(read0);
...@@ -158,5 +205,6 @@ BEGIN_SUITE(tree) ...@@ -158,5 +205,6 @@ BEGIN_SUITE(tree)
//ADD_TEST(write0); //ADD_TEST(write0);
//ADD_TEST(write1); //ADD_TEST(write1);
ADD_TEST(write2); ADD_TEST(write2);
ADD_TEST(write3);
END_SUITE END_SUITE
...@@ -51,6 +51,7 @@ BEGIN_TEST(readtag0, "lookup a loose tag reference") ...@@ -51,6 +51,7 @@ BEGIN_TEST(readtag0, "lookup a loose tag reference")
git__joinpath(ref_name_from_tag_name, GIT_REFS_TAGS_DIR, git_tag_name((git_tag *)object)); git__joinpath(ref_name_from_tag_name, GIT_REFS_TAGS_DIR, git_tag_name((git_tag *)object));
must_be_true(strcmp(ref_name_from_tag_name, loose_tag_ref_name) == 0); must_be_true(strcmp(ref_name_from_tag_name, loose_tag_ref_name) == 0);
git_object_close(object);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -91,6 +92,7 @@ BEGIN_TEST(readsym0, "lookup a symbolic reference") ...@@ -91,6 +92,7 @@ BEGIN_TEST(readsym0, "lookup a symbolic reference")
git_oid_mkstr(&id, current_master_tip); git_oid_mkstr(&id, current_master_tip);
must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0); must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0);
git_object_close(object);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -117,6 +119,7 @@ BEGIN_TEST(readsym1, "lookup a nested symbolic reference") ...@@ -117,6 +119,7 @@ BEGIN_TEST(readsym1, "lookup a nested symbolic reference")
git_oid_mkstr(&id, current_master_tip); git_oid_mkstr(&id, current_master_tip);
must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0); must_be_true(git_oid_cmp(&id, git_object_id(object)) == 0);
git_object_close(object);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -175,6 +178,7 @@ BEGIN_TEST(readpacked0, "lookup a packed reference") ...@@ -175,6 +178,7 @@ BEGIN_TEST(readpacked0, "lookup a packed reference")
must_be_true(object != NULL); must_be_true(object != NULL);
must_be_true(git_object_type(object) == GIT_OBJ_COMMIT); must_be_true(git_object_type(object) == GIT_OBJ_COMMIT);
git_object_close(object);
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
...@@ -194,7 +198,7 @@ END_TEST ...@@ -194,7 +198,7 @@ END_TEST
BEGIN_TEST(create0, "create a new symbolic reference") BEGIN_TEST(create0, "create a new symbolic reference")
git_reference *new_reference, *looked_up_ref, *resolved_ref; git_reference *new_reference, *looked_up_ref, *resolved_ref;
git_repository *repo; git_repository *repo, *repo2;
git_oid id; git_oid id;
char ref_path[GIT_PATH_MAX]; char ref_path[GIT_PATH_MAX];
...@@ -202,7 +206,7 @@ BEGIN_TEST(create0, "create a new symbolic reference") ...@@ -202,7 +206,7 @@ BEGIN_TEST(create0, "create a new symbolic reference")
git_oid_mkstr(&id, current_master_tip); git_oid_mkstr(&id, current_master_tip);
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
/* Retrieve the physical path to the symbolic ref for further cleaning */ /* Retrieve the physical path to the symbolic ref for further cleaning */
git__joinpath(ref_path, repo->path_repository, new_head_tracker); git__joinpath(ref_path, repo->path_repository, new_head_tracker);
...@@ -226,14 +230,13 @@ BEGIN_TEST(create0, "create a new symbolic reference") ...@@ -226,14 +230,13 @@ BEGIN_TEST(create0, "create a new symbolic reference")
git_repository_free(repo); git_repository_free(repo);
/* Similar test with a fresh new repository */ /* Similar test with a fresh new repository */
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(git_repository_open(&repo2, TEMP_REPO_FOLDER));
must_pass(git_reference_lookup(&looked_up_ref, repo, new_head_tracker)); must_pass(git_reference_lookup(&looked_up_ref, repo2, new_head_tracker));
must_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); must_pass(git_reference_resolve(&resolved_ref, looked_up_ref));
must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0); must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0);
git_reference_delete(looked_up_ref); close_temp_repo(repo2);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(create1, "create a deep symbolic reference") BEGIN_TEST(create1, "create a deep symbolic reference")
...@@ -246,7 +249,7 @@ BEGIN_TEST(create1, "create a deep symbolic reference") ...@@ -246,7 +249,7 @@ BEGIN_TEST(create1, "create a deep symbolic reference")
git_oid_mkstr(&id, current_master_tip); git_oid_mkstr(&id, current_master_tip);
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
git__joinpath(ref_path, repo->path_repository, new_head_tracker); git__joinpath(ref_path, repo->path_repository, new_head_tracker);
must_pass(git_reference_create_symbolic(&new_reference, repo, new_head_tracker, current_head_target)); must_pass(git_reference_create_symbolic(&new_reference, repo, new_head_tracker, current_head_target));
...@@ -254,13 +257,12 @@ BEGIN_TEST(create1, "create a deep symbolic reference") ...@@ -254,13 +257,12 @@ BEGIN_TEST(create1, "create a deep symbolic reference")
must_pass(git_reference_resolve(&resolved_ref, looked_up_ref)); must_pass(git_reference_resolve(&resolved_ref, looked_up_ref));
must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0); must_be_true(git_oid_cmp(&id, git_reference_oid(resolved_ref)) == 0);
git_reference_delete(looked_up_ref); close_temp_repo(repo);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(create2, "create a new OID reference") BEGIN_TEST(create2, "create a new OID reference")
git_reference *new_reference, *looked_up_ref; git_reference *new_reference, *looked_up_ref;
git_repository *repo; git_repository *repo, *repo2;
git_oid id; git_oid id;
char ref_path[GIT_PATH_MAX]; char ref_path[GIT_PATH_MAX];
...@@ -268,7 +270,7 @@ BEGIN_TEST(create2, "create a new OID reference") ...@@ -268,7 +270,7 @@ BEGIN_TEST(create2, "create a new OID reference")
git_oid_mkstr(&id, current_master_tip); git_oid_mkstr(&id, current_master_tip);
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
/* Retrieve the physical path to the symbolic ref for further cleaning */ /* Retrieve the physical path to the symbolic ref for further cleaning */
git__joinpath(ref_path, repo->path_repository, new_head); git__joinpath(ref_path, repo->path_repository, new_head);
...@@ -288,13 +290,12 @@ BEGIN_TEST(create2, "create a new OID reference") ...@@ -288,13 +290,12 @@ BEGIN_TEST(create2, "create a new OID reference")
git_repository_free(repo); git_repository_free(repo);
/* Similar test with a fresh new repository */ /* Similar test with a fresh new repository */
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(git_repository_open(&repo2, TEMP_REPO_FOLDER));
must_pass(git_reference_lookup(&looked_up_ref, repo, new_head)); must_pass(git_reference_lookup(&looked_up_ref, repo, new_head));
must_be_true(git_oid_cmp(&id, git_reference_oid(looked_up_ref)) == 0); must_be_true(git_oid_cmp(&id, git_reference_oid(looked_up_ref)) == 0);
git_reference_delete(looked_up_ref); close_temp_repo(repo2);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(create3, "Can not create a new OID reference which targets at an unknown id") BEGIN_TEST(create3, "Can not create a new OID reference which targets at an unknown id")
...@@ -325,7 +326,7 @@ BEGIN_TEST(overwrite0, "Overwrite an existing symbolic reference") ...@@ -325,7 +326,7 @@ BEGIN_TEST(overwrite0, "Overwrite an existing symbolic reference")
git_reference *ref, *branch_ref; git_reference *ref, *branch_ref;
git_repository *repo; git_repository *repo;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
/* The target needds to exist and we need to check the name has changed */ /* The target needds to exist and we need to check the name has changed */
must_pass(git_reference_create_symbolic(&branch_ref, repo, ref_branch_name, ref_master_name)); must_pass(git_reference_create_symbolic(&branch_ref, repo, ref_branch_name, ref_master_name));
...@@ -344,9 +345,7 @@ BEGIN_TEST(overwrite0, "Overwrite an existing symbolic reference") ...@@ -344,9 +345,7 @@ BEGIN_TEST(overwrite0, "Overwrite an existing symbolic reference")
must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC); must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC);
must_be_true(!strcmp(git_reference_target(ref), ref_master_name)); must_be_true(!strcmp(git_reference_target(ref), ref_master_name));
must_pass(git_reference_delete(ref)); close_temp_repo(repo);
must_pass(git_reference_delete(branch_ref));
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(overwrite1, "Overwrite an existing object id reference") BEGIN_TEST(overwrite1, "Overwrite an existing object id reference")
...@@ -354,7 +353,7 @@ BEGIN_TEST(overwrite1, "Overwrite an existing object id reference") ...@@ -354,7 +353,7 @@ BEGIN_TEST(overwrite1, "Overwrite an existing object id reference")
git_repository *repo; git_repository *repo;
git_oid id; git_oid id;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
must_pass(git_reference_lookup(&ref, repo, ref_master_name)); must_pass(git_reference_lookup(&ref, repo, ref_master_name));
must_be_true(ref->type & GIT_REF_OID); must_be_true(ref->type & GIT_REF_OID);
...@@ -375,8 +374,7 @@ BEGIN_TEST(overwrite1, "Overwrite an existing object id reference") ...@@ -375,8 +374,7 @@ BEGIN_TEST(overwrite1, "Overwrite an existing object id reference")
must_pass(git_reference_lookup(&ref, repo, ref_name)); must_pass(git_reference_lookup(&ref, repo, ref_name));
must_be_true(!git_oid_cmp(&id, git_reference_oid(ref))); must_be_true(!git_oid_cmp(&id, git_reference_oid(ref)));
git_reference_delete(ref); close_temp_repo(repo);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symbolic one") BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symbolic one")
...@@ -384,7 +382,7 @@ BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symboli ...@@ -384,7 +382,7 @@ BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symboli
git_repository *repo; git_repository *repo;
git_oid id; git_oid id;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
must_pass(git_reference_lookup(&ref, repo, ref_master_name)); must_pass(git_reference_lookup(&ref, repo, ref_master_name));
must_be_true(ref->type & GIT_REF_OID); must_be_true(ref->type & GIT_REF_OID);
...@@ -399,8 +397,7 @@ BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symboli ...@@ -399,8 +397,7 @@ BEGIN_TEST(overwrite2, "Overwrite an existing object id reference with a symboli
must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC); must_be_true(git_reference_type(ref) & GIT_REF_SYMBOLIC);
must_be_true(!strcmp(git_reference_target(ref), ref_master_name)); must_be_true(!strcmp(git_reference_target(ref), ref_master_name));
git_reference_delete(ref); close_temp_repo(repo);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object id one") BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object id one")
...@@ -408,7 +405,7 @@ BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object ...@@ -408,7 +405,7 @@ BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object
git_repository *repo; git_repository *repo;
git_oid id; git_oid id;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); must_pass(open_temp_repo(&repo, REPOSITORY_FOLDER));
must_pass(git_reference_lookup(&ref, repo, ref_master_name)); must_pass(git_reference_lookup(&ref, repo, ref_master_name));
must_be_true(ref->type & GIT_REF_OID); must_be_true(ref->type & GIT_REF_OID);
...@@ -425,8 +422,7 @@ BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object ...@@ -425,8 +422,7 @@ BEGIN_TEST(overwrite3, "Overwrite an existing symbolic reference with an object
must_be_true(git_reference_type(ref) & GIT_REF_OID); must_be_true(git_reference_type(ref) & GIT_REF_OID);
must_be_true(!git_oid_cmp(git_reference_oid(ref), &id)); must_be_true(!git_oid_cmp(git_reference_oid(ref), &id));
git_reference_delete(ref); close_temp_repo(repo);
git_repository_free(repo);
END_TEST END_TEST
BEGIN_TEST(pack0, "create a packfile for an empty folder") BEGIN_TEST(pack0, "create a packfile for an empty folder")
......
...@@ -130,6 +130,7 @@ static void free_suite(git_testsuite *ts) ...@@ -130,6 +130,7 @@ static void free_suite(git_testsuite *ts)
if (ts->list[n]) if (ts->list[n])
test_free(ts->list[n]); test_free(ts->list[n]);
free(ts->name);
free(ts); free(ts);
} }
......
...@@ -4,7 +4,7 @@ from waflib.Build import BuildContext, CleanContext, \ ...@@ -4,7 +4,7 @@ from waflib.Build import BuildContext, CleanContext, \
InstallContext, UninstallContext InstallContext, UninstallContext
# Unix flags # Unix flags
CFLAGS_UNIX = ["-O2", "-Wall", "-Wextra"] CFLAGS_UNIX = ["-O2", "-Wall", "-Wextra", "-fPIC"]
CFLAGS_UNIX_DBG = ['-g', '-O0'] CFLAGS_UNIX_DBG = ['-g', '-O0']
# Windows MSVC flags # Windows MSVC flags
...@@ -65,6 +65,9 @@ def configure(conf): ...@@ -65,6 +65,9 @@ def configure(conf):
else: else:
conf.env.PLATFORM = 'unix' conf.env.PLATFORM = 'unix'
if conf.env.DEST_OS == 'sunos':
conf.env.DEFINES += ['NO_VIZ']
if conf.options.threadsafe: if conf.options.threadsafe:
if conf.env.PLATFORM == 'unix': if conf.env.PLATFORM == 'unix':
conf.check_cc(lib='pthread', uselib_store='pthread') conf.check_cc(lib='pthread', uselib_store='pthread')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment