#include "GitRev.h"\r
#include "GitStatus.h"\r
#include "GitAdminDir.h"\r
+#include "gitdll.h"\r
\r
class CGitCall\r
{\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
\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
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_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
\r
//hash is empty means all. -1 means all\r
\r
- int GetLog(CGitCall* pgitCall, CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME);\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
+ 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
- BOOL EnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData);\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
- git_revnum_t GetHash(CString &friendname);\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
- static BOOL IsVista();\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
\r
extern CGit g_Git;\r
\r
-inline static BOOL wgEnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData) { return g_Git.EnumFiles(pszProjectPath, pszSubPath, nFlags, pEnumCb, pUserData); }\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