OSDN Git Service

Fix error in call to GetTimeZoneInformation().
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index 494f74c..bc8933d 100644 (file)
@@ -301,6 +301,7 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList
                mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
        this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
 \r
+\r
 #if 0\r
        \r
        int refetchcounter = 0;\r
@@ -2064,7 +2065,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
@@ -2302,6 +2303,26 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                if (popup.CreatePopupMenu())\r
                {\r
                        //Add Menu for verion controled file\r
+               \r
+                       if (wcStatus & CTGitPath::LOGACTIONS_UNMERGED)\r
+                       {\r
+                               if ((m_dwContextMenus & SVNSLC_POPCONFLICT)/*&&(entry->textstatus == git_wc_status_conflicted)*/)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_EDITCONFLICT, IDS_MENUCONFLICT, IDI_CONFLICT);\r
+                               }\r
+                               if (m_dwContextMenus & SVNSLC_POPRESOLVE)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_RESOLVECONFLICT, IDS_STATUSLIST_CONTEXT_RESOLVED, IDI_RESOLVE);\r
+                               }\r
+                               if ((m_dwContextMenus & SVNSLC_POPRESOLVE)/*&&(entry->textstatus == git_wc_status_conflicted)*/)\r
+                               {\r
+                                       //popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
+                                       //popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
+                               }\r
+                               if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE))\r
+                                       popup.AppendMenu(MF_SEPARATOR);\r
+                       }\r
+\r
                        if (!(wcStatus &CTGitPath::LOGACTIONS_UNVER))\r
                        {\r
                                if (m_dwContextMenus & SVNSLC_POPCOMPAREWITHBASE)\r
@@ -2354,6 +2375,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                //}\r
                        }\r
                        \r
+       \r
                        ///Select Multi item\r
                        //if (GetSelectedCount() > 0)\r
                        //{\r
@@ -2401,17 +2423,17 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        //              }\r
                        //      }\r
                        //}\r
-                       if ((GetSelectedCount() == 1)&&(!wcStatus & CTGitPath::LOGACTIONS_UNVER)\r
-                               &&(!wcStatus & CTGitPath::LOGACTIONS_IGNORE))\r
+                       if ((GetSelectedCount() == 1)&&(!(wcStatus & CTGitPath::LOGACTIONS_UNVER))\r
+                               &&(!(wcStatus & CTGitPath::LOGACTIONS_IGNORE)))\r
                        {\r
                                if (m_dwContextMenus & SVNSLC_POPSHOWLOG)\r
                                {\r
                                        popup.AppendMenuIcon(IDSVNLC_LOG, IDS_REPOBROWSE_SHOWLOG, IDI_LOG);\r
                                }\r
-//                             if (m_dwContextMenus & SVNSLC_POPBLAME)\r
-//                             {\r
-//                                     popup.AppendMenuIcon(IDSVNLC_BLAME, IDS_MENUBLAME, IDI_BLAME);\r
-//                             }\r
+                               if (m_dwContextMenus & SVNSLC_POPBLAME)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_BLAME, IDS_MENUBLAME, IDI_BLAME);\r
+                               }\r
                        }\r
 //                     if ((wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing) && (GetSelectedCount() == 1))\r
 //                     {\r
@@ -2502,27 +2524,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                        }\r
-#if 0\r
-                       if (((wcStatus == git_wc_status_conflicted)||(entry->isConflicted)))\r
-                       {\r
-                               if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE))\r
-                                       popup.AppendMenu(MF_SEPARATOR);\r
 \r
-                               if ((m_dwContextMenus & SVNSLC_POPCONFLICT)&&(entry->textstatus == git_wc_status_conflicted))\r
-                               {\r
-                                       popup.AppendMenuIcon(IDSVNLC_EDITCONFLICT, IDS_MENUCONFLICT, IDI_CONFLICT);\r
-                               }\r
-                               if (m_dwContextMenus & SVNSLC_POPRESOLVE)\r
-                               {\r
-                                       popup.AppendMenuIcon(IDSVNLC_RESOLVECONFLICT, IDS_STATUSLIST_CONTEXT_RESOLVED, IDI_RESOLVE);\r
-                               }\r
-                               if ((m_dwContextMenus & SVNSLC_POPRESOLVE)&&(entry->textstatus == git_wc_status_conflicted))\r
-                               {\r
-                                       popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
-                                       popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
-                               }\r
-                       }\r
-#endif\r
+\r
 #if 0                  \r
                        if (GetSelectedCount() > 0)\r
                        {\r
@@ -2713,7 +2716,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                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
@@ -2727,6 +2730,64 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        \r
                                }\r
                                break;\r
+\r
+                       case IDSVNLC_BLAME:\r
+                               {\r
+                                       CString sCmd;\r
+                                       sCmd.Format(_T("\"%s\" /command:blame /path:\"%s\""),\r
+                                               (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), g_Git.m_CurrentDir+_T("\\")+filepath->GetWinPath());\r
+\r
+                                       CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+                               }\r
+                               break;\r
+\r
+                       case IDSVNLC_LOG:\r
+                               {\r
+                                       CString sCmd;\r
+                                       sCmd.Format(_T("\"%s\" /command:log /path:\"%s\""),\r
+                                               (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), g_Git.m_CurrentDir+_T("\\")+filepath->GetWinPath());\r
+\r
+                                       CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+                               }\r
+                               break;\r
+\r
+                       case IDSVNLC_EDITCONFLICT:\r
+                       {\r
+                               CAppUtils::ConflictEdit(*filepath);\r
+                               break;\r
+                       }\r
+                       case IDSVNLC_RESOLVECONFLICT:\r
+                       {\r
+                               if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
+                               {\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       while (pos != 0)\r
+                                       {\r
+                                               int index;\r
+                                               index = GetNextSelectedItem(pos);\r
+                                               CTGitPath * fentry =(CTGitPath*) this->GetItemData(index);\r
+                                               if(fentry == NULL)\r
+                                                       continue;\r
+\r
+                                               if ( fentry->m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
+                                               {\r
+                                                       CString cmd,output;\r
+                                                       cmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString());\r
+                                                       if(g_Git.Run(cmd,&output,CP_OEMCP))\r
+                                                       {\r
+                                                               CMessageBox::Show(m_hWnd, output, _T("TortoiseSVN"), MB_ICONERROR);\r
+                                                       }else\r
+                                                       {\r
+                                                               fentry->m_Action |= CTGitPath::LOGACTIONS_MODIFIED;\r
+                                                               fentry->m_Action &=~CTGitPath::LOGACTIONS_UNMERGED;\r
+                                                       }\r
+                                               }\r
+                                               \r
+                                       }\r
+                                       Show(m_dwShow, 0, m_bShowFolders);\r
+                               }\r
+                       }\r
+                       break;\r
 #if 0\r
                        case IDSVNLC_COPY:\r
                                CopySelectedEntriesToClipboard(0);\r
@@ -2959,38 +3020,6 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_LOG:\r
-                               {\r
-                                       CString sCmd;\r
-                                       sCmd.Format(_T("\"%s\" /command:log /path:\"%s\""),\r
-                                               (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
-                                       if (!filepath.IsUrl())\r
-                                       {\r
-                                               sCmd += _T(" /propspath:\"");\r
-                                               sCmd += filepath.GetWinPathString();\r
-                                               sCmd += _T("\"");\r
-                                       }       \r
-\r
-                                       CAppUtils::LaunchApplication(sCmd, NULL, false);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_BLAME:\r
-                               {\r
-                                       CString sCmd;\r
-                                       sCmd.Format(_T("\"%s\" /command:blame /path:\"%s\""),\r
-                                               (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")), filepath.GetWinPath());\r
-\r
-                                       if (!filepath.IsUrl())\r
-                                       {\r
-                                               sCmd += _T(" /propspath:\"");\r
-                                               sCmd += filepath.GetWinPathString();\r
-                                               sCmd += _T("\"");\r
-                                       }       \r
-\r
-                                       CAppUtils::LaunchApplication(sCmd, NULL, false);\r
-                               }\r
-                               break;\r
                        case IDSVNLC_OPEN:\r
                                {\r
                                        int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath.GetWinPath(), NULL, NULL, SW_SHOW);\r
@@ -3453,47 +3482,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        case IDSVNLC_EDITCONFLICT:\r
                                SVNDiff::StartConflictEditor(filepath);\r
                                break;\r
-                       case IDSVNLC_RESOLVECONFLICT:\r
-                       case IDSVNLC_RESOLVEMINE:\r
-                       case IDSVNLC_RESOLVETHEIRS:\r
-                               {\r
-                                       git_wc_conflict_choice_t result = git_wc_conflict_choose_merged;\r
-                                       switch (cmd)\r
-                                       {\r
-                                       case IDSVNLC_RESOLVETHEIRS:\r
-                                               result = git_wc_conflict_choose_theirs_full;\r
-                                               break;\r
-                                       case IDSVNLC_RESOLVEMINE:\r
-                                               result = git_wc_conflict_choose_mine_full;\r
-                                               break;\r
-                                       case IDSVNLC_RESOLVECONFLICT:\r
-                                               result = git_wc_conflict_choose_merged;\r
-                                               break;\r
-                                       }\r
-                                       if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
-                                       {\r
-                                               SVN git;\r
-                                               POSITION pos = GetFirstSelectedItemPosition();\r
-                                               while (pos != 0)\r
-                                               {\r
-                                                       int index;\r
-                                                       index = GetNextSelectedItem(pos);\r
-                                                       FileEntry * fentry = m_arStatusArray[m_arListArray[index]];\r
-                                                       if (!git.Resolve(fentry->GetPath(), result, FALSE))\r
-                                                       {\r
-                                                               CMessageBox::Show(m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
-                                                       }\r
-                                                       else\r
-                                                       {\r
-                                                               fentry->status = git_wc_status_modified;\r
-                                                               fentry->textstatus = git_wc_status_modified;\r
-                                                               fentry->isConflicted = false;\r
-                                                       }\r
-                                               }\r
-                                               Show(m_dwShow, 0, m_bShowFolders);\r
-                                       }\r
-                               }\r
-                               break;\r
+                       \r
                        case IDSVNLC_ADD:\r
                                {\r
                                        SVN git;\r
@@ -4053,10 +4042,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)\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
@@ -4064,7 +4064,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
@@ -4150,20 +4150,25 @@ CString CGitStatusListCtrl::GetStatisticsString()
 \r
 }\r
 \r
-CTGitPath CGitStatusListCtrl::GetCommonDirectory(bool bStrict)\r
+CString CGitStatusListCtrl::GetCommonDirectory(bool bStrict)\r
 {\r
        if (!bStrict)\r
        {\r
                // not strict means that the selected folder has priority\r
                if (!m_StatusFileList.GetCommonDirectory().IsEmpty())\r
-                       return m_StatusFileList.GetCommonDirectory();\r
+                       return m_StatusFileList.GetCommonDirectory().GetWinPath();\r
        }\r
 \r
        CTGitPath commonBaseDirectory;\r
        int nListItems = GetItemCount();\r
        for (int i=0; i<nListItems; ++i)\r
        {\r
-               CTGitPath& baseDirectory = *(CTGitPath*)this->GetItemData(i);\r
+               CTGitPath baseDirectory,*p= (CTGitPath*)this->GetItemData(i);\r
+               ASSERT(p);\r
+               if(p==NULL)\r
+                       continue;\r
+               baseDirectory = p->GetDirectory();\r
+\r
                if(commonBaseDirectory.IsEmpty())\r
                {\r
                        commonBaseDirectory = baseDirectory;\r
@@ -4177,7 +4182,7 @@ CTGitPath CGitStatusListCtrl::GetCommonDirectory(bool bStrict)
                        }\r
                }\r
        }\r
-       return commonBaseDirectory;\r
+       return g_Git.m_CurrentDir+CString(_T("\\"))+commonBaseDirectory.GetWinPath();\r
 }\r
 \r
 CTGitPath CGitStatusListCtrl::GetCommonURL(bool bStrict)\r
@@ -4310,7 +4315,7 @@ 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_UNMERGED)\r
                                {\r
                                        crText = m_Colors.GetColor(CColors::Conflict);\r
 \r
@@ -5223,7 +5228,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
@@ -5237,30 +5242,39 @@ int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list)
 \r
                for(int i=0;i<count;i++)\r
                {       \r
-                       CString cmdout;\r
+                       BYTE_VECTOR cmdout;\r
+                       cmdout.clear();\r
                        CString cmd;\r
                        if(list == NULL)\r
-                               cmd=(_T("git.exe diff-index --raw HEAD --numstat -C -M"));\r
+                               cmd=(_T("git.exe diff-index --raw HEAD --numstat -C -M -z"));\r
                        else\r
-                               cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
+                               cmd.Format(_T("git.exe diff-index  --raw HEAD --numstat -C -M -z -- \"%s\""),(*list)[i].GetGitPathString());\r
 \r
                        if(g_Git.Run(cmd,&cmdout))\r
                        {\r
-                               cmdout.Empty();\r
-                               if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&cmdout))\r
+                               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,cmdout,_T("TortoiseGit"),MB_OK);\r
+                                       CMessageBox::Show(NULL,strout,_T("TortoiseGit"),MB_OK);\r
                                        return -1;\r
                                }\r
-                               if(cmdout.IsEmpty())\r
+                               if(strout.IsEmpty())\r
                                        break; //this is initial repositoyr, there are no any history\r
 \r
-                               CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK);\r
+                               CMessageBox::Show(NULL,strout,_T("TortoiseGit"),MB_OK);\r
                                return -1;\r
 \r
                        }\r
+                       \r
+                       if(list == NULL)\r
+                               cmd=(_T("git.exe diff-index --cached --raw HEAD --numstat -C -M -z"));\r
+                       else\r
+                               cmd.Format(_T("git.exe diff-index  --cached --raw HEAD --numstat -C -M -z -- \"%s\""),(*list)[i].GetGitPathString());\r
 \r
-                       out+=cmdout;\r
+                       g_Git.Run(cmd,&cmdout);\r
+                       //out+=cmdout;\r
+                       out.append(cmdout,0);\r
                }\r
 \r
 \r
@@ -5275,16 +5289,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