OSDN Git Service

Fix free commit list problem.
authorFrank Li <lznuaa@gmail.com>
Thu, 31 Dec 2009 03:15:31 +0000 (11:15 +0800)
committerFrank Li <lznuaa@gmail.com>
Thu, 31 Dec 2009 03:15:31 +0000 (11:15 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
ext/gitdll/gitdll.c
ext/gitdll/gitdll.h
ext/gitdlltest/gitdlltest.cpp

index 5098a8b..3ffee69 100644 (file)
@@ -201,6 +201,31 @@ int git_get_commit_from_hash(GIT_COMMIT *commit, GIT_HASH hash)
        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
@@ -211,6 +236,10 @@ int git_free_commit(GIT_COMMIT *commit)
        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
@@ -346,10 +375,14 @@ int git_open_diff(GIT_DIFF *diff, char * arg)
 \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
@@ -360,11 +393,12 @@ int git_diff_flush(struct diff_options *options)
                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
@@ -373,8 +407,6 @@ int git_diff(GIT_DIFF diff, GIT_HASH hash1, GIT_HASH hash2)
        \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
@@ -384,11 +416,44 @@ int git_diff(GIT_DIFF diff, GIT_HASH hash1, GIT_HASH hash2)
        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
index 2053fc4..b771e40 100644 (file)
@@ -28,11 +28,13 @@ public:
 #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
@@ -101,14 +103,16 @@ GITDLL_API int git_close_log(GIT_LOG handle);
  */\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
index 39aaeb7..2b1b17a 100644 (file)
@@ -14,6 +14,7 @@ int output(int ret, char * name)
 }\r
 int _tmain(int argc, _TCHAR* argv[])\r
 {\r
+       int count;\r
        GIT_HASH hash;\r
        GIT_COMMIT commit;\r
        char *buf;\r
@@ -28,13 +29,53 @@ int _tmain(int argc, _TCHAR* argv[])
        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
@@ -43,6 +84,8 @@ int _tmain(int argc, _TCHAR* argv[])
        }\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