int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t rev1,bool bIsAdd) { CString temppath; GetTempPath(temppath); Parser(rev1); CString file1; CString nullfile; CString cmd; if(pPath->IsDirectory()) { git_revnum_t rev2; return SubmoduleDiffNull(pPath,rev1); } if(rev1 != GIT_REV_ZERO ) { TCHAR szTempName[MAX_PATH]; GetTempFileName(temppath, pPath->GetBaseFilename(), 0, szTempName); CString temp(szTempName); DeleteFile(szTempName); CreateDirectory(szTempName, NULL); file1.Format(_T("%s\\%s-%s%s"), temp, pPath->GetBaseFilename(), rev1.Left(6), pPath->GetFileExtension()); g_Git.GetOneFile(rev1,*pPath,file1); } else { file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString(); } // preserve FileExtension, needed especially for diffing deleted images (detection on new filename extension) CString tempfile=::GetTempFile() + pPath->GetFileExtension(); CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate ); //file.WriteString(); file.Close(); ::SetFileAttributes(tempfile, FILE_ATTRIBUTE_READONLY); CAppUtils::DiffFlags flags; if(bIsAdd) CAppUtils::StartExtDiff(tempfile,file1, pPath->GetGitPathString(), pPath->GetGitPathString()+_T(":")+rev1.Left(6) ,flags); else CAppUtils::StartExtDiff(file1,tempfile, pPath->GetGitPathString()+_T(":")+rev1.Left(6) ,pPath->GetGitPathString(),flags); return 0; }
int CGitDiff::DiffNull(const CTGitPath *pPath, git_revnum_t rev1, bool bIsAdd, int jumpToLine) { CString temppath; GetTempPath(temppath); if (rev1 != GIT_REV_ZERO) { CGitHash rev1Hash; if (g_Git.GetHash(rev1Hash, rev1)) // make sure we have a HASH here, otherwise filenames might be invalid { MessageBox(NULL, g_Git.GetGitLastErr(_T("Could not get hash of \"") + rev1 + _T("\".")), _T("TortoiseGit"), MB_ICONERROR); return -1; } rev1 = rev1Hash.ToString(); } CString file1; CString nullfile; CString cmd; if(pPath->IsDirectory()) { int result; // refresh if result = 1 CTGitPath path = *pPath; while ((result = SubmoduleDiffNull(&path, rev1)) == 1) { path.SetFromGit(pPath->GetGitPathString()); } return result; } if(rev1 != GIT_REV_ZERO ) { TCHAR szTempName[MAX_PATH] = {0}; GetTempFileName(temppath, pPath->GetBaseFilename(), 0, szTempName); CString temp(szTempName); DeleteFile(szTempName); CreateDirectory(szTempName, NULL); file1.Format(_T("%s\\%s-%s%s"), temp, pPath->GetBaseFilename(), rev1.Left(g_Git.GetShortHASHLength()), pPath->GetFileExtension()); g_Git.GetOneFile(rev1,*pPath,file1); } else { file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString(); } // preserve FileExtension, needed especially for diffing deleted images (detection on new filename extension) CString tempfile=::GetTempFile() + pPath->GetFileExtension(); CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate ); //file.WriteString(); file.Close(); ::SetFileAttributes(tempfile, FILE_ATTRIBUTE_READONLY); CAppUtils::DiffFlags flags; if(bIsAdd) CAppUtils::StartExtDiff(tempfile,file1, pPath->GetGitPathString(), pPath->GetGitPathString() + _T(":") + rev1.Left(g_Git.GetShortHASHLength()), g_Git.m_CurrentDir + _T("\\") + pPath->GetWinPathString(), g_Git.m_CurrentDir + _T("\\") + pPath->GetWinPathString(), git_revnum_t(GIT_REV_ZERO), rev1 , flags, jumpToLine); else CAppUtils::StartExtDiff(file1,tempfile, pPath->GetGitPathString() + _T(":") + rev1.Left(g_Git.GetShortHASHLength()), pPath->GetGitPathString(), g_Git.m_CurrentDir + _T("\\") + pPath->GetWinPathString(), g_Git.m_CurrentDir + _T("\\") + pPath->GetWinPathString(), rev1, git_revnum_t(GIT_REV_ZERO) , flags, jumpToLine); return 0; }
int CGitDiff::DiffNull(const CTGitPath *pPath, git_revnum_t rev1, bool bIsAdd, int jumpToLine, bool bAlternative) { if (rev1 != GIT_REV_ZERO) { CGitHash rev1Hash; if (g_Git.GetHash(rev1Hash, rev1)) // make sure we have a HASH here, otherwise filenames might be invalid { MessageBox(nullptr, g_Git.GetGitLastErr(L"Could not get hash of \"" + rev1 + L"\"."), L"TortoiseGit", MB_ICONERROR); return -1; } rev1 = rev1Hash.ToString(); } CString file1; CString nullfile; CString cmd; if(pPath->IsDirectory()) { int result; // refresh if result = 1 CTGitPath path = *pPath; while ((result = SubmoduleDiffNull(&path, rev1)) == 1) path.SetFromGit(pPath->GetGitPathString()); return result; } if(rev1 != GIT_REV_ZERO ) { file1 = CTempFiles::Instance().GetTempFilePath(false, *pPath, rev1).GetWinPathString(); if (g_Git.GetOneFile(rev1, *pPath, file1)) { CString out; out.Format(IDS_STATUSLIST_CHECKOUTFILEFAILED, (LPCTSTR)pPath->GetGitPathString(), (LPCTSTR)rev1, (LPCTSTR)file1); CMessageBox::Show(nullptr, g_Git.GetGitLastErr(out, CGit::GIT_CMD_GETONEFILE), L"TortoiseGit", MB_OK); return -1; } ::SetFileAttributes(file1, FILE_ATTRIBUTE_READONLY); } else file1 = g_Git.CombinePath(pPath); CString tempfile = CTempFiles::Instance().GetTempFilePath(false, *pPath, rev1).GetWinPathString(); ::SetFileAttributes(tempfile, FILE_ATTRIBUTE_READONLY); CAppUtils::DiffFlags flags; flags.bAlternativeTool = bAlternative; if(bIsAdd) CAppUtils::StartExtDiff(tempfile,file1, pPath->GetGitPathString(), pPath->GetGitPathString() + L':' + rev1.Left(g_Git.GetShortHASHLength()), g_Git.CombinePath(pPath), g_Git.CombinePath(pPath), git_revnum_t(GIT_REV_ZERO), rev1 , flags, jumpToLine); else CAppUtils::StartExtDiff(file1,tempfile, pPath->GetGitPathString() + L':' + rev1.Left(g_Git.GetShortHASHLength()), pPath->GetGitPathString(), g_Git.CombinePath(pPath), g_Git.CombinePath(pPath), rev1, git_revnum_t(GIT_REV_ZERO) , flags, jumpToLine); return 0; }