Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Martí <vicent@github.com>2013-04-30 15:02:52 +0400
committerVicent Martí <vicent@github.com>2013-04-30 15:02:52 +0400
commitcd2ed9f0cc9d8e0e1724304e946adb28271e0669 (patch)
treecdf9e1dade9f0d6e0317735ac2d40d81ff074c16 /src
parentd76fb20ebce03b2fd87c2472d556bf9b64894efd (diff)
parent203d5b0e6829242ea412bbef7751e3c522ac5dd8 (diff)
Merge pull request #1518 from arrbee/export-oid-comparison
Remove most inlines from the public API
Diffstat (limited to 'src')
-rw-r--r--src/attr.c2
-rw-r--r--src/blob.c2
-rw-r--r--src/checkout.c6
-rw-r--r--src/clone.c6
-rw-r--r--src/diff.c10
-rw-r--r--src/diff_output.c4
-rw-r--r--src/diff_tform.c2
-rw-r--r--src/index.c2
-rw-r--r--src/indexer.c4
-rw-r--r--src/object.h12
-rw-r--r--src/odb.c2
-rw-r--r--src/oid.c39
-rw-r--r--src/oid.h33
-rw-r--r--src/pack.c6
-rw-r--r--src/push.c2
-rw-r--r--src/refs.c2
-rw-r--r--src/refs.h1
-rw-r--r--src/remote.c2
-rw-r--r--src/tag.c7
-rw-r--r--src/transports/local.c2
-rw-r--r--src/tree.c12
21 files changed, 110 insertions, 48 deletions
diff --git a/src/attr.c b/src/attr.c
index 979fecc14..6dd2c7e2f 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -312,7 +312,7 @@ static int load_attr_blob_from_index(
entry = git_index_get_byindex(index, pos);
- if (old_oid && git_oid_cmp(old_oid, &entry->oid) == 0)
+ if (old_oid && git_oid__cmp(old_oid, &entry->oid) == 0)
return GIT_ENOTFOUND;
if ((error = git_blob_lookup(blob, repo, &entry->oid)) < 0)
diff --git a/src/blob.c b/src/blob.c
index a68c4cc3e..25ea0df30 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -15,6 +15,8 @@
#include "filter.h"
#include "buf_text.h"
+GIT_OBJECT__TYPED_FUNCTIONS(git_blob, GIT_OBJ_BLOB)
+
const void *git_blob_rawcontent(const git_blob *blob)
{
assert(blob);
diff --git a/src/checkout.c b/src/checkout.c
index e29fccd05..96e15093c 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -138,7 +138,7 @@ static bool checkout_is_workdir_modified(
if (!sm_oid)
return false;
- return (git_oid_cmp(&baseitem->oid, sm_oid) != 0);
+ return (git_oid__cmp(&baseitem->oid, sm_oid) != 0);
}
/* Look at the cache to decide if the workdir is modified. If not,
@@ -149,7 +149,7 @@ static bool checkout_is_workdir_modified(
if (wditem->mtime.seconds == ie->mtime.seconds &&
wditem->mtime.nanoseconds == ie->mtime.nanoseconds &&
wditem->file_size == ie->file_size)
- return (git_oid_cmp(&baseitem->oid, &ie->oid) != 0);
+ return (git_oid__cmp(&baseitem->oid, &ie->oid) != 0);
}
/* depending on where base is coming from, we may or may not know
@@ -163,7 +163,7 @@ static bool checkout_is_workdir_modified(
wditem->file_size, &oid) < 0)
return false;
- return (git_oid_cmp(&baseitem->oid, &oid) != 0);
+ return (git_oid__cmp(&baseitem->oid, &oid) != 0);
}
#define CHECKOUT_ACTION_IF(FLAG,YES,NO) \
diff --git a/src/clone.c b/src/clone.c
index 0665576e3..aeb7bbf5c 100644
--- a/src/clone.c
+++ b/src/clone.c
@@ -132,14 +132,14 @@ static int reference_matches_remote_head(
return 0;
}
- if (git_oid_cmp(&head_info->remote_head_oid, &oid) == 0) {
+ if (git_oid__cmp(&head_info->remote_head_oid, &oid) == 0) {
/* Determine the local reference name from the remote tracking one */
if (git_refspec_transform_l(
- &head_info->branchname,
+ &head_info->branchname,
head_info->refspec,
reference_name) < 0)
return -1;
-
+
if (git_buf_len(&head_info->branchname) > 0) {
if (git_buf_sets(
&head_info->branchname,
diff --git a/src/diff.c b/src/diff.c
index 881173cde..6612abf06 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -196,21 +196,21 @@ static git_diff_delta *diff_delta__last_for_item(
switch (delta->status) {
case GIT_DELTA_UNMODIFIED:
case GIT_DELTA_DELETED:
- if (git_oid_cmp(&delta->old_file.oid, &item->oid) == 0)
+ if (git_oid__cmp(&delta->old_file.oid, &item->oid) == 0)
return delta;
break;
case GIT_DELTA_ADDED:
- if (git_oid_cmp(&delta->new_file.oid, &item->oid) == 0)
+ if (git_oid__cmp(&delta->new_file.oid, &item->oid) == 0)
return delta;
break;
case GIT_DELTA_UNTRACKED:
if (diff->strcomp(delta->new_file.path, item->path) == 0 &&
- git_oid_cmp(&delta->new_file.oid, &item->oid) == 0)
+ git_oid__cmp(&delta->new_file.oid, &item->oid) == 0)
return delta;
break;
case GIT_DELTA_MODIFIED:
- if (git_oid_cmp(&delta->old_file.oid, &item->oid) == 0 ||
- git_oid_cmp(&delta->new_file.oid, &item->oid) == 0)
+ if (git_oid__cmp(&delta->old_file.oid, &item->oid) == 0 ||
+ git_oid__cmp(&delta->new_file.oid, &item->oid) == 0)
return delta;
break;
default:
diff --git a/src/diff_output.c b/src/diff_output.c
index b8bb73bf7..4ce01bc62 100644
--- a/src/diff_output.c
+++ b/src/diff_output.c
@@ -660,7 +660,7 @@ static int diff_patch_load(
*/
if (check_if_unmodified &&
delta->old_file.mode == delta->new_file.mode &&
- !git_oid_cmp(&delta->old_file.oid, &delta->new_file.oid))
+ !git_oid__cmp(&delta->old_file.oid, &delta->new_file.oid))
{
delta->status = GIT_DELTA_UNMODIFIED;
@@ -1388,7 +1388,7 @@ static int diff_single_apply(diff_single_data *data)
(has_old ? GIT_DELTA_MODIFIED : GIT_DELTA_ADDED) :
(has_old ? GIT_DELTA_DELETED : GIT_DELTA_UNTRACKED);
- if (git_oid_cmp(&delta->new_file.oid, &delta->old_file.oid) == 0)
+ if (git_oid__cmp(&delta->new_file.oid, &delta->old_file.oid) == 0)
delta->status = GIT_DELTA_UNMODIFIED;
if ((error = diff_delta_is_binary_by_content(
diff --git a/src/diff_tform.c b/src/diff_tform.c
index efcb19d95..5c1a86cb9 100644
--- a/src/diff_tform.c
+++ b/src/diff_tform.c
@@ -429,7 +429,7 @@ static int similarity_measure(
if (GIT_MODE_TYPE(a_file->mode) != GIT_MODE_TYPE(b_file->mode))
return 0;
- if (git_oid_cmp(&a_file->oid, &b_file->oid) == 0)
+ if (git_oid__cmp(&a_file->oid, &b_file->oid) == 0)
return 100;
/* update signature cache if needed */
diff --git a/src/index.c b/src/index.c
index d8ca78e52..2e2d373b5 100644
--- a/src/index.c
+++ b/src/index.c
@@ -1411,7 +1411,7 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
/* 160-bit SHA-1 over the content of the index file before this checksum. */
git_oid_fromraw(&checksum_expected, (const unsigned char *)buffer);
- if (git_oid_cmp(&checksum_calculated, &checksum_expected) != 0)
+ if (git_oid__cmp(&checksum_calculated, &checksum_expected) != 0)
return index_error_invalid("calculated checksum does not match expected");
#undef seek_forward
diff --git a/src/indexer.c b/src/indexer.c
index 606771927..91b7ba5d9 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -9,7 +9,6 @@
#include "git2/indexer.h"
#include "git2/object.h"
-#include "git2/oid.h"
#include "common.h"
#include "pack.h"
@@ -17,6 +16,7 @@
#include "posix.h"
#include "pack.h"
#include "filebuf.h"
+#include "oid.h"
#include "oidmap.h"
#define UINT31_MAX (0x7FFFFFFF)
@@ -103,7 +103,7 @@ static int objects_cmp(const void *a, const void *b)
const struct entry *entrya = a;
const struct entry *entryb = b;
- return git_oid_cmp(&entrya->oid, &entryb->oid);
+ return git_oid__cmp(&entrya->oid, &entryb->oid);
}
int git_indexer_stream_new(
diff --git a/src/object.h b/src/object.h
index d187c55b7..7b25fc342 100644
--- a/src/object.h
+++ b/src/object.h
@@ -28,4 +28,16 @@ int git_oid__parse(git_oid *oid, const char **buffer_out, const char *buffer_end
void git_oid__writebuf(git_buf *buf, const char *header, const git_oid *oid);
+#define GIT_OBJECT__TYPED_FUNCTIONS(TYPE,OBJTYPE) \
+ int TYPE##_lookup(TYPE **out, git_repository *repo, const git_oid *id) { \
+ return git_object_lookup((git_object **)out, repo, id, OBJTYPE); } \
+ int TYPE##_lookup_prefix(TYPE **out, git_repository *repo, const git_oid *id, size_t len) { \
+ return git_object_lookup_prefix((git_object **)out, repo, id, len, OBJTYPE); } \
+ void TYPE##_free(TYPE *obj) { \
+ git_object_free((git_object *)obj); } \
+ const git_oid *TYPE##_id(const TYPE *obj) { \
+ return git_object_id((const git_object *)obj); } \
+ git_repository *TYPE##_owner(const TYPE *obj) { \
+ return git_object_owner((const git_object *)obj); }
+
#endif
diff --git a/src/odb.c b/src/odb.c
index 64e1232f5..07e1ea6eb 100644
--- a/src/odb.c
+++ b/src/odb.c
@@ -772,7 +772,7 @@ attempt_lookup:
git__free(data);
data = raw.data;
- if (found && git_oid_cmp(&full_oid, &found_full_oid))
+ if (found && git_oid__cmp(&full_oid, &found_full_oid))
return git_odb__error_ambiguous("multiple matches for prefix");
found_full_oid = full_oid;
diff --git a/src/oid.c b/src/oid.c
index ab69eeb17..e74640c57 100644
--- a/src/oid.c
+++ b/src/oid.c
@@ -166,18 +166,26 @@ void git_oid_cpy(git_oid *out, const git_oid *src)
memcpy(out->id, src->id, sizeof(out->id));
}
+int git_oid_cmp(const git_oid *a, const git_oid *b)
+{
+ return git_oid__cmp(a, b);
+}
+
int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, size_t len)
{
const unsigned char *a = oid_a->id;
const unsigned char *b = oid_b->id;
- do {
+ if (len > GIT_OID_HEXSZ)
+ len = GIT_OID_HEXSZ;
+
+ while (len > 1) {
if (*a != *b)
return 1;
a++;
b++;
len -= 2;
- } while (len > 1);
+ };
if (len)
if ((*a ^ *b) & 0xf0)
@@ -186,14 +194,31 @@ int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, size_t len)
return 0;
}
-int git_oid_streq(const git_oid *a, const char *str)
+int git_oid_strcmp(const git_oid *oid_a, const char *str)
{
- git_oid id;
+ const unsigned char *a = oid_a->id;
+ unsigned char strval;
+ int hexval;
- if (git_oid_fromstr(&id, str) < 0)
- return -1;
+ for (a = oid_a->id; *str && (a - oid_a->id) < GIT_OID_RAWSZ; ++a) {
+ if ((hexval = git__fromhex(*str++)) < 0)
+ return -1;
+ strval = hexval << 4;
+ if (*str) {
+ if ((hexval = git__fromhex(*str++)) < 0)
+ return -1;
+ strval |= hexval;
+ }
+ if (*a != strval)
+ return (*a - strval);
+ }
- return git_oid_cmp(a, &id) == 0 ? 0 : -1;
+ return 0;
+}
+
+int git_oid_streq(const git_oid *oid_a, const char *str)
+{
+ return git_oid_strcmp(oid_a, str) == 0 ? 0 : -1;
}
int git_oid_iszero(const git_oid *oid_a)
diff --git a/src/oid.h b/src/oid.h
new file mode 100644
index 000000000..077d0a4c8
--- /dev/null
+++ b/src/oid.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+#ifndef INCLUDE_oid_h__
+#define INCLUDE_oid_h__
+
+#include "git2/oid.h"
+
+/*
+ * Compare two oid structures.
+ *
+ * @param a first oid structure.
+ * @param b second oid structure.
+ * @return <0, 0, >0 if a < b, a == b, a > b.
+ */
+GIT_INLINE(int) git_oid__cmp(const git_oid *a, const git_oid *b)
+{
+ const unsigned char *sha1 = a->id;
+ const unsigned char *sha2 = b->id;
+ int i;
+
+ for (i = 0; i < GIT_OID_RAWSZ; i++, sha1++, sha2++) {
+ if (*sha1 != *sha2)
+ return *sha1 - *sha2;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/src/pack.c b/src/pack.c
index 33cdf760a..f8b621ef8 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -12,8 +12,8 @@
#include "sha1_lookup.h"
#include "mwindow.h"
#include "fileops.h"
+#include "oid.h"
-#include "git2/oid.h"
#include <zlib.h>
static int packfile_open(struct git_pack_file *p);
@@ -875,7 +875,7 @@ static int packfile_open(struct git_pack_file *p)
idx_sha1 = ((unsigned char *)p->index_map.data) + p->index_map.len - 40;
- if (git_oid_cmp(&sha1, (git_oid *)idx_sha1) == 0)
+ if (git_oid__cmp(&sha1, (git_oid *)idx_sha1) == 0)
return 0;
cleanup:
@@ -1139,7 +1139,7 @@ int git_pack_entry_find(
if (len == GIT_OID_HEXSZ && p->num_bad_objects) {
unsigned i;
for (i = 0; i < p->num_bad_objects; i++)
- if (git_oid_cmp(short_oid, &p->bad_object_sha1[i]) == 0)
+ if (git_oid__cmp(short_oid, &p->bad_object_sha1[i]) == 0)
return packfile_error("bad object found in packfile");
}
diff --git a/src/push.c b/src/push.c
index b6be1a4e1..9b1e78c8e 100644
--- a/src/push.c
+++ b/src/push.c
@@ -376,7 +376,7 @@ static int queue_differences(
const git_tree_entry *d_entry = git_tree_entry_byindex(delta, j);
int cmp = 0;
- if (!git_oid_cmp(&b_entry->oid, &d_entry->oid))
+ if (!git_oid__cmp(&b_entry->oid, &d_entry->oid))
goto loop;
cmp = strcmp(b_entry->filename, d_entry->filename);
diff --git a/src/refs.c b/src/refs.c
index 2faa4cb83..b85a2e828 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -832,7 +832,7 @@ int git_reference_cmp(git_reference *ref1, git_reference *ref2)
if (type1 == GIT_REF_SYMBOLIC)
return strcmp(ref1->target.symbolic, ref2->target.symbolic);
- return git_oid_cmp(&ref1->target.oid, &ref2->target.oid);
+ return git_oid__cmp(&ref1->target.oid, &ref2->target.oid);
}
static int reference__update_terminal(
diff --git a/src/refs.h b/src/refs.h
index 97d4d2eb5..908e86f29 100644
--- a/src/refs.h
+++ b/src/refs.h
@@ -13,6 +13,7 @@
#include "git2/refdb.h"
#include "strmap.h"
#include "buffer.h"
+#include "oid.h"
#define GIT_REFS_DIR "refs/"
#define GIT_REFS_HEADS_DIR GIT_REFS_DIR "heads/"
diff --git a/src/remote.c b/src/remote.c
index 08f56cd51..6eaaf8b49 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -923,7 +923,7 @@ static int update_tips_for_spec(git_remote *remote, git_refspec *spec, git_vecto
if (error == GIT_ENOTFOUND)
memset(&old, 0, GIT_OID_RAWSZ);
- if (!git_oid_cmp(&old, &head->oid))
+ if (!git_oid__cmp(&old, &head->oid))
continue;
/* In autotag mode, don't overwrite any locally-existing tags */
diff --git a/src/tag.c b/src/tag.c
index b9a806cd1..a0ecce176 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -15,6 +15,8 @@
#include "git2/signature.h"
#include "git2/odb_backend.h"
+GIT_OBJECT__TYPED_FUNCTIONS(git_tag, GIT_OBJ_TAG)
+
void git_tag__free(void *_tag)
{
git_tag *tag = _tag;
@@ -24,11 +26,6 @@ void git_tag__free(void *_tag)
git__free(tag);
}
-const git_oid *git_tag_id(const git_tag *c)
-{
- return git_object_id((const git_object *)c);
-}
-
int git_tag_target(git_object **target, const git_tag *t)
{
assert(t);
diff --git a/src/transports/local.c b/src/transports/local.c
index 8af970eac..8b4d50c14 100644
--- a/src/transports/local.c
+++ b/src/transports/local.c
@@ -282,7 +282,7 @@ static int local_push_copy_object(
odb_obj_size) < 0 ||
odb_stream->finalize_write(&remote_odb_obj_oid, odb_stream) < 0) {
error = -1;
- } else if (git_oid_cmp(&obj->id, &remote_odb_obj_oid) != 0) {
+ } else if (git_oid__cmp(&obj->id, &remote_odb_obj_oid) != 0) {
giterr_set(GITERR_ODB, "Error when writing object to remote odb "
"during local push operation. Remote odb object oid does not "
"match local oid.");
diff --git a/src/tree.c b/src/tree.c
index 58eb92f35..0a94aec10 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -11,6 +11,8 @@
#include "git2/repository.h"
#include "git2/object.h"
+GIT_OBJECT__TYPED_FUNCTIONS(git_tree, GIT_OBJ_TREE)
+
#define DEFAULT_TREE_SIZE 16
#define MAX_FILEMODE_BYTES 6
@@ -232,16 +234,6 @@ void git_tree__free(void *_tree)
git__free(tree);
}
-const git_oid *git_tree_id(const git_tree *t)
-{
- return git_object_id((const git_object *)t);
-}
-
-git_repository *git_tree_owner(const git_tree *t)
-{
- return git_object_owner((const git_object *)t);
-}
-
git_filemode_t git_tree_entry_filemode(const git_tree_entry *entry)
{
return (git_filemode_t)entry->attr;