OSDN Git Service

Git DLL get commit information basic work.
authorFrank Li <lznuaa@gmail.com>
Tue, 29 Dec 2009 05:41:12 +0000 (13:41 +0800)
committerFrank Li <lznuaa@gmail.com>
Tue, 29 Dec 2009 05:41:12 +0000 (13:41 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
ext/gitdll/gitdll.c
ext/gitdll/gitdll.h
ext/gitdlltest/gitdlltest.cpp

index 47cdc52..4ef95d4 100644 (file)
@@ -4,6 +4,7 @@
 #include "stdafx.h"\r
 #include "gitdll.h"\r
 #include "cache.h"\r
+#include "commit.h"\r
 #if 0\r
 \r
 // This is an example of an exported variable\r
@@ -42,7 +43,7 @@ void dll_entry()
        set_die_routine(die_dll);\r
 }\r
 \r
-int git_get_sha1(const char *name, unsigned char *sha1)\r
+int git_get_sha1(const char *name, GIT_HASH sha1)\r
 {\r
        return get_sha1(name,sha1);\r
 }\r
@@ -56,6 +57,7 @@ static int convert_slash(char * path)
                path++;\r
        }\r
 }\r
+\r
 int git_init()\r
 {\r
        char *home;\r
@@ -76,5 +78,117 @@ int git_init()
 \r
        git_extract_argv0_path(path);\r
        prefix = setup_git_directory();\r
-       git_config(git_default_config, NULL);\r
-}
\ No newline at end of file
+       return git_config(git_default_config, NULL);\r
+}\r
+\r
+static int git_parse_commit_author(struct GIT_COMMIT_AUTHOR *author, char *pbuff)\r
+{\r
+       char *end;\r
+\r
+       author->Name=pbuff;\r
+       end=strchr(pbuff,'<');\r
+       if( end == 0)\r
+       {\r
+               return -1;\r
+       }\r
+       author->NameSize = end - pbuff - 1;\r
+\r
+       pbuff = end +1;\r
+       end = strchr(pbuff, '>');\r
+       if( end == 0)\r
+               return -1;\r
+\r
+       author->Email = pbuff ;\r
+       author->EmailSize = end - pbuff;\r
+\r
+       pbuff = end + 2;\r
+\r
+       author->Date = atol(pbuff);\r
+       end =  strchr(pbuff, ' ');\r
+       if( end == 0 )\r
+               return -1;\r
+\r
+       pbuff=end;\r
+       author->TimeZone = atol(pbuff);\r
+\r
+       return 0;\r
+}\r
+\r
+static int git_parse_commit(GIT_COMMIT *commit)\r
+{\r
+       int ret = 0;\r
+       char *pbuf;\r
+       char *end;\r
+       struct commit *p;\r
+\r
+       p= (struct commit *)commit->m_pGitCommit;\r
+\r
+       memcpy(commit->m_hash,p->object.sha1,GIT_HASH_SIZE);\r
+\r
+       if(p->buffer == NULL)\r
+               return -1;\r
+\r
+       pbuf = p->buffer;\r
+       while(pbuf)\r
+       {\r
+               if( strncmp(pbuf,"author",6) == 0)\r
+               {\r
+                       ret = git_parse_commit_author(&commit->m_Author,pbuf + 7);\r
+                       if(ret)\r
+                               return ret;\r
+               }\r
+               if( strncmp(pbuf, "committer",9) == 0)\r
+               {\r
+                       ret =  git_parse_commit_author(&commit->m_Committer,pbuf + 10);\r
+                       if(ret)\r
+                               return ret;\r
+\r
+                       pbuf = strchr(pbuf,'\n');\r
+                       if(pbuf == NULL)\r
+                               return -1;\r
+\r
+                       while((*pbuf) && (*pbuf == '\n'))\r
+                               pbuf ++;\r
+\r
+                       commit->m_Subject=pbuf;\r
+                       end = strchr(pbuf,'\n');\r
+                       if( end == 0)\r
+                               commit->m_SubjectSize = strlen(pbuf);\r
+                       else\r
+                       {\r
+                               commit->m_SubjectSize = end - pbuf;\r
+                               pbuf = end +1;\r
+                               commit->m_Body = pbuf;\r
+                               commit->m_BodySize = strlen(pbuf);\r
+                               return 0;\r
+                       }\r
+\r
+               }\r
+\r
+               pbuf = strchr(pbuf,'\n');\r
+               if(pbuf)\r
+                       pbuf ++;\r
+       }\r
+\r
+}\r
+\r
+int git_get_commit_from_hash(GIT_COMMIT *commit, GIT_HASH hash)\r
+{\r
+       int ret = 0;\r
+       \r
+       struct commit *p = (struct commit*)commit;\r
+       commit->m_pGitCommit = p = lookup_commit(hash);\r
+\r
+       if(commit == NULL)\r
+               return -1;\r
+       \r
+       if(p == NULL)\r
+               return -1;\r
+       \r
+       ret = parse_commit(p);\r
+       if( ret )\r
+               return ret;\r
+\r
+       return git_parse_commit(commit);\r
+}\r
+\r
index f887712..3cec3d7 100644 (file)
@@ -25,10 +25,71 @@ public:
 };\r
 #endif\r
 \r
+#define GIT_HASH_SIZE 20\r
+\r
+typedef unsigned char GIT_HASH[GIT_HASH_SIZE];\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
+\r
+struct GIT_COMMIT_AUTHOR\r
+{\r
+       char *Name;\r
+       int       NameSize;\r
+       char *Email;\r
+       int       EmailSize;\r
+       int       Date;\r
+       int   TimeZone;\r
+       \r
+};\r
+typedef struct GIT_COMMIT_DATA\r
+{\r
+       GIT_HASH m_hash;\r
+       struct GIT_COMMIT_AUTHOR m_Author;\r
+       struct GIT_COMMIT_AUTHOR m_Committer;\r
+       char *   m_Subject;\r
+       int              m_SubjectSize;\r
+       char *   m_Body;\r
+       int              m_BodySize;\r
+       void *   m_pGitCommit; /** internal used */\r
+\r
+} GIT_COMMIT;\r
+\r
+\r
 GITDLL_API int ngitdll;\r
 \r
 GITDLL_API int fngitdll(void);\r
-\r
+/**\r
+ *     Get Git Last Error string. \r
+ */\r
 GITDLL_API char * get_git_last_error();\r
-GITDLL_API int git_get_sha1(const char *name, unsigned char *sha1);\r
-GITDLL_API int git_init();
\ No newline at end of file
+/**\r
+ *     Get hash value. \r
+ *     @param  name    [IN] Reference name, such as HEAD, master, ...\r
+ *     @param  sha1    [OUT] char[20] hash value. Caller prepare char[20] buffer.\r
+ *     @return                 0       success. \r
+ */\r
+GITDLL_API int git_get_sha1(const char *name, GIT_HASH sha1);\r
+/**\r
+ *     Init git dll\r
+ *  @remark, this function must be call before other function. \r
+ *     @return                 0       success\r
+ */\r
+GITDLL_API int git_init();\r
+\r
+GITDLL_API int git_open_log(GIT_LOG * handle, char * arg);\r
+GITDLL_API int git_get_log_count(GIT_LOG handle);\r
+GITDLL_API int git_get_log_firstcommit(GIT_LOG handle, GIT_COMMIT *commit);\r
+GITDLL_API int git_get_log_nextcommit(GIT_LOG handle, GIT_COMMIT *commit, int skip);\r
+GITDLL_API int git_close_log(GIT_LOG handle);\r
+\r
+GITDLL_API int git_get_commit_from_hash(GIT_COMMIT *commit, GIT_HASH hash);\r
+\r
+GITDLL_API int git_get_diff(GIT_COMMIT commit, GIT_DIFF *diff);\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
index b50f130..7298439 100644 (file)
@@ -4,12 +4,31 @@
 #include "stdafx.h"\r
 #include "gitdll.h"\r
 \r
+int output(int ret, char * name)\r
+{\r
+       if(ret)\r
+               printf("Fail \t%s\r\n",name);\r
+       else\r
+               printf("Success\t%s\r\n",name);\r
+       return 0;\r
+}\r
 int _tmain(int argc, _TCHAR* argv[])\r
 {\r
-       unsigned char hash[20];\r
+       GIT_HASH hash;\r
+       GIT_COMMIT commit;\r
+       char *buf;\r
+       int size;\r
+       memset(&hash,0,sizeof(GIT_HASH));\r
        int ret;\r
        ret=git_init();\r
+       output(ret,"git_init");\r
        ret=git_get_sha1("master",hash);\r
+       output(ret,"git_get_sha1");\r
+       ret=git_get_sha1("head",hash);\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
        return ret;\r
 }\r
 \r