OSDN Git Service

Commit dialog support check conflict and mark resolve function.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / AppUtils.cpp
index abc81d4..f6ebd3f 100644 (file)
@@ -1250,4 +1250,346 @@ bool CAppUtils::GitReset(CString *CommitHash,int type)
 \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
 }
\ No newline at end of file