OSDN Git Service

BugID 16 Fix F5 Refresh Don't work problem
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CommitDlg.cpp
index a7ca9fc..4bfa992 100644 (file)
@@ -30,6 +30,8 @@
 #include "GitStatus.h"\r
 #include "HistoryDlg.h"\r
 #include "Hooks.h"\r
+#include "CommonResource.h"\r
+#include "UnicodeUtils.h"\r
 \r
 #ifdef _DEBUG\r
 #define new DEBUG_NEW\r
@@ -74,6 +76,7 @@ void CCommitDlg::DoDataExchange(CDataExchange* pDX)
        DDX_Check(pDX, IDC_KEEPLOCK, m_bKeepLocks);\r
        DDX_Control(pDX, IDC_SPLITTER, m_wndSplitter);\r
        DDX_Check(pDX, IDC_KEEPLISTS, m_bKeepChangeList);\r
+       DDX_Check(pDX,IDC_COMMIT_AMEND,m_bCommitAmend);\r
 }\r
 \r
 BEGIN_MESSAGE_MAP(CCommitDlg, CResizableStandAloneDialog)\r
@@ -93,6 +96,7 @@ BEGIN_MESSAGE_MAP(CCommitDlg, CResizableStandAloneDialog)
        ON_STN_CLICKED(IDC_EXTERNALWARNING, &CCommitDlg::OnStnClickedExternalwarning)\r
        ON_BN_CLICKED(IDC_SIGNOFF, &CCommitDlg::OnBnClickedSignOff)\r
        ON_STN_CLICKED(IDC_COMMITLABEL, &CCommitDlg::OnStnClickedCommitlabel)\r
+    ON_BN_CLICKED(IDC_COMMIT_AMEND, &CCommitDlg::OnBnClickedCommitAmend)\r
 END_MESSAGE_MAP()\r
 \r
 BOOL CCommitDlg::OnInitDialog()\r
@@ -120,6 +124,7 @@ BOOL CCommitDlg::OnInitDialog()
        m_ListCtrl.EnableFileDrop();\r
        m_ListCtrl.SetBackgroundImage(IDI_COMMIT_BKG);\r
        \r
+       //this->DialogEnableWindow(IDC_COMMIT_AMEND,FALSE);\r
 //     m_ProjectProperties.ReadPropsPathList(m_pathList);\r
        m_cLogMessage.Init(m_ProjectProperties);\r
        m_cLogMessage.SetFont((CString)CRegString(_T("Software\\TortoiseGit\\LogFontName"), _T("Courier New")), (DWORD)CRegDWORD(_T("Software\\TortoiseGit\\LogFontSize"), 8));\r
@@ -129,6 +134,7 @@ BOOL CCommitDlg::OnInitDialog()
 \r
        m_tooltips.Create(this);\r
        m_tooltips.AddTool(IDC_EXTERNALWARNING, IDS_COMMITDLG_EXTERNALS);\r
+       m_tooltips.AddTool(IDC_COMMIT_AMEND,IDS_COMMIT_AMEND_TT);\r
 //     m_tooltips.AddTool(IDC_HISTORY, IDS_COMMITDLG_HISTORY_TT);\r
        \r
        m_SelectAll.SetCheck(BST_INDETERMINATE);\r
@@ -218,6 +224,7 @@ BOOL CCommitDlg::OnInitDialog()
        AddAnchor(IDOK, BOTTOM_RIGHT);\r
        AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
        AddAnchor(IDHELP, BOTTOM_RIGHT);\r
+       AddAnchor(IDC_COMMIT_AMEND,TOP_LEFT);\r
        \r
        if (hWndExplorer)\r
                CenterWindow(CWnd::FromHandle(hWndExplorer));\r
@@ -274,6 +281,9 @@ BOOL CCommitDlg::OnInitDialog()
        }\r
        err = FALSE;\r
 \r
+       this->UpdateData(TRUE);\r
+       this->m_bCommitAmend=FALSE;\r
+       this->UpdateData(FALSE);\r
 \r
        return FALSE;  // return TRUE unless you set the focus to a control\r
        // EXCEPTION: OCX Property Pages should return FALSE\r
@@ -296,6 +306,8 @@ void CCommitDlg::OnOK()
                        InterlockedExchange(&m_bThreadRunning, FALSE);\r
                }\r
        }\r
+       this->UpdateData();\r
+\r
        CString id;\r
        GetDlgItemText(IDC_BUGID, id);\r
        if (!m_ProjectProperties.CheckBugID(id))\r
@@ -334,19 +346,20 @@ void CCommitDlg::OnOK()
        CDWordArray arDeleted;\r
        //first add all the unversioned files the user selected\r
        //and check if all versioned files are selected\r
-       int nUnchecked = 0;\r
+       int nchecked = 0;\r
        m_bRecursive = true;\r
        int nListItems = m_ListCtrl.GetItemCount();\r
 \r
        CTGitPathList itemsToAdd;\r
        CTGitPathList itemsToRemove;\r
-       bool bCheckedInExternal = false;\r
-       bool bHasConflicted = false;\r
        //std::set<CString> checkedLists;\r
        //std::set<CString> uncheckedLists;\r
 \r
-       CString checkedfiles;\r
-       CString uncheckedfiles;\r
+       //CString checkedfiles;\r
+       //CString uncheckedfiles;\r
+\r
+       CString cmd;\r
+       CString out;\r
 \r
        for (int j=0; j<nListItems; j++)\r
        {\r
@@ -376,13 +389,27 @@ void CCommitDlg::OnOK()
                                bCheckedInExternal = true;\r
                        }\r
 #endif\r
+                       cmd.Format(_T("git.exe update-index -- \"%s\""),entry->GetGitPathString());\r
+                       g_Git.Run(cmd,&out,CP_OEMCP);\r
+                       nchecked++;\r
                        //checkedLists.insert(entry->GetGitPathString());\r
-                       checkedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
+//                     checkedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
                }\r
                else\r
                {\r
                        //uncheckedLists.insert(entry->GetGitPathString());\r
-                       uncheckedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
+                       if(entry->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+                       {       //To init git repository, there are not HEAD, so we can use git reset command\r
+                               cmd.Format(_T("git.exe rm --cache -- \"%s\""),entry->GetGitPathString());\r
+                               g_Git.Run(cmd,&out,CP_OEMCP);   \r
+                       }\r
+                       else\r
+                       {\r
+                               cmd.Format(_T("git.exe reset -- %s"),entry->GetGitPathString());\r
+                               g_Git.Run(cmd,&out,CP_OEMCP);\r
+                       }\r
+\r
+               //      uncheckedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
 #if 0\r
                        if ((entry->status != Git_wc_status_unversioned)        &&\r
                                (entry->status != Git_wc_status_ignored))\r
@@ -410,27 +437,33 @@ void CCommitDlg::OnOK()
                }\r
        }\r
 \r
-       CString cmd;\r
-       CString out;\r
-       if(uncheckedfiles.GetLength()>0)\r
-       {\r
-               cmd.Format(_T("git.exe reset -- %s"),uncheckedfiles);\r
-               g_Git.Run(cmd,&out);\r
-       }\r
+       //if(uncheckedfiles.GetLength()>0)\r
+       //{\r
+       //      cmd.Format(_T("git.exe reset -- %s"),uncheckedfiles);\r
+       //      g_Git.Run(cmd,&out);\r
+       //}\r
 \r
-       if(checkedfiles.GetLength()>0)\r
+       //if(checkedfiles.GetLength()>0)\r
+       if(nchecked||m_bCommitAmend)\r
        {\r
-               cmd.Format(_T("git.exe update-index -- %s"),checkedfiles);\r
-               g_Git.Run(cmd,&out);\r
+       //      cmd.Format(_T("git.exe update-index -- %s"),checkedfiles);\r
+       //      g_Git.Run(cmd,&out);\r
 \r
                CString tempfile=::GetTempFile();\r
-               CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
-               file.WriteString(m_sLogMessage);\r
+               CFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
+               CStringA log=CUnicodeUtils::GetUTF8( m_sLogMessage);\r
+               file.Write(log,log.GetLength());\r
+               //file.WriteString(m_sLogMessage);\r
                file.Close();\r
        \r
                out =_T("");\r
-               cmd.Format(_T("git.exe commit -F \"%s\""), tempfile);\r
-               g_Git.Run(cmd,&out);\r
+               CString amend;\r
+               if(this->m_bCommitAmend)\r
+               {\r
+                       amend=_T("--amend");\r
+               }\r
+               cmd.Format(_T("git.exe commit %s -F \"%s\""),amend, tempfile);\r
+               g_Git.Run(cmd,&out,CP_OEMCP);\r
        \r
                CFile::Remove(tempfile);\r
 \r
@@ -627,6 +660,7 @@ UINT CCommitDlg::StatusThread()
        }\r
 #endif\r
     // Initialise the list control with the status of the files/folders below us\r
+       m_ListCtrl.Clear();\r
        BOOL success = m_ListCtrl.GetStatus(m_pathList);\r
 \r
        //m_ListCtrl.UpdateFileList(git_revnum_t(GIT_REV_ZERO));\r
@@ -643,8 +677,7 @@ UINT CCommitDlg::StatusThread()
                        m_ListCtrl.Show(dwShow, m_checkedPathList);\r
                else\r
                {\r
-                       DWORD dwCheck = m_bSelectFilesForCommit ?SVNSLC_SHOWDIRECTS|SVNSLC_SHOWMODIFIED|SVNSLC_SHOWADDED|SVNSLC_SHOWREMOVED\r
-                               |SVNSLC_SHOWREPLACED|SVNSLC_SHOWMERGED|SVNSLC_SHOWLOCKS : 0;\r
+                       DWORD dwCheck = m_bSelectFilesForCommit ? dwShow : 0;\r
                        m_ListCtrl.Show(dwShow, dwCheck);\r
                        m_bSelectFilesForCommit = true;\r
                }\r
@@ -669,17 +702,17 @@ UINT CCommitDlg::StatusThread()
        }\r
        if ((m_ListCtrl.GetItemCount()==0)&&(m_ListCtrl.HasUnversionedItems()))\r
        {\r
-//             if (CMessageBox::Show(m_hWnd, IDS_COMMITDLG_NOTHINGTOCOMMITUNVERSIONED, IDS_APPNAME, MB_ICONINFORMATION | MB_YESNO)==IDYES)\r
-//             {\r
-//                     m_bShowUnversioned = TRUE;\r
-//                     GetDlgItem(IDC_SHOWUNVERSIONED)->SendMessage(BM_SETCHECK, BST_CHECKED);\r
-//                     DWORD dwShow = SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALSFROMDIFFERENTREPOS | SVNSLC_SHOWUNVERSIONED | SVNSLC_SHOWLOCKS;\r
-//                     m_ListCtrl.Show(dwShow);\r
-//             }\r
+               if (CMessageBox::Show(m_hWnd, IDS_COMMITDLG_NOTHINGTOCOMMITUNVERSIONED, IDS_APPNAME, MB_ICONINFORMATION | MB_YESNO)==IDYES)\r
+               {\r
+                       m_bShowUnversioned = TRUE;\r
+                       GetDlgItem(IDC_SHOWUNVERSIONED)->SendMessage(BM_SETCHECK, BST_CHECKED);\r
+                       DWORD dwShow = SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALSFROMDIFFERENTREPOS | SVNSLC_SHOWUNVERSIONED | SVNSLC_SHOWLOCKS;\r
+                       m_ListCtrl.Show(dwShow);\r
+               }\r
        }\r
 \r
-//     CTGitPath commonDir = m_ListCtrl.GetCommonDirectory(false);\r
-//     SetWindowText(m_sWindowTitle + _T(" - ") + commonDir.GetWinPathString());\r
+       CTGitPath commonDir = m_ListCtrl.GetCommonDirectory(false);\r
+       SetWindowText(m_sWindowTitle + _T(" - ") + commonDir.GetWinPathString());\r
 \r
        m_autolist.clear();\r
        // we don't have to block the commit dialog while we fetch the\r
@@ -1030,6 +1063,9 @@ void CCommitDlg::GetAutocompletionList()
 \r
                CTGitPath *path = (CTGitPath*)m_ListCtrl.GetItemData(i);\r
 \r
+               if(path == NULL)\r
+                       continue;\r
+\r
                CString sPartPath =path->GetGitPathString();\r
                m_autolist.insert(sPartPath);\r
 \r
@@ -1371,6 +1407,7 @@ void CCommitDlg::DoSize(int delta)
        RemoveAnchor(IDC_LOGMESSAGE);\r
        RemoveAnchor(IDC_SPLITTER);\r
        RemoveAnchor(IDC_SIGNOFF);\r
+       RemoveAnchor(IDC_COMMIT_AMEND);\r
        RemoveAnchor(IDC_LISTGROUP);\r
        RemoveAnchor(IDC_FILELIST);\r
        CSplitterControl::ChangeHeight(&m_cLogMessage, delta, CW_TOPALIGN);\r
@@ -1378,12 +1415,14 @@ void CCommitDlg::DoSize(int delta)
        CSplitterControl::ChangeHeight(&m_ListCtrl, -delta, CW_BOTTOMALIGN);\r
        CSplitterControl::ChangeHeight(GetDlgItem(IDC_LISTGROUP), -delta, CW_BOTTOMALIGN);\r
        CSplitterControl::ChangePos(GetDlgItem(IDC_SIGNOFF),0,delta);\r
+       CSplitterControl::ChangePos(GetDlgItem(IDC_COMMIT_AMEND),0,delta);\r
        AddAnchor(IDC_MESSAGEGROUP, TOP_LEFT, TOP_RIGHT);\r
        AddAnchor(IDC_LOGMESSAGE, TOP_LEFT, TOP_RIGHT);\r
        AddAnchor(IDC_SPLITTER, TOP_LEFT, TOP_RIGHT);\r
        AddAnchor(IDC_LISTGROUP, TOP_LEFT, BOTTOM_RIGHT);\r
        AddAnchor(IDC_FILELIST, TOP_LEFT, BOTTOM_RIGHT);\r
        AddAnchor(IDC_SIGNOFF,TOP_RIGHT);\r
+       AddAnchor(IDC_COMMIT_AMEND,TOP_LEFT);\r
        ArrangeLayout();\r
        // adjust the minimum size of the dialog to prevent the resizing from\r
        // moving the list control too far down.\r
@@ -1425,3 +1464,31 @@ void CCommitDlg::OnStnClickedCommitlabel()
 {\r
        // TODO: Add your control notification handler code here\r
 }\r
+\r
+void CCommitDlg::OnBnClickedCommitAmend()\r
+{\r
+    // TODO: Add your control notification handler code here\r
+       this->UpdateData();\r
+       if(this->m_bCommitAmend && this->m_AmendStr.IsEmpty())\r
+       {\r
+               GitRev rev;\r
+               BYTE_VECTOR vector;\r
+               CString head(_T("HEAD"));\r
+               g_Git.GetLog(vector,head,NULL,1);\r
+               rev.ParserFromLog(vector);\r
+               m_AmendStr=rev.m_Subject+_T("\n\n")+rev.m_Body;\r
+       }\r
+\r
+       if(this->m_bCommitAmend)\r
+       {\r
+               this->m_NoAmendStr=this->m_cLogMessage.GetText();\r
+               m_cLogMessage.SetText(m_AmendStr);\r
+\r
+       }else\r
+       {\r
+               this->m_AmendStr=this->m_cLogMessage.GetText();\r
+               m_cLogMessage.SetText(m_NoAmendStr);\r
+\r
+       }\r
+\r
+}\r