if(status&(CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_MODIFIED))\r
m_nModified++;\r
\r
- if(status&CTGitPath::LOGACTIONS_CONFLICT)\r
+ if(status&CTGitPath::LOGACTIONS_UNMERGED)\r
m_nConflicted++;\r
\r
if(status&(CTGitPath::LOGACTIONS_IGNORE|CTGitPath::LOGACTIONS_UNVER))\r
if (popup.CreatePopupMenu())\r
{\r
//Add Menu for verion controled file\r
+ \r
+ if (wcStatus & CTGitPath::LOGACTIONS_UNMERGED)\r
+ {\r
+ if ((m_dwContextMenus & SVNSLC_POPCONFLICT)/*&&(entry->textstatus == git_wc_status_conflicted)*/)\r
+ {\r
+ popup.AppendMenuIcon(IDSVNLC_EDITCONFLICT, IDS_MENUCONFLICT, IDI_CONFLICT);\r
+ }\r
+ if (m_dwContextMenus & SVNSLC_POPRESOLVE)\r
+ {\r
+ popup.AppendMenuIcon(IDSVNLC_RESOLVECONFLICT, IDS_STATUSLIST_CONTEXT_RESOLVED, IDI_RESOLVE);\r
+ }\r
+ if ((m_dwContextMenus & SVNSLC_POPRESOLVE)/*&&(entry->textstatus == git_wc_status_conflicted)*/)\r
+ {\r
+ popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
+ popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
+ }\r
+ if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE))\r
+ popup.AppendMenu(MF_SEPARATOR);\r
+ }\r
+\r
if (!(wcStatus &CTGitPath::LOGACTIONS_UNVER))\r
{\r
if (m_dwContextMenus & SVNSLC_POPCOMPAREWITHBASE)\r
//}\r
}\r
\r
+ \r
///Select Multi item\r
//if (GetSelectedCount() > 0)\r
//{\r
// }\r
// }\r
//}\r
- if ((GetSelectedCount() == 1)&&(!wcStatus & CTGitPath::LOGACTIONS_UNVER)\r
- &&(!wcStatus & CTGitPath::LOGACTIONS_IGNORE))\r
+ if ((GetSelectedCount() == 1)&&(!(wcStatus & CTGitPath::LOGACTIONS_UNVER))\r
+ &&(!(wcStatus & CTGitPath::LOGACTIONS_IGNORE)))\r
{\r
if (m_dwContextMenus & SVNSLC_POPSHOWLOG)\r
{\r
popup.AppendMenuIcon(IDSVNLC_LOG, IDS_REPOBROWSE_SHOWLOG, IDI_LOG);\r
}\r
-// if (m_dwContextMenus & SVNSLC_POPBLAME)\r
-// {\r
-// popup.AppendMenuIcon(IDSVNLC_BLAME, IDS_MENUBLAME, IDI_BLAME);\r
-// }\r
+ if (m_dwContextMenus & SVNSLC_POPBLAME)\r
+ {\r
+ popup.AppendMenuIcon(IDSVNLC_BLAME, IDS_MENUBLAME, IDI_BLAME);\r
+ }\r
}\r
// if ((wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing) && (GetSelectedCount() == 1))\r
// {\r
}\r
}\r
}\r
-#if 0\r
- if (((wcStatus == git_wc_status_conflicted)||(entry->isConflicted)))\r
- {\r
- if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE))\r
- popup.AppendMenu(MF_SEPARATOR);\r
\r
- if ((m_dwContextMenus & SVNSLC_POPCONFLICT)&&(entry->textstatus == git_wc_status_conflicted))\r
- {\r
- popup.AppendMenuIcon(IDSVNLC_EDITCONFLICT, IDS_MENUCONFLICT, IDI_CONFLICT);\r
- }\r
- if (m_dwContextMenus & SVNSLC_POPRESOLVE)\r
- {\r
- popup.AppendMenuIcon(IDSVNLC_RESOLVECONFLICT, IDS_STATUSLIST_CONTEXT_RESOLVED, IDI_RESOLVE);\r
- }\r
- if ((m_dwContextMenus & SVNSLC_POPRESOLVE)&&(entry->textstatus == git_wc_status_conflicted))\r
- {\r
- popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
- popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
- }\r
- }\r
-#endif\r
+\r
#if 0 \r
if (GetSelectedCount() > 0)\r
{\r
\r
}\r
break;\r
+\r
+ case IDSVNLC_BLAME:\r
+ {\r
+ CString sCmd;\r
+ sCmd.Format(_T("\"%s\" /command:blame /path:\"%s\""),\r
+ (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), g_Git.m_CurrentDir+filepath->GetWinPath());\r
+\r
+ CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+ }\r
+ break;\r
+\r
+ case IDSVNLC_LOG:\r
+ {\r
+ CString sCmd;\r
+ sCmd.Format(_T("\"%s\" /command:log /path:\"%s\""),\r
+ (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), g_Git.m_CurrentDir+filepath->GetWinPath());\r
+\r
+ CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+ }\r
+ break;\r
+\r
+ case IDSVNLC_EDITCONFLICT:\r
+ CString sCmd;\r
+ sCmd.Format(_T("\"%s\" /command:conflicteditor /path:\"%s\""),\r
+ (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), g_Git.m_CurrentDir+filepath->GetWinPath());\r
+ \r
+ CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+ break;\r
#if 0\r
case IDSVNLC_COPY:\r
CopySelectedEntriesToClipboard(0);\r
}\r
}\r
break;\r
- case IDSVNLC_LOG:\r
- {\r
- CString sCmd;\r
- sCmd.Format(_T("\"%s\" /command:log /path:\"%s\""),\r
- (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
- if (!filepath.IsUrl())\r
- {\r
- sCmd += _T(" /propspath:\"");\r
- sCmd += filepath.GetWinPathString();\r
- sCmd += _T("\"");\r
- } \r
-\r
- CAppUtils::LaunchApplication(sCmd, NULL, false);\r
- }\r
- break;\r
- case IDSVNLC_BLAME:\r
- {\r
- CString sCmd;\r
- sCmd.Format(_T("\"%s\" /command:blame /path:\"%s\""),\r
- (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
- if (!filepath.IsUrl())\r
- {\r
- sCmd += _T(" /propspath:\"");\r
- sCmd += filepath.GetWinPathString();\r
- sCmd += _T("\"");\r
- } \r
-\r
- CAppUtils::LaunchApplication(sCmd, NULL, false);\r
- }\r
- break;\r
case IDSVNLC_OPEN:\r
{\r
int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath.GetWinPath(), NULL, NULL, SW_SHOW);\r
// brown : missing, deleted, replaced\r
// green : merged (or potential merges)\r
// red : conflicts or sure conflicts\r
- if(entry->m_Action & CTGitPath::LOGACTIONS_CONFLICT)\r
+ if(entry->m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
{\r
crText = m_Colors.GetColor(CColors::Conflict);\r
\r
#define SVNSLC_SHOWMODIFIED CTGitPath::LOGACTIONS_MODIFIED\r
#define SVNSLC_SHOWADDED CTGitPath::LOGACTIONS_ADDED\r
#define SVNSLC_SHOWREMOVED CTGitPath::LOGACTIONS_DELETED\r
-#define SVNSLC_SHOWCONFLICTED CTGitPath::LOGACTIONS_CONFLICT\r
+#define SVNSLC_SHOWCONFLICTED CTGitPath::LOGACTIONS_UNMERGED\r
#define SVNSLC_SHOWMISSING 0x00000000\r
#define SVNSLC_SHOWREPLACED CTGitPath::LOGACTIONS_REPLACED\r
#define SVNSLC_SHOWMERGED 0x00000000\r
{\r
SetFromUnknown(sUnknownPath);\r
m_Action=0;\r
+ m_Stage=0;\r
}\r
\r
int CTGitPath::ParserAction(BYTE action)\r
m_Action|= LOGACTIONS_DELETED;\r
if(action == 'U')\r
m_Action|= LOGACTIONS_UNMERGED;\r
-\r
+ if(action == 'K')\r
+ m_Action|= LOGACTIONS_DELETED;\r
+ if(action == 'H')\r
+ m_Action|= LOGACTIONS_CACHE;\r
return m_Action;\r
}\r
void CTGitPath::SetFromGit(const char* pPath)\r
{\r
AddPath(firstEntry);\r
}\r
+int CTGitPathList::ParserFromLsFile(BYTE_VECTOR &out,bool staged)\r
+{\r
+ int pos=0;\r
+ CString one;\r
+ CTGitPath path;\r
+ CString part;\r
+ while(pos>=0 && pos<out.size())\r
+ {\r
+ one.Empty();\r
+ path.Reset();\r
+\r
+ g_Git.StringAppend(&one,&out[pos],CP_OEMCP);\r
+ int tabstart=0;\r
+ path.m_Action=path.ParserAction(out[pos]);\r
+ one.Tokenize(_T("\t"),tabstart); \r
+\r
+ if(tabstart>=0)\r
+ path.SetFromGit(one.Right(one.GetLength()-tabstart));\r
+\r
+ tabstart=0;\r
+\r
+ part=one.Tokenize(_T(" "),tabstart); //Tag\r
+\r
+ part=one.Tokenize(_T(" "),tabstart); //Mode\r
+ \r
+ part=one.Tokenize(_T(" "),tabstart); //Hash\r
+\r
+ part=one.Tokenize(_T("\t"),tabstart); //Stage\r
+\r
+ path.m_Stage=_ttol(part);\r
+\r
+ this->AddPath(path);\r
+\r
+ pos=out.findNextString(pos);\r
+ }\r
+ return pos;\r
+}\r
int CTGitPathList::FillUnRev(int action,CTGitPathList *list)\r
{\r
int pos=0;\r
\r
if(list==NULL)\r
{\r
- cmd=_T("git.exe ls-files --exclude-standard --full-name --others");\r
+ cmd=_T("git.exe ls-files --exclude-standard --full-name --others -z");\r
cmd+=ignored;\r
\r
}\r
else\r
- { cmd.Format(_T("git.exe ls-files --exclude-standard --full-name --others %s-- \"%s\""),\r
+ { cmd.Format(_T("git.exe ls-files --exclude-standard --full-name --others -z %s-- \"%s\""),\r
ignored,\r
(*list)[i].GetWinPathString());\r
}\r
-#ifdef VECTOR_F \r
- CString out;\r
- g_Git.Run(cmd,&out);\r
\r
+ BYTE_VECTOR out;\r
+ out.clear();\r
+ g_Git.Run(cmd,&out);\r
+ \r
+ pos=0;\r
CString one;\r
- while( pos>=0 )\r
+ while( pos>=0 && pos<out.size())\r
{\r
- one=out.Tokenize(_T("\n"),pos);\r
+ g_Git.StringAppend(&one,&out[pos],CP_OEMCP);\r
if(!one.IsEmpty())\r
{\r
//SetFromGit will clear all status\r
path.m_Action=action;\r
AddPath(path);\r
}\r
+ pos=out.findNextString(pos);\r
}\r
-#endif\r
+\r
}\r
return 0;\r
}\r
return _T("Added");\r
if(m_Action & CTGitPath::LOGACTIONS_DELETED)\r
return _T("Deleted");\r
+ if(m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
+ return _T("Conflict");\r
if(m_Action & CTGitPath::LOGACTIONS_MODIFIED)\r
return _T("Modified");\r
if(m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
public:\r
CTGitPath(void);\r
~CTGitPath(void);\r
- CTGitPath(const CString& sUnknownPath);\r
+ CTGitPath(const CString& sUnknownPath);\r
+ int m_Stage;\r
public:\r
enum\r
{ \r
LOGACTIONS_REPLACED = 0x00000004,\r
LOGACTIONS_DELETED = 0x00000008,\r
LOGACTIONS_UNMERGED = 0x00000010,\r
+ LOGACTIONS_CACHE = 0x00000020,\r
LOGACTIONS_UNVER = 0x80000000,\r
LOGACTIONS_IGNORE = 0x40000000,\r
- LOGACTIONS_CONFLICT = 0x20000000,\r
+ //LOGACTIONS_CONFLICT = 0x20000000,\r
};\r
\r
CString m_StatAdd;\r
// A constructor which allows a path list to be easily built with one initial entry in\r
explicit CTGitPathList(const CTGitPath& firstEntry);\r
int m_Action;\r
+\r
public:\r
void AddPath(const CTGitPath& newPath);\r
bool LoadFromFile(const CTGitPath& filename);\r
bool WriteToFile(const CString& sFilename, bool bANSI = false) const;\r
CTGitPath * LookForGitPath(CString path);\r
int ParserFromLog(BYTE_VECTOR &log);\r
+ int ParserFromLsFile(BYTE_VECTOR &out,bool staged=true);\r
int FillUnRev(int Action,CTGitPathList *list=NULL);\r
int GetAction();\r
/**\r
#include "ImportPatchCommand.h"\r
#include "BlameCommand.h"\r
#include "SettingsCommand.h"\r
+#include "ConflictEditorCommand.h"\r
#if 0\r
\r
\r
#include "CheckoutCommand.h"\r
#include "CleanupCommand.h"\r
\r
-#include "ConflictEditorCommand.h"\r
+\r
#include "CopyCommand.h"\r
#include "CrashCommand.h"\r
#include "CreatePatchCommand.h"\r
return new BlameCommand;\r
case cmdSettings:\r
return new SettingsCommand;\r
+ case cmdConflictEditor:\r
+ return new ConflictEditorCommand;\r
#if 0\r
\r
case cmdCat:\r
case cmdCleanup:\r
return new CleanupCommand;\r
\r
- case cmdConflictEditor:\r
- return new ConflictEditorCommand;\r
+ \r
case cmdCopy:\r
return new CopyCommand;\r
case cmdCrash:\r
--- /dev/null
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2008-2009 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+#include "stdafx.h"\r
+#include "ConflictEditorCommand.h"\r
+#include "GitStatus.h"\r
+#include "GitDiff.h"\r
+//#include "SVNInfo.h"\r
+#include "UnicodeUtils.h"\r
+#include "PathUtils.h"\r
+#include "AppUtils.h"\r
+//#include "EditPropConflictDlg.h"\r
+//#include "TreeConflictEditorDlg.h"\r
+\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
+}\r
/**\r
* Executes the command.\r
*/\r
- virtual bool Execute()\r
- {\r
-// return SVNDiff::StartConflictEditor(cmdLinePath);\r
- }\r
+ virtual bool Execute();\r
};\r
\r
\r
\r
return 0;\r
}\r
+\r
+int CGitDiff::StartConflictEditor(CTGitPath* file)\r
+{\r
+ return 0;\r
+}
\ No newline at end of file
// Use two path to handle rename cases\r
static int Diff(CTGitPath * pPath1, CTGitPath *pPath2 ,git_revnum_t & rev1, git_revnum_t & rev2, bool blame=false, bool unified=false);\r
static int DiffNull(CTGitPath *pPath, git_revnum_t &rev1);\r
+ static int StartConflictEditor(CTGitPath* filepath);\r
};\r
g_Git.GetMapHashToFriendName(m_HashMap);\r
Invalidate();\r
break;\r
+ case ID_RESET:\r
\r
+ break;\r
default:\r
//CMessageBox::Show(NULL,_T("Have not implemented"),_T("TortoiseGit"),MB_OK);\r
break;\r
//if (m_hasWC)\r
// popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREV, IDI_MERGE);\r
\r
+ CString str;\r
+ str.Format(_T("Reset %s to this"),g_Git.GetCurrentBranch());\r
+ popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
popup.AppendMenuIcon(ID_SWITCHTOREV, _T("Switch/Checkout to this") , IDI_SWITCH);\r
popup.AppendMenuIcon(ID_CREATE_BRANCH, _T("Create Branch at this version") , IDI_COPY);\r
popup.AppendMenuIcon(ID_CREATE_TAG, _T("Create Tag at this version"), IDI_COPY);\r
ID_CHERRY_PICK,\r
ID_CREATE_BRANCH,\r
ID_CREATE_TAG,\r
- ID_SWITCHTOREV\r
+ ID_SWITCHTOREV,\r
+ ID_RESET\r
};\r
void InsertGitColumn();\r
void ResizeAllListCtrlCols();\r
/>\r
</Configuration>\r
<Configuration\r
- Name="Debug|x64"\r
- OutputDirectory="..\..\bin\Debug64\bin"\r
- IntermediateDirectory="..\..\obj\TortoiseProc\Debug64"\r
+ Name="Release|Win32"\r
+ OutputDirectory="..\..\bin\$(ConfigurationName)\bin"\r
+ IntermediateDirectory="..\..\obj\TortoiseProc\$(ConfigurationName)"\r
ConfigurationType="1"\r
UseOfMFC="2"\r
- UseOfATL="0"\r
CharacterSet="1"\r
+ WholeProgramOptimization="1"\r
>\r
<Tool\r
Name="VCPreBuildEventTool"\r
/>\r
<Tool\r
Name="VCMIDLTool"\r
- PreprocessorDefinitions="_DEBUG"\r
+ PreprocessorDefinitions="NDEBUG"\r
MkTypLibCompatible="false"\r
- TargetEnvironment="3"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- Optimization="0"\r
+ Optimization="1"\r
+ InlineFunctionExpansion="1"\r
+ FavorSizeOrSpeed="2"\r
AdditionalIncludeDirectories="..\TortoiseProc;..\Resources;"$InputDir";../../ext/ResizableLib;../Git;"../../ext/apr-util/include";"../../ext/apr-util/xml/expat/lib";../../ext/Subversion/subversion/include;../../ext/Subversion/subversion/libsvn_client;../../ext/apr/include;../../ext/boost;..\Utils;..\SVN;..\..\ext\ResizableLib;..\crashrpt;"..\..\ext\libintl\libintl3-win32\inc";..\..\ext\hunspell;..\..\ext\scintilla\include;..\Utils\TreePropSheet;..\Utils\ColourPickerXP;..\Utils\NewMenu;..\Utils\MiscUI;..\LogCache;"../../ext/cyrus-sasl/include";../../../common/openssl/inc32;.\RevisionGraph;..\TortoiseShell"\r
- PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG;SVN_DEBUG;ENABLE_NLS;THESAURUS"\r
- MinimalRebuild="true"\r
+ PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;THESAURUS"\r
+ StringPooling="true"\r
+ MinimalRebuild="false"\r
ExceptionHandling="2"\r
- RuntimeLibrary="3"\r
+ RuntimeLibrary="2"\r
+ BufferSecurityCheck="false"\r
TreatWChar_tAsBuiltInType="true"\r
ForceConformanceInForLoopScope="true"\r
RuntimeTypeInfo="true"\r
/>\r
<Tool\r
Name="VCResourceCompilerTool"\r
- PreprocessorDefinitions="_DEBUG"\r
+ PreprocessorDefinitions="NDEBUG"\r
Culture="1033"\r
AdditionalIncludeDirectories=""$(IntDir)";..\TortoiseShell"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib"\r
- LinkIncremental="2"\r
+ LinkIncremental="1"\r
IgnoreDefaultLibraryNames="libcd.lib;libc;shell32;LIBCMT"\r
DelayLoadDLLs="gdiplus.dll"\r
GenerateDebugInformation="true"\r
SubSystem="2"\r
+ OptimizeReferences="2"\r
+ EnableCOMDATFolding="2"\r
+ OptimizeForWindows98="0"\r
RandomizedBaseAddress="1"\r
DataExecutionPrevention="0"\r
- TargetMachine="17"\r
+ TargetMachine="1"\r
+ Profile="true"\r
/>\r
<Tool\r
Name="VCALinkTool"\r
/>\r
</Configuration>\r
<Configuration\r
- Name="Release|Win32"\r
- OutputDirectory="..\..\bin\$(ConfigurationName)\bin"\r
- IntermediateDirectory="..\..\obj\TortoiseProc\$(ConfigurationName)"\r
+ Name="Debug|x64"\r
+ OutputDirectory="..\..\bin\Debug64\bin"\r
+ IntermediateDirectory="..\..\obj\TortoiseProc\Debug64"\r
ConfigurationType="1"\r
UseOfMFC="2"\r
+ UseOfATL="0"\r
CharacterSet="1"\r
- WholeProgramOptimization="1"\r
>\r
<Tool\r
Name="VCPreBuildEventTool"\r
/>\r
<Tool\r
Name="VCMIDLTool"\r
- PreprocessorDefinitions="NDEBUG"\r
+ PreprocessorDefinitions="_DEBUG"\r
MkTypLibCompatible="false"\r
+ TargetEnvironment="3"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- Optimization="1"\r
- InlineFunctionExpansion="1"\r
- FavorSizeOrSpeed="2"\r
+ Optimization="0"\r
AdditionalIncludeDirectories="..\TortoiseProc;..\Resources;"$InputDir";../../ext/ResizableLib;../Git;"../../ext/apr-util/include";"../../ext/apr-util/xml/expat/lib";../../ext/Subversion/subversion/include;../../ext/Subversion/subversion/libsvn_client;../../ext/apr/include;../../ext/boost;..\Utils;..\SVN;..\..\ext\ResizableLib;..\crashrpt;"..\..\ext\libintl\libintl3-win32\inc";..\..\ext\hunspell;..\..\ext\scintilla\include;..\Utils\TreePropSheet;..\Utils\ColourPickerXP;..\Utils\NewMenu;..\Utils\MiscUI;..\LogCache;"../../ext/cyrus-sasl/include";../../../common/openssl/inc32;.\RevisionGraph;..\TortoiseShell"\r
- PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;THESAURUS"\r
- StringPooling="true"\r
- MinimalRebuild="false"\r
+ PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG;SVN_DEBUG;ENABLE_NLS;THESAURUS"\r
+ MinimalRebuild="true"\r
ExceptionHandling="2"\r
- RuntimeLibrary="2"\r
- BufferSecurityCheck="false"\r
+ RuntimeLibrary="3"\r
TreatWChar_tAsBuiltInType="true"\r
ForceConformanceInForLoopScope="true"\r
RuntimeTypeInfo="true"\r
/>\r
<Tool\r
Name="VCResourceCompilerTool"\r
- PreprocessorDefinitions="NDEBUG"\r
+ PreprocessorDefinitions="_DEBUG"\r
Culture="1033"\r
AdditionalIncludeDirectories=""$(IntDir)";..\TortoiseShell"\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib"\r
- LinkIncremental="1"\r
+ LinkIncremental="2"\r
IgnoreDefaultLibraryNames="libcd.lib;libc;shell32;LIBCMT"\r
DelayLoadDLLs="gdiplus.dll"\r
GenerateDebugInformation="true"\r
SubSystem="2"\r
- OptimizeReferences="2"\r
- EnableCOMDATFolding="2"\r
- OptimizeForWindows98="0"\r
RandomizedBaseAddress="1"\r
DataExecutionPrevention="0"\r
- TargetMachine="1"\r
- Profile="true"\r
+ TargetMachine="17"\r
/>\r
<Tool\r
Name="VCALinkTool"\r
>\r
</File>\r
<File\r
- RelativePath=".\explorer.ico"\r
+ RelativePath="..\Resources\explorer.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\explorer.ico"\r
+ RelativePath=".\explorer.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\newfolder.ico"\r
+ RelativePath="..\Resources\newfolder.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\newfolder.ico"\r
+ RelativePath=".\newfolder.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\open.ico"\r
+ RelativePath="..\Resources\open.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\open.ico"\r
+ RelativePath=".\open.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\save.ico"\r
+ RelativePath="..\Resources\save.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\save.ico"\r
+ RelativePath=".\save.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\saveas.ico"\r
+ RelativePath="..\Resources\saveas.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\saveas.ico"\r
+ RelativePath=".\saveas.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\up.ico"\r
+ RelativePath="..\Resources\up.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\up.ico"\r
+ RelativePath=".\up.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
</Filter>\r
+ <Filter\r
+ Name="Conflict"\r
+ >\r
+ <File\r
+ RelativePath=".\Commands\ConflictEditorCommand.cpp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\Commands\ConflictEditorCommand.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
</Filter>\r
<Filter\r
Name="Utility Dialogs"\r
/>\r
</FileConfiguration>\r
<FileConfiguration\r
- Name="Debug|x64"\r
+ Name="Release|Win32"\r
>\r
<Tool\r
Name="VCCLCompilerTool"\r
/>\r
</FileConfiguration>\r
<FileConfiguration\r
- Name="Release|Win32"\r
+ Name="Debug|x64"\r
>\r
<Tool\r
Name="VCCLCompilerTool"\r