- else\r
- {\r
- CString sTempFile = CTempFiles::Instance().GetTempFilePath(false).GetWinPathString();\r
- targetList.WriteToFile(sTempFile, false);\r
- CString sCmd;\r
- sCmd.Format(_T("\"%s\" /command:update /rev /pathfile:\"%s\" /deletepathfile"),\r
- (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), (LPCTSTR)sTempFile);\r
-\r
- CAppUtils::LaunchApplication(sCmd, NULL, false);\r
- }\r
- }\r
- break;\r
- case IDSVNLC_LOG:\r
- {\r
- CString sCmd;\r
- sCmd.Format(_T("\"%s\" /command:log /path:\"%s\""),\r
- (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
- if (!filepath.IsUrl())\r
- {\r
- sCmd += _T(" /propspath:\"");\r
- sCmd += filepath.GetWinPathString();\r
- sCmd += _T("\"");\r
- } \r
-\r
- CAppUtils::LaunchApplication(sCmd, NULL, false);\r
- }\r
- break;\r
- case IDSVNLC_BLAME:\r
- {\r
- CString sCmd;\r
- sCmd.Format(_T("\"%s\" /command:blame /path:\"%s\""),\r
- (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
- if (!filepath.IsUrl())\r
- {\r
- sCmd += _T(" /propspath:\"");\r
- sCmd += filepath.GetWinPathString();\r
- sCmd += _T("\"");\r
- } \r
-\r
- CAppUtils::LaunchApplication(sCmd, NULL, false);\r
- }\r
- break;\r
- case IDSVNLC_OPEN:\r
- {\r
- int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath.GetWinPath(), NULL, NULL, SW_SHOW);\r
- if (ret <= HINSTANCE_ERROR)\r
- {\r
- CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
- cmd += filepath.GetWinPathString();\r
- CAppUtils::LaunchApplication(cmd, NULL, false);\r
- }\r
- }\r
- break;\r
- case IDSVNLC_OPENWITH:\r
- {\r
- CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
- cmd += filepath.GetWinPathString() + _T(" ");\r
- CAppUtils::LaunchApplication(cmd, NULL, false);\r
- }\r
- break;\r
- case IDSVNLC_EXPLORE:\r
- {\r
- ShellExecute(this->m_hWnd, _T("explore"), filepath.GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
- }\r
- break;\r
- case IDSVNLC_REMOVE:\r
- {\r
- SVN git;\r
- CTSVNPathList itemsToRemove;\r
- FillListOfSelectedItemPaths(itemsToRemove);\r
-\r
- // We must sort items before removing, so that files are always removed\r
- // *before* their parents\r
- itemsToRemove.SortByPathname(true);\r
-\r
- bool bSuccess = false;\r
- if (git.Remove(itemsToRemove, FALSE, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000)))\r
- {\r
- bSuccess = true;\r
- }\r
- else\r
- {\r
- if ((git.Err->apr_err == SVN_ERR_UNVERSIONED_RESOURCE) ||\r
- (git.Err->apr_err == SVN_ERR_CLIENT_MODIFIED))\r
- {\r
- CString msg, yes, no, yestoall;\r
- msg.Format(IDS_PROC_REMOVEFORCE, (LPCTSTR)git.GetLastErrorMessage());\r
- yes.LoadString(IDS_MSGBOX_YES);\r
- no.LoadString(IDS_MSGBOX_NO);\r
- yestoall.LoadString(IDS_PROC_YESTOALL);\r
- UINT ret = CMessageBox::Show(m_hWnd, msg, _T("TortoiseSVN"), 2, IDI_ERROR, yes, no, yestoall);\r
- if ((ret == 1)||(ret==3))\r
- {\r
- if (!git.Remove(itemsToRemove, TRUE, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000)))\r
- {\r
- CMessageBox::Show(m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
- }\r
- else\r
- bSuccess = true;\r
- }\r
- }\r
- else\r
- CMessageBox::Show(m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
- }\r
- if (bSuccess)\r
- {\r
- // The remove went ok, but we now need to run through the selected items again\r
- // and update their status\r
- POSITION pos = GetFirstSelectedItemPosition();\r
- int index;\r
- std::vector<int> entriesToRemove;\r
- while ((index = GetNextSelectedItem(pos)) >= 0)\r
- {\r
- FileEntry * e = GetListEntry(index);\r
- if (!bShift &&\r
- ((e->textstatus == git_wc_status_unversioned)||\r
- (e->textstatus == git_wc_status_none)||\r
- (e->textstatus == git_wc_status_ignored)))\r
- {\r
- if (GetCheck(index))\r
- m_nSelected--;\r
- m_nTotal--;\r
- entriesToRemove.push_back(index);\r
- }\r
- else\r
- {\r
- e->textstatus = git_wc_status_deleted;\r
- e->status = git_wc_status_deleted;\r
- SetEntryCheck(e,index,true);\r
- }\r
- }\r
- for (std::vector<int>::reverse_iterator it = entriesToRemove.rbegin(); it != entriesToRemove.rend(); ++it)\r
- {\r
- RemoveListEntry(*it);\r
- }\r
- }\r
- SaveColumnWidths();\r
- Show(m_dwShow, 0, m_bShowFolders);\r
- NotifyCheck();\r
- }\r
- break;\r
- case IDSVNLC_DELETE:\r
- {\r
- CTSVNPathList pathlist;\r
- FillListOfSelectedItemPaths(pathlist);\r
- pathlist.RemoveChildren();\r
- CString filelist;\r
- for (INT_PTR i=0; i<pathlist.GetCount(); ++i)\r
- {\r
- filelist += pathlist[i].GetWinPathString();\r
- filelist += _T("|");\r
- }\r
- filelist += _T("|");\r
- int len = filelist.GetLength();\r
- TCHAR * buf = new TCHAR[len+2];\r
- _tcscpy_s(buf, len+2, filelist);\r
- for (int i=0; i<len; ++i)\r
- if (buf[i] == '|')\r
- buf[i] = 0;\r
- SHFILEOPSTRUCT fileop;\r
- fileop.hwnd = this->m_hWnd;\r
- fileop.wFunc = FO_DELETE;\r
- fileop.pFrom = buf;\r
- fileop.pTo = NULL;\r
- fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | ((GetAsyncKeyState(VK_SHIFT) & 0x8000) ? 0 : FOF_ALLOWUNDO);\r
- fileop.lpszProgressTitle = _T("deleting file");\r
- int result = SHFileOperation(&fileop);\r
- delete [] buf;\r
-\r
- if ( (result==0) && (!fileop.fAnyOperationsAborted) )\r
- {\r
- SetRedraw(FALSE);\r
- POSITION pos = NULL;\r
- CTSVNPathList deletedlist; // to store list of deleted folders\r
- while ((pos = GetFirstSelectedItemPosition()) != 0)\r
- {\r
- int index = GetNextSelectedItem(pos);\r
- if (GetCheck(index))\r
- m_nSelected--;\r
- m_nTotal--;\r
- FileEntry * fentry = GetListEntry(index);\r
- if ((fentry)&&(fentry->isfolder))\r
- deletedlist.AddPath(fentry->path);\r
- RemoveListEntry(index);\r
- }\r
- // now go through the list of deleted folders\r
- // and remove all their children from the list too!\r
- int nListboxEntries = GetItemCount();\r
- for (int folderindex = 0; folderindex < deletedlist.GetCount(); ++folderindex)\r
- {\r
- CTSVNPath folderpath = deletedlist[folderindex];\r
- for (int i=0; i<nListboxEntries; ++i)\r
- {\r
- FileEntry * entry = GetListEntry(i);\r
- if (folderpath.IsAncestorOf(entry->path))\r
- {\r
- RemoveListEntry(i--);\r
- nListboxEntries--;\r
- }\r
- }\r
- }\r
- SetRedraw(TRUE);\r
- }\r
- }\r
- break;\r
- case IDSVNLC_IGNOREMASK:\r
- {\r
- CString name = _T("*")+filepath.GetFileExtension();\r
- CTSVNPathList ignorelist;\r
- FillListOfSelectedItemPaths(ignorelist, true);\r
- std::set<CTSVNPath> parentlist;\r
- for (int i=0; i<ignorelist.GetCount(); ++i)\r
- {\r
- parentlist.insert(ignorelist[i].GetContainingDirectory());\r
- }\r
- std::set<CTSVNPath>::iterator it;\r
- std::vector<CString> toremove;\r
- SetRedraw(FALSE);\r
- for (it = parentlist.begin(); it != parentlist.end(); ++it)\r