OSDN Git Service

Support Git svn-clone at clone dialog.
authorFrank Li <lznuaa@gmail.com>
Sat, 27 Jun 2009 07:33:30 +0000 (15:33 +0800)
committerFrank Li <lznuaa@gmail.com>
Sat, 27 Jun 2009 07:33:30 +0000 (15:33 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/AppUtils.cpp
src/TortoiseProc/AppUtils.h
src/TortoiseProc/CloneDlg.cpp
src/TortoiseProc/CloneDlg.h
src/TortoiseProc/Commands/CloneCommand.cpp
src/TortoiseProc/TortoiseProc.vcproj
src/TortoiseProc/resource.h
src/Utils/Utils.vcproj

index 1b8630e..d240b74 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index 44c464a..fe45e2f 100644 (file)
@@ -2080,4 +2080,37 @@ bool CAppUtils::Push()
                \r
        }\r
        return FALSE;\r
-}
\ No newline at end of file
+}\r
+\r
+bool CAppUtils::CreateMultipleDirectory(CString& szPath)\r
+{\r
+    CString strDir(szPath);\r
+    if (strDir.GetAt(strDir.GetLength()-1)!=_T('\\'))\r
+    {\r
+        strDir.AppendChar(_T('\\'));\r
+    }\r
+    std::vector<CString> vPath;\r
+    CString strTemp;\r
+    bool bSuccess = false;\r
+    \r
+    for (int i=0;i<strDir.GetLength();++i)\r
+    {\r
+        if (strDir.GetAt(i) != _T('\\')) \r
+        {\r
+            strTemp.AppendChar(strDir.GetAt(i));\r
+        }\r
+        else \r
+        {\r
+            vPath.push_back(strTemp);\r
+            strTemp.AppendChar(_T('\\'));\r
+        }\r
+    }\r
+\r
+    std::vector<CString>::const_iterator vIter;\r
+    for (vIter = vPath.begin(); vIter != vPath.end(); vIter++) \r
+    {\r
+        bSuccess = CreateDirectory(*vIter, NULL) ? true : false;    \r
+    }\r
+\r
+    return bSuccess;\r
+}\r
index 27d1274..f6bc9a1 100644 (file)
@@ -202,6 +202,8 @@ public:
 \r
        static bool Push();\r
 \r
+       static bool CreateMultipleDirectory(CString &dir);\r
+\r
 private:\r
        static CString PickDiffTool(const CTGitPath& file1, const CTGitPath& file2);\r
        static bool GetMimeType(const CTGitPath& file, CString& mimetype);\r
index 37c2cc5..67c9ebc 100644 (file)
@@ -16,6 +16,14 @@ CCloneDlg::CCloneDlg(CWnd* pParent /*=NULL*/)
        , m_Directory(_T(""))\r
 {\r
     m_bAutoloadPuttyKeyFile = CAppUtils::IsSSHPutty();\r
+\r
+       m_bSVN = FALSE;\r
+       m_bSVNTrunk = FALSE;\r
+       m_bSVNTags = FALSE;\r
+       m_bSVNBranch = FALSE;;\r
+       m_strSVNTrunk = _T("trunk");\r
+       m_strSVNTags = _T("tags");\r
+       m_strSVNBranchs = _T("branches");\r
 }\r
 \r
 CCloneDlg::~CCloneDlg()\r
@@ -30,6 +38,15 @@ void CCloneDlg::DoDataExchange(CDataExchange* pDX)
        DDX_Text(pDX, IDC_CLONE_DIR, m_Directory);\r
     DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD, m_bAutoloadPuttyKeyFile);\r
 \r
+       DDX_Check(pDX,IDC_CHECK_SVN, m_bSVN);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_TRUNK, m_bSVNTrunk);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_TAG, m_bSVNTags);\r
+       DDX_Check(pDX,IDC_CHECK_SVN_BRANCH, m_bSVNBranch);\r
+\r
+       DDX_Text(pDX, IDC_EDIT_SVN_TRUNK, m_strSVNTrunk);\r
+       DDX_Text(pDX, IDC_EDIT_SVN_TAG, m_strSVNTags);\r
+       DDX_Text(pDX, IDC_EDIT_SVN_BRANCH, m_strSVNBranchs);\r
+\r
 }\r
 \r
 BOOL CCloneDlg::OnInitDialog()\r
@@ -42,10 +59,11 @@ BOOL CCloneDlg::OnInitDialog()
        AddAnchor(IDOK,BOTTOM_RIGHT);\r
        AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
 \r
-    AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,BOTTOM_RIGHT);\r
-    AddAnchor(IDC_PUTTYKEYFILE_BROWSE,BOTTOM_RIGHT);\r
-    AddAnchor(IDC_PUTTYKEY_AUTOLOAD,BOTTOM_LEFT);\r
-    AddAnchor(IDC_PUTTYKEYFILE,BOTTOM_LEFT,BOTTOM_RIGHT);\r
+    AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,TOP_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEYFILE_BROWSE,TOP_RIGHT);\r
+    AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);\r
+    AddAnchor(IDC_PUTTYKEYFILE,TOP_LEFT,TOP_RIGHT);\r
+       AddAnchor(IDC_CLONE_GROUP_SVN,TOP_LEFT,TOP_RIGHT);\r
        AddAnchor(IDHELP, BOTTOM_RIGHT);\r
 \r
        this->AddOthersToAnchor();\r
@@ -76,6 +94,9 @@ BOOL CCloneDlg::OnInitDialog()
     this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
        \r
     EnableSaveRestore(_T("CloneDlg"));\r
+       \r
+       OnBnClickedCheckSvn();\r
+\r
        return TRUE;  // return TRUE  unless you set the focus to a control\r
 }\r
 \r
@@ -88,6 +109,10 @@ BEGIN_MESSAGE_MAP(CCloneDlg, CResizableStandAloneDialog)
        ON_NOTIFY(CBEN_BEGINEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenBegineditUrlcombo)\r
        ON_NOTIFY(CBEN_ENDEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenEndeditUrlcombo)\r
        ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnEditchangeUrlcombo)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN, &CCloneDlg::OnBnClickedCheckSvn)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_TRUNK, &CCloneDlg::OnBnClickedCheckSvnTrunk)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_TAG, &CCloneDlg::OnBnClickedCheckSvnTag)\r
+       ON_BN_CLICKED(IDC_CHECK_SVN_BRANCH, &CCloneDlg::OnBnClickedCheckSvnBranch)\r
 END_MESSAGE_MAP()\r
 \r
 \r
@@ -273,3 +298,35 @@ void CCloneDlg::OnCbnEditchangeUrlcombo()
        }\r
        this->UpdateData(FALSE);\r
 }\r
+\r
+void CCloneDlg::OnBnClickedCheckSvn()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       OnBnClickedCheckSvnTrunk();\r
+       OnBnClickedCheckSvnTag();\r
+       OnBnClickedCheckSvnBranch();\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnTrunk()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_TRUNK)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_TRUNK)->EnableWindow(this->m_bSVNTrunk&&this->m_bSVN);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnTag()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_TAG)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_TAG)->EnableWindow(this->m_bSVNTags&&this->m_bSVN);\r
+}\r
+\r
+void CCloneDlg::OnBnClickedCheckSvnBranch()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       UpdateData(TRUE);\r
+       this->GetDlgItem(IDC_CHECK_SVN_BRANCH)->EnableWindow(this->m_bSVN);\r
+       this->GetDlgItem(IDC_EDIT_SVN_BRANCH)->EnableWindow(this->m_bSVNBranch&&this->m_bSVN);\r
+}\r
index 327399b..0820aac 100644 (file)
@@ -39,6 +39,14 @@ public:
     CString m_strPuttyKeyFile;\r
        CString m_URL;\r
     BOOL    m_bAutoloadPuttyKeyFile;\r
+       BOOL    m_bSVN;\r
+       BOOL    m_bSVNTrunk;\r
+       BOOL    m_bSVNTags;\r
+       BOOL    m_bSVNBranch;\r
+       CString m_strSVNTrunk;\r
+       CString m_strSVNTags;\r
+       CString m_strSVNBranchs;\r
+\r
     afx_msg void OnBnClickedPuttykeyfileBrowse();\r
     afx_msg void OnBnClickedPuttykeyAutoload();\r
        afx_msg void OnCbnSelchangeUrlcombo();\r
@@ -46,4 +54,8 @@ public:
        afx_msg void OnCbenEndeditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult);\r
        afx_msg void OnCbnEditchangeUrlcombo();\r
 \r
+       afx_msg void OnBnClickedCheckSvn();\r
+       afx_msg void OnBnClickedCheckSvnTrunk();\r
+       afx_msg void OnBnClickedCheckSvnTag();\r
+       afx_msg void OnBnClickedCheckSvnBranch();\r
 };\r
index 029f605..50c1777 100644 (file)
@@ -51,6 +51,56 @@ bool CloneCommand::Execute()
                cmd.Format(_T("git.exe clone -v \"%s\" \"%s\""),\r
                                                url,\r
                                                dir);\r
+\r
+               // Handle Git SVN-clone\r
+               if(dlg.m_bSVN)\r
+               {\r
+                       WIN32_FILE_ATTRIBUTE_DATA attribs;\r
+                       if(GetFileAttributesEx(dlg.m_Directory, GetFileExInfoStandard, &attribs))\r
+                       {\r
+                               if(!(attribs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r
+                               {\r
+                                       CString errstr;\r
+                                       errstr.Format(_T("%s is not valid direcotry"),dlg.m_Directory);\r
+                                       CMessageBox::Show(NULL,errstr,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+                                       return FALSE;\r
+                               }\r
+                       }       \r
+                       else\r
+                       {\r
+                               DWORD err = GetLastError();\r
+                               if(err == ERROR_PATH_NOT_FOUND)\r
+                               {\r
+                                       if(!CAppUtils::CreateMultipleDirectory(dlg.m_Directory))\r
+                                       {\r
+                                               CString errstr;\r
+                                               errstr.Format(_T("Fail create dir: %s"),dlg.m_Directory);\r
+                                               CMessageBox::Show(NULL,errstr,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+                                               return FALSE;\r
+                                       }\r
+\r
+                               }\r
+                               else\r
+                               {\r
+                                       CMessageBox::Show(NULL,_T("Unknow ERROR"),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+                                       return FALSE;\r
+                               }\r
+                       }\r
+\r
+                       g_Git.m_CurrentDir=dlg.m_Directory;\r
+                       cmd.Format(_T("git.exe svn clone \"%s\" "),\r
+                                               url);\r
+\r
+                       if(dlg.m_bSVNTrunk)\r
+                               cmd+=_T(" -T ")+dlg.m_strSVNTrunk;\r
+\r
+                       if(dlg.m_bSVNBranch)\r
+                               cmd+=_T(" -b ")+dlg.m_strSVNBranchs;\r
+\r
+                       if(dlg.m_bSVNTags)\r
+                               cmd+=_T(" -t ")+dlg.m_strSVNTags;\r
+\r
+               }\r
                CProgressDlg progress;\r
                progress.m_GitCmd=cmd;\r
                if(progress.DoModal()==IDOK)\r
index b9bf06e..6dc63f4 100644 (file)
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\copy.ico"\r
+                               RelativePath="..\Resources\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\copy.ico"\r
+                               RelativePath=".\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\explorer.ico"\r
+                               RelativePath=".\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\explorer.ico"\r
+                               RelativePath="..\Resources\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\newfolder.ico"\r
+                               RelativePath="..\Resources\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\newfolder.ico"\r
+                               RelativePath=".\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\refresh.ico"\r
+                               RelativePath="..\Resources\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\refresh.ico"\r
+                               RelativePath=".\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\save.ico"\r
+                               RelativePath=".\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\save.ico"\r
+                               RelativePath="..\Resources\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\up.ico"\r
+                               RelativePath="..\Resources\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\up.ico"\r
+                               RelativePath=".\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
index 845fa22..b48bd46 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ
index 788b4f2..d85f21b 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\DirFileEnum.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\DragDropImpl.cpp"\r
                                >\r
                        </File>\r