OSDN Git Service

BrowseRefsDlg: Add ability to diff two commits
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / BrowseRefsDlg.cpp
index 0236410..c0701e2 100644 (file)
@@ -12,6 +12,7 @@
 #include "MessageBox.h"\r
 #include "RefLogDlg.h"\r
 #include "IconMenu.h"\r
+#include "FileDiffDlg.h"\r
 \r
 void SetSortArrow(CListCtrl * control, int nColumn, bool bAscending)\r
 {\r
@@ -160,11 +161,11 @@ CShadowTree* CShadowTree::FindLeaf(CString partialRefName)
 \r
 typedef std::map<CString,CString> MAP_STRING_STRING;\r
 \r
-CString CBrowseRefsDlg::GetSelectedRef(bool onlyIfLeaf)\r
+CString CBrowseRefsDlg::GetSelectedRef(bool onlyIfLeaf, bool pickFirstSelIfMultiSel)\r
 {\r
        POSITION pos=m_ListRefLeafs.GetFirstSelectedItemPosition();\r
        //List ctrl selection?\r
-       if(pos)\r
+       if(pos && (pickFirstSelIfMultiSel || m_ListRefLeafs.GetSelectedCount() == 1))\r
        {\r
                //A leaf is selected\r
                CShadowTree* pTree=(CShadowTree*)m_ListRefLeafs.GetItemData(\r
@@ -200,7 +201,7 @@ void CBrowseRefsDlg::Refresh(CString selectRef)
        }\r
        else\r
        {\r
-               selectRef = GetSelectedRef(false);\r
+               selectRef = GetSelectedRef(false, true);\r
        }\r
 \r
        m_RefTreeCtrl.DeleteAllItems();\r
@@ -391,14 +392,24 @@ bool CBrowseRefsDlg::ConfirmDeleteRef(CString completeRefName)
        CString csTitle;\r
 \r
        UINT mbIcon=MB_ICONQUESTION;\r
-       csMessage=L"Are you sure you want to delete the ";\r
-       if(wcsncmp(completeRefName,L"refs/heads",10)==0)\r
-       {\r
-               CString branchToDelete = completeRefName.Mid(11);\r
-               csTitle.Format(L"Confirm deletion of branch %s", branchToDelete);\r
-               csMessage += "branch:\r\n\r\n<b>";\r
+       csMessage = L"Are you sure you want to delete the ";\r
+\r
+       bool bIsRemoteBranch = false;\r
+       bool bIsBranch = false;\r
+       if              (wcsncmp(completeRefName, L"refs/remotes",12)==0)       {bIsBranch = true; bIsRemoteBranch = true;}\r
+       else if (wcsncmp(completeRefName, L"refs/heads",10)==0)         {bIsBranch = true;}\r
+\r
+       if(bIsBranch)\r
+       {\r
+               CString branchToDelete = completeRefName.Mid(bIsRemoteBranch ? 13 : 11);\r
+               csTitle.Format(L"Confirm deletion of %sbranch %s", \r
+                       bIsRemoteBranch? L"remote ": L"", \r
+                       branchToDelete);\r
+               if(bIsRemoteBranch)\r
+                       csMessage += L"<ct=0x0000FF><i>remote</i></ct> "; \r
+               csMessage += L"branch:\r\n\r\n<b>";\r
                csMessage += branchToDelete;\r
-               csMessage += "</b>";\r
+               csMessage += L"</b>";\r
 \r
                //Check if branch is fully merged in HEAD\r
                CString branchHash = g_Git.GetHash(completeRefName);\r
@@ -413,7 +424,12 @@ bool CBrowseRefsDlg::ConfirmDeleteRef(CString completeRefName)
                if(commonAncestor != branchHash)\r
                {\r
                        csMessage += L"\r\n\r\n<b>Warning:\r\nThis branch is not fully merged into HEAD.</b>";\r
-                       mbIcon=MB_ICONWARNING;\r
+                       mbIcon = MB_ICONWARNING;\r
+               }\r
+               if(bIsRemoteBranch)\r
+               {\r
+                       csMessage += L"\r\n\r\n<b>Warning:\r\nThis action will remove the branch on the remote.</b>";\r
+                       mbIcon = MB_ICONWARNING;\r
                }\r
        }\r
        else if(wcsncmp(completeRefName,L"refs/tags",9)==0)\r
@@ -432,11 +448,26 @@ bool CBrowseRefsDlg::ConfirmDeleteRef(CString completeRefName)
 \r
 bool CBrowseRefsDlg::DoDeleteRef(CString completeRefName, bool bForce)\r
 {\r
-       if(wcsncmp(completeRefName,L"refs/heads",10)==0)\r
+       bool bIsRemoteBranch = false;\r
+       bool bIsBranch = false;\r
+       if              (wcsncmp(completeRefName, L"refs/remotes",12)==0)       {bIsBranch = true; bIsRemoteBranch = true;}\r
+       else if (wcsncmp(completeRefName, L"refs/heads",10)==0)         {bIsBranch = true;}\r
+\r
+       if(bIsBranch)\r
        {\r
-               CString branchToDelete = completeRefName.Mid(11);\r
+               CString branchToDelete = completeRefName.Mid(bIsRemoteBranch ? 13 : 11);\r
                CString cmd;\r
-               cmd.Format(L"git.exe branch -%c %s",bForce?L'D':L'd',branchToDelete);\r
+               if(bIsRemoteBranch)\r
+               {\r
+                       int slash = branchToDelete.Find(L'/');\r
+                       if(slash < 0)\r
+                               return false;\r
+                       CString remoteName = branchToDelete.Left(slash);\r
+                       CString remoteBranchToDelete = branchToDelete.Mid(slash + 1);\r
+                       cmd.Format(L"git.exe push \"%s\" :%s", remoteName, remoteBranchToDelete);\r
+               }\r
+               else\r
+                       cmd.Format(L"git.exe branch -%c %s",bForce?L'D':L'd',branchToDelete);\r
                CString resultDummy;\r
                if(g_Git.Run(cmd,&resultDummy,CP_UTF8)!=0)\r
                {\r
@@ -519,6 +550,7 @@ void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPSh
                bool bShowReflogOption = false;\r
                bool bShowDeleteBranchOption = false;\r
                bool bShowDeleteTagOption = false;\r
+               bool bShowDeleteRemoteBranchOption = false;\r
 \r
                if(selectedLeafs[0]->IsFrom(L"refs/heads"))\r
                {\r
@@ -528,16 +560,18 @@ void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPSh
                else if(selectedLeafs[0]->IsFrom(L"refs/remotes"))\r
                {\r
                        bShowReflogOption = true;\r
+                       bShowDeleteRemoteBranchOption = true;\r
                }\r
                else if(selectedLeafs[0]->IsFrom(L"refs/tags"))\r
                {\r
                        bShowDeleteTagOption = true;\r
                }\r
 \r
-                                                                       popupMenu.AppendMenuIcon(eCmd_ViewLog, L"Show Log", IDI_LOG);\r
-               if(bShowReflogOption)           popupMenu.AppendMenuIcon(eCmd_ShowReflog, L"Show Reflog", IDI_LOG);\r
-               if(bShowDeleteTagOption)        popupMenu.AppendMenuIcon(eCmd_DeleteTag, L"Delete Tag", IDI_DELETE);\r
-               if(bShowDeleteBranchOption) popupMenu.AppendMenuIcon(eCmd_DeleteBranch, L"Delete Branch", IDI_DELETE);\r
+                                                                                       popupMenu.AppendMenuIcon(eCmd_ViewLog, L"Show Log", IDI_LOG);\r
+               if(bShowReflogOption)                           popupMenu.AppendMenuIcon(eCmd_ShowReflog, L"Show Reflog", IDI_LOG);\r
+               if(bShowDeleteTagOption)                        popupMenu.AppendMenuIcon(eCmd_DeleteTag, L"Delete Tag", IDI_DELETE);\r
+               if(bShowDeleteBranchOption)                     popupMenu.AppendMenuIcon(eCmd_DeleteBranch, L"Delete Branch", IDI_DELETE);\r
+               if(bShowDeleteRemoteBranchOption)       popupMenu.AppendMenuIcon(eCmd_DeleteRemoteBranch, L"Delete Remote Branch", IDI_DELETE);\r
 \r
 \r
 \r
@@ -545,6 +579,12 @@ void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPSh
 //             if(pTree==NULL)\r
 //                     return;\r
        }\r
+       else if(selectedLeafs.size() == 2)\r
+       {\r
+               bAddSeparator = true;\r
+               \r
+               popupMenu.AppendMenuIcon(eCmd_Diff, L"Diff These Commits", IDI_DIFF);\r
+       }\r
 \r
        if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR);\r
 \r
@@ -574,6 +614,7 @@ void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPSh
                }\r
                break;\r
        case eCmd_DeleteBranch:\r
+       case eCmd_DeleteRemoteBranch:\r
                {\r
                        if(ConfirmDeleteRef(selectedLeafs[0]->GetRefName()))\r
                                DoDeleteRef(selectedLeafs[0]->GetRefName(), true);\r
@@ -620,6 +661,16 @@ void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPSh
                        Refresh();\r
                }\r
                break;\r
+       case eCmd_Diff:\r
+               {\r
+                       CFileDiffDlg dlg;\r
+                       dlg.SetDiff(\r
+                               NULL, \r
+                               selectedLeafs[0]->m_csRefHash, \r
+                               selectedLeafs[1]->m_csRefHash);\r
+                       dlg.DoModal();\r
+               }\r
+               break;\r
        }\r
 }\r
 \r
@@ -719,7 +770,7 @@ void CBrowseRefsDlg::OnLvnColumnclickListRefLeafs(NMHDR *pNMHDR, LRESULT *pResul
 \r
 void CBrowseRefsDlg::OnDestroy()\r
 {\r
-       m_pickedRef = GetSelectedRef(true);\r
+       m_pickedRef = GetSelectedRef(true, false);\r
 \r
        CResizableStandAloneDialog::OnDestroy();\r
 }\r
@@ -736,6 +787,8 @@ CString CBrowseRefsDlg::PickRef(bool returnAsHash, CString initialRef, int pickR
 {\r
        CBrowseRefsDlg dlg(CString(),NULL);\r
        \r
+       if(initialRef.IsEmpty())\r
+               initialRef = L"HEAD";\r
        dlg.m_initialRef = initialRef;\r
        dlg.m_pickRef_Kind = pickRef_Kind;\r
 \r