OSDN Git Service

Added some useful commands to CGit
authorJohan 't Hart <johanthart@gmail.com>
Fri, 26 Jun 2009 18:53:42 +0000 (20:53 +0200)
committerJohan 't Hart <johanthart@gmail.com>
Fri, 26 Jun 2009 19:03:18 +0000 (21:03 +0200)
src/Git/Git.cpp
src/Git/Git.h

index 3000113..a209a53 100644 (file)
@@ -304,19 +304,24 @@ int CGit::Run(CString cmd, CString* output,int code)
 \r
 CString CGit::GetUserName(void)\r
 {\r
-       CString UserName;\r
-       Run(_T("git.exe config user.name"),&UserName,CP_UTF8);\r
-       int start = 0;\r
-       return UserName.Tokenize(_T("\n"),start);\r
+       return GetConfigValue(L"user.name");\r
 }\r
 CString CGit::GetUserEmail(void)\r
 {\r
-       CString UserName;\r
-       Run(_T("git.exe config user.email"),&UserName,CP_UTF8);\r
+       return GetConfigValue(L"user.email");\r
+}\r
+\r
+CString CGit::GetConfigValue(CString name)\r
+{\r
+       CString configValue;\r
+       CString cmd;\r
+       cmd.Format(L"git.exe config %s", name);\r
+       Run(cmd,&configValue,CP_UTF8);\r
        int start = 0;\r
-       return UserName.Tokenize(_T("\n"),start);\r
+       return configValue.Tokenize(_T("\n"),start);\r
 }\r
 \r
+\r
 CString CGit::GetCurrentBranch(void)\r
 {\r
        CString output;\r
@@ -339,6 +344,29 @@ CString CGit::GetCurrentBranch(void)
        return CString("");\r
 }\r
 \r
+CString CGit::GetSymbolicRef(const wchar_t* symbolicRefName, bool bStripRefsHeads)\r
+{\r
+       CString refName;\r
+       CString cmd;\r
+       cmd.Format(L"git symbolic-ref %s", symbolicRefName);\r
+       if(Run(cmd, &refName, CP_UTF8) != 0)\r
+               return CString();//Error\r
+       int iStart = 0;\r
+       refName = refName.Tokenize(L"\n", iStart);\r
+       if(bStripRefsHeads)\r
+               refName = StripRefName(refName);\r
+       return refName;\r
+}\r
+\r
+CString CGit::StripRefName(CString refName)\r
+{\r
+       if(wcsncmp(refName, L"refs/heads/", 11) == 0)\r
+               refName = refName.Mid(11);\r
+       else if(wcsncmp(refName, L"refs/", 5) == 0)\r
+               refName = refName.Mid(5);\r
+       return refName;\r
+}\r
+\r
 int CGit::GetCurrentBranchFromFile(const CString &sProjectRoot, CString &sBranchOut)\r
 {\r
        // read current branch name like git-gui does, by parsing the .git/HEAD file directly\r
index a339664..a0d73c3 100644 (file)
@@ -44,9 +44,11 @@ public:
 \r
        int RunAsync(CString cmd,PROCESS_INFORMATION *pi, HANDLE* hRead, CString *StdioFile=NULL);\r
        int RunLogFile(CString cmd, CString &filename);\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
@@ -106,6 +108,10 @@ public:
        BOOL IsInitRepos();\r
        int ListConflictFile(CTGitPathList &list,CTGitPath *path=NULL);\r
        int GetRefList(STRING_VECTOR &list);\r
+\r
+\r
+       //Removes 'refs/heads/' or just 'refs'\r
+       static CString StripRefName(CString refName);\r
        \r
 };\r
 extern void GetTempPath(CString &path);\r