OSDN Git Service

BrowseRefs: Added option to delete branch or tag.
authorJohan 't Hart <johanthart@gmail.com>
Wed, 6 May 2009 21:51:12 +0000 (23:51 +0200)
committerFrank Li <lznuaa@gmail.com>
Thu, 7 May 2009 02:55:19 +0000 (10:55 +0800)
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/BrowseRefsDlg.cpp
src/TortoiseProc/BrowseRefsDlg.h
src/TortoiseProc/ConfirmDelRefDlg.cpp [new file with mode: 0644]
src/TortoiseProc/ConfirmDelRefDlg.h [new file with mode: 0644]
src/TortoiseProc/TortoiseProc.vcproj
src/TortoiseProc/resource.h

index d9cfc15..a65e893 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index 12a23d6..159eaa9 100644 (file)
@@ -9,6 +9,7 @@
 #include "CreateBranchTagDlg.h"\r
 #include "Settings\SettingGitRemote.h"\r
 #include "SinglePropSheetDlg.h"\r
+#include "ConfirmDelRefDlg.h"\r
 \r
 \r
 // CBrowseRefsDlg dialog\r
@@ -272,11 +273,9 @@ void CBrowseRefsDlg::OnContextMenu_ListRefLeafs(CPoint point)
        CPoint clientPoint=point;\r
        m_RefTreeCtrl.ScreenToClient(&clientPoint);\r
 \r
-       int selectedItemCount=m_ListRefLeafs.GetSelectedCount();\r
-\r
 \r
        std::vector<CShadowTree*> selectedTrees;\r
-       selectedTrees.reserve(selectedItemCount);\r
+       selectedTrees.reserve(m_ListRefLeafs.GetSelectedCount());\r
        POSITION pos=m_ListRefLeafs.GetFirstSelectedItemPosition();\r
        while(pos)\r
        {\r
@@ -288,9 +287,13 @@ void CBrowseRefsDlg::OnContextMenu_ListRefLeafs(CPoint point)
        CMenu popupMenu;\r
        popupMenu.CreatePopupMenu();\r
 \r
-       if(selectedItemCount==1)\r
+       if(selectedTrees.size()==1)\r
        {\r
                popupMenu.AppendMenu(MF_STRING,eCmd_ViewLog,L"View log");\r
+               if(selectedTrees[0]->IsFrom(L"refs/heads"))\r
+                       popupMenu.AppendMenu(MF_STRING,eCmd_DeleteBranch,L"Delete Branch");\r
+               else if(selectedTrees[0]->IsFrom(L"refs/tags"))\r
+                       popupMenu.AppendMenu(MF_STRING,eCmd_DeleteTag,L"Delete Tag");\r
 \r
 //             CShadowTree* pTree = (CShadowTree*)m_ListRefLeafs.GetItemData(pNMHDR->idFrom);\r
 //             if(pTree==NULL)\r
@@ -308,6 +311,18 @@ void CBrowseRefsDlg::OnContextMenu_ListRefLeafs(CPoint point)
                        dlg.DoModal();\r
                }\r
                break;\r
+       case eCmd_DeleteBranch:\r
+               {\r
+                       CConfirmDelRefDlg(selectedTrees[0]->GetRefName(),this).DoModal();\r
+                       Refresh();\r
+               }\r
+               break;\r
+       case eCmd_DeleteTag:\r
+               {\r
+                       CConfirmDelRefDlg(selectedTrees[0]->GetRefName(),this).DoModal();\r
+                       Refresh();\r
+               }\r
+               break;\r
        }\r
 }\r
 \r
@@ -355,6 +370,7 @@ void CBrowseRefsDlg::OnContextMenu_RefTreeCtrl(CPoint point)
                        CSinglePropSheetDlg(L"Git Remote Settings",new CSettingGitRemote(m_cmdPath),this).DoModal();\r
 //                     CSettingGitRemote W_Remotes(m_cmdPath);\r
 //                     W_Remotes.DoModal();\r
+                       Refresh();\r
                }\r
                break;\r
        case eCmd_CreateBranch:\r
index b66de68..eb7ee22 100644 (file)
@@ -52,7 +52,9 @@ public:
                eCmd_AddRemote,\r
                eCmd_ManageRemotes,\r
                eCmd_CreateBranch,\r
-               eCmd_CreateTag\r
+               eCmd_CreateTag,\r
+               eCmd_DeleteBranch,\r
+               eCmd_DeleteTag\r
        };\r
 \r
 // Dialog Data\r
diff --git a/src/TortoiseProc/ConfirmDelRefDlg.cpp b/src/TortoiseProc/ConfirmDelRefDlg.cpp
new file mode 100644 (file)
index 0000000..943c0b0
--- /dev/null
@@ -0,0 +1,114 @@
+// ConfirmDelRefDlg.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "TortoiseProc.h"\r
+#include "ConfirmDelRefDlg.h"\r
+#include "Git.h"\r
+\r
+\r
+// CConfirmDelRefDlg dialog\r
+\r
+IMPLEMENT_DYNAMIC(CConfirmDelRefDlg, CDialog)\r
+\r
+CConfirmDelRefDlg::CConfirmDelRefDlg(CString completeRefName, CWnd* pParent /*=NULL*/)\r
+:      CDialog(CConfirmDelRefDlg::IDD, pParent),\r
+       m_completeRefName(completeRefName)\r
+{\r
+\r
+}\r
+\r
+CConfirmDelRefDlg::~CConfirmDelRefDlg()\r
+{\r
+}\r
+\r
+void CConfirmDelRefDlg::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       DDX_Control(pDX, IDC_CHECK_FORCE, m_butForce);\r
+       DDX_Control(pDX, IDC_STATIC_MESSAGE, m_statMessage);\r
+       DDX_Control(pDX, IDOK, m_butOK);\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CConfirmDelRefDlg, CDialog)\r
+       ON_BN_CLICKED(IDC_CHECK_FORCE, OnBnForce)\r
+END_MESSAGE_MAP()\r
+\r
+\r
+// CConfirmDelRefDlg message handlers\r
+\r
+BOOL CConfirmDelRefDlg::OnInitDialog()\r
+{\r
+       CDialog::OnInitDialog();\r
+       CString csMessage;\r
+\r
+       csMessage=L"Are you sure you want to delete the ";\r
+       if(wcsncmp(m_completeRefName,L"refs/heads",10)==0)\r
+       {\r
+               SetWindowText(L"Confirm deletion of branch " + m_completeRefName);\r
+               csMessage += "branch '";\r
+               csMessage += m_completeRefName;\r
+               csMessage += "'?";\r
+\r
+               //Check if branch is fully merged in HEAD\r
+               CString branchHash = g_Git.GetHash(m_completeRefName);\r
+               CString commonAncestor;\r
+               CString cmd;\r
+               cmd.Format(L"git.exe merge-base HEAD %s",m_completeRefName);\r
+               g_Git.Run(cmd,&commonAncestor,CP_UTF8);\r
+\r
+               branchHash=branchHash.Left(40);\r
+               commonAncestor=commonAncestor.Left(40);\r
+               \r
+               if(commonAncestor != branchHash)\r
+               {\r
+                       m_butForce.ShowWindow(SW_SHOW);\r
+                       m_butOK.EnableWindow(FALSE);\r
+                       csMessage += L"\r\n\r\nWarning: this branch is not fully merged into HEAD. If you realy want to delete this branch, check the force flag.";\r
+               }\r
+       }\r
+       else if(wcsncmp(m_completeRefName,L"refs/tags",9)==0)\r
+       {\r
+               SetWindowText(L"Confirm deletion of tag " + m_completeRefName);\r
+               csMessage += "tag '";\r
+               csMessage += m_completeRefName;\r
+               csMessage += "'?";\r
+       }\r
+\r
+       m_statMessage.SetWindowText(csMessage);\r
+\r
+       return TRUE;\r
+}\r
+\r
+void CConfirmDelRefDlg::OnOK()\r
+{\r
+       bool bForce = m_butForce.GetCheck()!=0;\r
+\r
+       if(wcsncmp(m_completeRefName,L"refs/heads",10)==0)\r
+       {\r
+               CString branchToDelete = m_completeRefName.Mid(11);\r
+               CString cmd;\r
+               cmd.Format(L"git.exe branch -%c %s",bForce?L'D':L'd',branchToDelete);\r
+               CString resultDummy;\r
+               g_Git.Run(cmd,&resultDummy,CP_UTF8);\r
+       }\r
+       else if(wcsncmp(m_completeRefName,L"refs/tags",9)==0)\r
+       {\r
+               CString tagToDelete = m_completeRefName.Mid(10);\r
+               CString cmd;\r
+               cmd.Format(L"git.exe tag -d %s",tagToDelete);\r
+               CString resultDummy;\r
+               g_Git.Run(cmd,&resultDummy,CP_UTF8);\r
+       }\r
+\r
+       CDialog::OnOK();\r
+}\r
+\r
+void CConfirmDelRefDlg::OnBnForce()\r
+{\r
+       if(m_butForce.GetCheck()!=0)\r
+               m_butOK.EnableWindow(TRUE);\r
+       else if(wcsncmp(m_completeRefName,L"refs/heads",10)==0)\r
+               m_butOK.EnableWindow(FALSE);\r
+}
\ No newline at end of file
diff --git a/src/TortoiseProc/ConfirmDelRefDlg.h b/src/TortoiseProc/ConfirmDelRefDlg.h
new file mode 100644 (file)
index 0000000..dba730b
--- /dev/null
@@ -0,0 +1,34 @@
+#pragma once\r
+#include "afxwin.h"\r
+\r
+\r
+// CConfirmDelRefDlg dialog\r
+\r
+class CConfirmDelRefDlg : public CDialog\r
+{\r
+       DECLARE_DYNAMIC(CConfirmDelRefDlg)\r
+\r
+public:\r
+       CConfirmDelRefDlg(CString completeRefName, CWnd* pParent = NULL);   // standard constructor\r
+       virtual ~CConfirmDelRefDlg();\r
+\r
+// Dialog Data\r
+       enum { IDD = IDD_DIALOG_DELETE_REF };\r
+\r
+protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+\r
+       DECLARE_MESSAGE_MAP()\r
+public:\r
+       virtual BOOL OnInitDialog();\r
+\r
+private:\r
+       CString m_completeRefName;\r
+public:\r
+       CButton m_butForce;\r
+       CStatic m_statMessage;\r
+       CButton m_butOK;\r
+protected:\r
+       virtual void OnOK();\r
+       virtual void OnBnForce();\r
+};\r
index 3c9f927..a9af9fc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
-       Version="9.00"\r
+       Version="9,00"\r
        Name="TortoiseProc"\r
        ProjectGUID="{50797F06-39C5-4802-8E2B-7B7A4EF03214}"\r
        RootNamespace="TortoiseProc"\r
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Debug|x64"\r
-                       OutputDirectory="..\..\bin\Debug64\bin"\r
-                       IntermediateDirectory="..\..\obj\TortoiseProc\Debug64"\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="..\..\bin\$(ConfigurationName)\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseProc\$(ConfigurationName)"\r
                        ConfigurationType="1"\r
                        UseOfMFC="2"\r
-                       UseOfATL="0"\r
                        CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               PreprocessorDefinitions="_DEBUG"\r
+                               PreprocessorDefinitions="NDEBUG"\r
                                MkTypLibCompatible="false"\r
-                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
                                AdditionalIncludeDirectories="..\TortoiseProc;..\Resources;&quot;$InputDir&quot;;../../ext/ResizableLib;../Git;&quot;../../ext/apr-util/include&quot;;&quot;../../ext/apr-util/xml/expat/lib&quot;;../../ext/Subversion/subversion/include;../../ext/Subversion/subversion/libsvn_client;../../ext/apr/include;../../ext/boost;..\Utils;..\SVN;..\..\ext\ResizableLib;..\crashrpt;&quot;..\..\ext\libintl\libintl3-win32\inc&quot;;..\..\ext\hunspell;..\..\ext\scintilla\include;..\Utils\TreePropSheet;..\Utils\ColourPickerXP;..\Utils\NewMenu;..\Utils\MiscUI;..\LogCache;&quot;../../ext/cyrus-sasl/include&quot;;../../../common/openssl/inc32;.\RevisionGraph;..\TortoiseShell"\r
-                               PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG;SVN_DEBUG;ENABLE_NLS;THESAURUS"\r
-                               MinimalRebuild="true"\r
+                               PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;THESAURUS"\r
+                               StringPooling="true"\r
+                               MinimalRebuild="false"\r
                                ExceptionHandling="2"\r
-                               RuntimeLibrary="3"\r
+                               RuntimeLibrary="2"\r
+                               BufferSecurityCheck="false"\r
                                TreatWChar_tAsBuiltInType="true"\r
                                ForceConformanceInForLoopScope="true"\r
                                RuntimeTypeInfo="true"\r
                                UsePrecompiledHeader="2"\r
                                WarningLevel="4"\r
                                DebugInformationFormat="3"\r
+                               DisableSpecificWarnings="4996,4018"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                        />\r
                        <Tool\r
                                Name="VCResourceCompilerTool"\r
-                               PreprocessorDefinitions="_DEBUG"\r
+                               PreprocessorDefinitions="NDEBUG"\r
                                Culture="1033"\r
                                AdditionalIncludeDirectories="&quot;$(IntDir)&quot;;..\TortoiseShell"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib Dnsapi.lib"\r
-                               LinkIncremental="2"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames=""\r
                                DelayLoadDLLs="gdiplus.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="0"\r
                                RandomizedBaseAddress="1"\r
                                DataExecutionPrevention="0"\r
-                               TargetMachine="17"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="..\..\bin\$(ConfigurationName)\bin"\r
-                       IntermediateDirectory="..\..\obj\TortoiseProc\$(ConfigurationName)"\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="..\..\bin\Debug64\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseProc\Debug64"\r
                        ConfigurationType="1"\r
                        UseOfMFC="2"\r
+                       UseOfATL="0"\r
                        CharacterSet="1"\r
-                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               PreprocessorDefinitions="NDEBUG"\r
+                               PreprocessorDefinitions="_DEBUG"\r
                                MkTypLibCompatible="false"\r
+                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
                                AdditionalIncludeDirectories="..\TortoiseProc;..\Resources;&quot;$InputDir&quot;;../../ext/ResizableLib;../Git;&quot;../../ext/apr-util/include&quot;;&quot;../../ext/apr-util/xml/expat/lib&quot;;../../ext/Subversion/subversion/include;../../ext/Subversion/subversion/libsvn_client;../../ext/apr/include;../../ext/boost;..\Utils;..\SVN;..\..\ext\ResizableLib;..\crashrpt;&quot;..\..\ext\libintl\libintl3-win32\inc&quot;;..\..\ext\hunspell;..\..\ext\scintilla\include;..\Utils\TreePropSheet;..\Utils\ColourPickerXP;..\Utils\NewMenu;..\Utils\MiscUI;..\LogCache;&quot;../../ext/cyrus-sasl/include&quot;;../../../common/openssl/inc32;.\RevisionGraph;..\TortoiseShell"\r
-                               PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;THESAURUS"\r
-                               StringPooling="true"\r
-                               MinimalRebuild="false"\r
+                               PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG;SVN_DEBUG;ENABLE_NLS;THESAURUS"\r
+                               MinimalRebuild="true"\r
                                ExceptionHandling="2"\r
-                               RuntimeLibrary="2"\r
-                               BufferSecurityCheck="false"\r
+                               RuntimeLibrary="3"\r
                                TreatWChar_tAsBuiltInType="true"\r
                                ForceConformanceInForLoopScope="true"\r
                                RuntimeTypeInfo="true"\r
                                UsePrecompiledHeader="2"\r
                                WarningLevel="4"\r
                                DebugInformationFormat="3"\r
-                               DisableSpecificWarnings="4996,4018"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                        />\r
                        <Tool\r
                                Name="VCResourceCompilerTool"\r
-                               PreprocessorDefinitions="NDEBUG"\r
+                               PreprocessorDefinitions="_DEBUG"\r
                                Culture="1033"\r
                                AdditionalIncludeDirectories="&quot;$(IntDir)&quot;;..\TortoiseShell"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib Dnsapi.lib"\r
-                               LinkIncremental="1"\r
-                               AdditionalLibraryDirectories="../../ext/wingit"\r
+                               LinkIncremental="2"\r
                                IgnoreDefaultLibraryNames=""\r
                                DelayLoadDLLs="gdiplus.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               OptimizeForWindows98="0"\r
                                RandomizedBaseAddress="1"\r
                                DataExecutionPrevention="0"\r
-                               TargetMachine="1"\r
-                               Profile="true"\r
+                               TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\ConfirmDelRefDlg.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\ConfirmDelRefDlg.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\LogFile.cpp"\r
                                >\r
                        </File>\r
                                >\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
                                />\r
                        </FileConfiguration>\r
                        <FileConfiguration\r
-                               Name="Debug|x64"\r
+                               Name="Release|Win32"\r
                                >\r
                                <Tool\r
                                        Name="VCCLCompilerTool"\r
                                />\r
                        </FileConfiguration>\r
                        <FileConfiguration\r
-                               Name="Release|Win32"\r
+                               Name="Debug|x64"\r
                                >\r
                                <Tool\r
                                        Name="VCCLCompilerTool"\r
index c7e3209..df9f60e 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ