mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
\r
+\r
#if 0\r
\r
int refetchcounter = 0;\r
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
CString cmd;\r
cmd.Format(_T("git.exe add %s"),path->GetGitPathString());\r
CString output;\r
- if(!g_Git.Run(cmd,&output))\r
+ if(!g_Git.Run(cmd,&output,CP_OEMCP))\r
{\r
path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
SetEntryCheck(path,index,true);\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+_T("\\")+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+_T("\\")+filepath->GetWinPath());\r
+\r
+ CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+ }\r
+ break;\r
+\r
+ case IDSVNLC_EDITCONFLICT:\r
+ {\r
+ CAppUtils::ConflictEdit(*filepath);\r
+ break;\r
+ }\r
+ case IDSVNLC_RESOLVECONFLICT:\r
+ {\r
+ if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
+ {\r
+ POSITION pos = GetFirstSelectedItemPosition();\r
+ while (pos != 0)\r
+ {\r
+ int index;\r
+ index = GetNextSelectedItem(pos);\r
+ CTGitPath * fentry =(CTGitPath*) this->GetItemData(index);\r
+ if(fentry == NULL)\r
+ continue;\r
+\r
+ if ( fentry->m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
+ {\r
+ CString cmd,output;\r
+ cmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString());\r
+ if(g_Git.Run(cmd,&output,CP_OEMCP))\r
+ {\r
+ CMessageBox::Show(m_hWnd, output, _T("TortoiseSVN"), MB_ICONERROR);\r
+ }else\r
+ {\r
+ fentry->m_Action |= CTGitPath::LOGACTIONS_MODIFIED;\r
+ fentry->m_Action &=~CTGitPath::LOGACTIONS_UNMERGED;\r
+ }\r
+ }\r
+ \r
+ }\r
+ Show(m_dwShow, 0, m_bShowFolders);\r
+ }\r
+ }\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
case IDSVNLC_EDITCONFLICT:\r
SVNDiff::StartConflictEditor(filepath);\r
break;\r
- case IDSVNLC_RESOLVECONFLICT:\r
- case IDSVNLC_RESOLVEMINE:\r
- case IDSVNLC_RESOLVETHEIRS:\r
- {\r
- git_wc_conflict_choice_t result = git_wc_conflict_choose_merged;\r
- switch (cmd)\r
- {\r
- case IDSVNLC_RESOLVETHEIRS:\r
- result = git_wc_conflict_choose_theirs_full;\r
- break;\r
- case IDSVNLC_RESOLVEMINE:\r
- result = git_wc_conflict_choose_mine_full;\r
- break;\r
- case IDSVNLC_RESOLVECONFLICT:\r
- result = git_wc_conflict_choose_merged;\r
- break;\r
- }\r
- if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
- {\r
- SVN git;\r
- POSITION pos = GetFirstSelectedItemPosition();\r
- while (pos != 0)\r
- {\r
- int index;\r
- index = GetNextSelectedItem(pos);\r
- FileEntry * fentry = m_arStatusArray[m_arListArray[index]];\r
- if (!git.Resolve(fentry->GetPath(), result, FALSE))\r
- {\r
- CMessageBox::Show(m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
- }\r
- else\r
- {\r
- fentry->status = git_wc_status_modified;\r
- fentry->textstatus = git_wc_status_modified;\r
- fentry->isConflicted = false;\r
- }\r
- }\r
- Show(m_dwShow, 0, m_bShowFolders);\r
- }\r
- }\r
- break;\r
+ \r
case IDSVNLC_ADD:\r
{\r
SVN git;\r
{\r
if(fileindex<0)\r
return;\r
+\r
+ CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+ CTGitPath file2;\r
+ if(file1.m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+ {\r
+ file2.SetFromGit(file1.GetGitOldPathString());\r
+ }else\r
+ {\r
+ file2=file1;\r
+ }\r
+\r
if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
{\r
if(!g_Git.IsInitRepos())\r
- CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+ CGitDiff::Diff(&file1,&file2,\r
CString(GIT_REV_ZERO),\r
GitRev::GetHead());\r
else\r
CString(GIT_REV_ZERO));\r
}else\r
{\r
- CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+ CGitDiff::Diff(&file1,&file2,\r
m_CurrentVersion,\r
m_CurrentVersion+_T("~1"));\r
}\r
\r
}\r
\r
-CTGitPath CGitStatusListCtrl::GetCommonDirectory(bool bStrict)\r
+CString CGitStatusListCtrl::GetCommonDirectory(bool bStrict)\r
{\r
if (!bStrict)\r
{\r
// not strict means that the selected folder has priority\r
if (!m_StatusFileList.GetCommonDirectory().IsEmpty())\r
- return m_StatusFileList.GetCommonDirectory();\r
+ return m_StatusFileList.GetCommonDirectory().GetWinPath();\r
}\r
\r
CTGitPath commonBaseDirectory;\r
int nListItems = GetItemCount();\r
for (int i=0; i<nListItems; ++i)\r
{\r
- CTGitPath& baseDirectory = *(CTGitPath*)this->GetItemData(i);\r
+ CTGitPath baseDirectory,*p= (CTGitPath*)this->GetItemData(i);\r
+ ASSERT(p);\r
+ if(p==NULL)\r
+ continue;\r
+ baseDirectory = p->GetDirectory();\r
+\r
if(commonBaseDirectory.IsEmpty())\r
{\r
commonBaseDirectory = baseDirectory;\r
}\r
}\r
}\r
- return commonBaseDirectory;\r
+ return g_Git.m_CurrentDir+CString(_T("\\"))+commonBaseDirectory.GetWinPath();\r
}\r
\r
CTGitPath CGitStatusListCtrl::GetCommonURL(bool bStrict)\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
\r
int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list)\r
{\r
- CString out;\r
+ BYTE_VECTOR out;\r
this->m_bBusy=TRUE;\r
m_CurrentVersion=hash;\r
\r
\r
for(int i=0;i<count;i++)\r
{ \r
- CString cmdout;\r
+ BYTE_VECTOR cmdout;\r
+ cmdout.clear();\r
CString cmd;\r
if(list == NULL)\r
- cmd=(_T("git.exe diff-index --raw HEAD --numstat -C -M"));\r
+ cmd=(_T("git.exe diff-index --raw HEAD --numstat -C -M -z"));\r
else\r
- cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
+ cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -z -- \"%s\""),(*list)[i].GetGitPathString());\r
\r
if(g_Git.Run(cmd,&cmdout))\r
{\r
- cmdout.Empty();\r
- if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&cmdout))\r
+ cmdout.clear();\r
+ CString strout;\r
+ if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&strout,CP_UTF8))\r
{\r
- CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\r
+ CMessageBox::Show(NULL,strout,_T("TortoiseGit"),MB_OK);\r
return -1;\r
}\r
- if(cmdout.IsEmpty())\r
+ if(strout.IsEmpty())\r
break; //this is initial repositoyr, there are no any history\r
\r
- CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\r
+ CMessageBox::Show(NULL,strout,_T("TortoiseGit"),MB_OK);\r
return -1;\r
\r
}\r
+ \r
+ if(list == NULL)\r
+ cmd=(_T("git.exe diff-index --cached --raw HEAD --numstat -C -M -z"));\r
+ else\r
+ cmd.Format(_T("git.exe diff-index --cached --raw HEAD --numstat -C -M -z -- \"%s\""),(*list)[i].GetGitPathString());\r
\r
- out+=cmdout;\r
+ g_Git.Run(cmd,&cmdout);\r
+ //out+=cmdout;\r
+ out.append(cmdout,0);\r
}\r
\r
\r
\r
for(int i=0;i<count;i++)\r
{ \r
- CString cmdout;\r
+ BYTE_VECTOR cmdout;\r
CString cmd;\r
if(list == NULL)\r
- cmd.Format(_T("git.exe diff-tree --raw --numstat -C -M %s"),hash);\r
+ cmd.Format(_T("git.exe diff-tree --raw --numstat -C -M -z %s"),hash);\r
else\r
- cmd.Format(_T("git.exe diff-tree --raw --numstat -C -M %s -- \"%s\""),hash,(*list)[i].GetGitPathString());\r
+ cmd.Format(_T("git.exe diff-tree --raw --numstat -C -M %s -z -- \"%s\""),hash,(*list)[i].GetGitPathString());\r
\r
g_Git.Run(cmd,&cmdout);\r
\r
- out+=cmdout;\r
+ out.append(cmdout);\r
}\r
this->m_StatusFileList.ParserFromLog(out);\r
\r