bool DropCopyAddCommand::Execute() { bool bRet = false; CString droppath = parser.GetVal(_T("droptarget")); if (CTGitPath(droppath).IsAdminDir()) return FALSE; if(!CTGitPath(droppath).HasAdminDir(&g_Git.m_CurrentDir)) return FALSE; int worktreePathLen = g_Git.m_CurrentDir.GetLength(); orgPathList.RemoveAdminPaths(); CTGitPathList copiedFiles; for(int nPath = 0; nPath < orgPathList.GetCount(); ++nPath) { if (orgPathList[nPath].IsEquivalentTo(CTGitPath(droppath))) continue; //copy the file to the new location CString name = orgPathList[nPath].GetFileOrDirectoryName(); if (::PathFileExists(droppath + _T("\\") + name)) { if (::PathIsDirectory(droppath + _T("\\") + name)) { if (orgPathList[nPath].IsDirectory()) continue; } CString strMessage; strMessage.Format(IDS_PROC_OVERWRITE_CONFIRM, (LPCTSTR)(droppath + _T("\\") + name)); CString sBtn1(MAKEINTRESOURCE(IDS_PROC_OVERWRITEEXPORT_OVERWRITE)); CString sBtn2(MAKEINTRESOURCE(IDS_PROC_OVERWRITEEXPORT_KEEP)); CString sBtn3(MAKEINTRESOURCE(IDS_PROC_OVERWRITEEXPORT_CANCEL)); UINT ret = CMessageBox::Show(hwndExplorer, strMessage, _T("TortoiseGit"), 2, IDI_QUESTION, sBtn1, sBtn2, sBtn3); if (ret == 3) return FALSE; //cancel the whole operation if (ret == 1) { if (!::CopyFile(orgPathList[nPath].GetWinPath(), droppath + _T("\\") + name, FALSE)) { //the copy operation failed! Get out of here! ShowErrorMessage(); return FALSE; } } } else { if (orgPathList[nPath].IsDirectory()) { CString fromPath = orgPathList[nPath].GetWinPathString() + L"||"; CString toPath = droppath + L"\\" + name + L"||"; std::unique_ptr<TCHAR[]> fromBuf(new TCHAR[fromPath.GetLength() + 2]); std::unique_ptr<TCHAR[]> toBuf(new TCHAR[toPath.GetLength() + 2]); wcscpy_s(fromBuf.get(), fromPath.GetLength() + 2, fromPath); wcscpy_s(toBuf.get(), toPath.GetLength() + 2, toPath); CStringUtils::PipesToNulls(fromBuf.get(), fromPath.GetLength() + 2); CStringUtils::PipesToNulls(toBuf.get(), toPath.GetLength() + 2); SHFILEOPSTRUCT fileop = {0}; fileop.wFunc = FO_COPY; fileop.pFrom = fromBuf.get(); fileop.pTo = toBuf.get(); fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR | FOF_NOCOPYSECURITYATTRIBS | FOF_SILENT; if (!SHFileOperation(&fileop)) { // add all copied files WITH special handling for repos/submodules (folders which include a .git entry) CDirFileEnum finder(droppath + L"\\" + name); bool isDir = true; CString filepath; CString lastRepo; bool isRepo = false; while (finder.NextFile(filepath, &isDir, !isRepo)) // don't recurse into .git directories { if (!lastRepo.IsEmpty()) { if (filepath.Find(lastRepo) == 0) continue; else lastRepo.Empty(); } int pos = -1; if ((pos = filepath.Find(L"\\" + g_GitAdminDir.GetAdminDirName())) >= 0) isRepo = (pos == filepath.GetLength() - g_GitAdminDir.GetAdminDirName().GetLength() - 1); else isRepo = false; if (isRepo) { lastRepo = filepath.Mid(0, filepath.GetLength() - g_GitAdminDir.GetAdminDirName().GetLength()); CString msg; if (!isDir) msg.Format(IDS_PROC_COPY_SUBMODULE, lastRepo); else msg.Format(IDS_PROC_COPY_REPOSITORY, lastRepo); int ret = CMessageBox::Show(hwndExplorer, msg, _T("TortoiseGit"), 1, IDI_QUESTION, CString(MAKEINTRESOURCE(IDS_DELETEBUTTON)), CString(MAKEINTRESOURCE(IDS_IGNOREBUTTON)), CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))); if (ret == 3) return FALSE; if (ret == 1) { CTGitPath(filepath).Delete(false); lastRepo.Empty(); } continue; } if (!isDir) copiedFiles.AddPath(CTGitPath(filepath.Mid(worktreePathLen + 1))); //add the new filepath } } continue; // do not add a directory to copiedFiles } else if (!CopyFile(orgPathList[nPath].GetWinPath(), droppath+_T("\\")+name, FALSE)) { //the copy operation failed! Get out of here! ShowErrorMessage(); return FALSE; } } CString destPath(droppath + _T("\\") + name); copiedFiles.AddPath(CTGitPath(destPath.Mid(worktreePathLen + 1))); //add the new filepath } //now add all the newly copied files to the working copy CGitProgressDlg progDlg; theApp.m_pMainWnd = &progDlg; AddProgressCommand addCommand; progDlg.SetCommand(&addCommand); addCommand.SetPathList(copiedFiles); progDlg.DoModal(); bRet = !progDlg.DidErrorsOccur(); return bRet; }
bool CClientState::ProcessTempEntities( SVC_TempEntities *msg ) { bool bReliable = false; float fire_time = cl.GetTime(); #ifndef _XBOX // delay firing temp ents by cl_interp in multiplayer or demoplayback if ( cl.m_nMaxClients > 1 || demoplayer->IsPlayingBack() ) { float flInterpAmount = GetClientInterpAmount(); fire_time += flInterpAmount; } #endif if ( msg->m_nNumEntries == 0 ) { bReliable = true; msg->m_nNumEntries = 1; } int flags = bReliable ? FEV_RELIABLE : 0; // Don't actually queue unreliable events if playing a demo and skipping ahead #ifndef _XBOX if ( !bReliable && demoplayer->IsSkipping() ) { return true; } #endif bf_read &buffer = msg->m_DataIn; // shortcut int classID = -1; void *from = NULL; C_ServerClassInfo *pServerClass = NULL; ClientClass *pClientClass = NULL; unsigned char data[CEventInfo::MAX_EVENT_DATA]; bf_write toBuf( data, sizeof(data) ); CEventInfo *ei = NULL; for (int i = 0; i < msg->m_nNumEntries; i++ ) { float delay = 0.0f; if ( buffer.ReadOneBit() ) { delay = (float)buffer.ReadSBitLong( 8 ) / 100.0f; } toBuf.Reset(); if ( buffer.ReadOneBit() ) { from = NULL; // full update classID = buffer.ReadUBitLong( m_nServerClassBits ); // classID // Look up the client class, etc. // Match the server classes to the client classes. pServerClass = m_pServerClasses ? &m_pServerClasses[ classID - 1 ] : NULL; if ( !pServerClass ) { DevMsg("CL_QueueEvent: missing server class info for %i.\n", classID - 1 ); return false; } // See if the client .dll has a handler for this class pClientClass = FindClientClass( pServerClass->m_ClassName ); if ( !pClientClass || !pClientClass->m_pRecvTable ) { DevMsg("CL_QueueEvent: missing client receive table for %s.\n", pServerClass->m_ClassName ); return false; } RecvTable_MergeDeltas( pClientClass->m_pRecvTable, NULL, &buffer, &toBuf ); } else { Assert( ei ); bf_read fromBuf( ei->pData, Bits2Bytes(ei->bits) ); RecvTable_MergeDeltas( pClientClass->m_pRecvTable, &fromBuf, &buffer, &toBuf ); } // Add a slot ei = &cl.events[ cl.events.AddToTail() ]; Assert( ei ); int size = Bits2Bytes(toBuf.GetNumBitsWritten() ); ei->classID = classID; ei->fire_delay = fire_time + delay; ei->flags = flags; ei->pClientClass = pClientClass; ei->bits = toBuf.GetNumBitsWritten(); ei->pData = new byte[size]; // copy raw data Q_memcpy( ei->pData, data, size ); } return true; }