//#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
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
int i=0;\r
for(i=0;i<32;i++)\r
if(mask&0x1)\r
- return i;\r
+ return i-1;\r
else\r
mask=mask>>1;\r
return -1;\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_CONFLICT)\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
// {\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
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
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))\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
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
if(fileindex<0)\r
return;\r
- CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+ if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
+ {\r
+ if(!g_Git.IsInitRepos())\r
+ CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\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((CTGitPath*)GetItemData(fileindex),\r
+ m_CurrentVersion,\r
+ m_CurrentVersion+_T("~1"));\r
+ }\r
#if 0\r
if (fileindex < 0)\r
return;\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_CONFLICT)\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
\r
- if (entry->isConflicted)\r
- crText = m_Colors.GetColor(CColors::Conflict);\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
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
CString out;\r
this->m_bBusy=TRUE;\r
+ m_CurrentVersion=hash;\r
+\r
if(hash == GIT_REV_ZERO)\r
{\r
int count = 0;\r
else\r
cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
\r
- g_Git.Run(cmd,&cmdout);\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
+ {\r
+ CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\r
+ return -1;\r
+ }\r
+ if(cmdout.IsEmpty())\r
+ break; //this is initial repositoyr, there are no any history\r
+\r
+ CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\r
+ return -1;\r
+\r
+ }\r
\r
out+=cmdout;\r
}\r