int py_str_to_git_oid_expand(git_repository *repo, PyObject *py_str, git_oid *oid) { int err; int len; git_odb *odb; git_odb_object *obj; len = py_str_to_git_oid(py_str, oid); if (len == GIT_OID_HEXSZ || len < 0) return len; err = git_repository_odb(&odb, repo); if (err < 0) { Error_set(err); return -1; } err = git_odb_read_prefix(&obj, odb, oid, len); if (err < 0) { git_odb_free(odb); Error_set(err); return err; } git_oid_cpy(oid, git_odb_object_id(obj)); git_odb_object_free(obj); git_odb_free(odb); return 0; }
PyObject * Repository_read(Repository *self, PyObject *py_hex) { git_oid oid; git_odb_object *obj; int len; PyObject* tuple; len = py_str_to_git_oid(py_hex, &oid); if (len < 0) return NULL; obj = Repository_read_raw(self->repo, &oid, len); if (obj == NULL) return NULL; tuple = Py_BuildValue( "(ns#)", git_odb_object_type(obj), git_odb_object_data(obj), git_odb_object_size(obj)); git_odb_object_free(obj); return tuple; }
PyObject * Repository_create_tag(Repository *self, PyObject *args) { PyObject *py_oid; Signature *py_tagger; char *tag_name, *message; git_oid oid; git_object *target = NULL; int err, target_type, len; if (!PyArg_ParseTuple(args, "sOiO!s", &tag_name, &py_oid, &target_type, &SignatureType, &py_tagger, &message)) return NULL; len = py_str_to_git_oid(py_oid, &oid); if (len < 0) return NULL; err = git_object_lookup_prefix(&target, self->repo, &oid, (unsigned int)len, target_type); err = err < 0 ? err : git_tag_create(&oid, self->repo, tag_name, target, py_tagger->signature, message, 0); git_object_free(target); if (err < 0) return Error_set_oid(err, &oid, len); return git_oid_to_python(oid.id); }
int Repository_contains(Repository *self, PyObject *value) { git_oid oid; git_odb *odb; int err, len, exists; len = py_str_to_git_oid(value, &oid); if (len < 0) return -1; err = git_repository_odb(&odb, self->repo); if (err < 0) { Error_set(err); return -1; } if (len < GIT_OID_HEXSZ) { git_odb_object *obj = NULL; err = git_odb_read_prefix(&obj, odb, &oid, len); if (err < 0 && err != GIT_ENOTFOUND) { Error_set(err); exists = -1; } else { exists = (err == 0); if (obj) git_odb_object_free(obj); } } else { exists = git_odb_exists(odb, &oid); } git_odb_free(odb); return exists; }
PyObject * TreeBuilder_insert(TreeBuilder *self, PyObject *args) { PyObject *py_oid; int len, err, attr; git_oid oid; const char *fname; if (!PyArg_ParseTuple(args, "sOi", &fname, &py_oid, &attr)) { return NULL; } len = py_str_to_git_oid(py_oid, &oid); if (len < 0) { return NULL; } err = git_treebuilder_insert(NULL, self->bld, fname, &oid, attr); if (err < 0) { Error_set(err); return NULL; } Py_RETURN_NONE; }
PyObject * Repository_getitem(Repository *self, PyObject *value) { git_oid oid; int len; len = py_str_to_git_oid(value, &oid); if (len < 0) return NULL; return lookup_object_prefix(self, &oid, len, GIT_OBJ_ANY); }
PyObject * Index_read_tree(Index *self, PyObject *value) { git_oid oid; git_tree *tree; int err, len; len = py_str_to_git_oid(value, &oid); if (len < 0) return NULL; err = git_tree_lookup_prefix(&tree, self->repo->repo, &oid, (unsigned int)len); if (err < 0) return Error_set(err); err = git_index_read_tree(self->index, tree); if (err < 0) return Error_set(err); Py_RETURN_NONE; }
PyObject * Repository_create_commit(Repository *self, PyObject *args) { Signature *py_author, *py_committer; PyObject *py_oid, *py_message, *py_parents, *py_parent; PyObject *py_result = NULL; char *message = NULL; char *update_ref = NULL; char *encoding = NULL; git_oid oid; git_tree *tree = NULL; int parent_count; git_commit **parents = NULL; int err = 0, i = 0, len; if (!PyArg_ParseTuple(args, "zO!O!OOO!|s", &update_ref, &SignatureType, &py_author, &SignatureType, &py_committer, &py_message, &py_oid, &PyList_Type, &py_parents, &encoding)) return NULL; len = py_str_to_git_oid(py_oid, &oid); if (len < 0) goto out; message = py_str_to_c_str(py_message, encoding); if (message == NULL) goto out; err = git_tree_lookup_prefix(&tree, self->repo, &oid, (unsigned int)len); if (err < 0) { Error_set(err); goto out; } parent_count = (int)PyList_Size(py_parents); parents = malloc(parent_count * sizeof(git_commit*)); if (parents == NULL) { PyErr_SetNone(PyExc_MemoryError); goto out; } for (; i < parent_count; i++) { py_parent = PyList_GET_ITEM(py_parents, i); len = py_str_to_git_oid(py_parent, &oid); if (len < 0) goto out; if (git_commit_lookup_prefix(&parents[i], self->repo, &oid, (unsigned int)len)) goto out; } err = git_commit_create(&oid, self->repo, update_ref, py_author->signature, py_committer->signature, encoding, message, tree, parent_count, (const git_commit**)parents); if (err < 0) { Error_set(err); goto out; } py_result = git_oid_to_python(oid.id); out: free(message); git_tree_free(tree); while (i > 0) { i--; git_commit_free(parents[i]); } free(parents); return py_result; }