#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
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
path++;\r
}\r
}\r
+\r
int git_init()\r
{\r
char *home;\r
\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
};\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
#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