OSDN Git Service

Change Progress.h to SysProgress.h because there are two progress.h file.
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index 49241ac..0884469 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
@@ -286,7 +287,7 @@ bool CGitStatusListCtrl::SetBackgroundImage(UINT nID)
        return CAppUtils::SetListCtrlBackgroundImage(GetSafeHwnd(), nID);\r
 }\r
 \r
-BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList\r
+BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList* pathList\r
                                    , bool bUpdate /* = FALSE */\r
                                    , bool bShowIgnores /* = false */\r
                                                                   , bool bShowUnRev\r
@@ -298,7 +299,8 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList
                mask|= CGitStatusListCtrl::FILELIST_IGNORE;\r
        if(bShowUnRev)\r
                mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
-       this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
+       this->UpdateFileList(mask,bUpdate,(CTGitPathList*)pathList);\r
+\r
 \r
 #if 0\r
        \r
@@ -1081,10 +1083,18 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                        m_arStatusArray.push_back((CTGitPath*)&m_IgnoreFileList[i]);\r
                }\r
        }\r
+       int index =0;\r
        for(int i=0;i<this->m_arStatusArray.size();i++)\r
        {\r
+               //set default checkbox status\r
+               if(((CTGitPath*)m_arStatusArray[i])->m_Action & dwCheck)\r
+                       ((CTGitPath*)m_arStatusArray[i])->m_Checked=true;\r
+\r
                if(((CTGitPath*)m_arStatusArray[i])->m_Action & dwShow)\r
-                               AddEntry((CTGitPath*)m_arStatusArray[i],langID,i);\r
+               {\r
+                       AddEntry((CTGitPath*)m_arStatusArray[i],langID,index);\r
+                       index++;\r
+               }\r
        }\r
        \r
        int maxcol = ((CHeaderCtrl*)(GetDlgItem(0)))->GetItemCount()-1;\r
@@ -1441,6 +1451,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|CTGitPath::LOGACTIONS_COPY))\r
+               entryname+=rename;\r
+       \r
        InsertItem(index, entryname, icon_idx);\r
 \r
        this->SetItemData(index, (DWORD_PTR)GitPath);\r
@@ -1723,8 +1738,8 @@ void CGitStatusListCtrl::AddEntry(FileEntry * entry, WORD langID, int listIndex)
 #endif\r
 bool CGitStatusListCtrl::SetItemGroup(int item, int groupindex)\r
 {\r
-       if ((m_dwContextMenus & SVNSLC_POPCHANGELISTS) == NULL)\r
-               return false;\r
+//     if ((m_dwContextMenus & SVNSLC_POPCHANGELISTS) == NULL)\r
+//             return false;\r
        if (groupindex < 0)\r
                return false;\r
        LVITEM i = {0};\r
@@ -1781,7 +1796,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
@@ -2047,7 +2064,7 @@ bool CGitStatusListCtrl::BuildStatistics()
        {\r
                int status=((CTGitPath*)m_arStatusArray[i])->m_Action;\r
 \r
-               if(status&CTGitPath::LOGACTIONS_ADDED)\r
+               if(status&(CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_COPY))\r
                        m_nAdded++;\r
                \r
                if(status&CTGitPath::LOGACTIONS_DELETED)\r
@@ -2056,7 +2073,7 @@ bool CGitStatusListCtrl::BuildStatistics()
                if(status&(CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_MODIFIED))\r
                        m_nModified++;\r
                \r
-               if(status&CTGitPath::LOGACTIONS_CONFLICT)\r
+               if(status&CTGitPath::LOGACTIONS_UNMERGED)\r
                        m_nConflicted++;\r
                \r
                if(status&(CTGitPath::LOGACTIONS_IGNORE|CTGitPath::LOGACTIONS_UNVER))\r
@@ -2215,14 +2232,14 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                lv.mask = LVIF_GROUPID;\r
                                                lv.iItem = i;\r
                                                GetItem(&lv);\r
-#if 0\r
+\r
                                                if (lv.iGroupId == group)\r
                                                {\r
-                                                       FileEntry * entry = GetListEntry(i);\r
+                                                       CTGitPath * entry = (CTGitPath*)GetItemData(i);\r
                                                        if (entry)\r
                                                        {\r
-                                                               bool bOldCheck = !!GetCheck(i);\r
-                                                               //SetEntryCheck(entry, i, bCheck);\r
+                                                               bool bOldCheck = entry->m_Checked;\r
+                                                               SetEntryCheck(entry, i, bCheck);\r
                                                                if (bCheck != bOldCheck)\r
                                                                {\r
                                                                        if (bCheck)\r
@@ -2232,7 +2249,7 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                                }\r
                                                        }\r
                                                }\r
-#endif\r
+\r
                                        }\r
                                        GetStatisticsString();\r
                                        NotifyCheck();\r
@@ -2294,6 +2311,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,6 +2383,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                //}\r
                        }\r
                        \r
+       \r
                        ///Select Multi item\r
                        //if (GetSelectedCount() > 0)\r
                        //{\r
@@ -2393,17 +2431,26 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        //              }\r
                        //      }\r
                        //}\r
-                       if ((GetSelectedCount() == 1)&&(!wcStatus & CTGitPath::LOGACTIONS_UNVER)\r
-                               &&(!wcStatus & CTGitPath::LOGACTIONS_IGNORE))\r
+\r
+                       if ( (GetSelectedCount() >0 ) && (!(wcStatus & CTGitPath::LOGACTIONS_UNVER)))\r
+                       {\r
+                               if (m_dwContextMenus & SVNSLC_POPREVERT)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_REVERT, IDS_MENUREVERT, IDI_REVERT);\r
+                               }\r
+                       }\r
+\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
@@ -2494,27 +2541,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
@@ -2662,7 +2690,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                break;\r
                        case IDSVNLC_EXPLORE:\r
                                {\r
-                                       ShellExecute(this->m_hWnd, _T("explore"), filepath->GetWinPath(), NULL, NULL, SW_SHOW);\r
+                                       ShellExecute(this->m_hWnd, _T("explore"), filepath->GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
                                }\r
                                break;\r
                        case IDSVNLC_COMPARE:\r
@@ -2699,10 +2727,13 @@ 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
-                                               if(!g_Git.Run(cmd,&output))\r
+                                               if(!g_Git.Run(cmd,&output,CP_OEMCP))\r
                                                {\r
                                                        path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
                                                        SetEntryCheck(path,index,true);\r
@@ -2716,167 +2747,526 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        \r
                                }\r
                                break;\r
-#if 0\r
-                       case IDSVNLC_COPY:\r
-                               CopySelectedEntriesToClipboard(0);\r
-                               break;\r
-                       case IDSVNLC_COPYEXT:\r
-                               CopySelectedEntriesToClipboard((DWORD)-1);\r
-                               break;\r
-                       case IDSVNLC_PROPERTIES:\r
+\r
+                       case IDSVNLC_BLAME:\r
                                {\r
-                                       CTSVNPathList targetList;\r
-                                       FillListOfSelectedItemPaths(targetList);\r
-                                       CEditPropertiesDlg dlg;\r
-                                       dlg.SetPathList(targetList);\r
-                                       dlg.DoModal();\r
-                                       if (dlg.HasChanged())\r
-                                       {\r
-                                               // since the user might have changed/removed/added\r
-                                               // properties recursively, we don't really know\r
-                                               // which items have changed their status.\r
-                                               // So tell the parent to do a refresh.\r
-                                               CWnd* pParent = GetParent();\r
-                                               if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                               {\r
-                                                       pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                               }\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
-                       case IDSVNLC_COMMIT:\r
+\r
+                       case IDSVNLC_LOG:\r
                                {\r
-                                       CTSVNPathList targetList;\r
-                                       FillListOfSelectedItemPaths(targetList);\r
-                                       CTSVNPath tempFile = CTempFiles::Instance().GetTempFilePath(false);\r
-                                       VERIFY(targetList.WriteToFile(tempFile.GetWinPathString()));\r
-                                       CString commandline = CPathUtils::GetAppDirectory();\r
-                                       commandline += _T("TortoiseProc.exe /command:commit /pathfile:\"");\r
-                                       commandline += tempFile.GetWinPathString();\r
-                                       commandline += _T("\"");\r
-                                       commandline += _T(" /deletepathfile");\r
-                                       CAppUtils::LaunchApplication(commandline, NULL, false);\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
-                       case IDSVNLC_REVERT:\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
-                                       // If at least one item is not in the status "added"\r
-                                       // we ask for a confirmation\r
-                                       BOOL bConfirm = FALSE;\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
-                                       int index;\r
-                                       while ((index = GetNextSelectedItem(pos)) >= 0)\r
+                                       while (pos != 0)\r
                                        {\r
-                                               FileEntry * fentry = GetListEntry(index);\r
-                                               if (fentry->textstatus != git_wc_status_added)\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
-                                                       bConfirm = TRUE;\r
-                                                       break;\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
-                                       CString str;\r
-                                       str.Format(IDS_PROC_WARNREVERT,GetSelectedCount());\r
-\r
-                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
-                                       {\r
-                                               CTSVNPathList targetList;\r
-                                               FillListOfSelectedItemPaths(targetList);\r
+                                               \r
+                                       }\r
+                                       Show(m_dwShow, 0, m_bShowFolders);\r
+                               }\r
+                       }\r
+                       break;\r
 \r
-                                               // make sure that the list is reverse sorted, so that\r
-                                               // children are removed before any parents\r
-                                               targetList.SortByPathname(true);\r
+                       case IDSVNLC_IGNORE:\r
+                       {\r
+                               CTGitPathList ignorelist;\r
+                               //std::vector<CString> toremove;\r
+                               FillListOfSelectedItemPaths(ignorelist, true);\r
+                               SetRedraw(FALSE);\r
 \r
-                                               SVN git;\r
+                               if(!CAppUtils::IgnoreFile(ignorelist,false))\r
+                                       break;\r
 \r
-                                               // put all reverted files in the trashbin, except the ones with 'added'\r
-                                               // status because they are not restored by the revert.\r
-                                               CTSVNPathList delList;\r
-                                               POSITION pos = GetFirstSelectedItemPosition();\r
-                                               int index;\r
-                                               while ((index = GetNextSelectedItem(pos)) >= 0)\r
+                               for(int i=0;i<ignorelist.GetCount();i++)\r
+                               {\r
+                                       int nListboxEntries = GetItemCount();\r
+                                       for (int nItem=0; nItem<nListboxEntries; ++nItem)\r
+                                       {\r
+                                               CTGitPath *path=(CTGitPath*)GetItemData(nItem);\r
+                                               if (path->GetGitPathString()==ignorelist[i].GetGitPathString())\r
                                                {\r
-                                                       FileEntry * entry = GetListEntry(index);\r
-                                                       if (entry->status != git_wc_status_added)\r
-                                                               delList.AddPath(entry->GetPath());\r
+                                                       RemoveListEntry(nItem);\r
+                                                       break;\r
                                                }\r
-                                               if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RevertWithRecycleBin"), TRUE)))\r
-                                                       delList.DeleteAllFiles(true);\r
-\r
-                                               if (!git.Revert(targetList, CStringArray(), FALSE))\r
+                                       }\r
+                               }\r
+                               SetRedraw(TRUE);\r
+                       }\r
+#if 0\r
+                                       CTSVNPathList ignorelist;\r
+                                       std::vector<CString> toremove;\r
+                                       FillListOfSelectedItemPaths(ignorelist, true);\r
+                                       SetRedraw(FALSE);\r
+                                       for (int j=0; j<ignorelist.GetCount(); ++j)\r
+                                       {\r
+                                               int nListboxEntries = GetItemCount();\r
+                                               for (int i=0; i<nListboxEntries; ++i)\r
                                                {\r
-                                                       CMessageBox::Show(this->m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
+                                                       if (GetListEntry(i)->GetPath().IsEquivalentTo(ignorelist[j]))\r
+                                                       {\r
+                                                               selIndex = i;\r
+                                                               break;\r
+                                                       }\r
                                                }\r
-                                               else\r
+                                               CString name = CPathUtils::PathPatternEscape(ignorelist[j].GetFileOrDirectoryName());\r
+                                               CTSVNPath parentfolder = ignorelist[j].GetContainingDirectory();\r
+                                               SVNProperties props(parentfolder, SVNRev::REV_WC, false);\r
+                                               CStringA value;\r
+                                               for (int i=0; i<props.GetCount(); i++)\r
                                                {\r
-                                                       // since the entries got reverted we need to remove\r
-                                                       // them from the list too, if no remote changes are shown,\r
-                                                       // if the unmodified files are not shown\r
-                                                       // and if the item is not part of a changelist\r
-                                                       POSITION pos;\r
-                                                       SetRedraw(FALSE);\r
-                                                       while ((pos = GetFirstSelectedItemPosition())!=0)\r
+                                                       CString propname(props.GetItemName(i).c_str());\r
+                                                       if (propname.CompareNoCase(_T("git:ignore"))==0)\r
                                                        {\r
-                                                               int index;\r
-                                                               index = GetNextSelectedItem(pos);\r
-                                                               FileEntry * fentry = m_arStatusArray[m_arListArray[index]];\r
-                                                               if ( fentry->IsFolder() )\r
-                                                               {\r
-                                                                       // refresh!\r
-                                                                       CWnd* pParent = GetParent();\r
-                                                                       if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                                                       {\r
-                                                                               pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                                                       }\r
-                                                                       break;\r
-                                                               }\r
+                                                               stdstring stemp;\r
+                                                               // treat values as normal text even if they're not\r
+                                                               value = (char *)props.GetItemValue(i).c_str();\r
+                                                       }\r
+                                               }\r
+                                               if (value.IsEmpty())\r
+                                                       value = name;\r
+                                               else\r
+                                               {\r
+                                                       value = value.Trim("\n\r");\r
+                                                       value += "\n";\r
+                                                       value += name;\r
+                                                       value.Remove('\r');\r
+                                               }\r
+                                               if (!props.Add(_T("git:ignore"), (LPCSTR)value))\r
+                                               {\r
+                                                       CString temp;\r
+                                                       temp.Format(IDS_ERR_FAILEDIGNOREPROPERTY, (LPCTSTR)name);\r
+                                                       CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_ICONERROR);\r
+                                                       break;\r
+                                               }\r
+                                               if (GetCheck(selIndex))\r
+                                                       m_nSelected--;\r
+                                               m_nTotal--;\r
 \r
-                                                               BOOL bAdded = (fentry->textstatus == git_wc_status_added);\r
-                                                               fentry->status = git_wc_status_normal;\r
-                                                               fentry->propstatus = git_wc_status_normal;\r
-                                                               fentry->textstatus = git_wc_status_normal;\r
-                                                               fentry->copied = false;\r
-                                                               fentry->isConflicted = false;\r
-                                                               if ((fentry->GetChangeList().IsEmpty()&&(fentry->remotestatus <= git_wc_status_normal))||(m_dwShow & SVNSLC_SHOWNORMAL))\r
+                                               // now, if we ignored a folder, remove all its children\r
+                                               if (ignorelist[j].IsDirectory())\r
+                                               {\r
+                                                       for (int i=0; i<(int)m_arListArray.size(); ++i)\r
+                                                       {\r
+                                                               FileEntry * entry = GetListEntry(i);\r
+                                                               if (entry->status == git_wc_status_unversioned)\r
                                                                {\r
-                                                                       if ( bAdded )\r
-                                                                       {\r
-                                                                               // reverting added items makes them unversioned, not 'normal'\r
-                                                                               if (fentry->IsFolder())\r
-                                                                                       fentry->propstatus = git_wc_status_none;\r
-                                                                               else\r
-                                                                                       fentry->propstatus = git_wc_status_unversioned;\r
-                                                                               fentry->status = git_wc_status_unversioned;\r
-                                                                               fentry->textstatus = git_wc_status_unversioned;\r
-                                                                               SetItemState(index, 0, LVIS_SELECTED);\r
-                                                                               SetEntryCheck(fentry, index, false);\r
-                                                                       }\r
-                                                                       else if ((fentry->switched)||(m_dwShow & SVNSLC_SHOWNORMAL))\r
-                                                                       {\r
-                                                                               SetItemState(index, 0, LVIS_SELECTED);\r
-                                                                       }\r
-                                                                       else\r
+                                                                       if (!ignorelist[j].IsEquivalentTo(entry->GetPath())&&(ignorelist[j].IsAncestorOf(entry->GetPath())))\r
                                                                        {\r
-                                                                               m_nTotal--;\r
-                                                                               if (GetCheck(index))\r
+                                                                               entry->status = git_wc_status_ignored;\r
+                                                                               entry->textstatus = git_wc_status_ignored;\r
+                                                                               if (GetCheck(i))\r
                                                                                        m_nSelected--;\r
-                                                                               RemoveListEntry(index);\r
-                                                                               Invalidate();\r
+                                                                               toremove.push_back(entry->GetPath().GetSVNPathString());\r
                                                                        }\r
                                                                }\r
-                                                               else\r
+                                                       }\r
+                                               }\r
+\r
+                                               CTSVNPath basepath = m_arStatusArray[m_arListArray[selIndex]]->basepath;\r
+\r
+                                               FileEntry * entry = m_arStatusArray[m_arListArray[selIndex]];\r
+                                               if ( entry->status == git_wc_status_unversioned ) // keep "deleted" items\r
+                                                       toremove.push_back(entry->GetPath().GetSVNPathString());\r
+\r
+                                               if (!m_bIgnoreRemoveOnly)\r
+                                               {\r
+                                                       SVNStatus status;\r
+                                                       git_wc_status2_t * s;\r
+                                                       CTSVNPath gitPath;\r
+                                                       s = status.GetFirstFileStatus(parentfolder, gitPath, false, git_depth_empty);\r
+                                                       // first check if the folder isn't already present in the list\r
+                                                       bool bFound = false;\r
+                                                       nListboxEntries = GetItemCount();\r
+                                                       for (int i=0; i<nListboxEntries; ++i)\r
+                                                       {\r
+                                                               FileEntry * entry = GetListEntry(i);\r
+                                                               if (entry->path.IsEquivalentTo(gitPath))\r
                                                                {\r
-                                                                       SetItemState(index, 0, LVIS_SELECTED);\r
+                                                                       bFound = true;\r
+                                                                       break;\r
                                                                }\r
                                                        }\r
-                                                       SetRedraw(TRUE);\r
-                                                       SaveColumnWidths();\r
-                                                       Show(m_dwShow, 0, m_bShowFolders);\r
-                                                       NotifyCheck();\r
-                                               }\r
-                                       }\r
-                               }\r
+                                                       if (!bFound)\r
+                                                       {\r
+                                                               if (s!=0)\r
+                                                               {\r
+                                                                       FileEntry * entry = new FileEntry();\r
+                                                                       entry->path = gitPath;\r
+                                                                       entry->basepath = basepath;\r
+                                                                       entry->status = SVNStatus::GetMoreImportant(s->text_status, s->prop_status);\r
+                                                                       entry->textstatus = s->text_status;\r
+                                                                       entry->propstatus = s->prop_status;\r
+                                                                       entry->remotestatus = SVNStatus::GetMoreImportant(s->repos_text_status, s->repos_prop_status);\r
+                                                                       entry->remotetextstatus = s->repos_text_status;\r
+                                                                       entry->remotepropstatus = s->repos_prop_status;\r
+                                                                       entry->inunversionedfolder = FALSE;\r
+                                                                       entry->checked = true;\r
+                                                                       entry->inexternal = false;\r
+                                                                       entry->direct = false;\r
+                                                                       entry->isfolder = true;\r
+                                                                       entry->last_commit_date = 0;\r
+                                                                       entry->last_commit_rev = 0;\r
+                                                                       entry->remoterev = 0;\r
+                                                                       if (s->entry)\r
+                                                                       {\r
+                                                                               if (s->entry->url)\r
+                                                                               {\r
+                                                                                       entry->url = CUnicodeUtils::GetUnicode(CPathUtils::PathUnescape(s->entry->url));\r
+                                                                               }\r
+                                                                       }\r
+                                                                       if (s->entry && s->entry->present_props)\r
+                                                                       {\r
+                                                                               entry->present_props = s->entry->present_props;\r
+                                                                       }\r
+                                                                       m_arStatusArray.push_back(entry);\r
+                                                                       m_arListArray.push_back(m_arStatusArray.size()-1);\r
+                                                                       AddEntry(entry, langID, GetItemCount());\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       for (std::vector<CString>::iterator it = toremove.begin(); it != toremove.end(); ++it)\r
+                                       {\r
+                                               int nListboxEntries = GetItemCount();\r
+                                               for (int i=0; i<nListboxEntries; ++i)\r
+                                               {\r
+                                                       if (GetListEntry(i)->path.GetSVNPathString().Compare(*it)==0)\r
+                                                       {\r
+                                                               RemoveListEntry(i);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       SetRedraw(TRUE);\r
+                               }\r
+#endif\r
+                               break;\r
+                       case IDSVNLC_IGNOREMASK:\r
+                               {\r
+                                       CString common;\r
+                                       CString ext=filepath->GetFileExtension();\r
+                                       CTGitPathList ignorelist;\r
+                                       FillListOfSelectedItemPaths(ignorelist, true);\r
+                                       SetRedraw(FALSE);\r
+\r
+                                       CAppUtils::IgnoreFile(ignorelist,true);\r
+                                       common=ignorelist.GetCommonRoot().GetGitPathString();\r
+\r
+                                       for (int i=0; i< GetItemCount(); ++i)\r
+                                       {\r
+                                               CTGitPath *path=(CTGitPath*)GetItemData(i);\r
+                                               if(!( path->m_Action & CTGitPath::LOGACTIONS_UNVER))\r
+                                                       continue;\r
+                                               if( path->GetGitPathString().Left(common.GetLength()) == common )\r
+                                               {\r
+                                                       if (path->GetFileExtension()==ext)\r
+                                                       {\r
+                                                               RemoveListEntry(i);\r
+                                                               i--; // remove index i at item, new one will replace. \r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       \r
+                                       SetRedraw(TRUE);\r
+                               }\r
+#if 0\r
+                                       std::set<CTSVNPath> parentlist;\r
+                                       for (int i=0; i<ignorelist.GetCount(); ++i)\r
+                                       {\r
+                                               parentlist.insert(ignorelist[i].GetContainingDirectory());\r
+                                       }\r
+                                       std::set<CTSVNPath>::iterator it;\r
+                                       std::vector<CString> toremove;\r
+                                       \r
+                                       for (it = parentlist.begin(); it != parentlist.end(); ++it)\r
+                                       {\r
+                                               CTSVNPath parentFolder = (*it).GetDirectory();\r
+                                               SVNProperties props(parentFolder, SVNRev::REV_WC, false);\r
+                                               CStringA value;\r
+                                               for (int i=0; i<props.GetCount(); i++)\r
+                                               {\r
+                                                       CString propname(props.GetItemName(i).c_str());\r
+                                                       if (propname.CompareNoCase(_T("git:ignore"))==0)\r
+                                                       {\r
+                                                               stdstring stemp;\r
+                                                               // treat values as normal text even if they're not\r
+                                                               value = (char *)props.GetItemValue(i).c_str();\r
+                                                       }\r
+                                               }\r
+                                               if (value.IsEmpty())\r
+                                                       value = name;\r
+                                               else\r
+                                               {\r
+                                                       value = value.Trim("\n\r");\r
+                                                       value += "\n";\r
+                                                       value += name;\r
+                                                       value.Remove('\r');\r
+                                               }\r
+                                               if (!props.Add(_T("git:ignore"), (LPCSTR)value))\r
+                                               {\r
+                                                       CString temp;\r
+                                                       temp.Format(IDS_ERR_FAILEDIGNOREPROPERTY, (LPCTSTR)name);\r
+                                                       CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_ICONERROR);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       CTSVNPath basepath;\r
+                                                       int nListboxEntries = GetItemCount();\r
+                                                       for (int i=0; i<nListboxEntries; ++i)\r
+                                                       {\r
+                                                               FileEntry * entry = GetListEntry(i);\r
+                                                               ASSERT(entry != NULL);\r
+                                                               if (entry == NULL)\r
+                                                                       continue;\r
+                                                               if (basepath.IsEmpty())\r
+                                                                       basepath = entry->basepath;\r
+                                                               // since we ignored files with a mask (e.g. *.exe)\r
+                                                               // we have to find find all files in the same\r
+                                                               // folder (IsAncestorOf() returns TRUE for _all_ children,\r
+                                                               // not just the immediate ones) which match the\r
+                                                               // mask and remove them from the list too.\r
+                                                               if ((entry->status == git_wc_status_unversioned)&&(parentFolder.IsAncestorOf(entry->path)))\r
+                                                               {\r
+                                                                       CString f = entry->path.GetSVNPathString();\r
+                                                                       if (f.Mid(parentFolder.GetSVNPathString().GetLength()).Find('/')<=0)\r
+                                                                       {\r
+                                                                               if (CStringUtils::WildCardMatch(name, f))\r
+                                                                               {\r
+                                                                                       if (GetCheck(i))\r
+                                                                                               m_nSelected--;\r
+                                                                                       m_nTotal--;\r
+                                                                                       toremove.push_back(f);\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                                       if (!m_bIgnoreRemoveOnly)\r
+                                                       {\r
+                                                               SVNStatus status;\r
+                                                               git_wc_status2_t * s;\r
+                                                               CTSVNPath gitPath;\r
+                                                               s = status.GetFirstFileStatus(parentFolder, gitPath, false, git_depth_empty);\r
+                                                               if (s!=0)\r
+                                                               {\r
+                                                                       // first check if the folder isn't already present in the list\r
+                                                                       bool bFound = false;\r
+                                                                       for (int i=0; i<nListboxEntries; ++i)\r
+                                                                       {\r
+                                                                               FileEntry * entry = GetListEntry(i);\r
+                                                                               if (entry->path.IsEquivalentTo(gitPath))\r
+                                                                               {\r
+                                                                                       bFound = true;\r
+                                                                                       break;\r
+                                                                               }\r
+                                                                       }\r
+                                                                       if (!bFound)\r
+                                                                       {\r
+                                                                               FileEntry * entry = new FileEntry();\r
+                                                                               entry->path = gitPath;\r
+                                                                               entry->basepath = basepath;\r
+                                                                               entry->status = SVNStatus::GetMoreImportant(s->text_status, s->prop_status);\r
+                                                                               entry->textstatus = s->text_status;\r
+                                                                               entry->propstatus = s->prop_status;\r
+                                                                               entry->remotestatus = SVNStatus::GetMoreImportant(s->repos_text_status, s->repos_prop_status);\r
+                                                                               entry->remotetextstatus = s->repos_text_status;\r
+                                                                               entry->remotepropstatus = s->repos_prop_status;\r
+                                                                               entry->inunversionedfolder = false;\r
+                                                                               entry->checked = true;\r
+                                                                               entry->inexternal = false;\r
+                                                                               entry->direct = false;\r
+                                                                               entry->isfolder = true;\r
+                                                                               entry->last_commit_date = 0;\r
+                                                                               entry->last_commit_rev = 0;\r
+                                                                               entry->remoterev = 0;\r
+                                                                               if (s->entry)\r
+                                                                               {\r
+                                                                                       if (s->entry->url)\r
+                                                                                       {\r
+                                                                                               entry->url = CUnicodeUtils::GetUnicode(CPathUtils::PathUnescape(s->entry->url));\r
+                                                                                       }\r
+                                                                               }\r
+                                                                               if (s->entry && s->entry->present_props)\r
+                                                                               {\r
+                                                                                       entry->present_props = s->entry->present_props;\r
+                                                                               }\r
+                                                                               m_arStatusArray.push_back(entry);\r
+                                                                               m_arListArray.push_back(m_arStatusArray.size()-1);\r
+                                                                               AddEntry(entry, langID, GetItemCount());\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       for (std::vector<CString>::iterator it = toremove.begin(); it != toremove.end(); ++it)\r
+                                       {\r
+                                               int nListboxEntries = GetItemCount();\r
+                                               for (int i=0; i<nListboxEntries; ++i)\r
+                                               {\r
+                                                       if (GetListEntry(i)->path.GetSVNPathString().Compare(*it)==0)\r
+                                                       {\r
+                                                               RemoveListEntry(i);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       SetRedraw(TRUE);\r
+                               }\r
+#endif\r
+                               break;\r
+                       \r
+                               case IDSVNLC_REVERT:\r
+                               {\r
+                                       // If at least one item is not in the status "added"\r
+                                       // we ask for a confirmation\r
+                                       BOOL bConfirm = FALSE;\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       int index;\r
+                                       while ((index = GetNextSelectedItem(pos)) >= 0)\r
+                                       {\r
+                                               //FileEntry * fentry = GetListEntry(index);\r
+                                               CTGitPath *fentry=(CTGitPath*)GetItemData(index);\r
+                                               if(fentry && fentry->m_Action &CTGitPath::LOGACTIONS_MODIFIED )\r
+                                               {\r
+                                                       bConfirm = TRUE;\r
+                                                       break;\r
+                                               }\r
+                                       }       \r
+\r
+                                       CString str;\r
+                                       str.Format(IDS_PROC_WARNREVERT,GetSelectedCount());\r
+\r
+                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
+                                       {\r
+                                               CTGitPathList targetList;\r
+                                               FillListOfSelectedItemPaths(targetList);\r
+\r
+                                               // make sure that the list is reverse sorted, so that\r
+                                               // children are removed before any parents\r
+                                               targetList.SortByPathname(true);\r
+\r
+                                               // put all reverted files in the trashbin, except the ones with 'added'\r
+                                               // status because they are not restored by the revert.\r
+                                               CTGitPathList delList;\r
+                                               POSITION pos = GetFirstSelectedItemPosition();\r
+                                               int index;\r
+                                               while ((index = GetNextSelectedItem(pos)) >= 0)\r
+                                               {\r
+                                                       CTGitPath *entry=(CTGitPath *)GetItemData(index);\r
+                                                       if (entry&&(!(entry->m_Action& CTGitPath::LOGACTIONS_ADDED)))\r
+                                                               delList.AddPath(*entry);\r
+                                               }\r
+                                               if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RevertWithRecycleBin"), TRUE)))\r
+                                                       delList.DeleteAllFiles(true);\r
+\r
+                                               if (g_Git.Revert(targetList))\r
+                                               {\r
+                                                       CMessageBox::Show(this->m_hWnd, _T("Revert Fail"), _T("TortoiseSVN"), MB_ICONERROR);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       for(int i=0;i<targetList.GetCount();i++)\r
+                                                       {       \r
+                                                               int nListboxEntries = GetItemCount();\r
+                                                               for (int nItem=0; nItem<nListboxEntries; ++nItem)\r
+                                                               {\r
+                                                                       CTGitPath *path=(CTGitPath*)GetItemData(nItem);\r
+                                                                       if (path->GetGitPathString()==targetList[i].GetGitPathString())\r
+                                                                       {\r
+                                                                               RemoveListEntry(nItem);\r
+                                                                               break;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                                       SetRedraw(TRUE);\r
+                                                       SaveColumnWidths();\r
+                                                       Show(m_dwShow, 0, m_bShowFolders);\r
+                                                       NotifyCheck();\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+#if 0\r
+                       case IDSVNLC_COPY:\r
+                               CopySelectedEntriesToClipboard(0);\r
+                               break;\r
+                       case IDSVNLC_COPYEXT:\r
+                               CopySelectedEntriesToClipboard((DWORD)-1);\r
+                               break;\r
+                       case IDSVNLC_PROPERTIES:\r
+                               {\r
+                                       CTSVNPathList targetList;\r
+                                       FillListOfSelectedItemPaths(targetList);\r
+                                       CEditPropertiesDlg dlg;\r
+                                       dlg.SetPathList(targetList);\r
+                                       dlg.DoModal();\r
+                                       if (dlg.HasChanged())\r
+                                       {\r
+                                               // since the user might have changed/removed/added\r
+                                               // properties recursively, we don't really know\r
+                                               // which items have changed their status.\r
+                                               // So tell the parent to do a refresh.\r
+                                               CWnd* pParent = GetParent();\r
+                                               if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
+                                               {\r
+                                                       pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case IDSVNLC_COMMIT:\r
+                               {\r
+                                       CTSVNPathList targetList;\r
+                                       FillListOfSelectedItemPaths(targetList);\r
+                                       CTSVNPath tempFile = CTempFiles::Instance().GetTempFilePath(false);\r
+                                       VERIFY(targetList.WriteToFile(tempFile.GetWinPathString()));\r
+                                       CString commandline = CPathUtils::GetAppDirectory();\r
+                                       commandline += _T("TortoiseProc.exe /command:commit /pathfile:\"");\r
+                                       commandline += tempFile.GetWinPathString();\r
+                                       commandline += _T("\"");\r
+                                       commandline += _T(" /deletepathfile");\r
+                                       CAppUtils::LaunchApplication(commandline, NULL, false);\r
+                               }\r
                                break;\r
+               \r
                        case IDSVNLC_COMPARE:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
@@ -2948,38 +3338,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
@@ -3290,199 +3648,10 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        SetRedraw(TRUE);\r
                                }\r
                                break;\r
-                       case IDSVNLC_IGNORE:\r
-                               {\r
-                                       CTSVNPathList ignorelist;\r
-                                       std::vector<CString> toremove;\r
-                                       FillListOfSelectedItemPaths(ignorelist, true);\r
-                                       SetRedraw(FALSE);\r
-                                       for (int j=0; j<ignorelist.GetCount(); ++j)\r
-                                       {\r
-                                               int nListboxEntries = GetItemCount();\r
-                                               for (int i=0; i<nListboxEntries; ++i)\r
-                                               {\r
-                                                       if (GetListEntry(i)->GetPath().IsEquivalentTo(ignorelist[j]))\r
-                                                       {\r
-                                                               selIndex = i;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                               CString name = CPathUtils::PathPatternEscape(ignorelist[j].GetFileOrDirectoryName());\r
-                                               CTSVNPath parentfolder = ignorelist[j].GetContainingDirectory();\r
-                                               SVNProperties props(parentfolder, SVNRev::REV_WC, false);\r
-                                               CStringA value;\r
-                                               for (int i=0; i<props.GetCount(); i++)\r
-                                               {\r
-                                                       CString propname(props.GetItemName(i).c_str());\r
-                                                       if (propname.CompareNoCase(_T("git:ignore"))==0)\r
-                                                       {\r
-                                                               stdstring stemp;\r
-                                                               // treat values as normal text even if they're not\r
-                                                               value = (char *)props.GetItemValue(i).c_str();\r
-                                                       }\r
-                                               }\r
-                                               if (value.IsEmpty())\r
-                                                       value = name;\r
-                                               else\r
-                                               {\r
-                                                       value = value.Trim("\n\r");\r
-                                                       value += "\n";\r
-                                                       value += name;\r
-                                                       value.Remove('\r');\r
-                                               }\r
-                                               if (!props.Add(_T("git:ignore"), (LPCSTR)value))\r
-                                               {\r
-                                                       CString temp;\r
-                                                       temp.Format(IDS_ERR_FAILEDIGNOREPROPERTY, (LPCTSTR)name);\r
-                                                       CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_ICONERROR);\r
-                                                       break;\r
-                                               }\r
-                                               if (GetCheck(selIndex))\r
-                                                       m_nSelected--;\r
-                                               m_nTotal--;\r
-\r
-                                               // now, if we ignored a folder, remove all its children\r
-                                               if (ignorelist[j].IsDirectory())\r
-                                               {\r
-                                                       for (int i=0; i<(int)m_arListArray.size(); ++i)\r
-                                                       {\r
-                                                               FileEntry * entry = GetListEntry(i);\r
-                                                               if (entry->status == git_wc_status_unversioned)\r
-                                                               {\r
-                                                                       if (!ignorelist[j].IsEquivalentTo(entry->GetPath())&&(ignorelist[j].IsAncestorOf(entry->GetPath())))\r
-                                                                       {\r
-                                                                               entry->status = git_wc_status_ignored;\r
-                                                                               entry->textstatus = git_wc_status_ignored;\r
-                                                                               if (GetCheck(i))\r
-                                                                                       m_nSelected--;\r
-                                                                               toremove.push_back(entry->GetPath().GetSVNPathString());\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-\r
-                                               CTSVNPath basepath = m_arStatusArray[m_arListArray[selIndex]]->basepath;\r
-\r
-                                               FileEntry * entry = m_arStatusArray[m_arListArray[selIndex]];\r
-                                               if ( entry->status == git_wc_status_unversioned ) // keep "deleted" items\r
-                                                       toremove.push_back(entry->GetPath().GetSVNPathString());\r
-\r
-                                               if (!m_bIgnoreRemoveOnly)\r
-                                               {\r
-                                                       SVNStatus status;\r
-                                                       git_wc_status2_t * s;\r
-                                                       CTSVNPath gitPath;\r
-                                                       s = status.GetFirstFileStatus(parentfolder, gitPath, false, git_depth_empty);\r
-                                                       // first check if the folder isn't already present in the list\r
-                                                       bool bFound = false;\r
-                                                       nListboxEntries = GetItemCount();\r
-                                                       for (int i=0; i<nListboxEntries; ++i)\r
-                                                       {\r
-                                                               FileEntry * entry = GetListEntry(i);\r
-                                                               if (entry->path.IsEquivalentTo(gitPath))\r
-                                                               {\r
-                                                                       bFound = true;\r
-                                                                       break;\r
-                                                               }\r
-                                                       }\r
-                                                       if (!bFound)\r
-                                                       {\r
-                                                               if (s!=0)\r
-                                                               {\r
-                                                                       FileEntry * entry = new FileEntry();\r
-                                                                       entry->path = gitPath;\r
-                                                                       entry->basepath = basepath;\r
-                                                                       entry->status = SVNStatus::GetMoreImportant(s->text_status, s->prop_status);\r
-                                                                       entry->textstatus = s->text_status;\r
-                                                                       entry->propstatus = s->prop_status;\r
-                                                                       entry->remotestatus = SVNStatus::GetMoreImportant(s->repos_text_status, s->repos_prop_status);\r
-                                                                       entry->remotetextstatus = s->repos_text_status;\r
-                                                                       entry->remotepropstatus = s->repos_prop_status;\r
-                                                                       entry->inunversionedfolder = FALSE;\r
-                                                                       entry->checked = true;\r
-                                                                       entry->inexternal = false;\r
-                                                                       entry->direct = false;\r
-                                                                       entry->isfolder = true;\r
-                                                                       entry->last_commit_date = 0;\r
-                                                                       entry->last_commit_rev = 0;\r
-                                                                       entry->remoterev = 0;\r
-                                                                       if (s->entry)\r
-                                                                       {\r
-                                                                               if (s->entry->url)\r
-                                                                               {\r
-                                                                                       entry->url = CUnicodeUtils::GetUnicode(CPathUtils::PathUnescape(s->entry->url));\r
-                                                                               }\r
-                                                                       }\r
-                                                                       if (s->entry && s->entry->present_props)\r
-                                                                       {\r
-                                                                               entry->present_props = s->entry->present_props;\r
-                                                                       }\r
-                                                                       m_arStatusArray.push_back(entry);\r
-                                                                       m_arListArray.push_back(m_arStatusArray.size()-1);\r
-                                                                       AddEntry(entry, langID, GetItemCount());\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       for (std::vector<CString>::iterator it = toremove.begin(); it != toremove.end(); ++it)\r
-                                       {\r
-                                               int nListboxEntries = GetItemCount();\r
-                                               for (int i=0; i<nListboxEntries; ++i)\r
-                                               {\r
-                                                       if (GetListEntry(i)->path.GetSVNPathString().Compare(*it)==0)\r
-                                                       {\r
-                                                               RemoveListEntry(i);\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       SetRedraw(TRUE);\r
-                               }\r
-                               break;\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
@@ -4042,10 +4211,21 @@ void CGitStatusListCtrl::StartDiff(int fileindex)
 {\r
        if(fileindex<0)\r
                return;\r
+\r
+       CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+       CTGitPath file2;\r
+       if(file1.m_Action & (CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_COPY))\r
+       {\r
+               file2.SetFromGit(file1.GetGitOldPathString());\r
+       }else\r
+       {\r
+               file2=file1;\r
+       }\r
+\r
        if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
        {\r
                if(!g_Git.IsInitRepos())\r
-                       CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+                       CGitDiff::Diff(&file1,&file2,\r
                                CString(GIT_REV_ZERO),\r
                                        GitRev::GetHead());\r
                else\r
@@ -4053,7 +4233,7 @@ void CGitStatusListCtrl::StartDiff(int fileindex)
                                CString(GIT_REV_ZERO));\r
        }else\r
        {\r
-               CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+               CGitDiff::Diff(&file1,&file2,\r
                                m_CurrentVersion,\r
                                        m_CurrentVersion+_T("~1"));\r
        }\r
@@ -4139,20 +4319,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
@@ -4166,7 +4351,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
@@ -4299,15 +4484,19 @@ void CGitStatusListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
                                // brown  : missing, deleted, replaced\r
                                // green  : merged (or potential merges)\r
                                // red    : conflicts or sure conflicts\r
-                               if(entry->m_Action & CTGitPath::LOGACTIONS_CONFLICT)\r
+                               if(entry->m_Action & CTGitPath::LOGACTIONS_GRAY)\r
+                               {\r
+                                       crText = RGB(128,128,128);\r
+\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
+                               }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
+                               }else if(entry->m_Action & (CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_COPY))\r
                                {\r
                                        crText = m_Colors.GetColor(CColors::Added);\r
                                }\r
@@ -4347,9 +4536,13 @@ BOOL CGitStatusListCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
 \r
 void CGitStatusListCtrl::RemoveListEntry(int index)\r
 {\r
-#if 0\r
+\r
        Locker lock(m_critSec);\r
        DeleteItem(index);\r
+\r
+       m_arStatusArray.erase(m_arStatusArray.begin()+index);\r
+\r
+#if 0\r
        delete m_arStatusArray[m_arListArray[index]];\r
        m_arStatusArray.erase(m_arStatusArray.begin()+m_arListArray[index]);\r
        m_arListArray.erase(m_arListArray.begin()+index);\r
@@ -4401,20 +4594,20 @@ void CGitStatusListCtrl::SetCheckOnAllDescendentsOf(const FileEntry* parentEntry
 \r
 void CGitStatusListCtrl::WriteCheckedNamesToPathList(CTGitPathList& pathList)\r
 {\r
-#if 0\r
+\r
        pathList.Clear();\r
        int nListItems = GetItemCount();\r
        for (int i=0; i< nListItems; i++)\r
        {\r
-               const FileEntry* entry = GetListEntry(i);\r
+               CTGitPath * entry = (CTGitPath*)GetItemData(i);\r
                ASSERT(entry != NULL);\r
-               if (entry->IsChecked())\r
+               if (entry->m_Checked)\r
                {\r
-                       pathList.AddPath(entry->path);\r
+                       pathList.AddPath(*entry);\r
                }\r
        }\r
        pathList.SortByPathname();\r
-#endif\r
+\r
 }\r
 \r
 \r
@@ -5119,7 +5312,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
        TCHAR groupname[1024];\r
        int groupindex = 0;\r
 \r
-       if(bHasGroups);\r
+       if(bHasGroups)\r
        {\r
                LVGROUP grp = {0};\r
                grp.cbSize = sizeof(LVGROUP);\r
@@ -5151,7 +5344,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
@@ -5197,7 +5390,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
                        it->second = InsertGroup(groupindex, &grp);\r
                }\r
        }\r
-\r
+#endif\r
        return bHasGroups;\r
 }\r
 \r
@@ -5212,7 +5405,7 @@ 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
@@ -5226,34 +5419,65 @@ 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
-                       else\r
-                               cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
-\r
-                       if(g_Git.Run(cmd,&cmdout))\r
+                       if(!g_Git.IsInitRepos())\r
                        {\r
-                               cmdout.Empty();\r
-                               if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&cmdout))\r
+                               if(list == NULL)\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 -z -- \"%s\""),(*list)[i].GetGitPathString());\r
+       \r
+                               if(g_Git.Run(cmd,&cmdout))\r
                                {\r
-                                       CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\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
-                               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
+                               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
+                       else // Init Repository\r
+                       {\r
+                               if(list == NULL)\r
+                                       cmd=_T("git.exe ls-files -s -t -z");\r
+                               else\r
+                                       cmd.Format(_T("git.exe ls-files -s -t -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
+               if(g_Git.IsInitRepos())\r
+               {\r
+                       m_StatusFileList.ParserFromLsFile(out);\r
+                       for(int i=0;i<m_StatusFileList.GetCount();i++)\r
+                               ((CTGitPath&)(m_StatusFileList[i])).m_Action=CTGitPath::LOGACTIONS_ADDED;\r
+               }\r
+               else\r
+                       this->m_StatusFileList.ParserFromLog(out);\r
 \r
-               this->m_StatusFileList.ParserFromLog(out);\r
+               \r
        }else\r
        {\r
                int count = 0;\r
@@ -5264,16 +5488,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
@@ -5293,8 +5517,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
@@ -5343,6 +5571,15 @@ int CGitStatusListCtrl::UpdateFileList(int mask,bool once,CTGitPathList *List)
        }\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