BOOL CTortoiseGitBlameDoc::OnOpenDocument(LPCTSTR lpszPathName,CString Rev) { if(Rev.IsEmpty()) Rev = _T("HEAD"); // enable blame for files which do not exist in current working tree if (!PathFileExists(lpszPathName) && Rev != _T("HEAD")) { if (!CDocument::OnOpenDocument(GetTempFile())) return FALSE; } else { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; } m_CurrentFileName = lpszPathName; m_Rev=Rev; // (SDI documents will reuse this document) if(!g_Git.CheckMsysGitDir()) { CCommonAppUtils::RunTortoiseGitProc(_T(" /command:settings")); return FALSE; } GitAdminDir admindir; CString topdir; if(!admindir.HasAdminDir(m_CurrentFileName, &topdir)) { CString temp; temp.Format(IDS_CANNOTBLAMENOGIT, CString(m_CurrentFileName)); CMessageBox::Show(NULL, temp, _T("TortoiseGitBlame"), MB_OK); return FALSE; } else { GitAdminDir lastAdminDir; CString oldTopDir; if (topdir != g_Git.m_CurrentDir && CTGitPath(g_Git.m_CurrentDir).HasAdminDir(&oldTopDir) && oldTopDir != topdir) { CString sMsg; sMsg.Format(IDS_ERR_DIFFENERTPREPO, oldTopDir, topdir); MessageBox(NULL, sMsg, _T("TortoiseGitBlame"), MB_OK | MB_ICONERROR); return FALSE; } m_IsGitFile=TRUE; sOrigCWD = g_Git.m_CurrentDir = topdir; CString PathName = m_CurrentFileName; if(topdir[topdir.GetLength()-1] == _T('\\') || topdir[topdir.GetLength()-1] == _T('/')) PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()); else PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()-1); CTGitPath path; path.SetFromWin(PathName); if(!g_Git.m_CurrentDir.IsEmpty()) SetCurrentDirectory(g_Git.m_CurrentDir); try { // make sure all config files are read in order to check that none contains an error g_Git.GetConfigValue(_T("doesnot.exist")); } catch (char * libgiterr) { MessageBox(NULL, CString(libgiterr), _T("TortoiseGitBlame"), MB_ICONERROR); return FALSE; } CString cmd; cmd.Format(_T("git.exe blame -s -l %s -- \"%s\""),Rev,path.GetGitPathString()); m_BlameData.clear(); BYTE_VECTOR err; if(g_Git.Run(cmd, &m_BlameData, &err)) { CString str; if (!m_BlameData.empty()) g_Git.StringAppend(&str, &m_BlameData[0], CP_UTF8); if (!err.empty()) g_Git.StringAppend(&str, &err[0], CP_UTF8); MessageBox(NULL, CString(MAKEINTRESOURCE(IDS_BLAMEERROR)) + _T("\n\n") + str, _T("TortoiseGitBlame"), MB_OK); return FALSE; } if(!m_TempFileName.IsEmpty()) { ::DeleteFile(m_TempFileName); m_TempFileName.Empty(); } m_TempFileName=GetTempFile(); cmd.Format(_T("git.exe cat-file blob %s:\"%s\""),Rev,path.GetGitPathString()); if(g_Git.RunLogFile(cmd, m_TempFileName)) { CString str; str.Format(IDS_CHECKOUTFAILED, path.GetGitPathString()); MessageBox(NULL, CString(MAKEINTRESOURCE(IDS_BLAMEERROR)) + _T("\n\n") + str, _T("TortoiseGitBlame"), MB_OK); return FALSE; } m_GitPath = path; if (GetMainFrame()->m_wndOutput.LoadHistory(path.GetGitPathString(), m_Rev, (theApp.GetInt(_T("FollowRenames"), 0) == 1))) return FALSE; CTortoiseGitBlameView *pView=DYNAMIC_DOWNCAST(CTortoiseGitBlameView,GetMainFrame()->GetActiveView()); if(pView == NULL) { CWnd* pWnd = GetMainFrame()->GetDescendantWindow(AFX_IDW_PANE_FIRST, TRUE); if (pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CTortoiseGitBlameView))) { pView = (CTortoiseGitBlameView*)pWnd; } else { return FALSE; } } pView->UpdateInfo(); } return TRUE; }
BOOL CTortoiseGitBlameDoc::OnOpenDocument(LPCTSTR lpszPathName,CString Rev) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; m_CurrentFileName=lpszPathName; m_Rev=Rev; // (SDI documents will reuse this document) if(!g_Git.CheckMsysGitDir()) { CMessageBox::Show(NULL,_T("MsysGit have not install or config fail"),_T("TortoiseGitBlame"),MB_OK); return FALSE; } GitAdminDir admindir; CString topdir; if(!admindir.HasAdminDir(lpszPathName,&topdir)) { CMessageBox::Show(NULL,CString(lpszPathName)+_T(" is not controled by git\nJust Show File Context"),_T("TortoiseGitBlame"),MB_OK); } else { m_IsGitFile=TRUE; g_Git.m_CurrentDir=topdir; CString PathName=lpszPathName; if(topdir[topdir.GetLength()-1] == _T('\\') || topdir[topdir.GetLength()-1] == _T('/')) PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()); else PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()-1); CTGitPath path; path.SetFromWin(PathName); if(!g_Git.m_CurrentDir.IsEmpty()) SetCurrentDirectory(g_Git.m_CurrentDir); m_GitPath = path; GetMainFrame()->m_wndOutput.LoadHistory(path.GetGitPathString()); CString cmd; if(Rev.IsEmpty()) Rev=_T("HEAD"); cmd.Format(_T("git.exe blame -s -l %s -- \"%s\""),Rev,path.GetGitPathString()); m_BlameData.clear(); BYTE_VECTOR err; if(g_Git.Run(cmd, &m_BlameData, &err)) { CString str; g_Git.StringAppend(&str, &m_BlameData[0], CP_ACP); g_Git.StringAppend(&str, &err[0], CP_ACP); CMessageBox::Show(NULL,CString(_T("Blame Error")) + str,_T("TortoiseGitBlame"),MB_OK); } if(!m_TempFileName.IsEmpty()) { ::DeleteFile(m_TempFileName); m_TempFileName.Empty(); } m_TempFileName=GetTempFile(); if(Rev.IsEmpty()) Rev=_T("HEAD"); cmd.Format(_T("git.exe cat-file blob %s:\"%s\""),Rev,path.GetGitPathString()); if(g_Git.RunLogFile(cmd, m_TempFileName)) { CString str; str.Format(_T("Fail get file %s"), path.GetGitPathString()); CMessageBox::Show(NULL,CString(_T("Blame Error")) + str,_T("TortoiseGitBlame"),MB_OK); } CTortoiseGitBlameView *pView=DYNAMIC_DOWNCAST(CTortoiseGitBlameView,GetMainFrame()->GetActiveView()); if(pView == NULL) { CWnd* pWnd = GetMainFrame()->GetDescendantWindow(AFX_IDW_PANE_FIRST, TRUE); if (pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CTortoiseGitBlameView))) { pView = (CTortoiseGitBlameView*)pWnd; } else { return FALSE; } } pView->UpdateInfo(); } return TRUE; }
BOOL CTortoiseGitBlameDoc::OnOpenDocument(LPCTSTR lpszPathName,CString Rev) { if(Rev.IsEmpty()) Rev = _T("HEAD"); // enable blame for files which do not exist in current working tree if (!PathFileExists(lpszPathName) && Rev != _T("HEAD")) { if (!CDocument::OnOpenDocument(GetTempFile())) return FALSE; } else { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; } m_CurrentFileName = lpszPathName; m_Rev=Rev; // (SDI documents will reuse this document) if(!g_Git.CheckMsysGitDir()) { CCommonAppUtils::RunTortoiseGitProc(_T(" /command:settings")); return FALSE; } GitAdminDir admindir; CString topdir; if(!admindir.HasAdminDir(m_CurrentFileName, &topdir)) { CString temp; temp.Format(IDS_CANNOTBLAMENOGIT, CString(m_CurrentFileName)); CMessageBox::Show(NULL, temp, _T("TortoiseGitBlame"), MB_OK); return FALSE; } else { GitAdminDir lastAdminDir; CString oldTopDir; if (topdir != g_Git.m_CurrentDir && CTGitPath(g_Git.m_CurrentDir).HasAdminDir(&oldTopDir) && oldTopDir != topdir) { CString sMsg; sMsg.Format(IDS_ERR_DIFFENERTPREPO, oldTopDir, topdir); MessageBox(NULL, sMsg, _T("TortoiseGitBlame"), MB_OK | MB_ICONERROR); return FALSE; } m_IsGitFile=TRUE; sOrigCWD = g_Git.m_CurrentDir = topdir; CString PathName = m_CurrentFileName; if(topdir[topdir.GetLength()-1] == _T('\\') || topdir[topdir.GetLength()-1] == _T('/')) PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()); else PathName=PathName.Right(PathName.GetLength()-g_Git.m_CurrentDir.GetLength()-1); CTGitPath path; path.SetFromWin(PathName); if(!g_Git.m_CurrentDir.IsEmpty()) SetCurrentDirectory(g_Git.m_CurrentDir); try { // make sure all config files are read in order to check that none contains an error g_Git.GetConfigValue(_T("doesnot.exist")); } catch (char * libgiterr) { MessageBox(NULL, CString(libgiterr), _T("TortoiseGitBlame"), MB_ICONERROR); return FALSE; } CString cmd, option; int dwDetectMovedOrCopiedLines = theApp.GetInt(_T("DetectMovedOrCopiedLines"), BLAME_DETECT_MOVED_OR_COPIED_LINES_DISABLED); int dwDetectMovedOrCopiedLinesNumCharactersWithinFile = theApp.GetInt(_T("DetectMovedOrCopiedLinesNumCharactersWithinFile"), BLAME_DETECT_MOVED_OR_COPIED_LINES_NUM_CHARACTERS_WITHIN_FILE_DEFAULT); int dwDetectMovedOrCopiedLinesNumCharactersFromFiles = theApp.GetInt(_T("DetectMovedOrCopiedLinesNumCharactersFromFiles"), BLAME_DETECT_MOVED_OR_COPIED_LINES_NUM_CHARACTERS_FROM_FILES_DEFAULT); switch(dwDetectMovedOrCopiedLines) { default: case BLAME_DETECT_MOVED_OR_COPIED_LINES_DISABLED: option.Empty(); break; case BLAME_DETECT_MOVED_OR_COPIED_LINES_WITHIN_FILE: option.Format(_T("-M%d"), dwDetectMovedOrCopiedLinesNumCharactersWithinFile); break; case BLAME_DETECT_MOVED_OR_COPIED_LINES_FROM_MODIFIED_FILES: option.Format(_T("-C%d"), dwDetectMovedOrCopiedLinesNumCharactersFromFiles); break; case BLAME_DETECT_MOVED_OR_COPIED_LINES_FROM_EXISTING_FILES_AT_FILE_CREATION: option.Format(_T("-C -C%d"), dwDetectMovedOrCopiedLinesNumCharactersFromFiles); break; case BLAME_DETECT_MOVED_OR_COPIED_LINES_FROM_EXISTING_FILES: option.Format(_T("-C -C -C%d"), dwDetectMovedOrCopiedLinesNumCharactersFromFiles); break; } cmd.Format(_T("git.exe blame -p %s %s -- \"%s\""), option, Rev, path.GetGitPathString()); m_BlameData.clear(); BYTE_VECTOR err; if(g_Git.Run(cmd, &m_BlameData, &err)) { CString str; if (!m_BlameData.empty()) g_Git.StringAppend(&str, &m_BlameData[0], CP_UTF8); if (!err.empty()) g_Git.StringAppend(&str, &err[0], CP_UTF8); MessageBox(NULL, CString(MAKEINTRESOURCE(IDS_BLAMEERROR)) + _T("\n\n") + str, _T("TortoiseGitBlame"), MB_OK); return FALSE; } #ifdef USE_TEMPFILENAME if(!m_TempFileName.IsEmpty()) { ::DeleteFile(m_TempFileName); m_TempFileName.Empty(); } m_TempFileName=GetTempFile(); cmd.Format(_T("git.exe cat-file blob %s:\"%s\""),Rev,path.GetGitPathString()); if(g_Git.RunLogFile(cmd, m_TempFileName)) { CString str; str.Format(IDS_CHECKOUTFAILED, path.GetGitPathString()); MessageBox(NULL, CString(MAKEINTRESOURCE(IDS_BLAMEERROR)) + _T("\n\n") + str, _T("TortoiseGitBlame"), MB_OK); return FALSE; } #endif m_GitPath = path; CTortoiseGitBlameView *pView=DYNAMIC_DOWNCAST(CTortoiseGitBlameView,GetMainFrame()->GetActiveView()); if(pView == NULL) { CWnd* pWnd = GetMainFrame()->GetDescendantWindow(AFX_IDW_PANE_FIRST, TRUE); if (pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CTortoiseGitBlameView))) { pView = (CTortoiseGitBlameView*)pWnd; } else { return FALSE; } } pView->ParseBlame(); BOOL bShowCompleteLog = (theApp.GetInt(_T("ShowCompleteLog"), 1) == 1); if (bShowCompleteLog && BlameIsLimitedToOneFilename(dwDetectMovedOrCopiedLines)) { if (GetMainFrame()->m_wndOutput.LoadHistory(path.GetGitPathString(), m_Rev, (theApp.GetInt(_T("FollowRenames"), 0) == 1))) return FALSE; } else { std::set<CGitHash> hashes; pView->m_data.GetHashes(hashes); if (GetMainFrame()->m_wndOutput.LoadHistory(hashes)) return FALSE; } pView->MapLineToLogIndex(); pView->UpdateInfo(); if (m_lLine > 0) pView->GotoLine(m_lLine); SetPathName(m_CurrentFileName, FALSE); } return TRUE; }