void git_commit__free(git_commit *commit) { clear_parents(commit); git_signature_free(commit->author); git_signature_free(commit->committer); free(commit->message); free(commit->message_short); free(commit); }
void git_commit__free(git_commit *commit) { clear_parents(commit); git_vector_free(&commit->parent_oids); git_signature_free(commit->author); git_signature_free(commit->committer); free(commit->message); free(commit->message_encoding); free(commit); }
int commit_parse_buffer(git_commit *commit, void *data, size_t len, unsigned int parse_flags) { char *buffer = (char *)data; const char *buffer_end = (char *)data + len; git_oid oid; int error; /* first parse; the vector hasn't been initialized yet */ if (commit->parents.contents == NULL) { git_vector_init(&commit->parents, 4, NULL, NULL); } clear_parents(commit); if ((error = git__parse_oid(&oid, &buffer, buffer_end, "tree ")) < GIT_SUCCESS) return error; if ((error = git_repository_lookup((git_object **)&commit->tree, commit->object.repo, &oid, GIT_OBJ_TREE)) < GIT_SUCCESS) return error; /* * TODO: commit grafts! */ while (git__parse_oid(&oid, &buffer, buffer_end, "parent ") == GIT_SUCCESS) { git_commit *parent; if ((error = git_repository_lookup((git_object **)&parent, commit->object.repo, &oid, GIT_OBJ_COMMIT)) < GIT_SUCCESS) return error; if (git_vector_insert(&commit->parents, parent) < GIT_SUCCESS) return GIT_ENOMEM; } if (parse_flags & COMMIT_FULL_PARSE) { if (commit->author) git_signature_free(commit->author); commit->author = git__malloc(sizeof(git_signature)); if ((error = git_signature__parse(commit->author, &buffer, buffer_end, "author ")) < GIT_SUCCESS) return error; } else { if ((buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL) return GIT_EOBJCORRUPTED; buffer++; } /* Always parse the committer; we need the commit time */ if (commit->committer) git_signature_free(commit->committer); commit->committer = git__malloc(sizeof(git_signature)); if ((error = git_signature__parse(commit->committer, &buffer, buffer_end, "committer ")) < GIT_SUCCESS) return error; /* parse commit message */ while (buffer <= buffer_end && *buffer == '\n') buffer++; if (parse_flags & COMMIT_FULL_PARSE && buffer < buffer_end) { const char *line_end; size_t message_len = buffer_end - buffer; /* Long message */ message_len = buffer_end - buffer; commit->message = git__malloc(message_len + 1); memcpy(commit->message, buffer, message_len); commit->message[message_len] = 0; /* Short message */ if((line_end = memchr(buffer, '\n', buffer_end - buffer)) == NULL) line_end = buffer_end; message_len = line_end - buffer; commit->message_short = git__malloc(message_len + 1); memcpy(commit->message_short, buffer, message_len); commit->message_short[message_len] = 0; } return GIT_SUCCESS; }