return git_parse_commit(commit);\r
}\r
\r
+int git_get_commit_first_parent(GIT_COMMIT *commit,GIT_COMMIT_LIST *list)\r
+{\r
+ struct commit *p = commit->m_pGitCommit;\r
+\r
+ if(list == NULL)\r
+ return -1;\r
+ \r
+ *list = (GIT_COMMIT_LIST*)p->parents;\r
+ return 0;\r
+}\r
+int git_get_commit_next_parent(GIT_COMMIT_LIST *list, GIT_HASH hash)\r
+{\r
+ struct commit_list *l = *(struct commit_list **)list;\r
+ if(list == NULL)\r
+ return -1;\r
+\r
+ if(hash)\r
+ memcpy(hash, l->item->object.sha1, GIT_HASH_SIZE);\r
+\r
+ *list = (GIT_COMMIT_LIST *)l->next;\r
+ return 0;\r
+\r
+}\r
+\r
+\r
int git_free_commit(GIT_COMMIT *commit)\r
{\r
struct commit *p = commit->m_pGitCommit;\r
if( p->buffer )\r
{\r
free(p->buffer);\r
+ p->buffer=NULL;\r
+ p->object.parsed=0;\r
+ p->parents=0;\r
+ p->tree=0;\r
}\r
memset(commit,0,sizeof(GIT_COMMIT));\r
return 0;\r
\r
return 0;\r
}\r
-int git_diff_flush(struct diff_options *options)\r
+int git_diff_flush(GIT_DIFF diff)\r
{\r
struct diff_queue_struct *q = &diff_queued_diff;\r
+ struct rev_info *p_Rev;\r
int i;\r
+ p_Rev = (struct rev_info *)diff;\r
+ \r
+ \r
for (i = 0; i < q->nr; i++)\r
diff_free_filepair(q->queue[i]);\r
\r
q->nr = q->alloc = 0;\r
}\r
\r
- if (options->close_file)\r
- fclose(options->file);\r
+ if (p_Rev->diffopt.close_file)\r
+ fclose(p_Rev->diffopt.close_file);\r
\r
+ free_diffstat_info(&p_Rev->diffstat);\r
}\r
-int git_diff(GIT_DIFF diff, GIT_HASH hash1, GIT_HASH hash2)\r
+int git_diff(GIT_DIFF diff, GIT_HASH hash1, GIT_HASH hash2, GIT_FILE * file, int *count)\r
{\r
struct rev_info *p_Rev;\r
int ret;\r
\r
p_Rev = (struct rev_info *)diff;\r
\r
- git_diff_flush(&p_Rev->diffopt);\r
-\r
ret = diff_tree_sha1(hash1,hash2,"",&p_Rev->diffopt);\r
if( ret )\r
return ret;\r
memset(&p_Rev->diffstat, 0, sizeof(struct diffstat_t));\r
for (i = 0; i < q->nr; i++) {\r
struct diff_filepair *p = q->queue[i];\r
- if (check_pair_status(p))\r
- diff_flush_stat(p, &p_Rev->diffopt, &p_Rev->diffstat);\r
+ //if (check_pair_status(p))\r
+ diff_flush_stat(p, &p_Rev->diffopt, &p_Rev->diffstat);\r
}\r
- free_diffstat_info(&p_Rev->diffstat);\r
\r
+ if(file)\r
+ *file = q;\r
+ if(count)\r
+ *count = q->nr;\r
return 0;\r
}\r
\r
+int git_get_diff_file(GIT_DIFF diff,GIT_FILE file,int i, char **newname, char ** oldname, int *status, int *IsBin, int *inc, int *dec)\r
+{\r
+ struct diff_queue_struct *q = &diff_queued_diff;\r
+ struct rev_info *p_Rev;\r
+ p_Rev = (struct rev_info *)diff;\r
+ \r
+ q = (struct diff_queue_struct *)file;\r
+ if(file == 0)\r
+ return -1;\r
+ if(i>=q->nr)\r
+ return -1;\r
+\r
+ if(newname)\r
+ *newname = q->queue[i]->one->path;\r
+\r
+ if(oldname)\r
+ *oldname = q->queue[i]->two->path;\r
+\r
+ if(status)\r
+ *status = q->queue[i]->status;\r
+\r
+ if(IsBin)\r
+ *IsBin = p_Rev->diffstat.files[i]->is_binary;\r
+ if(inc)\r
+ *inc = p_Rev->diffstat.files[i]->added;\r
+ if(dec)\r
+ *dec = p_Rev->diffstat.files[i]->deleted;\r
+\r
+ return 0;\r
+}
\ No newline at end of file
#define GIT_HASH_SIZE 20\r
\r
typedef unsigned char GIT_HASH[GIT_HASH_SIZE];\r
+\r
typedef unsigned int GIT_HANDLE;\r
typedef unsigned int GIT_LOG;\r
\r
typedef unsigned int GIT_DIFF;\r
typedef unsigned int GIT_FILE;\r
+typedef unsigned int GIT_COMMIT_LIST;\r
\r
struct GIT_COMMIT_AUTHOR\r
{\r
*/\r
GITDLL_API int git_get_commit_from_hash(GIT_COMMIT *commit, GIT_HASH hash);\r
GITDLL_API int git_parse_commit(GIT_COMMIT *commit);\r
+\r
+GITDLL_API int git_get_commit_first_parent(GIT_COMMIT *commit,GIT_COMMIT_LIST *list);\r
+GITDLL_API int git_get_commit_next_parent(GIT_COMMIT_LIST *list, GIT_HASH hash);\r
+\r
GITDLL_API int git_free_commit(GIT_COMMIT *commit);\r
\r
GITDLL_API int git_open_diff(GIT_DIFF *diff, char * arg);\r
-GITDLL_API int git_diff(GIT_DIFF diff, GIT_HASH hash1,GIT_HASH hash2);\r
+GITDLL_API int git_diff(GIT_DIFF diff, GIT_HASH hash1,GIT_HASH hash2, GIT_FILE * file, int *count);\r
+GITDLL_API int git_diff_flush(GIT_DIFF diff);\r
GITDLL_API int git_close_diff(GIT_DIFF diff);\r
\r
-GITDLL_API int git_get_diff_firstfile(GIT_DIFF diff, GIT_FILE * file);\r
-GITDLL_API int git_get_diff_nextfile(GIT_DIFF diff, GIT_FILE *file);\r
-GITDLL_API int git_get_diff_status(GIT_DIFF diff, int * status);\r
-GITDLL_API int git_get_diff_stat(GIT_FILE file, int *inc, int *dec, int *mode);\r
-GITDLL_API int git_get_diff_file(GIT_FILE file, char *newname, int newsize, char *oldname, int oldsize, int *mode);
\ No newline at end of file
+\r
+GITDLL_API int git_get_diff_file(GIT_DIFF diff,GIT_FILE file, int i,char **newname, char **oldname, int *mode, int *IsBin, int *inc, int *dec);\r
}\r
int _tmain(int argc, _TCHAR* argv[])\r
{\r
+ int count;\r
GIT_HASH hash;\r
GIT_COMMIT commit;\r
char *buf;\r
output(ret,"git_get_sha1");\r
ret=git_get_commit_from_hash(&commit, hash);\r
output(ret,"git_get_commit_from_hash");\r
+\r
+ GIT_COMMIT_LIST list;\r
+ GIT_HASH outhash;\r
+ int i=0;\r
+ ret = git_get_commit_first_parent(&commit,&list);\r
+ output(ret, "git_get_commit_first_parent");\r
+ while(list)\r
+ {\r
+ i++;\r
+ ret = git_get_commit_next_parent(&list, outhash);\r
+ }\r
+ printf("parent count %d\r\n",i);\r
+\r
+ GIT_DIFF diff;\r
+ ret = git_open_diff(&diff, "-M -C --stat");\r
+ output(ret, "git_open_diff");\r
\r
+ GIT_FILE file;\r
+\r
+ ret = git_diff(diff, outhash, commit.m_hash,&file, &count);\r
+ output(ret, "git_diff");\r
+\r
+ for(i =0;i<count;i++)\r
+ { \r
+ char * newname;\r
+ char * oldname;\r
+ int status;\r
+ int IsBin;\r
+ int inc, dec;\r
+ ret = git_get_diff_file(diff,file,i,&newname, &oldname, &status,\r
+ &IsBin, &inc, &dec);\r
+ }\r
+ ret = git_diff_flush(diff);\r
+ output(ret, "git_diff_flush");\r
+// ret = git_close_diff(diff);\r
+// output(ret, "git_close_diff");\r
+\r
+\r
+ git_free_commit(&commit);\r
+\r
+\r
GIT_HANDLE handle;\r
ret=git_open_log(&handle,"--stat -c -- \"build.txt\"");\r
output(ret,"git_open_log");\r
ret=git_get_log_firstcommit(handle);\r
output(ret,"git_get_log_firstcommit");\r
- int count = 0;\r
+ count = 0;\r
while( git_get_log_nextcommit(handle,&commit) == 0)\r
{\r
//printf("%s\r\n",commit.m_Subject);\r
}\r
printf("commit number %d\r\n",count);\r
ret=git_close_log(handle);\r
+\r
+\r
output(ret,"git_close_log");\r
return ret;\r
}\r