\r
bool ConflictEditorCommand::Execute()\r
{\r
- bool bRet = false;\r
-\r
- CTGitPath merge = cmdLinePath;\r
- CTGitPath directory = merge.GetDirectory();\r
- \r
bool bAlternativeTool = !!parser.HasKey(_T("alternative"));\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
+ return CAppUtils::ConflictEdit(this->cmdLinePath,bAlternativeTool);\r
}\r