//#include "EditPropertiesDlg.h"\r
//#include "CreateChangelistDlg.h"\r
#include "XPTheme.h"\r
+#include "CommonResource.h"\r
\r
const UINT CGitStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED\r
= ::RegisterWindowMessage(_T("GITSLNM_ITEMCOUNTCHANGED"));\r
\r
CGitStatusListCtrl::~CGitStatusListCtrl()\r
{\r
- if (m_pDropTarget)\r
- delete m_pDropTarget;\r
+// if (m_pDropTarget)\r
+// delete m_pDropTarget;\r
ClearStatusArray();\r
}\r
\r
m_arStatusArray.clear();\r
#endif\r
}\r
-\r
+#if 0\r
CGitStatusListCtrl::FileEntry * CGitStatusListCtrl::GetListEntry(UINT_PTR index)\r
{\r
-#if 0\r
+\r
if (index >= (UINT_PTR)m_arListArray.size())\r
return NULL;\r
if (m_arListArray[index] >= m_arStatusArray.size())\r
return NULL;\r
return m_arStatusArray[m_arListArray[index]];\r
-#endif\r
+\r
return NULL;\r
}\r
-\r
+#endif\r
+#if 0\r
CGitStatusListCtrl::FileEntry * CGitStatusListCtrl::GetVisibleListEntry(const CTGitPath& path)\r
{\r
int itemCount = GetItemCount();\r
}\r
return NULL;\r
}\r
-\r
+#endif\r
+#if 0\r
CGitStatusListCtrl::FileEntry * CGitStatusListCtrl::GetListEntry(const CTGitPath& path)\r
{\r
-#if 0\r
+\r
for (size_t i=0; i < m_arStatusArray.size(); i++)\r
{\r
FileEntry * entry = m_arStatusArray[i];\r
if (entry->GetPath().IsEquivalentTo(path))\r
return entry;\r
}\r
-#endif\r
+\r
return NULL;\r
}\r
+#endif\r
\r
+#if 0\r
int CGitStatusListCtrl::GetIndex(const CTGitPath& path)\r
{\r
int itemCount = GetItemCount();\r
}\r
return -1;\r
}\r
+#endif \r
\r
void CGitStatusListCtrl::Init(DWORD dwColumns, const CString& sColumnInfoContainer, DWORD dwContextMenus /* = GitSLC_POPALL */, bool bHasCheckboxes /* = true */)\r
{\r
mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
\r
+\r
#if 0\r
\r
int refetchcounter = 0;\r
SetCursorPos(pt.x, pt.y);\r
return bRet;\r
#endif \r
+ BuildStatistics();\r
return TRUE;\r
}\r
\r
#endif\r
return true;\r
}\r
-\r
+#if 0\r
const CGitStatusListCtrl::FileEntry*\r
CGitStatusListCtrl::AddNewFileEntry(\r
const git_wc_status2_t* pGitStatus, // The return from the Git GetStatus functions\r
)\r
{\r
FileEntry * entry = new FileEntry();\r
-#if 0\r
+\r
\r
entry->path = path;\r
entry->basepath = basePath;\r
\r
// Pass ownership of the entry to the array\r
m_arStatusArray.push_back(entry);\r
-#endif\r
+\r
return entry;\r
}\r
+#endif\r
\r
void CGitStatusListCtrl::AddUnversionedFolder(const CTGitPath& folderName,\r
const CTGitPath& basePath,\r
return 0;\r
}\r
\r
-void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFolders /* = true */)\r
+void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFolders /* = true */,BOOL UpdateStatusList)\r
{\r
CWinApp * pApp = AfxGetApp();\r
if (pApp)\r
pApp->DoWaitCursor(1);\r
\r
Locker lock(m_critSec);\r
- WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseSVN\\LanguageID"), GetUserDefaultLangID());\r
+ WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), GetUserDefaultLangID());\r
\r
//SetItemCount(listIndex);\r
SetRedraw(FALSE);\r
PrepareGroups();\r
m_nSelected = 0;\r
\r
+ if(UpdateStatusList)\r
+ {\r
+ m_arStatusArray.clear();\r
+ for(int i=0;i<this->m_StatusFileList.GetCount();i++)\r
+ {\r
+ m_arStatusArray.push_back((CTGitPath*)&m_StatusFileList[i]);\r
+ }\r
+\r
+ for(int i=0;i<this->m_UnRevFileList.GetCount();i++)\r
+ {\r
+ m_arStatusArray.push_back((CTGitPath*)&m_UnRevFileList[i]);\r
+ }\r
+\r
+ for(int i=0;i<this->m_IgnoreFileList.GetCount();i++)\r
+ {\r
+ m_arStatusArray.push_back((CTGitPath*)&m_IgnoreFileList[i]);\r
+ }\r
+ }\r
for(int i=0;i<this->m_arStatusArray.size();i++)\r
{\r
- AddEntry((CTGitPath*)m_arStatusArray[i],langID,i);\r
+ if(((CTGitPath*)m_arStatusArray[i])->m_Action & dwShow)\r
+ AddEntry((CTGitPath*)m_arStatusArray[i],langID,i);\r
}\r
\r
int maxcol = ((CHeaderCtrl*)(GetDlgItem(0)))->GetItemCount()-1;\r
pApp->DoWaitCursor(-1);\r
\r
Invalidate();\r
+ \r
+ m_dwShow = dwShow;\r
\r
#if 0\r
\r
CWinApp * pApp = AfxGetApp();\r
if (pApp)\r
pApp->DoWaitCursor(1);\r
- m_dwShow = dwShow;\r
+\r
m_bShowFolders = bShowFolders;\r
\r
int nTopIndex = GetTopIndex();\r
#if 0\r
\r
Locker lock(m_critSec);\r
- WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseSVN\\LanguageID"), GetUserDefaultLangID());\r
+ WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), GetUserDefaultLangID());\r
\r
CWinApp * pApp = AfxGetApp();\r
if (pApp)\r
#endif\r
\r
}\r
+int CGitStatusListCtrl::GetColumnIndex(int mask)\r
+{\r
+ int i=0;\r
+ for(i=0;i<32;i++)\r
+ if(mask&0x1)\r
+ return i-1;\r
+ else\r
+ mask=mask>>1;\r
+ return -1;\r
+}\r
void CGitStatusListCtrl::AddEntry(CTGitPath * GitPath, WORD langID, int listIndex)\r
{\r
static CString ponly(MAKEINTRESOURCE(IDS_STATUSLIST_PROPONLY));\r
icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(*GitPath);\r
}\r
// relative path\r
+ CString rename;\r
+ rename.Format(_T("(from %s)"),GitPath->GetGitOldPathString());\r
+ if(GitPath->m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+ entryname+=rename;\r
+ \r
InsertItem(index, entryname, icon_idx);\r
\r
this->SetItemData(index, (DWORD_PTR)GitPath);\r
// SVNSLC_COLEXT\r
SetItemText(index, nCol++, GitPath->GetFileExtension());\r
// SVNSLC_COLSTATUS\r
-// if (entry->isNested)\r
-// {\r
-// CString sTemp(MAKEINTRESOURCE(IDS_STATUSLIST_NESTED));\r
-// SetItemText(index, nCol++, sTemp);\r
-// }\r
-// else\r
- {\r
- SetItemText(index, nCol++, GitPath->GetActionName());\r
- }\r
- // SVNSLC_COLREMOTESTATUS\r
-// if (entry->isNested)\r
-// {\r
-// CString sTemp(MAKEINTRESOURCE(IDS_STATUSLIST_NESTED));\r
-// SetItemText(index, nCol++, sTemp);\r
-// }\r
-// else\r
- {\r
- //SetItemText(index, nCol++, buf);\r
- }\r
- // SVNSLC_COLTEXTSTATUS\r
-// if (entry->isNested)\r
-// {\r
-// CString sTemp(MAKEINTRESOURCE(IDS_STATUSLIST_NESTED));\r
-// SetItemText(index, nCol++, sTemp);\r
-// }\r
-// else\r
-// {\r
-#if 0\r
- SVNStatus::GetStatusString(hResourceHandle, entry->textstatus, buf, sizeof(buf)/sizeof(TCHAR), (WORD)langID);\r
- if ((entry->copied)&&(_tcslen(buf)>1))\r
- _tcscat_s(buf, 100, _T(" (+)"));\r
- if ((entry->switched)&&(_tcslen(buf)>1))\r
- _tcscat_s(buf, 100, _T(" (s)"));\r
-#endif\r
-// SetItemText(index, nCol++, buf);\r
-// }\r
- // SVNSLC_COLPROPSTATUS\r
-// if (entry->isNested)\r
-// {\r
-// SetItemText(index, nCol++, _T(""));\r
-// }\r
-// else\r
-// {\r
-#if 0\r
- SVNStatus::GetStatusString(hResourceHandle, entry->propstatus, buf, sizeof(buf)/sizeof(TCHAR), (WORD)langID);\r
- if ((entry->copied)&&(_tcslen(buf)>1))\r
- _tcscat_s(buf, 100, _T(" (+)"));\r
- if ((entry->switched)&&(_tcslen(buf)>1))\r
- _tcscat_s(buf, 100, _T(" (s)"));\r
-#endif\r
-// SetItemText(index, nCol++, buf);\r
-// }\r
- // SVNSLC_COLREMOTETEXT\r
-// if (entry->isNested)\r
-// {\r
-// SetItemText(index, nCol++, _T(""));\r
-// }\r
-// else\r
-// {\r
-#if 0\r
- SVNStatus::GetStatusString(hResourceHandle, entry->remotetextstatus, buf, sizeof(buf)/sizeof(TCHAR), (WORD)langID);\r
- SetItemText(index, nCol++, buf);\r
-#endif\r
-// }\r
- // SVNSLC_COLREMOTEPROP\r
-// if (entry->isNested)\r
-// {\r
-// SetItemText(index, nCol++, _T(""));\r
-// }\r
-// else\r
-// {\r
-// SVNStatus::GetStatusString(hResourceHandle, entry->remotepropstatus, buf, sizeof(buf)/sizeof(TCHAR), (WORD)langID);\r
-// SetItemText(index, nCol++, buf);\r
-// }\r
- // SVNSLC_COLURL\r
-// SetItemText(index, nCol++, entry->url);\r
- // SVNSLC_COLLOCK\r
-#if 0\r
- if (!m_HeadRev.IsHead())\r
- {\r
- // we have contacted the repository\r
+ SetItemText(index, nCol++, GitPath->GetActionName());\r
\r
- // decision-matrix\r
- // wc repository text\r
- // "" "" ""\r
- // "" UID1 owner\r
- // UID1 UID1 owner\r
- // UID1 "" lock has been broken\r
- // UID1 UID2 lock has been stolen\r
- if (entry->lock_token.IsEmpty() || (entry->lock_token.Compare(entry->lock_remotetoken)==0))\r
- {\r
- if (entry->lock_owner.IsEmpty())\r
- SetItemText(index, nCol++, entry->lock_remoteowner);\r
- else\r
- SetItemText(index, nCol++, entry->lock_owner);\r
- }\r
- else if (entry->lock_remotetoken.IsEmpty())\r
- {\r
- // broken lock\r
- CString temp(MAKEINTRESOURCE(IDS_STATUSLIST_LOCKBROKEN));\r
- SetItemText(index, nCol++, temp);\r
- }\r
- else\r
- {\r
- // stolen lock\r
- CString temp;\r
- temp.Format(IDS_STATUSLIST_LOCKSTOLEN, (LPCTSTR)entry->lock_remoteowner);\r
- SetItemText(index, nCol++, temp);\r
- }\r
- }\r
- else\r
- SetItemText(index, nCol++, entry->lock_owner);\r
- // SVNSLC_COLLOCKCOMMENT\r
- SetItemText(index, nCol++, entry->lock_comment);\r
- // SVNSLC_COLAUTHOR\r
- SetItemText(index, nCol++, entry->last_commit_author);\r
- // SVNSLC_COLREVISION\r
- CString temp;\r
- temp.Format(_T("%ld"), entry->last_commit_rev);\r
- if (entry->last_commit_rev > 0)\r
- SetItemText(index, nCol++, temp);\r
- else\r
- SetItemText(index, nCol++, _T(""));\r
- // SVNSLC_COLREMOTEREVISION\r
- temp.Format(_T("%ld"), entry->remoterev);\r
- if (entry->remoterev > 0)\r
- SetItemText(index, nCol++, temp);\r
- else\r
- SetItemText(index, nCol++, _T(""));\r
- // SVNSLC_COLDATE\r
- TCHAR datebuf[SVN_DATE_BUFFER];\r
- apr_time_t date = entry->last_commit_date;\r
- SVN::formatDate(datebuf, date, true);\r
- if (date)\r
- SetItemText(index, nCol++, datebuf);\r
- else\r
- SetItemText(index, nCol++, _T(""));\r
- // SVNSLC_COLSVNNEEDSLOCK\r
- BOOL bFoundSVNNeedsLock = entry->present_props.IsNeedsLockSet();\r
- CString strSVNNeedsLock = (bFoundSVNNeedsLock) ? _T("*") : _T("");\r
- SetItemText(index, nCol++, strSVNNeedsLock);\r
- // SVNSLC_COLCOPYFROM\r
- if (m_sURL.Compare(entry->copyfrom_url.Left(m_sURL.GetLength()))==0)\r
- temp = entry->copyfrom_url.Mid(m_sURL.GetLength());\r
- else\r
- temp = entry->copyfrom_url;\r
- SetItemText(index, nCol++, temp);\r
- // SVNSLC_COLMODIFICATIONDATE\r
- __int64 filetime = entry->GetPath().GetLastWriteTime();\r
- if ( (filetime) && (entry->status!=git_wc_status_deleted) )\r
- {\r
- FILETIME* f = (FILETIME*)(__int64*)&filetime;\r
- TCHAR datebuf[SVN_DATE_BUFFER];\r
- SVN::formatDate(datebuf,*f,true);\r
- SetItemText(index, nCol++, datebuf);\r
- }\r
- else\r
- {\r
- SetItemText(index, nCol++, _T(""));\r
- }\r
+ SetItemText(index, GetColumnIndex(SVNSLC_COLADD),GitPath->m_StatAdd);\r
+ SetItemText(index, GetColumnIndex(SVNSLC_COLDEL),GitPath->m_StatDel);\r
\r
- // user-defined properties\r
- for ( int i = SVNSLC_NUMCOLUMNS, count = m_ColumnManager.GetColumnCount()\r
- ; i < count\r
- ; ++i)\r
- {\r
- assert (i == nCol++);\r
- assert (m_ColumnManager.IsUserProp (i));\r
\r
- CString name = m_ColumnManager.GetName(i);\r
- if (entry->present_props.HasProperty (name))\r
- {\r
- const CString& propVal = entry->present_props [name];\r
- if (propVal.IsEmpty())\r
- SetItemText(index, i, m_sNoPropValueText);\r
- else\r
- SetItemText(index, i, propVal);\r
- }\r
- else\r
- SetItemText(index, i, _T(""));\r
- }\r
-#endif\r
SetCheck(index, GitPath->m_Checked);\r
if (GitPath->m_Checked)\r
m_nSelected++;\r
\r
-//#if 0\r
-// if (m_changelists.find(entry->changelist) != m_changelists.end())\r
-// SetItemGroup(index, m_changelists[entry->changelist]);\r
-// else\r
+\r
if( GitPath->m_Action & CTGitPath::LOGACTIONS_IGNORE)\r
SetItemGroup(index, 2);\r
else if( GitPath->m_Action & CTGitPath::LOGACTIONS_UNVER)\r
else\r
SetItemGroup(index,0);\r
m_bBlock = FALSE;\r
-//#endif\r
+\r
\r
}\r
#if 0\r
for (int i=0; i<GetItemCount(); ++i)\r
{\r
CTGitPath * entry = (CTGitPath*)GetItemData(i);\r
- SetCheck(i, entry->m_Checked);\r
+ ASSERT(entry);\r
+ if(entry)\r
+ SetCheck(i, entry->m_Checked);\r
}\r
\r
m_bBlock = FALSE;\r
m_nSelected--;\r
}\r
}\r
-\r
+#if 0\r
bool CGitStatusListCtrl::EntryPathCompareNoCase(const FileEntry* pEntry1, const FileEntry* pEntry2)\r
{\r
return pEntry1->path < pEntry2->path;\r
{\r
return pEntry1->status != git_wc_status_unversioned;\r
}\r
-\r
+#endif\r
bool CGitStatusListCtrl::BuildStatistics()\r
{\r
-#if 0\r
+\r
bool bRefetchStatus = false;\r
- FileEntryVector::iterator itFirstUnversionedEntry;\r
- itFirstUnversionedEntry = std::partition(m_arStatusArray.begin(), m_arStatusArray.end(), IsEntryVersioned);\r
- if (m_bUnversionedLast)\r
- {\r
- // We partition the list of items so that it's arrange with all the versioned items first\r
- // then all the unversioned items afterwards.\r
- // Then we sort the versioned part of this, so that we can do quick look-ups in it\r
- std::sort(m_arStatusArray.begin(), itFirstUnversionedEntry, EntryPathCompareNoCase);\r
- // Also sort the unversioned section, to make the list look nice...\r
- std::sort(itFirstUnversionedEntry, m_arStatusArray.end(), EntryPathCompareNoCase);\r
- }\r
\r
// now gather some statistics\r
m_nUnversioned = 0;\r
m_nConflicted = 0;\r
m_nTotal = 0;\r
m_nSelected = 0;\r
+ \r
for (int i=0; i < (int)m_arStatusArray.size(); ++i)\r
{\r
- const FileEntry * entry = m_arStatusArray[i];\r
- if (entry)\r
- {\r
- switch (entry->status)\r
- {\r
- case git_wc_status_normal:\r
- m_nNormal++;\r
- break;\r
- case git_wc_status_added:\r
- m_nAdded++;\r
- break;\r
- case git_wc_status_missing:\r
- case git_wc_status_deleted:\r
- m_nDeleted++;\r
- break;\r
- case git_wc_status_replaced:\r
- case git_wc_status_modified:\r
- case git_wc_status_merged:\r
- m_nModified++;\r
- break;\r
- case git_wc_status_conflicted:\r
- case git_wc_status_obstructed:\r
- m_nConflicted++;\r
- break;\r
- case git_wc_status_ignored:\r
- m_nUnversioned++;\r
- break;\r
- default:\r
-#if 0\r
- {\r
- if (GitStatus::IsImportant(entry->remotestatus))\r
- break;\r
- m_nUnversioned++;\r
- // If an entry is in an unversioned folder, we don't have to do an expensive array search\r
- // to find out if it got case-renamed: an unversioned folder can't have versioned files\r
- // But nested folders are also considered to be in unversioned folders, we have to do the\r
- // check in that case too, otherwise we would miss case-renamed folders - they show up\r
- // as nested folders.\r
- if (((!entry->inunversionedfolder)||(entry->isNested))&&(m_bUnversionedLast))\r
- {\r
- // check if the unversioned item is just\r
- // a file differing in case but still versioned\r
- FileEntryVector::iterator itMatchingItem;\r
- if(std::binary_search(m_arStatusArray.begin(), itFirstUnversionedEntry, entry, EntryPathCompareNoCase))\r
- {\r
- // We've confirmed that there *is* a matching file\r
- // Find its exact location\r
- FileEntryVector::iterator itMatchingItem;\r
- itMatchingItem = std::lower_bound(m_arStatusArray.begin(), itFirstUnversionedEntry, entry, EntryPathCompareNoCase);\r
+ int status=((CTGitPath*)m_arStatusArray[i])->m_Action;\r
+\r
+ if(status&CTGitPath::LOGACTIONS_ADDED)\r
+ m_nAdded++;\r
+ \r
+ if(status&CTGitPath::LOGACTIONS_DELETED)\r
+ m_nDeleted++;\r
+ \r
+ if(status&(CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_MODIFIED))\r
+ m_nModified++;\r
+ \r
+ if(status&CTGitPath::LOGACTIONS_UNMERGED)\r
+ m_nConflicted++;\r
+ \r
+ if(status&(CTGitPath::LOGACTIONS_IGNORE|CTGitPath::LOGACTIONS_UNVER))\r
+ m_nUnversioned++;\r
+ \r
+ \r
\r
- // adjust the case of the filename\r
- if (MoveFileEx(entry->path.GetWinPath(), (*itMatchingItem)->path.GetWinPath(), MOVEFILE_REPLACE_EXISTING))\r
- {\r
- // We successfully adjusted the case in the filename. But there is now a file with status 'missing'\r
- // in the array, because that's the status of the file before we adjusted the case.\r
- // We have to refetch the status of that file.\r
- // Since fetching the status of single files/directories is very expensive and there can be\r
- // multiple case-renames here, we just set a flag and refetch the status at the end from scratch.\r
- bRefetchStatus = true;\r
- DeleteItem(i);\r
- m_arStatusArray.erase(m_arStatusArray.begin()+i);\r
- delete entry;\r
- i--;\r
- m_nUnversioned--;\r
- // now that we removed an unversioned item from the array, find the first unversioned item in the 'new'\r
- // list again.\r
- itFirstUnversionedEntry = std::partition(m_arStatusArray.begin(), m_arStatusArray.end(), IsEntryVersioned);\r
- }\r
- break;\r
- }\r
- }\r
- }\r
-#endif\r
- break;\r
- } // switch (entry->status)\r
- } // if (entry)\r
+// } // switch (entry->status)\r
+// } // if (entry)\r
} // for (int i=0; i < (int)m_arStatusArray.size(); ++i)\r
return !bRefetchStatus;\r
-#endif \r
+\r
return FALSE;\r
}\r
\r
lv.mask = LVIF_GROUPID;\r
lv.iItem = i;\r
GetItem(&lv);\r
+#if 0\r
if (lv.iGroupId == group)\r
{\r
FileEntry * entry = GetListEntry(i);\r
}\r
}\r
}\r
+#endif\r
}\r
GetStatisticsString();\r
NotifyCheck();\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
// if ((m_dwContextMenus & SVNSLC_POPGNUDIFF)&&(wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing))\r
// {\r
- popup.AppendMenuIcon(IDSVNLC_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
+ if(!g_Git.IsInitRepos())\r
+ popup.AppendMenuIcon(IDSVNLC_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
+\r
bEntryAdded = true;\r
// }\r
// }\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
case IDSVNLC_OPEN:\r
{\r
- int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath->GetWinPath(), NULL, NULL, SW_SHOW);\r
+ CString file;\r
+ if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
+ {\r
+ file= filepath->GetWinPath();\r
+ }else\r
+ {\r
+ CString temppath;\r
+ GetTempPath(temppath);\r
+ file.Format(_T("%s%s_%s%s"),\r
+ temppath, \r
+ filepath->GetBaseFilename(),\r
+ m_CurrentVersion.Left(6),\r
+ filepath->GetFileExtension());\r
+\r
+ }\r
+ int ret = (int)ShellExecute(this->m_hWnd, NULL,file, NULL, NULL, SW_SHOW);\r
if (ret <= HINSTANCE_ERROR)\r
{\r
CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
- cmd += filepath->GetWinPath();\r
+ cmd += file;\r
CAppUtils::LaunchApplication(cmd, NULL, false);\r
}\r
}\r
break;\r
case IDSVNLC_OPENWITH:\r
{\r
+ CString file;\r
+ if(m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
+ {\r
+ file= filepath->GetWinPath();\r
+ }else\r
+ {\r
+ CString temppath;\r
+ GetTempPath(temppath);\r
+ file.Format(_T("%s%s_%s%s"),\r
+ temppath, \r
+ filepath->GetBaseFilename(),\r
+ m_CurrentVersion.Left(6),\r
+ filepath->GetFileExtension());\r
+\r
+ }\r
+\r
CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
- cmd += filepath->GetWinPathString() + _T(" ");\r
+ cmd += file + _T(" ");\r
CAppUtils::LaunchApplication(cmd, NULL, false);\r
}\r
break;\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
- CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,GitRev::GetWorkingCopy(),\r
+ if(m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
+ CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,GitRev::GetWorkingCopy(),\r
*filepath,GitRev::GetHead());\r
+ else\r
+ CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,m_CurrentVersion,\r
+ *filepath,m_CurrentVersion+_T("~1"));\r
}\r
break;\r
case IDSVNLC_ADD:\r
while ((index = GetNextSelectedItem(pos)) >= 0)\r
{\r
CTGitPath * path=(CTGitPath*)GetItemData(index);\r
+ ASSERT(path);\r
+ if(path == NULL)\r
+ continue;\r
CString cmd;\r
cmd.Format(_T("git.exe add %s"),path->GetGitPathString());\r
CString output;\r
- g_Git.Run(cmd,&output);\r
- path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
- SetEntryCheck(path,index,true);\r
- SetItemGroup(index,0);\r
- this->m_StatusFileList.AddPath(*path);\r
- this->m_UnRevFileList.RemoveItem(*path);\r
- this->m_IgnoreFileList.RemoveItem(*path);\r
+ if(!g_Git.Run(cmd,&output,CP_OEMCP))\r
+ {\r
+ path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
+ SetEntryCheck(path,index,true);\r
+ SetItemGroup(index,0);\r
+ this->m_StatusFileList.AddPath(*path);\r
+ this->m_UnRevFileList.RemoveItem(*path);\r
+ this->m_IgnoreFileList.RemoveItem(*path);\r
+ Show(this->m_dwShow,0,true,true);\r
+ }\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+_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
if (entry->status != git_wc_status_added)\r
delList.AddPath(entry->GetPath());\r
}\r
- if (DWORD(CRegDWORD(_T("Software\\TortoiseSVN\\RevertWithRecycleBin"), TRUE)))\r
+ if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RevertWithRecycleBin"), TRUE)))\r
delList.DeleteAllFiles(true);\r
\r
if (!git.Revert(targetList, CStringArray(), FALSE))\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
- CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\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(&file1,&file2,\r
CString(GIT_REV_ZERO),\r
GitRev::GetHead());\r
- \r
+ else\r
+ CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
+ CString(GIT_REV_ZERO));\r
+ }else\r
+ {\r
+ CGitDiff::Diff(&file1,&file2,\r
+ m_CurrentVersion,\r
+ m_CurrentVersion+_T("~1"));\r
+ }\r
#if 0\r
if (fileindex < 0)\r
return;\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
*pResult = 0;\r
if (m_bBlock)\r
return;\r
+#if 0\r
if (GetListEntry(pGetInfoTip->iItem >= 0))\r
if (pGetInfoTip->cchTextMax > GetListEntry(pGetInfoTip->iItem)->path.GetGitPathString().GetLength())\r
{\r
else if (GetStringWidth(GetListEntry(pGetInfoTip->iItem)->path.GetGitPathString()) > GetColumnWidth(pGetInfoTip->iItem))\r
_tcsncpy_s(pGetInfoTip->pszText, pGetInfoTip->cchTextMax, GetListEntry(pGetInfoTip->iItem)->path.GetGitPathString(), pGetInfoTip->cchTextMax);\r
}\r
+#endif\r
}\r
\r
void CGitStatusListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)\r
\r
COLORREF crText = GetSysColor(COLOR_WINDOWTEXT);\r
\r
- if (m_arListArray.size() > (DWORD_PTR)pLVCD->nmcd.dwItemSpec)\r
+ if (m_arStatusArray.size() > (DWORD_PTR)pLVCD->nmcd.dwItemSpec)\r
{\r
- FileEntry * entry = GetListEntry((int)pLVCD->nmcd.dwItemSpec);\r
+\r
+ //FileEntry * entry = GetListEntry((int)pLVCD->nmcd.dwItemSpec);\r
+ CTGitPath *entry=(CTGitPath *)GetItemData((int)pLVCD->nmcd.dwItemSpec);\r
if (entry == NULL)\r
return;\r
\r
// brown : missing, deleted, replaced\r
// green : merged (or potential merges)\r
// red : conflicts or sure conflicts\r
- switch (entry->status)\r
+ if(entry->m_Action & CTGitPath::LOGACTIONS_GRAY)\r
{\r
- case git_wc_status_added:\r
-// if (entry->remotestatus > git_wc_status_unversioned)\r
- // locally added file, but file already exists in repository!\r
-// crText = m_Colors.GetColor(CColors::Conflict);\r
-// else\r
- crText = m_Colors.GetColor(CColors::Added);\r
- break;\r
- case git_wc_status_missing:\r
- case git_wc_status_deleted:\r
- case git_wc_status_replaced:\r
- crText = m_Colors.GetColor(CColors::Deleted);\r
- break;\r
- case git_wc_status_modified:\r
-// if (entry->remotestatus == git_wc_status_modified)\r
- // indicate a merge (both local and remote changes will require a merge)\r
-// crText = m_Colors.GetColor(CColors::Merged);\r
-// else if (entry->remotestatus == git_wc_status_deleted)\r
-// // locally modified, but already deleted in the repository\r
-// crText = m_Colors.GetColor(CColors::Conflict);\r
-// else\r
- crText = m_Colors.GetColor(CColors::Modified);\r
- break;\r
- case git_wc_status_merged:\r
- crText = m_Colors.GetColor(CColors::Merged);\r
- break;\r
- case git_wc_status_conflicted:\r
- case git_wc_status_obstructed:\r
- crText = m_Colors.GetColor(CColors::Conflict);\r
- break;\r
- case git_wc_status_none:\r
- case git_wc_status_unversioned:\r
- case git_wc_status_ignored:\r
- case git_wc_status_incomplete:\r
- case git_wc_status_normal:\r
- case git_wc_status_external:\r
- default:\r
- crText = GetSysColor(COLOR_WINDOWTEXT);\r
- break;\r
- }\r
+ crText = RGB(128,128,128);\r
\r
- if (entry->isConflicted)\r
+ }else if(entry->m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
+ {\r
crText = m_Colors.GetColor(CColors::Conflict);\r
\r
+ }else if(entry->m_Action & CTGitPath::LOGACTIONS_MODIFIED)\r
+ {\r
+ crText = m_Colors.GetColor(CColors::Modified);\r
+\r
+ }else if(entry->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+ {\r
+ crText = m_Colors.GetColor(CColors::Added);\r
+ }\r
+ else if(entry->m_Action & CTGitPath::LOGACTIONS_DELETED)\r
+ {\r
+ crText = m_Colors.GetColor(CColors::DeletedNode);\r
+ }\r
+ else if(entry->m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+ {\r
+ crText = m_Colors.GetColor(CColors::RenamedNode);\r
+ }else\r
+ {\r
+ crText = GetSysColor(COLOR_WINDOWTEXT);\r
+ }\r
// Store the color back in the NMLVCUSTOMDRAW struct.\r
pLVCD->clrText = crText;\r
}\r
SetCheck(listboxIndex, bCheck);\r
}\r
\r
-\r
+#if 0\r
void CGitStatusListCtrl::SetCheckOnAllDescendentsOf(const FileEntry* parentEntry, bool bCheck)\r
{\r
-#if 0\r
+\r
int nListItems = GetItemCount();\r
for (int j=0; j< nListItems ; ++j)\r
{\r
}\r
}\r
}\r
-#endif\r
+\r
}\r
+#endif\r
\r
void CGitStatusListCtrl::WriteCheckedNamesToPathList(CTGitPathList& pathList)\r
{\r
+#if 0\r
pathList.Clear();\r
int nListItems = GetItemCount();\r
for (int i=0; i< nListItems; i++)\r
}\r
}\r
pathList.SortByPathname();\r
+#endif\r
}\r
\r
\r
{\r
CListCtrl::PreSubclassWindow();\r
EnableToolTips(TRUE);\r
+ m_Theme.SetWindowTheme(GetSafeHwnd(), L"Explorer", NULL);\r
}\r
\r
INT_PTR CGitStatusListCtrl::OnToolHitTest(CPoint point, TOOLINFO* pTI) const\r
\r
bool CGitStatusListCtrl::IsPathShown(const CTGitPath& path)\r
{\r
+#if 0\r
int itemCount = GetItemCount();\r
for (int i=0; i < itemCount; i++)\r
{\r
if (entry->GetPath().IsEquivalentTo(path))\r
return true;\r
}\r
+#endif\r
return false;\r
}\r
\r
\r
size_t CGitStatusListCtrl::GetNumberOfChangelistsInSelection()\r
{\r
+#if 0\r
std::set<CString> changelists;\r
POSITION pos = GetFirstSelectedItemPosition();\r
int index;\r
changelists.insert(entry->changelist);\r
}\r
return changelists.size();\r
+#endif \r
+ return 0;\r
}\r
\r
bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)\r
\r
}\r
\r
-\r
+#if 0\r
m_bHasIgnoreGroup = false;\r
\r
// now add the items which don't belong to a group\r
it->second = InsertGroup(groupindex, &grp);\r
}\r
}\r
-\r
+#endif\r
return bHasGroups;\r
}\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
if(hash == GIT_REV_ZERO)\r
{\r
int count = 0;\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
- g_Git.Run(cmd,&cmdout);\r
+ if(g_Git.Run(cmd,&cmdout))\r
+ {\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,strout,_T("TortoiseGit"),MB_OK);\r
+ return -1;\r
+ }\r
+ if(strout.IsEmpty())\r
+ break; //this is initial repositoyr, there are no any history\r
+\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
this->m_StatusFileList.ParserFromLog(out);\r
+ }else\r
+ {\r
+ int count = 0;\r
+ if(list == NULL)\r
+ count = 1;\r
+ else\r
+ count = list->GetCount();\r
+\r
+ for(int i=0;i<count;i++)\r
+ { \r
+ BYTE_VECTOR cmdout;\r
+ CString cmd;\r
+ if(list == NULL)\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 -z -- \"%s\""),hash,(*list)[i].GetGitPathString());\r
+\r
+ g_Git.Run(cmd,&cmdout);\r
+\r
+ out.append(cmdout);\r
+ }\r
+ this->m_StatusFileList.ParserFromLog(out);\r
+\r
}\r
for(int i=0;i<m_StatusFileList.GetCount();i++)\r
{\r
this->m_bBusy=FALSE;\r
return 0;\r
}\r
+\r
+int CGitStatusListCtrl::UpdateWithGitPathList(CTGitPathList &list)\r
+{\r
+ m_arStatusArray.clear();\r
+ for(int i=0;i<list.GetCount();i++)\r
+ {\r
+ CTGitPath * gitpath=(CTGitPath*)&list[i];\r
+ \r
+ if(gitpath ->m_Action & CTGitPath::LOGACTIONS_HIDE)\r
+ continue;\r
+\r
+ gitpath->m_Checked = TRUE;\r
+ m_arStatusArray.push_back((CTGitPath*)&list[i]);\r
+ }\r
+ return 0;\r
+}\r
+\r
int CGitStatusListCtrl::UpdateUnRevFileList(CTGitPathList *List)\r
{\r
this->m_UnRevFileList.FillUnRev(CTGitPath::LOGACTIONS_UNVER,List);\r
}\r
return 0;\r
}\r
+\r
+void CGitStatusListCtrl::Clear()\r
+{\r
+ m_FileLoaded=0;\r
+ this->DeleteAllItems();\r
+ this->m_arListArray.clear();\r
+ this->m_arStatusArray.clear();\r
+ this->m_changelists.clear();\r
+}\r
//////////////////////////////////////////////////////////////////////////\r
#if 0\r
bool CGitStatusListCtrlDropTarget::OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD * /*pdwEffect*/, POINTL pt)\r