int git_do_diff(GIT_DIFF diff, GIT_HASH hash1, GIT_HASH hash2, GIT_FILE * file, int *count,int isstat) { struct rev_info *p_Rev; int ret; int i; struct diff_queue_struct *q = &diff_queued_diff; p_Rev = (struct rev_info *)diff; ret = diff_tree_sha1(hash1,hash2,"",&p_Rev->diffopt); if( ret ) { free_all_pack(); return ret; } if(isstat) { diffcore_std(&p_Rev->diffopt); memset(&p_Rev->diffstat, 0, sizeof(struct diffstat_t)); for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; //if (check_pair_status(p)) diff_flush_stat(p, &p_Rev->diffopt, &p_Rev->diffstat); } } free_all_pack(); if(file) *file = q; if(count) *count = q->nr; return 0; }
int git_root_diff(GIT_DIFF diff, const GIT_HASH hash, GIT_FILE* file, int* count, int isstat) { int ret; struct object_id oid; struct rev_info *p_Rev; struct diff_queue_struct *q = &diff_queued_diff; p_Rev = (struct rev_info *)diff; hashcpy(oid.hash, hash); ret = diff_root_tree_oid(&oid, "", &p_Rev->diffopt); if(ret) return ret; if(isstat) { diffcore_std(&p_Rev->diffopt); memset(&p_Rev->diffstat, 0, sizeof(struct diffstat_t)); for (int i = 0; i < q->nr; ++i) { struct diff_filepair *p = q->queue[i]; //if (check_pair_status(p)) diff_flush_stat(p, &p_Rev->diffopt, &p_Rev->diffstat); } } if (file) *file = q; if (count) *count = q->nr; return 0; }