OSDN Git Service

Add Diff with work copy and file list
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index 8b7b30c..ce9ee8d 100644 (file)
@@ -2302,6 +2302,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        popup.AppendMenuIcon(IDSVNLC_COMPARE, IDS_LOG_COMPAREWITHBASE, IDI_DIFF);\r
                                        popup.SetDefaultItem(IDSVNLC_COMPARE, FALSE);\r
                                }\r
+\r
+                               if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_COMPAREWC))\r
+                               {\r
+                                       if( (!m_CurrentVersion.IsEmpty()) && m_CurrentVersion != GIT_REV_ZERO)\r
+                                               popup.AppendMenuIcon(IDSVNLC_COMPAREWC, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
+                               }\r
                                //Select one items\r
                                if (GetSelectedCount() == 1)\r
                                {\r
@@ -2672,6 +2678,19 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        ShellExecute(this->m_hWnd, _T("explore"), filepath->GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
                                }\r
                                break;\r
+\r
+                       // Compare current version and work copy. \r
+                       case IDSVNLC_COMPAREWC:\r
+                               {\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       while ( pos )\r
+                                       {\r
+                                               int index = GetNextSelectedItem(pos);\r
+                                               StartDiffWC(index);\r
+                                       }\r
+                               }\r
+                               break;\r
+                       // Compare with base version. when current version is zero, compare workcopy and HEAD. \r
                        case IDSVNLC_COMPARE:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
@@ -3153,7 +3172,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        CString str;\r
                                        str.Format(IDS_PROC_WARNREVERT,GetSelectedCount());\r
 \r
-                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
+                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
                                        {\r
                                                CTGitPathList targetList;\r
                                                FillListOfSelectedItemPaths(targetList);\r
@@ -3214,6 +3233,10 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        case IDSVNLC_SAVEAS:\r
                                FileSaveAs(filepath);\r
                                break;\r
+\r
+                       case IDSVNLC_REVERTTOREV:\r
+                               RevertSelectedItemToVersion();\r
+                               break;\r
 #if 0\r
                        case IDSVNLC_PROPERTIES:\r
                                {\r
@@ -3961,6 +3984,22 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
        }\r
 \r
 }\r
+void CGitStatusListCtrl::StartDiffWC(int fileindex)\r
+{\r
+       if(fileindex<0)\r
+               return;\r
+\r
+       CString Ver;\r
+       if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
+               return;\r
+\r
+       CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+\r
+       CGitDiff::Diff(&file1,&file1,\r
+                               CString(GIT_REV_ZERO),\r
+                                       m_CurrentVersion);\r
+\r
+}\r
 \r
 void CGitStatusListCtrl::StartDiff(int fileindex)\r
 {\r
@@ -5536,4 +5575,31 @@ void CGitStatusListCtrl::FileSaveAs(CTGitPath *path)
                }\r
        }\r
 \r
+}\r
+\r
+int CGitStatusListCtrl::RevertSelectedItemToVersion()\r
+{\r
+       if(this->m_CurrentVersion.IsEmpty())\r
+               return 0;\r
+       if(this->m_CurrentVersion == GIT_REV_ZERO)\r
+               return 0;\r
+\r
+       POSITION pos = GetFirstSelectedItemPosition();\r
+       int index;\r
+       CString cmd,out;\r
+       int count =0;\r
+       while ((index = GetNextSelectedItem(pos)) >= 0)\r
+       {\r
+               CTGitPath *fentry=(CTGitPath*)GetItemData(index);\r
+               cmd.Format(_T("git.exe checkout %s -- \"%s\""),m_CurrentVersion,fentry->GetGitPathString());\r
+               out.Empty();\r
+               if(g_Git.Run(cmd,&out,CP_ACP))\r
+               {\r
+                       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+               }\r
+               count++;\r
+       }\r
+\r
+       out.Format(_T("%d files revert to %s"),count,m_CurrentVersion.Left(6));\r
+       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
 }
\ No newline at end of file