#include "GitStatus.h"\r
#include "CreateBranchTagDlg.h"\r
#include "GitSwitchDlg.h"\r
+#include "ResetDlg.h"\r
\r
CAppUtils::CAppUtils(void)\r
{\r
/**\r
* Launch the external blame viewer\r
*/\r
-bool CAppUtils::LaunchTortoiseBlame(const CString& sBlameFile, const CString& sLogFile, const CString& sOriginalFile, const CString& sParams)\r
+bool CAppUtils::LaunchTortoiseBlame(const CString& sBlameFile,CString Rev,const CString& sParams)\r
{\r
CString viewer = CPathUtils::GetAppDirectory();\r
- viewer += _T("TortoiseBlame.exe");\r
+ viewer += _T("TortoiseGitBlame.exe");\r
viewer += _T(" \"") + sBlameFile + _T("\"");\r
- viewer += _T(" \"") + sLogFile + _T("\"");\r
- viewer += _T(" \"") + sOriginalFile + _T("\"");\r
+ //viewer += _T(" \"") + sLogFile + _T("\"");\r
+ //viewer += _T(" \"") + sOriginalFile + _T("\"");\r
+ if(!Rev.IsEmpty())\r
+ viewer += CString(_T(" /rev:"))+Rev;\r
viewer += _T(" ")+sParams;\r
\r
return LaunchApplication(viewer, IDS_ERR_EXTDIFFSTART, false);\r
);\r
}\r
CString out;\r
- if(g_Git.Run(cmd,&out))\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
}\r
\r
file.Close();\r
return TRUE;\r
-}
\ No newline at end of file
+}\r
+\r
+bool CAppUtils::GitReset(CString *CommitHash,int type)\r
+{\r
+ CResetDlg dlg;\r
+ dlg.m_ResetType=type;\r
+ if (dlg.DoModal() == IDOK)\r
+ {\r
+ CString cmd;\r
+ CString type;\r
+ switch(dlg.m_ResetType)\r
+ {\r
+ case 0:\r
+ type=_T("--soft");\r
+ break;\r
+ case 1:\r
+ type=_T("--mixed");\r
+ break;\r
+ case 2:\r
+ type=_T("--hard");\r
+ break;\r
+ default:\r
+ type=_T("--mixed");\r
+ break;\r
+ }\r
+ cmd.Format(_T("git.exe reset %s %s"),type, *CommitHash);\r
+\r
+ CProgressDlg progress;\r
+ progress.m_GitCmd=cmd;\r
+ if(progress.DoModal()==IDOK)\r
+ return TRUE;\r
+\r
+ }\r
+ return FALSE;\r
+}\r
+\r
+bool CAppUtils::ConflictEdit(CTGitPath &path,bool bAlternativeTool)\r
+{\r
+ bool bRet = false;\r
+\r
+ CTGitPath merge=path;\r
+ CTGitPath directory = merge.GetDirectory();\r
+ \r
+ \r
+\r
+ // we have the conflicted file (%merged)\r
+ // now look for the other required files\r
+ //GitStatus stat;\r
+ //stat.GetStatus(merge);\r
+ //if (stat.status == NULL)\r
+ // return false;\r
+\r
+ BYTE_VECTOR vector;\r
+\r
+ CString cmd;\r
+ cmd.Format(_T("git.exe ls-files -u -t -z -- \"%s\""),merge.GetGitPathString());\r
+\r
+ if(g_Git.Run(cmd,&vector))\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ CTGitPathList list;\r
+ list.ParserFromLsFile(vector);\r
+\r
+ if(list.GetCount() == 0)\r
+ return FALSE;\r
+\r
+ TCHAR szTempName[512]; \r
+ GetTempFileName(_T(""),_T(""),0,szTempName);\r
+ CString temp(szTempName);\r
+ temp=temp.Mid(1,temp.GetLength()-5);\r
+\r
+ CTGitPath theirs;\r
+ CTGitPath mine;\r
+ CTGitPath base;\r
+\r
+ CString format;\r
+ format=g_Git.m_CurrentDir+_T("\\")+directory.GetWinPathString()+merge.GetFilename()+CString(_T(".%s."))+temp+merge.GetFileExtension();\r
+\r
+ CString file;\r
+ file.Format(format,_T("LOCAL"));\r
+ mine.SetFromGit(file);\r
+ file.Format(format,_T("REMOTE"));\r
+ theirs.SetFromGit(file);\r
+ file.Format(format,_T("BASE"));\r
+ base.SetFromGit(file);\r
+\r
+ \r
+ format=_T("git.exe cat-file blob \":%d:%s\"");\r
+ for(int i=0;i<list.GetCount();i++)\r
+ {\r
+ CString cmd;\r
+ CString outfile;\r
+ cmd.Format(format,list[i].m_Stage,list[i].GetGitPathString());\r
+\r
+ if( list[i].m_Stage == 1)\r
+ {\r
+ outfile=base.GetWinPathString();\r
+ }\r
+ if( list[i].m_Stage == 2 )\r
+ {\r
+ outfile=mine.GetWinPathString();\r
+ }\r
+ if( list[i].m_Stage == 3 )\r
+ {\r
+ outfile=theirs.GetWinPathString();\r
+ }\r
+ g_Git.RunLogFile(cmd,outfile);\r
+ }\r
+\r
+ merge.SetFromWin(g_Git.m_CurrentDir+_T("\\")+merge.GetWinPathString());\r
+ bRet = !!CAppUtils::StartExtMerge(base, theirs, mine, merge,_T("BASE"),_T("REMOTE"),_T("LOCAL"));\r
+\r
+#if 0\r
+\r
+ CAppUtils::StartExtMerge(CAppUtils::MergeFlags().AlternativeTool(bAlternativeTool), \r
+ base, theirs, mine, merge);\r
+#endif\r
+#if 0\r
+ if (stat.status->text_status == svn_wc_status_conflicted)\r
+ {\r
+ // we have a text conflict, use our merge tool to resolve the conflict\r
+\r
+ CTSVNPath theirs(directory);\r
+ CTSVNPath mine(directory);\r
+ CTSVNPath base(directory);\r
+ bool bConflictData = false;\r
+\r
+ if ((stat.status->entry)&&(stat.status->entry->conflict_new))\r
+ {\r
+ theirs.AppendPathString(CUnicodeUtils::GetUnicode(stat.status->entry->conflict_new));\r
+ bConflictData = true;\r
+ }\r
+ if ((stat.status->entry)&&(stat.status->entry->conflict_old))\r
+ {\r
+ base.AppendPathString(CUnicodeUtils::GetUnicode(stat.status->entry->conflict_old));\r
+ bConflictData = true;\r
+ }\r
+ if ((stat.status->entry)&&(stat.status->entry->conflict_wrk))\r
+ {\r
+ mine.AppendPathString(CUnicodeUtils::GetUnicode(stat.status->entry->conflict_wrk));\r
+ bConflictData = true;\r
+ }\r
+ else\r
+ {\r
+ mine = merge;\r
+ }\r
+ if (bConflictData)\r
+ bRet = !!CAppUtils::StartExtMerge(CAppUtils::MergeFlags().AlternativeTool(bAlternativeTool), \r
+ base, theirs, mine, merge);\r
+ }\r
+\r
+ if (stat.status->prop_status == svn_wc_status_conflicted)\r
+ {\r
+ // we have a property conflict\r
+ CTSVNPath prej(directory);\r
+ if ((stat.status->entry)&&(stat.status->entry->prejfile))\r
+ {\r
+ prej.AppendPathString(CUnicodeUtils::GetUnicode(stat.status->entry->prejfile));\r
+ // there's a problem: the prej file contains a _description_ of the conflict, and\r
+ // that description string might be translated. That means we have no way of parsing\r
+ // the file to find out the conflicting values.\r
+ // The only thing we can do: show a dialog with the conflict description, then\r
+ // let the user either accept the existing property or open the property edit dialog\r
+ // to manually change the properties and values. And a button to mark the conflict as\r
+ // resolved.\r
+ CEditPropConflictDlg dlg;\r
+ dlg.SetPrejFile(prej);\r
+ dlg.SetConflictedItem(merge);\r
+ bRet = (dlg.DoModal() != IDCANCEL);\r
+ }\r
+ }\r
+\r
+ if (stat.status->tree_conflict)\r
+ {\r
+ // we have a tree conflict\r
+ SVNInfo info;\r
+ const SVNInfoData * pInfoData = info.GetFirstFileInfo(merge, SVNRev(), SVNRev());\r
+ if (pInfoData)\r
+ {\r
+ if (pInfoData->treeconflict_kind == svn_wc_conflict_kind_text)\r
+ {\r
+ CTSVNPath theirs(directory);\r
+ CTSVNPath mine(directory);\r
+ CTSVNPath base(directory);\r
+ bool bConflictData = false;\r
+\r
+ if (pInfoData->treeconflict_theirfile)\r
+ {\r
+ theirs.AppendPathString(pInfoData->treeconflict_theirfile);\r
+ bConflictData = true;\r
+ }\r
+ if (pInfoData->treeconflict_basefile)\r
+ {\r
+ base.AppendPathString(pInfoData->treeconflict_basefile);\r
+ bConflictData = true;\r
+ }\r
+ if (pInfoData->treeconflict_myfile)\r
+ {\r
+ mine.AppendPathString(pInfoData->treeconflict_myfile);\r
+ bConflictData = true;\r
+ }\r
+ else\r
+ {\r
+ mine = merge;\r
+ }\r
+ if (bConflictData)\r
+ bRet = !!CAppUtils::StartExtMerge(CAppUtils::MergeFlags().AlternativeTool(bAlternativeTool),\r
+ base, theirs, mine, merge);\r
+ }\r
+ else if (pInfoData->treeconflict_kind == svn_wc_conflict_kind_tree)\r
+ {\r
+ CString sConflictAction;\r
+ CString sConflictReason;\r
+ CString sResolveTheirs;\r
+ CString sResolveMine;\r
+ CTSVNPath treeConflictPath = CTSVNPath(pInfoData->treeconflict_path);\r
+ CString sItemName = treeConflictPath.GetUIFileOrDirectoryName();\r
+ \r
+ if (pInfoData->treeconflict_nodekind == svn_node_file)\r
+ {\r
+ switch (pInfoData->treeconflict_operation)\r
+ {\r
+ case svn_wc_operation_update:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILEUPDATEEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILEUPDATEADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILEUPDATEDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEFILE);\r
+ break;\r
+ }\r
+ break;\r
+ case svn_wc_operation_switch:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILESWITCHEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILESWITCHADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILESWITCHDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEFILE);\r
+ break;\r
+ }\r
+ break;\r
+ case svn_wc_operation_merge:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILEMERGEEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sResolveTheirs.Format(IDS_TREECONFLICT_FILEMERGEADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYFILE);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_FILEMERGEDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEFILE);\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ else if (pInfoData->treeconflict_nodekind == svn_node_dir)\r
+ {\r
+ switch (pInfoData->treeconflict_operation)\r
+ {\r
+ case svn_wc_operation_update:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRUPDATEEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRUPDATEADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRUPDATEDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEDIR);\r
+ break;\r
+ }\r
+ break;\r
+ case svn_wc_operation_switch:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRSWITCHEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRSWITCHADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRSWITCHDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEDIR);\r
+ break;\r
+ }\r
+ break;\r
+ case svn_wc_operation_merge:\r
+ switch (pInfoData->treeconflict_action)\r
+ {\r
+ case svn_wc_conflict_action_edit:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRMERGEEDIT, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_add:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRMERGEADD, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_KEEPREPOSITORYDIR);\r
+ break;\r
+ case svn_wc_conflict_action_delete:\r
+ sConflictAction.Format(IDS_TREECONFLICT_DIRMERGEDELETE, (LPCTSTR)sItemName);\r
+ sResolveTheirs.LoadString(IDS_TREECONFLICT_RESOLVE_REMOVEDIR);\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ UINT uReasonID = 0;\r
+ switch (pInfoData->treeconflict_reason)\r
+ { \r
+ case svn_wc_conflict_reason_edited:\r
+ uReasonID = IDS_TREECONFLICT_REASON_EDITED;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_KEEPLOCALDIR : IDS_TREECONFLICT_RESOLVE_KEEPLOCALFILE);\r
+ break;\r
+ case svn_wc_conflict_reason_obstructed:\r
+ uReasonID = IDS_TREECONFLICT_REASON_OBSTRUCTED;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_KEEPLOCALDIR : IDS_TREECONFLICT_RESOLVE_KEEPLOCALFILE);\r
+ break;\r
+ case svn_wc_conflict_reason_deleted:\r
+ uReasonID = IDS_TREECONFLICT_REASON_DELETED;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_REMOVEDIR : IDS_TREECONFLICT_RESOLVE_REMOVEFILE);\r
+ break;\r
+ case svn_wc_conflict_reason_added:\r
+ uReasonID = IDS_TREECONFLICT_REASON_ADDED;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_KEEPLOCALDIR : IDS_TREECONFLICT_RESOLVE_KEEPLOCALFILE);\r
+ break;\r
+ case svn_wc_conflict_reason_missing:\r
+ uReasonID = IDS_TREECONFLICT_REASON_MISSING;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_REMOVEDIR : IDS_TREECONFLICT_RESOLVE_REMOVEFILE);\r
+ break;\r
+ case svn_wc_conflict_reason_unversioned:\r
+ uReasonID = IDS_TREECONFLICT_REASON_UNVERSIONED;\r
+ sResolveMine.LoadString(pInfoData->treeconflict_nodekind == svn_node_dir ? IDS_TREECONFLICT_RESOLVE_KEEPLOCALDIR : IDS_TREECONFLICT_RESOLVE_KEEPLOCALFILE);\r
+ break;\r
+ }\r
+ sConflictReason.Format(uReasonID, (LPCTSTR)sConflictAction);\r
+\r
+ CTreeConflictEditorDlg dlg;\r
+ dlg.SetConflictInfoText(sConflictReason);\r
+ dlg.SetResolveTexts(sResolveTheirs, sResolveMine);\r
+ dlg.SetPath(treeConflictPath);\r
+ INT_PTR dlgRet = dlg.DoModal();\r
+ bRet = (dlgRet != IDCANCEL);\r
+ }\r
+ }\r
+ }\r
+#endif\r
+ return bRet;\r
+}\r
+\r
+/**\r
+ * FUNCTION : FormatDateAndTime\r
+ * DESCRIPTION : Generates a displayable string from a CTime object in\r
+ * system short or long format dependant on setting of option\r
+ * as DATE_SHORTDATE or DATE_LONGDATE\r
+ * If HKCU\Software\TortoiseGit\UseSystemLocaleForDates is 0 then use fixed format\r
+ * rather than locale\r
+ * RETURN : CString containing date/time\r
+ */\r
+CString CAppUtils::FormatDateAndTime( const CTime& cTime, DWORD option, bool bIncludeTime /*=true*/ )\r
+{\r
+ CString datetime;\r
+ // should we use the locale settings for formatting the date/time?\r
+ if (CRegDWORD(_T("Software\\TortoiseGit\\UseSystemLocaleForDates"), TRUE))\r
+ {\r
+ // yes\r
+ SYSTEMTIME sysTime;\r
+ cTime.GetAsSystemTime( sysTime );\r
+ \r
+ TCHAR buf[100];\r
+ \r
+ GetDateFormat(LOCALE_USER_DEFAULT, option, &sysTime, NULL, buf, \r
+ sizeof(buf)/sizeof(TCHAR)-1);\r
+ datetime = buf;\r
+ if ( bIncludeTime )\r
+ {\r
+ datetime += _T(" ");\r
+ GetTimeFormat(LOCALE_USER_DEFAULT, 0, &sysTime, NULL, buf, sizeof(buf)/sizeof(TCHAR)-1);\r
+ datetime += buf;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // no, so fixed format\r
+ if ( bIncludeTime )\r
+ {\r
+ datetime = cTime.Format(_T("%Y-%m-%d %H:%M:%S"));\r
+ }\r
+ else\r
+ {\r
+ datetime = cTime.Format(_T("%Y-%m-%d"));\r
+ }\r
+ }\r
+ return datetime;\r
+}\r