PyObject * git_oid_to_py_str(const git_oid *oid) { char hex[GIT_OID_HEXSZ]; git_oid_fmt(hex, oid); #if PY_MAJOR_VERSION == 2 return PyBytes_FromStringAndSize(hex, GIT_OID_HEXSZ); #else return to_unicode_n(hex, GIT_OID_HEXSZ, "utf-8", "strict"); #endif }
PyObject * Object_short_id__get__(Object *self) { git_buf short_id = { NULL, 0, 0 }; PyObject *py_short_id; int err = git_object_short_id(&short_id, self->obj); if (err != GIT_OK) return Error_set(err); py_short_id = to_unicode_n(short_id.ptr, short_id.size, NULL, "strict"); git_buf_dispose(&short_id); return py_short_id; }
PyObject * wrap_diff_line(const git_diff_line *line) { DiffLine *py_line; py_line = PyObject_New(DiffLine, &DiffLineType); if (py_line) { py_line->origin = line->origin; py_line->old_lineno = line->old_lineno; py_line->new_lineno = line->new_lineno; py_line->num_lines = line->num_lines; py_line->content = to_unicode_n(line->content, line->content_len, NULL, NULL); py_line->content_offset = line->content_offset; } return (PyObject *) py_line; }
PyObject * wrap_diff_hunk(git_patch *patch, size_t idx) { DiffHunk *py_hunk; const git_diff_hunk *hunk; const git_diff_line *line; size_t j, lines_in_hunk; int err; err = git_patch_get_hunk(&hunk, &lines_in_hunk, patch, idx); if (err < 0) return Error_set(err); py_hunk = PyObject_New(DiffHunk, &DiffHunkType); if (py_hunk) { py_hunk->old_start = hunk->old_start; py_hunk->old_lines = hunk->old_lines; py_hunk->new_start = hunk->new_start; py_hunk->new_lines = hunk->new_lines; py_hunk->header = to_unicode_n((const char *) &hunk->header, hunk->header_len, NULL, NULL); py_hunk->lines = PyList_New(lines_in_hunk); for (j = 0; j < lines_in_hunk; ++j) { PyObject *py_line = NULL; err = git_patch_get_line_in_hunk(&line, patch, idx, j); if (err < 0) return Error_set(err); py_line = wrap_diff_line(line); if (py_line == NULL) return NULL; PyList_SetItem(py_hunk->lines, j, py_line); } } return (PyObject *) py_hunk; }
PyObject * wrap_patch(git_patch *patch) { Patch *py_patch; if (!patch) Py_RETURN_NONE; py_patch = PyObject_New(Patch, &PatchType); if (py_patch) { size_t i, j, hunk_amounts, lines_in_hunk, additions, deletions; const git_diff_delta *delta; const git_diff_hunk *hunk; const git_diff_line *line; int err; delta = git_patch_get_delta(patch); py_patch->old_file_path = delta->old_file.path; py_patch->new_file_path = delta->new_file.path; py_patch->status = git_diff_status_char(delta->status); py_patch->similarity = delta->similarity; py_patch->flags = delta->flags; py_patch->old_id = git_oid_allocfmt(&delta->old_file.id); py_patch->new_id = git_oid_allocfmt(&delta->new_file.id); git_patch_line_stats(NULL, &additions, &deletions, patch); py_patch->additions = additions; py_patch->deletions = deletions; hunk_amounts = git_patch_num_hunks(patch); py_patch->hunks = PyList_New(hunk_amounts); for (i = 0; i < hunk_amounts; ++i) { Hunk *py_hunk = NULL; err = git_patch_get_hunk(&hunk, &lines_in_hunk, patch, i); if (err < 0) return Error_set(err); py_hunk = PyObject_New(Hunk, &HunkType); if (py_hunk != NULL) { py_hunk->old_start = hunk->old_start; py_hunk->old_lines = hunk->old_lines; py_hunk->new_start = hunk->new_start; py_hunk->new_lines = hunk->new_lines; py_hunk->lines = PyList_New(lines_in_hunk); for (j = 0; j < lines_in_hunk; ++j) { PyObject *py_line_origin = NULL, *py_line = NULL; err = git_patch_get_line_in_hunk(&line, patch, i, j); if (err < 0) return Error_set(err); py_line_origin = to_unicode_n(&line->origin, 1, NULL, NULL); py_line = to_unicode_n(line->content, line->content_len, NULL, NULL); PyList_SetItem(py_hunk->lines, j, Py_BuildValue("OO", py_line_origin, py_line)); Py_DECREF(py_line_origin); Py_DECREF(py_line); } PyList_SetItem((PyObject*) py_patch->hunks, i, (PyObject*) py_hunk); } } } git_patch_free(patch); return (PyObject*) py_patch; }
PyObject* diff_get_patch_byindex(git_diff_list* list, size_t idx) { const git_diff_delta* delta; const git_diff_range* range; git_diff_patch* patch = NULL; size_t i, j, hunk_amounts, lines_in_hunk, line_len, header_len; const char* line, *header; int err; Hunk *py_hunk = NULL; Patch *py_patch = NULL; err = git_diff_get_patch(&patch, &delta, list, idx); if (err < 0) return Error_set(err); py_patch = PyObject_New(Patch, &PatchType); if (py_patch != NULL) { py_patch->old_file_path = delta->old_file.path; py_patch->new_file_path = delta->new_file.path; py_patch->status = git_diff_status_char(delta->status); py_patch->similarity = delta->similarity; py_patch->old_oid = git_oid_allocfmt(&delta->old_file.oid); py_patch->new_oid = git_oid_allocfmt(&delta->new_file.oid); hunk_amounts = git_diff_patch_num_hunks(patch); py_patch->hunks = PyList_New(hunk_amounts); for (i=0; i < hunk_amounts; ++i) { err = git_diff_patch_get_hunk(&range, &header, &header_len, &lines_in_hunk, patch, i); if (err < 0) goto cleanup; py_hunk = PyObject_New(Hunk, &HunkType); if (py_hunk != NULL) { py_hunk->old_start = range->old_start; py_hunk->old_lines = range->old_lines; py_hunk->new_start = range->new_start; py_hunk->new_lines = range->new_lines; py_hunk->lines = PyList_New(lines_in_hunk + 1); PyList_SetItem(py_hunk->lines, 0, to_unicode_n(header, header_len, NULL, NULL)); for (j=1; j < lines_in_hunk + 1; ++j) { err = git_diff_patch_get_line_in_hunk(&py_hunk->origin, &line, &line_len, NULL, NULL, patch, i, j - 1); if (err < 0) goto cleanup; PyList_SetItem(py_hunk->lines, j, to_unicode_n(line, line_len, NULL, NULL)); } PyList_SetItem((PyObject*) py_patch->hunks, i, (PyObject*) py_hunk); } } } cleanup: git_diff_patch_free(patch); return (err < 0) ? Error_set(err) : (PyObject*) py_patch; }