commit - 908b01940959be5e3b25e6e352b4bdcb2a49f65c
commit + 59ece79d29ce555391953bc053f934b5b1ec15ff
blob - 5543f39b3fadb56aa44361f6af19d4e979ec45a5
blob + 63ff8ec7e3a9660476e5885e90590b8b63bc52bc
--- include/got_error.h
+++ include/got_error.h
#define GOT_ERR_BAD_DELTA_CHAIN 20
#define GOT_ERR_BAD_DELTA 21
#define GOT_ERR_COMPRESSION 22
+#define GOT_ERR_BAD_OBJ_ID_STR 23
static const struct got_error {
int code;
{ GOT_ERR_NOT_IMPL, "feature not implemented" },
{ GOT_ERR_OBJ_NOT_PACKED,"object is not packed" },
{ GOT_ERR_BAD_DELTA_CHAIN,"bad delta chain" },
- { GOT_ERR_BAD_DELTA ,"bad delta" },
- { GOT_ERR_COMPRESSION,"compression failed" },
+ { GOT_ERR_BAD_DELTA, "bad delta" },
+ { GOT_ERR_COMPRESSION, "compression failed" },
+ { GOT_ERR_BAD_OBJ_ID_STR,"bad object id string" },
};
const struct got_error * got_error(int code);
blob - 12c26ba164146ecbebea3eb36396764616cc5da2
blob + 1e490d07749d5bc65262db22d608334fc7dc81f3
--- include/got_object.h
+++ include/got_object.h
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-struct got_object_id {
- u_int8_t sha1[SHA1_DIGEST_LENGTH];
-};
+struct got_object_id;
struct got_blob_object;
SIMPLEQ_ENTRY(got_tree_entry) entry;
mode_t mode;
char *name;
- struct got_object_id id;
+ struct got_object_id *id;
};
struct got_tree_object {
struct got_parent_id {
SIMPLEQ_ENTRY(got_parent_id) entry;
- struct got_object_id id;
+ struct got_object_id *id;
};
SIMPLEQ_HEAD(got_parent_id_list, got_parent_id);
struct got_commit_object {
- struct got_object_id tree_id;
+ struct got_object_id *tree_id;
unsigned int nparents;
SIMPLEQ_HEAD(, got_parent_id) parent_ids;
char *author;
struct got_repository;
char *got_object_id_str(struct got_object_id *, char *, size_t);
+const struct got_error *got_parse_object_id(struct got_object_id **, const char *);
int got_object_id_cmp(struct got_object_id *, struct got_object_id *);
int got_object_get_type(struct got_object *);
const struct got_error *got_object_open(struct got_object **,
blob - 0d417198dabeffa3677bed2341c49fdefa698b55
blob + a2cb581be5f9c483aa6a1c74a7158b0c0003403a
--- lib/diff.c
+++ lib/diff.c
te2 = match_entry_by_name(te1, tree2);
if (te2 == NULL) {
if (S_ISDIR(te1->mode))
- return diff_deleted_tree(&te1->id, repo, outfile);
- return diff_deleted_blob(&te1->id, repo, outfile);
+ return diff_deleted_tree(te1->id, repo, outfile);
+ return diff_deleted_blob(te1->id, repo, outfile);
}
if (S_ISDIR(te1->mode) && S_ISDIR(te2->mode)) {
- if (got_object_id_cmp(&te1->id, &te2->id) != 0)
- return diff_modified_tree(&te1->id, &te2->id, repo,
+ if (got_object_id_cmp(te1->id, te2->id) != 0)
+ return diff_modified_tree(te1->id, te2->id, repo,
outfile);
} else if (S_ISREG(te1->mode) && S_ISREG(te2->mode)) {
- if (got_object_id_cmp(&te1->id, &te2->id) != 0)
- return diff_modified_blob(&te1->id, &te2->id, repo,
+ if (got_object_id_cmp(te1->id, te2->id) != 0)
+ return diff_modified_blob(te1->id, te2->id, repo,
outfile);
}
- return diff_kind_mismatch(&te1->id, &te2->id, outfile);
+ return diff_kind_mismatch(te1->id, te2->id, outfile);
}
static const struct got_error *
return NULL;
if (S_ISDIR(te2->mode))
- return diff_added_tree(&te2->id, repo, outfile);
- return diff_added_blob(&te2->id, repo, outfile);
+ return diff_added_tree(te2->id, repo, outfile);
+ return diff_added_blob(te2->id, repo, outfile);
}
const struct got_error *
blob - 9e483cc3b205fa699fa54d75cc474e3980cd8383
blob + e9db3c6742df9df3e1e59370a935408eefd16704
--- lib/object.c
+++ lib/object.c
#include "got_object.h"
#include "got_repository.h"
#include "got_sha1.h"
-#include "pack.h"
#include "delta.h"
+#include "pack.h"
#include "zb.h"
#include "object.h"
got_object_id_str(struct got_object_id *id, char *buf, size_t size)
{
return got_sha1_digest_to_str(id->sha1, buf, size);
+}
+
+const struct got_error *
+got_parse_object_id(struct got_object_id **id, const char *buf)
+{
+ *id = calloc(1, sizeof(**id));
+ if (*id == NULL)
+ return got_error(GOT_ERR_NO_MEM);
+ if (!got_parse_sha1_digest((*id)->sha1, buf)) {
+ free(*id);
+ *id = NULL;
+ return got_error(GOT_ERR_BAD_OBJ_ID_STR);
+ }
+ return NULL;
}
+
int
got_object_id_cmp(struct got_object_id *id1, struct got_object_id *id2)
{
n = 0;
for (i = 0; i < SHA1_DIGEST_LENGTH; i++) {
- if (commit->tree_id.sha1[i] == 0)
+ if (commit->tree_id->sha1[i] == 0)
n++;
}
if (n == SHA1_DIGEST_LENGTH)
*commit = calloc(1, sizeof(**commit));
if (*commit == NULL)
+ return got_error(GOT_ERR_NO_MEM);
+ (*commit)->tree_id = calloc(1, sizeof(*(*commit)->tree_id));
+ if ((*commit)->tree_id == NULL) {
+ free(*commit);
+ *commit = NULL;
return got_error(GOT_ERR_NO_MEM);
+ }
SIMPLEQ_INIT(&(*commit)->parent_ids);
goto done;
}
s += tlen;
- if (!got_parse_sha1_digest((*commit)->tree_id.sha1, s)) {
+ if (!got_parse_sha1_digest((*commit)->tree_id->sha1, s)) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
err = got_error(GOT_ERR_NO_MEM);
goto done;
}
- s += tlen;
- if (!got_parse_sha1_digest(pid->id.sha1, s)) {
+ pid->id = calloc(1, sizeof(*pid->id));
+ if (pid->id == NULL) {
+ free(pid);
+ err = got_error(GOT_ERR_NO_MEM);
+ goto done;
+ }
+ s += tlen;
+ if (!got_parse_sha1_digest(pid->id->sha1, s)) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
+ free(pid->id);
+ free(pid);
goto done;
}
SIMPLEQ_INSERT_TAIL(&(*commit)->parent_ids, pid, entry);
goto done;
}
done:
- if (err)
+ if (err) {
got_object_commit_close(*commit);
+ *commit = NULL;
+ }
return err;
}
static void
tree_entry_close(struct got_tree_entry *te)
{
+ free(te->id);
free(te->name);
free(te);
}
*te = calloc(1, sizeof(**te));
if (*te == NULL)
+ return got_error(GOT_ERR_NO_MEM);
+
+ (*te)->id = calloc(1, sizeof(*(*te)->id));
+ if ((*te)->id == NULL) {
+ free(*te);
+ *te = NULL;
return got_error(GOT_ERR_NO_MEM);
+ }
*elen = strlen(buf) + 1;
if (*elen > maxlen) {
free(*te);
+ *te = NULL;
return got_error(GOT_ERR_BAD_OBJ_DATA);
}
space = strchr(buf, ' ');
if (space == NULL) {
free(*te);
+ *te = NULL;
return got_error(GOT_ERR_BAD_OBJ_DATA);
}
while (*p != ' ') {
goto done;
}
buf += strlen(buf) + 1;
- memcpy((*te)->id.sha1, buf, SHA1_DIGEST_LENGTH);
+ memcpy((*te)->id->sha1, buf, SHA1_DIGEST_LENGTH);
*elen += SHA1_DIGEST_LENGTH;
done:
- if (err)
+ if (err) {
tree_entry_close(*te);
+ *te = NULL;
+ }
return err;
}
while (!SIMPLEQ_EMPTY(&commit->parent_ids)) {
pid = SIMPLEQ_FIRST(&commit->parent_ids);
SIMPLEQ_REMOVE_HEAD(&commit->parent_ids, entry);
+ free(pid->id);
free(pid);
}
+ free(commit->tree_id);
free(commit->author);
free(commit->committer);
free(commit->logmsg);
blob - 9b27d1b8f5cb6507171a8a3db2a4a98bce3e0562
blob + 156901f0339a8945664abed5e3624a696e2ea8b5
--- lib/object.h
+++ lib/object.h
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+struct got_object_id {
+ u_int8_t sha1[SHA1_DIGEST_LENGTH];
+};
+
struct got_object {
int type;
int flags;
blob - 189b5641714068ed3ea3bc6d13b1f765956a582d
blob + 348ae1a580907c62f979bb861cdde189a32ca3af
--- lib/pack.h
+++ lib/pack.h
/* If object is of type GOT_OBJ_TYPE_REF_DELTA. */
struct got_packfile_object_data_ref_delta {
- struct got_object_id id;
+ uint8_t sha1[SHA1_DIGEST_LENGTH];
uint8_t *delta_data; /* compressed */
};
blob - 9392f6678ce431df86878842a37ac009b1e1a171
blob + 67a327f5fa5f50aeaea6665fa38f8b692e726ea4
--- lib/refs.c
+++ lib/refs.c
#include "got_sha1.h"
#include "path.h"
+#include "delta.h"
+#include "zb.h"
+#include "object.h"
-
static const struct got_error *
parse_symref(struct got_reference **ref, const char *name, const char *line)
{
blob - 0b04bd618d455a241730c9202119f379a6d102ce
blob + 0dac4a0e1383ef0e7db9adee92a2dbed8d1e67ec
--- regress/repository/repository_test.c
+++ regress/repository/repository_test.c
#include <string.h>
#include <sha1.h>
#include <zlib.h>
+#include <unistd.h>
#include "got_error.h"
#include "got_object.h"
#include "got_repository.h"
#include "got_sha1.h"
#include "got_diff.h"
-#include "unistd.h"
#define GOT_REPO_PATH "../../../"
struct got_object *obj;
SIMPLEQ_FOREACH(pid, &commit->parent_ids, entry) {
- err = got_object_open(&obj, repo, &pid->id);
+ err = got_object_open(&obj, repo, pid->id);
if (err != NULL)
return err;
if (got_object_get_type(obj) != GOT_OBJ_TYPE_COMMIT)
if (!S_ISDIR(te->mode)) {
test_printf("%s %s/%s\n",
- got_object_id_str(&te->id, hex, sizeof(hex)),
+ got_object_id_str(te->id, hex, sizeof(hex)),
parent, te->name);
continue;
}
test_printf("%s %s/%s\n",
- got_object_id_str(&te->id, hex, sizeof(hex)),
+ got_object_id_str(te->id, hex, sizeof(hex)),
parent, te->name);
- err = got_object_open(&treeobj, repo, &te->id);
+ err = got_object_open(&treeobj, repo, te->id);
if (err != NULL)
break;
return err;
test_printf("tree: %s\n",
- got_object_id_str(&commit->tree_id, buf, sizeof(buf)));
+ got_object_id_str(commit->tree_id, buf, sizeof(buf)));
test_printf("parent%s: ", (commit->nparents == 1) ? "" : "s");
SIMPLEQ_FOREACH(pid, &commit->parent_ids, entry) {
test_printf("%s\n",
- got_object_id_str(&pid->id, buf, sizeof(buf)));
+ got_object_id_str(pid->id, buf, sizeof(buf)));
}
test_printf("author: %s\n", commit->author);
test_printf("committer: %s\n", commit->committer);
test_printf("log: %s\n", commit->logmsg);
- err = got_object_open(&treeobj, repo, &commit->tree_id);
+ err = got_object_open(&treeobj, repo, commit->tree_id);
if (err != NULL)
return err;
if (got_object_get_type(treeobj) == GOT_OBJ_TYPE_TREE) {
const char *tree_sha1 = "6cc96e0e093fb30630ba7f199d0a008b24c6a690";
const struct got_error *err;
struct got_repository *repo;
- struct got_object_id id;
+ struct got_object_id *id;
struct got_object *obj;
char hex[SHA1_DIGEST_STRING_LENGTH];
int i;
size_t len;
- if (!got_parse_sha1_digest(id.sha1, tree_sha1))
+ err = got_parse_object_id(&id, tree_sha1);
+ if (err != NULL)
return 0;
err = got_repo_open(&repo, repo_path);
if (err != NULL || repo == NULL)
return 0;
- err = got_object_open(&obj, repo, &id);
+ err = got_object_open(&obj, repo, id);
+ free(id);
if (err != NULL || obj == NULL)
return 0;
if (got_object_get_type(obj) != GOT_OBJ_TYPE_TREE)
const char *blob_sha1 = "141f5fdc96126c1f4195558560a3c915e3d9b4c3";
const struct got_error *err;
struct got_repository *repo;
- struct got_object_id id;
+ struct got_object_id *id;
struct got_object *obj;
struct got_blob_object *blob;
char hex[SHA1_DIGEST_STRING_LENGTH];
int i;
size_t len;
- if (!got_parse_sha1_digest(id.sha1, blob_sha1))
+ err = got_parse_object_id(&id, blob_sha1);
+ if (err != NULL)
return 0;
err = got_repo_open(&repo, repo_path);
if (err != NULL || repo == NULL)
return 0;
- err = got_object_open(&obj, repo, &id);
+ err = got_object_open(&obj, repo, id);
+ free(id);
if (err != NULL || obj == NULL)
return 0;
if (got_object_get_type(obj) != GOT_OBJ_TYPE_BLOB)
const char *blob2_sha1 = "de7eb21b21c7823a753261aadf7cba35c9580fbf";
const struct got_error *err;
struct got_repository *repo;
- struct got_object_id id1;
- struct got_object_id id2;
+ struct got_object_id *id1;
+ struct got_object_id *id2;
struct got_object *obj1;
struct got_object *obj2;
struct got_blob_object *blob1;
size_t len;
FILE *outfile;
- if (!got_parse_sha1_digest(id1.sha1, blob1_sha1))
+ err = got_parse_object_id(&id1, blob1_sha1);
+ if (err != NULL)
return 0;
- if (!got_parse_sha1_digest(id2.sha1, blob2_sha1))
+
+ err = got_parse_object_id(&id2, blob2_sha1);
+ if (err != NULL)
return 0;
err = got_repo_open(&repo, repo_path);
if (err != NULL || repo == NULL)
return 0;
- err = got_object_open(&obj1, repo, &id1);
+ err = got_object_open(&obj1, repo, id1);
+ free(id1);
if (err != NULL || obj1 == NULL)
return 0;
if (got_object_get_type(obj1) != GOT_OBJ_TYPE_BLOB)
return 0;
- err = got_object_open(&obj2, repo, &id2);
+ err = got_object_open(&obj2, repo, id2);
+ free(id2);
if (err != NULL || obj2 == NULL)
return 0;
if (got_object_get_type(obj2) != GOT_OBJ_TYPE_BLOB)
const char *tree2_sha1 = "4aa8f2933839ff8a8fb3f905a4c232d22c6ff5f3";
const struct got_error *err;
struct got_repository *repo;
- struct got_object_id id1;
- struct got_object_id id2;
+ struct got_object_id *id1;
+ struct got_object_id *id2;
struct got_object *obj1;
struct got_object *obj2;
struct got_tree_object *tree1;
size_t len;
FILE *outfile;
- if (!got_parse_sha1_digest(id1.sha1, tree1_sha1))
+ err = got_parse_object_id(&id1, tree1_sha1);
+ if (err != NULL)
return 0;
- if (!got_parse_sha1_digest(id2.sha1, tree2_sha1))
+
+ err = got_parse_object_id(&id2, tree2_sha1);
+ if (err != NULL)
return 0;
err = got_repo_open(&repo, repo_path);
if (err != NULL || repo == NULL)
return 0;
- err = got_object_open(&obj1, repo, &id1);
+ err = got_object_open(&obj1, repo, id1);
+ free(id1);
if (err != NULL || obj1 == NULL)
return 0;
if (got_object_get_type(obj1) != GOT_OBJ_TYPE_TREE)
return 0;
- err = got_object_open(&obj2, repo, &id2);
+ err = got_object_open(&obj2, repo, id2);
+ free(id2);
if (err != NULL || obj2 == NULL)
return 0;
if (got_object_get_type(obj2) != GOT_OBJ_TYPE_TREE)