From 98ed07f87f293191820d093f253b550b42c79258 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Tue, 14 Nov 2017 17:03:19 +0100 Subject: [PATCH] Fixed issue #3107: Clean: Allow to remove orphaned submodules (i.e., clean -f -f) Signed-off-by: Sven Strickroth --- Languages/Tortoise.pot | 4 ++++ src/Changelog.txt | 1 + src/Resources/TortoiseProcENG.rc | 20 +++++++++++--------- src/TortoiseProc/CleanTypeDlg.cpp | 19 ++++++++++++++++++- src/TortoiseProc/CleanTypeDlg.h | 2 ++ src/TortoiseProc/Commands/CleanupCommand.cpp | 16 +++++++++------- src/TortoiseProc/resource.h | 1 + 7 files changed, 46 insertions(+), 17 deletions(-) diff --git a/Languages/Tortoise.pot b/Languages/Tortoise.pot index 6e80c7e56..cbc9fdf89 100644 --- a/Languages/Tortoise.pot +++ b/Languages/Tortoise.pot @@ -7326,6 +7326,10 @@ msgstr "" msgid "Remove stale lock file" msgstr "" +#. Resource IDs: (Dialog IDD_CLEAN: Control id 1631) +msgid "Remove unmanaged directories with .git folder (-f)" +msgstr "" + #. Resource IDs: (Dialog IDD_CLEAN: Control id 1626) msgid "Remove untracked directories (-d)" msgstr "" diff --git a/src/Changelog.txt b/src/Changelog.txt index 35c559c98..db569c797 100644 --- a/src/Changelog.txt +++ b/src/Changelog.txt @@ -6,6 +6,7 @@ Released: unreleased * Fixed issue #3052: Filename autocomplete in commit dialog ignores filenames starting with underscores * TortoiseGitMerge no uses native ribbon instead of MFC wrapped This results in a noticeable speed up (cf. issue #1616) and also fixes issues with rounded corners for maximized windows (cf. issue #1767) + * Fixed issue #3107: Clean: Allow to remove orphaned submodules (i.e., clean -f -f) == Bug Fixes == * Fixed issue #3029: LogDlg: Action column icons painted over Graph or message columns when turned off or resized diff --git a/src/Resources/TortoiseProcENG.rc b/src/Resources/TortoiseProcENG.rc index 795e859db..a48f9d01b 100644 --- a/src/Resources/TortoiseProcENG.rc +++ b/src/Resources/TortoiseProcENG.rc @@ -1661,7 +1661,7 @@ BEGIN LTEXT "",IDC_PROG_LABEL,13,47,367,8 END -IDD_CLEAN DIALOGEX 0, 0, 261, 160 +IDD_CLEAN DIALOGEX 0, 0, 261, 180 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Clean" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -1674,13 +1674,15 @@ BEGIN CONTROL "Remove ignored files (-fX)",IDC_RADIO_CLEAN_IGNORE, "Button",BS_AUTORADIOBUTTON,15,45,232,10 CONTROL "Remove untracked directories (-d)",IDC_CHECK_DIR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,68,232,10 - CONTROL "Do not use recycle bin",IDC_CHECK_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,81,232,10 - CONTROL "Dry run",IDC_CHECK_DRYRUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,95,116,10 - CONTROL "Submodules",IDC_CHECKSUBMODULES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,109,40,10 - DEFPUSHBUTTON "OK",IDOK,81,142,50,14 - PUSHBUTTON "Cancel",IDCANCEL,142,142,50,14 - PUSHBUTTON "Help",IDHELP,204,142,50,14 - LTEXT "Attention: This command affects the whole working tree!",IDC_STATIC,14,128,233,10 + CONTROL "Remove unmanaged directories with .git folder (-f)",IDC_CHECK_DIR_UNMANAGEDREPO, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,26,82,215,10 + CONTROL "Do not use recycle bin",IDC_CHECK_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,96,232,10 + CONTROL "Dry run",IDC_CHECK_DRYRUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,110,116,10 + CONTROL "Submodules",IDC_CHECKSUBMODULES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,124,40,10 + DEFPUSHBUTTON "OK",IDOK,81,158,50,14 + PUSHBUTTON "Cancel",IDCANCEL,142,158,50,14 + PUSHBUTTON "Help",IDHELP,204,158,50,14 + LTEXT "Attention: This command affects the whole working tree!",IDC_STATIC,14,142,233,10 END IDD_PATCH_VIEW DIALOGEX 0, 0, 248, 195 @@ -2906,7 +2908,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 254 TOPMARGIN, 7 - BOTTOMMARGIN, 152 + BOTTOMMARGIN, 172 END IDD_PATCH_VIEW, DIALOG diff --git a/src/TortoiseProc/CleanTypeDlg.cpp b/src/TortoiseProc/CleanTypeDlg.cpp index bb76ba9f9..2e4aa235b 100644 --- a/src/TortoiseProc/CleanTypeDlg.cpp +++ b/src/TortoiseProc/CleanTypeDlg.cpp @@ -1,6 +1,6 @@ // TortoiseGit - a Windows shell extension for easy version control -// Copyright (C) 2008-2016 - TortoiseGit +// Copyright (C) 2008-2017 - TortoiseGit // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -34,6 +34,7 @@ CCleanTypeDlg::CCleanTypeDlg(CWnd* pParent /*=nullptr*/) , m_bDryRun(BST_UNCHECKED) , m_bSubmodules(BST_UNCHECKED) , m_bNoRecycleBin(!CRegDWORD(L"Software\\TortoiseGit\\RevertWithRecycleBin", TRUE)) + , m_bDirUnmanagedRepo(BST_UNCHECKED) { CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(L':', L'_'); @@ -52,6 +53,7 @@ void CCleanTypeDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK_DIR, m_bDir); + DDX_Check(pDX, IDC_CHECK_DIR_UNMANAGEDREPO, m_bDirUnmanagedRepo); DDX_Check(pDX, IDC_CHECK_NORECYCLEBIN, m_bNoRecycleBin); DDX_Check(pDX, IDC_CHECK_DRYRUN, m_bDryRun); DDX_Check(pDX, IDC_CHECKSUBMODULES, m_bSubmodules); @@ -60,6 +62,7 @@ void CCleanTypeDlg::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CCleanTypeDlg, CStateStandAloneDialog) + ON_BN_CLICKED(IDC_CHECK_DIR, &CCleanTypeDlg::OnBnClickedCheckDir) END_MESSAGE_MAP() @@ -74,6 +77,7 @@ BOOL CCleanTypeDlg::OnInitDialog() AdjustControlSize(IDC_RADIO_CLEAN_NO); AdjustControlSize(IDC_RADIO_CLEAN_IGNORE); AdjustControlSize(IDC_CHECK_DIR); + AdjustControlSize(IDC_CHECK_DIR_UNMANAGEDREPO); AdjustControlSize(IDC_CHECK_NORECYCLEBIN); AdjustControlSize(IDC_CHECK_DRYRUN); AdjustControlSize(IDC_CHECKSUBMODULES); @@ -82,6 +86,8 @@ BOOL CCleanTypeDlg::OnInitDialog() SetDlgTitle(); + DialogEnableWindow(IDC_CHECK_DIR_UNMANAGEDREPO, m_bDir); + return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } @@ -106,3 +112,14 @@ void CCleanTypeDlg::SetDlgTitle() else CAppUtils::SetWindowTitle(m_hWnd, g_Git.CombinePath(m_pathList.GetCommonRoot().GetDirectory()), m_sTitle); } + +void CCleanTypeDlg::OnBnClickedCheckDir() +{ + UpdateData(); + if (!m_bDir && m_bDirUnmanagedRepo) + { + m_bDirUnmanagedRepo = BST_UNCHECKED; + UpdateData(FALSE); + } + DialogEnableWindow(IDC_CHECK_DIR_UNMANAGEDREPO, m_bDir); +} diff --git a/src/TortoiseProc/CleanTypeDlg.h b/src/TortoiseProc/CleanTypeDlg.h index 6da7b1bbd..b006bc6a4 100644 --- a/src/TortoiseProc/CleanTypeDlg.h +++ b/src/TortoiseProc/CleanTypeDlg.h @@ -48,9 +48,11 @@ protected: virtual BOOL OnInitDialog() override; virtual void OnOK() override; void SetDlgTitle(); + afx_msg void OnBnClickedCheckDir(); public: BOOL m_bDir; + BOOL m_bDirUnmanagedRepo; int m_CleanType; BOOL m_bNoRecycleBin; BOOL m_bDryRun; diff --git a/src/TortoiseProc/Commands/CleanupCommand.cpp b/src/TortoiseProc/Commands/CleanupCommand.cpp index 9d646f968..b79d8c972 100644 --- a/src/TortoiseProc/Commands/CleanupCommand.cpp +++ b/src/TortoiseProc/Commands/CleanupCommand.cpp @@ -158,7 +158,7 @@ static bool GetFilesToCleanUp(CTGitPathList& delList, const CString& baseCmd, CG return true; } -static bool DoCleanUp(const CTGitPathList& pathList, int cleanType, bool bDir, bool bSubmodules, bool bDryRun, bool bNoRecycleBin) +static bool DoCleanUp(const CTGitPathList& pathList, int cleanType, bool bDir, bool bDirUnmanagedRepos, bool bSubmodules, bool bDryRun, bool bNoRecycleBin) { CString cmd; cmd.Format(L"git.exe clean"); @@ -178,6 +178,8 @@ static bool DoCleanUp(const CTGitPathList& pathList, int cleanType, bool bDir, b cmd += L" -fX"; break; } + if (bDirUnmanagedRepos) + cmd += L" -f"; STRING_VECTOR submoduleList; if (bSubmodules) @@ -224,20 +226,20 @@ static bool DoCleanUp(const CTGitPathList& pathList, int cleanType, bool bDir, b progress.m_PostCmdCallback = [&](DWORD status, PostCmdList& postCmdList) { if (status) - postCmdList.emplace_back(IDS_MSGBOX_RETRY, [&]{ DoCleanUp(pathList, cleanType, bDir, bSubmodules, bDryRun, bNoRecycleBin); }); + postCmdList.emplace_back(IDS_MSGBOX_RETRY, [&]{ DoCleanUp(pathList, cleanType, bDir, bDirUnmanagedRepos, bSubmodules, bDryRun, bNoRecycleBin); }); if (status || !bDryRun) return; if (bNoRecycleBin) { - postCmdList.emplace_back(IDS_CLEAN_NO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bSubmodules, FALSE, TRUE); }); - postCmdList.emplace_back(IDS_CLEAN_TO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bSubmodules, FALSE, FALSE); }); + postCmdList.emplace_back(IDS_CLEAN_NO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bDirUnmanagedRepos, bSubmodules, FALSE, TRUE); }); + postCmdList.emplace_back(IDS_CLEAN_TO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bDirUnmanagedRepos, bSubmodules, FALSE, FALSE); }); } else { - postCmdList.emplace_back(IDS_CLEAN_TO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bSubmodules, FALSE, FALSE); }); - postCmdList.emplace_back(IDS_CLEAN_NO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bSubmodules, FALSE, TRUE); }); + postCmdList.emplace_back(IDS_CLEAN_TO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bDirUnmanagedRepos, bSubmodules, FALSE, FALSE); }); + postCmdList.emplace_back(IDS_CLEAN_NO_RECYCLEBIN, [&]{ DoCleanUp(pathList, cleanType, bDir, bDirUnmanagedRepos, bSubmodules, FALSE, TRUE); }); } }; @@ -292,7 +294,7 @@ bool CleanupCommand::Execute() dlg.m_pathList = pathList; if (dlg.DoModal() == IDOK) { - bRet = DoCleanUp(pathList, dlg.m_CleanType, dlg.m_bDir == BST_CHECKED, dlg.m_bSubmodules == BST_CHECKED, dlg.m_bDryRun == BST_CHECKED, dlg.m_bNoRecycleBin == BST_CHECKED); + bRet = DoCleanUp(pathList, dlg.m_CleanType, dlg.m_bDir == BST_CHECKED, dlg.m_bDirUnmanagedRepo == BST_CHECKED, dlg.m_bSubmodules == BST_CHECKED, dlg.m_bDryRun == BST_CHECKED, dlg.m_bNoRecycleBin == BST_CHECKED); CShellUpdater::Instance().Flush(); } diff --git a/src/TortoiseProc/resource.h b/src/TortoiseProc/resource.h index 13a5cfc9a..4c2d5302e 100644 --- a/src/TortoiseProc/resource.h +++ b/src/TortoiseProc/resource.h @@ -1322,6 +1322,7 @@ #define IDS_FIRSTSTART_LANGUAGEHINT1 1630 #define IDC_CHECK_AUTOCRLF 1631 #define IDS_FIRSTSTART_LANGUAGEHINT2 1631 +#define IDC_CHECK_DIR_UNMANAGEDREPO 1631 #define IDC_COMBO_SAFECRLF 1632 #define IDS_FIRSTSTART_LANGUAGEHINT3 1632 #define IDC_CHECK_QUOTEPATH 1633 -- 2.11.4.GIT