OSDN Git Service

merge original branch.
[tortoisegit/TortoiseGitJp.git] / src / Git / Git.h
index 406bfa9..a868e24 100644 (file)
@@ -3,32 +3,96 @@
 #include "GitRev.h"\r
 #include "GitStatus.h"\r
 #include "GitAdminDir.h"\r
+#include "gitdll.h"\r
 \r
+class CGitCall\r
+{\r
+public:\r
+       CGitCall(){}\r
+       CGitCall(CString cmd):m_Cmd(cmd){}\r
+\r
+       CString                 GetCmd()const{return m_Cmd;}\r
+       void                    SetCmd(CString cmd){m_Cmd=cmd;}\r
+\r
+       //This function is called when command output data is available.\r
+       //When this function returns 'true' the git command should be aborted.\r
+       //This behavior is not implemented yet.\r
+       virtual bool    OnOutputData(const BYTE* data, size_t size)=0;\r
+       virtual void    OnEnd(){}\r
+\r
+private:\r
+       CString m_Cmd;\r
+\r
+};\r
+\r
+class CTGitPath;\r
 \r
 class CGit\r
 {\r
 private:\r
        GitAdminDir m_GitDir;\r
+protected:\r
+       bool m_IsGitDllInited;\r
+       GIT_DIFF m_GitDiff;\r
 public:\r
+       void CheckAndInitDll()\r
+       { \r
+               if(!m_IsGitDllInited) \r
+               {\r
+                       git_init();\r
+                       m_IsGitDllInited=true;\r
+               } \r
+       }\r
+\r
+       GIT_DIFF GetGitDiff()\r
+       {\r
+               if(m_GitDiff)\r
+                       return m_GitDiff;\r
+               else\r
+               {\r
+                       git_open_diff(&m_GitDiff,"-C -M -r");\r
+                       return m_GitDiff;\r
+               }\r
+       }\r
+\r
        static BOOL CheckMsysGitDir();\r
        static CString ms_LastMsysGitDir;       // the last msysgitdir added to the path, blank if none\r
-\r
+       static int m_LogEncode;\r
+       unsigned int Hash2int(CString &hash);\r
 //     static CString m_MsysGitPath;\r
+       \r
+       PROCESS_INFORMATION m_CurrentGitPi;\r
+\r
        CGit(void);\r
        ~CGit(void);\r
        \r
        int Run(CString cmd, CString* output,int code);\r
        int Run(CString cmd, BYTE_VECTOR *byte_array);\r
+       int Run(CGitCall* pcall);\r
 \r
        int RunAsync(CString cmd,PROCESS_INFORMATION *pi, HANDLE* hRead, CString *StdioFile=NULL);\r
        int RunLogFile(CString cmd, CString &filename);\r
+\r
+       bool IsFastForward(CString &from, CString &to);\r
+       CString GetConfigValue(CString name);\r
        CString GetUserName(void);\r
        CString GetUserEmail(void);\r
        CString GetCurrentBranch(void);\r
+       CString GetSymbolicRef(const wchar_t* symbolicRefName = L"HEAD", bool bStripRefsHeads = true);\r
+       // read current branch name from HEAD file, returns 0 on success, -1 on failure, 1 detached (branch name "HEAD" returned)\r
+       int GetCurrentBranchFromFile(const CString &sProjectRoot, CString &sBranchOut);\r
+       BOOL CheckCleanWorkTree();\r
+       int Revert(CTGitPath &path,bool keep=true);\r
+       int Revert(CTGitPathList &list,bool keep=true);\r
 \r
        bool SetCurrentDir(CString path)\r
        {\r
-               return m_GitDir.HasAdminDir(path,&m_CurrentDir);\r
+               bool b = m_GitDir.HasAdminDir(path,&m_CurrentDir);\r
+               if(m_CurrentDir.GetLength() == 2 && m_CurrentDir[1] == _T(':')) //C: D:\r
+               {\r
+                       m_CurrentDir+=_T('\\');\r
+               }\r
+               return b;\r
        }\r
        CString m_CurrentDir;\r
 \r
@@ -49,7 +113,12 @@ public:
         LOG_INFO_ALL_BRANCH=0x20,\r
                LOG_INFO_ONLY_HASH=0x40,\r
                LOG_INFO_DETECT_RENAME=0x80,\r
-               LOG_INFO_DETECT_COPYRENAME=0x100\r
+               LOG_INFO_DETECT_COPYRENAME=0x100,\r
+               LOG_INFO_FIRST_PARENT = 0x200,\r
+               LOG_INFO_NO_MERGE = 0x400,\r
+               LOG_INFO_FOLLOW = 0x800,\r
+               LOG_INFO_SHOW_MERGEDFILE=0x1000,\r
+               LOG_INFO_FULL_DIFF = 0x2000,\r
        }LOG_INFO_MASK;\r
 \r
        int GetRemoteList(STRING_VECTOR &list);\r
@@ -58,19 +127,42 @@ public:
        int GetMapHashToFriendName(MAP_HASH_NAME &map);\r
        \r
        //hash is empty means all. -1 means all\r
-       int GetLog(BYTE_VECTOR& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME);\r
 \r
-       git_revnum_t GetHash(CString &friendname);\r
+       int GetLog(CGitCall* pgitCall, CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_FULL_DIFF|LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME|LOG_INFO_SHOW_MERGEDFILE,\r
+                                                               CString *from=NULL,CString *to=NULL);\r
+       int GetLog(BYTE_VECTOR& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_FULL_DIFF|LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME|LOG_INFO_SHOW_MERGEDFILE,\r
+                                                               CString *from=NULL,CString *to=NULL);\r
+\r
+       CString GetLogCmd(CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_FULL_DIFF|LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME|LOG_INFO_SHOW_MERGEDFILE,\r
+                                                               CString *from=NULL,CString *to=NULL, bool paramonly=false);\r
+\r
+       BOOL EnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData);\r
+\r
+       git_revnum_t GetHash(const CString &friendname);\r
 \r
        int BuildOutputFormat(CString &format,bool IsFull=TRUE);\r
        //int GetShortLog(CString &log,CTGitPath * path=NULL, int count =-1);\r
        static void StringAppend(CString *str,BYTE *p,int code=CP_UTF8,int length=-1);\r
 \r
        BOOL IsInitRepos();\r
+       int ListConflictFile(CTGitPathList &list,CTGitPath *path=NULL);\r
+       int GetRefList(STRING_VECTOR &list);\r
+\r
+       int RefreshGitIndex();\r
+\r
+       //Example: master -> refs/heads/master\r
+       CString GetFullRefName(CString shortRefName);\r
+       //Removes 'refs/heads/' or just 'refs'. Example: refs/heads/master -> master\r
+       static CString StripRefName(CString refName);\r
+\r
+       int GetCommitDiffList(CString &rev1,CString &rev2,CTGitPathList &outpathlist);\r
+\r
        \r
 };\r
 extern void GetTempPath(CString &path);\r
 extern CString GetTempFile();\r
 \r
 \r
-extern CGit g_Git;
\ No newline at end of file
+extern CGit g_Git;\r
+\r
+inline static BOOL wgEnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData) { return g_Git.EnumFiles(pszProjectPath, pszSubPath, nFlags, pEnumCb, pUserData); }\r