OSDN Git Service

Git LogDlg "Hide unrelated changed paths" Check box work
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index f809128..4edf274 100644 (file)
@@ -52,6 +52,7 @@
 //#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
@@ -163,8 +164,8 @@ CGitStatusListCtrl::CGitStatusListCtrl() : CListCtrl()
 \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
@@ -179,19 +180,20 @@ void CGitStatusListCtrl::ClearStatusArray()
        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
@@ -203,20 +205,23 @@ CGitStatusListCtrl::FileEntry * CGitStatusListCtrl::GetVisibleListEntry(const CT
        }\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
@@ -228,6 +233,7 @@ int CGitStatusListCtrl::GetIndex(const CTGitPath& path)
        }\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
@@ -295,6 +301,7 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList
                mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
        this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
 \r
+\r
 #if 0\r
        \r
        int refetchcounter = 0;\r
@@ -459,6 +466,7 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList
        SetCursorPos(pt.x, pt.y);\r
        return bRet;\r
 #endif \r
+       BuildStatistics();\r
        return TRUE;\r
 }\r
 \r
@@ -671,7 +679,7 @@ bool CGitStatusListCtrl::FetchStatusForSingleTarget(
 #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
@@ -683,7 +691,7 @@ CGitStatusListCtrl::AddNewFileEntry(
                        )\r
 {\r
        FileEntry * entry = new FileEntry();\r
-#if 0\r
+\r
        \r
        entry->path = path;\r
        entry->basepath = basePath;\r
@@ -816,9 +824,10 @@ CGitStatusListCtrl::AddNewFileEntry(
 \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
@@ -1041,14 +1050,14 @@ DWORD CGitStatusListCtrl::GetShowFlagsFromGitStatus(git_wc_status_kind status)
        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
@@ -1056,9 +1065,28 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
        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
@@ -1106,13 +1134,15 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                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
@@ -1254,7 +1284,7 @@ void CGitStatusListCtrl::Show(DWORD dwShow, const CTGitPathList& checkedList, bo
 #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
@@ -1388,7 +1418,7 @@ int CGitStatusListCtrl::GetColumnIndex(int mask)
        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
@@ -1413,6 +1443,11 @@ void CGitStatusListCtrl::AddEntry(CTGitPath * GitPath, WORD langID, int listInde
                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
@@ -1753,7 +1788,9 @@ void CGitStatusListCtrl::OnHdnItemclick(NMHDR *pNMHDR, LRESULT *pResult)
        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
@@ -1989,7 +2026,7 @@ void CGitStatusListCtrl::UncheckEntry(int index, int nListItems)
                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
@@ -1999,22 +2036,11 @@ bool CGitStatusListCtrl::IsEntryVersioned(const FileEntry* pEntry1)
 {\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
@@ -2025,87 +2051,33 @@ bool CGitStatusListCtrl::BuildStatistics()
        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
@@ -2252,6 +2224,7 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                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
@@ -2268,6 +2241,7 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                                }\r
                                                        }\r
                                                }\r
+#endif\r
                                        }\r
                                        GetStatisticsString();\r
                                        NotifyCheck();\r
@@ -2329,6 +2303,26 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                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
@@ -2346,7 +2340,9 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        //      {\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
@@ -2379,6 +2375,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                //}\r
                        }\r
                        \r
+       \r
                        ///Select Multi item\r
                        //if (GetSelectedCount() > 0)\r
                        //{\r
@@ -2426,17 +2423,17 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        //              }\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
@@ -2527,27 +2524,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\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
@@ -2646,19 +2624,50 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        {\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
@@ -2685,8 +2694,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                //              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
@@ -2697,20 +2710,84 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        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
@@ -2795,7 +2872,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                        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
@@ -2943,38 +3020,6 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\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
@@ -3437,47 +3482,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        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
@@ -4037,10 +4042,32 @@ void CGitStatusListCtrl::StartDiff(int fileindex)
 {\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
@@ -4123,20 +4150,25 @@ CString CGitStatusListCtrl::GetStatisticsString()
 \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
@@ -4150,7 +4182,7 @@ CTGitPath CGitStatusListCtrl::GetCommonDirectory(bool bStrict)
                        }\r
                }\r
        }\r
-       return commonBaseDirectory;\r
+       return g_Git.m_CurrentDir+CString(_T("\\"))+commonBaseDirectory.GetWinPath();\r
 }\r
 \r
 CTGitPath CGitStatusListCtrl::GetCommonURL(bool bStrict)\r
@@ -4227,6 +4259,7 @@ void CGitStatusListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
        *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
@@ -4235,6 +4268,7 @@ void CGitStatusListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
                        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
@@ -4265,9 +4299,11 @@ void CGitStatusListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
 \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
@@ -4279,51 +4315,33 @@ void CGitStatusListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
                                // 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
@@ -4370,10 +4388,10 @@ void CGitStatusListCtrl::SetEntryCheck(CTGitPath* pEntry, int listboxIndex, bool
        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
@@ -4397,11 +4415,13 @@ void CGitStatusListCtrl::SetCheckOnAllDescendentsOf(const FileEntry* parentEntry
                        }\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
@@ -4414,6 +4434,7 @@ void CGitStatusListCtrl::WriteCheckedNamesToPathList(CTGitPathList& pathList)
                }\r
        }\r
        pathList.SortByPathname();\r
+#endif\r
 }\r
 \r
 \r
@@ -4789,6 +4810,7 @@ bool CGitStatusListCtrl::HasPath(const CTGitPath& path)
 \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
@@ -4796,6 +4818,7 @@ bool CGitStatusListCtrl::IsPathShown(const CTGitPath& path)
                if (entry->GetPath().IsEquivalentTo(path))\r
                        return true;\r
        }\r
+#endif\r
        return false;\r
 }\r
 \r
@@ -5085,6 +5108,7 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
 \r
 size_t CGitStatusListCtrl::GetNumberOfChangelistsInSelection()\r
 {\r
+#if 0\r
        std::set<CString> changelists;\r
        POSITION pos = GetFirstSelectedItemPosition();\r
        int index;\r
@@ -5095,6 +5119,8 @@ size_t CGitStatusListCtrl::GetNumberOfChangelistsInSelection()
                        changelists.insert(entry->changelist);\r
        }\r
        return changelists.size();\r
+#endif \r
+       return 0;\r
 }\r
 \r
 bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)\r
@@ -5145,7 +5171,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
 \r
        }\r
 \r
-\r
+#if 0\r
        m_bHasIgnoreGroup = false;\r
 \r
        // now add the items which don't belong to a group\r
@@ -5191,7 +5217,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
                        it->second = InsertGroup(groupindex, &grp);\r
                }\r
        }\r
-\r
+#endif\r
        return bHasGroups;\r
 }\r
 \r
@@ -5206,8 +5232,10 @@ void CGitStatusListCtrl::NotifyCheck()
 \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
@@ -5218,16 +5246,39 @@ int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list)
 \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
-                       out+=cmdout;\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
+                       g_Git.Run(cmd,&cmdout);\r
+                       //out+=cmdout;\r
+                       out.append(cmdout,0);\r
                }\r
 \r
 \r
@@ -5242,16 +5293,16 @@ int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list)
 \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
@@ -5271,8 +5322,12 @@ int CGitStatusListCtrl::UpdateWithGitPathList(CTGitPathList &list)
        m_arStatusArray.clear();\r
        for(int i=0;i<list.GetCount();i++)\r
        {\r
-               CTGitPath * gitpatch=(CTGitPath*)&list[i];\r
-               gitpatch->m_Checked = TRUE;\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