\r
void CGitStatusListCtrl::Show(DWORD dwShow, const CTGitPathList& checkedList, bool bShowFolders /* = true */)\r
{\r
+ DeleteAllItems();\r
+ for(int i=0;i<checkedList.GetCount();i++)\r
+ this->AddEntry((CTGitPath *)&checkedList[i],0,i);\r
return ;\r
#if 0\r
\r
int nCol = 1;\r
CString entryname = GitPath->GetGitPathString();\r
int icon_idx = 0;\r
-// if (entry->isfolder)\r
-// icon_idx = m_nIconFolder;\r
-// else\r
+ if (GitPath->IsDirectory())\r
+ icon_idx = m_nIconFolder;\r
+ else\r
{\r
icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(*GitPath);\r
}\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
+ 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
// if ((m_dwContextMenus & SVNSLC_POPGNUDIFF)&&(wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing))\r
// {\r
- if(!g_Git.IsInitRepos())\r
+ if(!g_Git.IsInitRepos() && (m_dwContextMenus&SVNSLC_POPGNUDIFF))\r
+ {\r
popup.AppendMenuIcon(IDSVNLC_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
\r
- bEntryAdded = true;\r
+ bEntryAdded = true;\r
+ }\r
// }\r
// }\r
//\r
//}\r
}\r
\r
+ if( (!this->m_Rev1.IsEmpty()) || (!this->m_Rev1.IsEmpty()) )\r
+ {\r
+ if(GetSelectedCount() == 1)\r
+ {\r
+ if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_COMPARETWO))\r
+ { \r
+ popup.AppendMenuIcon(IDSVNLC_COMPARETWO, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF);\r
+ popup.SetDefaultItem(IDSVNLC_COMPARETWO, FALSE);\r
+ }\r
+ if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_GNUDIFF2))\r
+ { \r
+ popup.AppendMenuIcon(IDSVNLC_GNUDIFF2, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
+ }\r
+ }\r
+ }\r
\r
///Select Multi item\r
//if (GetSelectedCount() > 0)\r
popup.AppendMenuIcon(IDSVNLC_ADD, IDS_STATUSLIST_CONTEXT_ADD, IDI_ADD);\r
}\r
}\r
+\r
+ if (m_dwContextMenus & SVNSLC_POPDELETE)\r
+ {\r
+ popup.AppendMenuIcon(IDSVNLC_DELETE, IDS_MENUREMOVE, IDI_DELETE);\r
+ }\r
//}\r
//if ( (wcStatus == git_wc_status_unversioned) || (wcStatus == git_wc_status_deleted) )\r
//{\r
}\r
}\r
break;\r
+ case IDSVNLC_COMPARETWO:\r
+ {\r
+ POSITION pos = GetFirstSelectedItemPosition();\r
+ while ( pos )\r
+ {\r
+ int index = GetNextSelectedItem(pos);\r
+ StartDiffTwo(index);\r
+ }\r
+ }\r
+ break;\r
case IDSVNLC_GNUDIFF1:\r
{\r
// SVNDiff diff(NULL, this->m_hWnd, true);\r
*filepath,m_CurrentVersion+_T("~1"));\r
}\r
break;\r
+ case IDSVNLC_GNUDIFF2:\r
+ {\r
+ // SVNDiff diff(NULL, this->m_hWnd, true);\r
+ //\r
+ // if (entry->remotestatus <= git_wc_status_normal)\r
+ // CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_BASE, entry->path, SVNRev::REV_WC);\r
+ // else\r
+ // CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_WC, entry->path, SVNRev::REV_HEAD);\r
+ \r
+ CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,m_Rev1,\r
+ *filepath,m_Rev2);\r
+ }\r
+ break;\r
+ \r
case IDSVNLC_ADD:\r
{ // The add went ok, but we now need to run through the selected items again\r
// and update their status\r
+ std::vector<int> selectIndex;\r
+\r
POSITION pos = GetFirstSelectedItemPosition();\r
int index;\r
while ((index = GetNextSelectedItem(pos)) >= 0)\r
{\r
+ selectIndex.push_back(index);\r
+ }\r
+ for(int i=0;i<selectIndex.size();i++)\r
+ {\r
+ index=selectIndex[i];\r
+\r
CTGitPath * path=(CTGitPath*)GetItemData(index);\r
ASSERT(path);\r
if(path == NULL)\r
}\r
break;\r
\r
+ case IDSVNLC_DELETE:\r
+ {\r
+ //Collect paths\r
+ std::vector<int> selectIndex;\r
+\r
+ POSITION pos = GetFirstSelectedItemPosition();\r
+ int index;\r
+ while ((index = GetNextSelectedItem(pos)) >= 0)\r
+ {\r
+ selectIndex.push_back(index);\r
+ }\r
+\r
+ //Create file-list ('\0' separated) for SHFileOperation\r
+ CString filelist;\r
+ for(int i=0;i<selectIndex.size();i++)\r
+ {\r
+ index=selectIndex[i];\r
+\r
+ CTGitPath * path=(CTGitPath*)GetItemData(index);\r
+ ASSERT(path);\r
+ if(path == NULL)\r
+ continue;\r
+\r
+ filelist += path->GetWinPathString();\r
+ filelist += _T("|");\r
+ }\r
+ filelist += _T("|");\r
+ int len = filelist.GetLength();\r
+ TCHAR * buf = new TCHAR[len+2];\r
+ _tcscpy_s(buf, len+2, filelist);\r
+ for (int i=0; i<len; ++i)\r
+ if (buf[i] == '|')\r
+ buf[i] = 0;\r
+ SHFILEOPSTRUCT fileop;\r
+ fileop.hwnd = this->m_hWnd;\r
+ fileop.wFunc = FO_DELETE;\r
+ fileop.pFrom = buf;\r
+ fileop.pTo = NULL;\r
+ fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | ((GetAsyncKeyState(VK_SHIFT) & 0x8000) ? 0 : FOF_ALLOWUNDO);\r
+ fileop.lpszProgressTitle = _T("deleting file");\r
+ int result = SHFileOperation(&fileop);\r
+ delete [] buf;\r
+\r
+ if ( (result==0) && (!fileop.fAnyOperationsAborted) )\r
+ {\r
+ SetRedraw(FALSE);\r
+ POSITION pos = NULL;\r
+ while ((pos = GetFirstSelectedItemPosition()) != 0)\r
+ {\r
+ int index = GetNextSelectedItem(pos);\r
+ if (GetCheck(index))\r
+ m_nSelected--;\r
+ m_nTotal--;\r
+\r
+ RemoveListEntry(index);\r
+ }\r
+ SetRedraw(TRUE);\r
+ }\r
+ }\r
+ break;\r
+\r
case IDSVNLC_BLAME:\r
{\r
CString sCmd;\r
CAppUtils::ConflictEdit(*filepath);\r
break;\r
}\r
+ case IDSVNLC_RESOLVETHEIRS: //follow up \r
+ case IDSVNLC_RESOLVEMINE: //follow up\r
case IDSVNLC_RESOLVECONFLICT:\r
{\r
if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
CTGitPath * fentry =(CTGitPath*) this->GetItemData(index);\r
if(fentry == NULL)\r
continue;\r
+ CString gitcmd,output;\r
+ output.Empty();\r
+ if ( cmd == IDSVNLC_RESOLVETHEIRS)\r
+ {\r
+ gitcmd.Format(_T("git.exe cat-file blob \":3:%s\""),fentry->GetGitPathString());\r
+ if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString()))\r
+ {\r
+ CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
+ continue;\r
+ }\r
+ }\r
+ output.Empty();\r
+ if ( cmd == IDSVNLC_RESOLVEMINE)\r
+ {\r
+ gitcmd.Format(_T("git.exe cat-file blob \":2:%s\""),fentry->GetGitPathString());\r
+ if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString()))\r
+ {\r
+ CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
+ continue;\r
+ }\r
\r
+ }\r
+ output.Empty();\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_ACP))\r
+ gitcmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString());\r
+ if(g_Git.Run(gitcmd,&output,CP_ACP))\r
{\r
- CMessageBox::Show(m_hWnd, output, _T("TortoiseSVN"), MB_ICONERROR);\r
+ CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
}else\r
{\r
fentry->m_Action |= CTGitPath::LOGACTIONS_MODIFIED;\r
CTGitPath *path=(CTGitPath*)GetItemData(nItem);\r
if (path->GetGitPathString()==targetList[i].GetGitPathString())\r
{\r
- RemoveListEntry(nItem);\r
+ if(path->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+ {\r
+ path->m_Action = CTGitPath::LOGACTIONS_UNVER;\r
+ SetEntryCheck(path,nItem,false);\r
+ SetItemGroup(nItem,1);\r
+ this->m_StatusFileList.RemoveItem(*path);\r
+ this->m_UnRevFileList.AddPath(*path);\r
+ //this->m_IgnoreFileList.RemoveItem(*path);\r
+\r
+ }else\r
+ {\r
+ RemoveListEntry(nItem);\r
+ }\r
break;\r
}\r
}\r
*pResult = 0;\r
if (m_bBlock)\r
return;\r
-#if 0\r
+\r
if (pNMLV->iItem < 0)\r
{\r
if (!IsGroupViewEnabled())\r
GetItem(&lv);\r
if (lv.iGroupId == group)\r
{\r
- FileEntry * entry = GetListEntry(i);\r
+ CTGitPath *entry=(CTGitPath*)GetItemData(i);\r
+\r
if (!bFirst)\r
{\r
bCheck = !GetCheck(i);\r
NotifyCheck();\r
return;\r
}\r
-#endif\r
-// FileEntry * entry = GetListEntry(pNMLV->iItem);\r
-// if (entry)\r
- {\r
-// if (entry->isConflicted)\r
-// {\r
-// gitDiff::StartConflictEditor(entry->GetPath());\r
-// }\r
-// else\r
- {\r
+\r
+ CTGitPath *file=(CTGitPath*)GetItemData(pNMLV->iItem);\r
+\r
+ if( file->m_Action&CTGitPath::LOGACTIONS_UNMERGED )\r
+ {\r
+ CAppUtils::ConflictEdit(*file,false);\r
+\r
+ }else\r
+ {\r
+ if( (!m_Rev1.IsEmpty()) || (!m_Rev1.IsEmpty()))\r
+ StartDiffTwo(pNMLV->iItem);\r
+ else\r
StartDiff(pNMLV->iItem);\r
- }\r
}\r
\r
}\r
+void CGitStatusListCtrl::StartDiffTwo(int fileindex)\r
+{\r
+ if(fileindex<0)\r
+ return;\r
+\r
+ CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+\r
+ CGitDiff::Diff(&file1,&file1,\r
+ m_Rev1,\r
+ m_Rev2);\r
+\r
+}\r
void CGitStatusListCtrl::StartDiffWC(int fileindex)\r
{\r
if(fileindex<0)\r
\r
if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
{\r
- if(!g_Git.IsInitRepos())\r
+ if( g_Git.IsInitRepos())\r
+ CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
+ CString(GIT_REV_ZERO)); \r
+ else if( file1.m_Action&CTGitPath::LOGACTIONS_DELETED )\r
+ CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
+ GitRev::GetHead(),false); \r
+ else\r
CGitDiff::Diff(&file1,&file2,\r
CString(GIT_REV_ZERO),\r
GitRev::GetHead());\r
- else\r
- CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
- CString(GIT_REV_ZERO));\r
}else\r
{\r
CGitDiff::Diff(&file1,&file2,\r
\r
//if(m_UnRevFileList.GetCount()>0)\r
{\r
- _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("No Version Control"), 1023);\r
+ _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Not Versioned"), 1023);\r
grp.pszHeader = groupname;\r
grp.iGroupId = groupindex;\r
grp.uAlign = LVGA_HEADER_LEFT;\r
\r
//if(m_IgnoreFileList.GetCount()>0)\r
{\r
- _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored File"), 1023);\r
+ _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored"), 1023);\r
grp.pszHeader = groupname;\r
grp.iGroupId = groupindex;\r
grp.uAlign = LVGA_HEADER_LEFT;\r
\r
out.Format(_T("%d files revert to %s"),count,m_CurrentVersion.Left(6));\r
CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+ return 0;\r
}\r
\r
void CGitStatusListCtrl::OpenFile(CTGitPath*filepath,int mode)\r