OSDN Git Service

Add union code encode at commit support i18n.commitencoding
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CommitDlg.cpp
index 7b23d16..d7e189b 100644 (file)
@@ -32,6 +32,8 @@
 #include "Hooks.h"\r
 #include "CommonResource.h"\r
 #include "UnicodeUtils.h"\r
+#include "ProgressDlg.h"\r
+#include "ShellUpdater.h"\r
 \r
 #ifdef _DEBUG\r
 #define new DEBUG_NEW\r
@@ -50,11 +52,12 @@ CCommitDlg::CCommitDlg(CWnd* pParent /*=NULL*/)
        , m_bThreadRunning(FALSE)\r
        , m_bRunThread(FALSE)\r
        , m_pThread(NULL)\r
-       , m_bKeepLocks(FALSE)\r
+       , m_bWholeProject(FALSE)\r
        , m_bKeepChangeList(TRUE)\r
        , m_itemsCount(0)\r
        , m_bSelectFilesForCommit(TRUE)\r
 {\r
+       this->m_bCommitAmend=FALSE;\r
 }\r
 \r
 CCommitDlg::~CCommitDlg()\r
@@ -73,9 +76,10 @@ void CCommitDlg::DoDataExchange(CDataExchange* pDX)
        DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);\r
        DDX_Control(pDX, IDC_SELECTALL, m_SelectAll);\r
        DDX_Text(pDX, IDC_BUGID, m_sBugID);\r
-       DDX_Check(pDX, IDC_KEEPLOCK, m_bKeepLocks);\r
+       DDX_Check(pDX, IDC_WHOLE_PROJECT, m_bWholeProject);\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
@@ -95,6 +99,8 @@ 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
+    ON_BN_CLICKED(IDC_WHOLE_PROJECT, &CCommitDlg::OnBnClickedWholeProject)\r
 END_MESSAGE_MAP()\r
 \r
 BOOL CCommitDlg::OnInitDialog()\r
@@ -110,11 +116,11 @@ BOOL CCommitDlg::OnInitDialog()
        m_bKeepChangeList = m_regKeepChangelists;\r
 \r
 //     GitConfig config;\r
-//     m_bKeepLocks = config.KeepLocks();\r
+//     m_bWholeProject = config.KeepLocks();\r
 \r
        UpdateData(FALSE);\r
        \r
-       m_ListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("CommitDlg"));\r
+       m_ListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS | SVNSLC_COLADD |SVNSLC_COLDEL, _T("CommitDlg"));\r
        m_ListCtrl.SetSelectButton(&m_SelectAll);\r
        m_ListCtrl.SetStatLabel(GetDlgItem(IDC_STATISTICS));\r
        m_ListCtrl.SetCancelBool(&m_bCancelled);\r
@@ -122,6 +128,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
@@ -131,6 +138,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
@@ -194,7 +202,7 @@ BOOL CCommitDlg::OnInitDialog()
        \r
        AdjustControlSize(IDC_SHOWUNVERSIONED);\r
        AdjustControlSize(IDC_SELECTALL);\r
-       AdjustControlSize(IDC_KEEPLOCK);\r
+       AdjustControlSize(IDC_WHOLE_PROJECT);\r
 \r
        GetClientRect(m_DlgOrigRect);\r
        m_cLogMessage.GetClientRect(m_LogMsgOrigRect);\r
@@ -215,11 +223,12 @@ BOOL CCommitDlg::OnInitDialog()
        AddAnchor(IDC_SELECTALL, BOTTOM_LEFT);\r
        AddAnchor(IDC_EXTERNALWARNING, BOTTOM_RIGHT);\r
        AddAnchor(IDC_STATISTICS, BOTTOM_LEFT, BOTTOM_RIGHT);\r
-       AddAnchor(IDC_KEEPLOCK, BOTTOM_LEFT);\r
+       AddAnchor(IDC_WHOLE_PROJECT, BOTTOM_LEFT);\r
        AddAnchor(IDC_KEEPLISTS, BOTTOM_LEFT);\r
        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
@@ -276,6 +285,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
@@ -298,6 +310,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
@@ -306,6 +320,12 @@ void CCommitDlg::OnOK()
                return;\r
        }\r
        m_sLogMessage = m_cLogMessage.GetText();\r
+       if ( m_sLogMessage.IsEmpty() )\r
+       {\r
+               // no message entered, go round again\r
+               CMessageBox::Show(this->m_hWnd, IDS_COMMITDLG_NOMESSAGE, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
+               return;\r
+       }\r
        if ((m_ProjectProperties.bWarnIfNoIssue) && (id.IsEmpty() && !m_ProjectProperties.HasBugID(m_sLogMessage)))\r
        {\r
                if (CMessageBox::Show(this->m_hWnd, IDS_COMMITDLG_NOISSUEWARNING, IDS_APPNAME, MB_YESNO | MB_ICONWARNING)!=IDYES)\r
@@ -336,15 +356,12 @@ 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
@@ -382,9 +399,16 @@ 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);\r
+                       if( entry->m_Action & CTGitPath::LOGACTIONS_UNVER)\r
+                               cmd.Format(_T("git.exe add -f -- \"%s\""),entry->GetGitPathString());\r
+                       else if ( entry->m_Action & CTGitPath::LOGACTIONS_DELETED)\r
+                               cmd.Format(_T("git.exe update-index --remove -- \"%s\""),entry->GetGitPathString());\r
+                       else\r
+                               cmd.Format(_T("git.exe update-index  -- \"%s\""),entry->GetGitPathString());\r
+\r
+                       g_Git.Run(cmd,&out,CP_ACP);\r
                        nchecked++;\r
+\r
                        //checkedLists.insert(entry->GetGitPathString());\r
 //                     checkedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
                }\r
@@ -394,12 +418,12 @@ void CCommitDlg::OnOK()
                        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);    \r
+                               g_Git.Run(cmd,&out,CP_ACP);     \r
                        }\r
-                       else\r
+                       else if(!( entry->m_Action & CTGitPath::LOGACTIONS_UNVER ) )\r
                        {\r
-                               cmd.Format(_T("git.exe reset -- %s"),entry->GetGitPathString());\r
-                               g_Git.Run(cmd,&out);\r
+                               cmd.Format(_T("git.exe reset -- \"%s\""),entry->GetGitPathString());\r
+                               g_Git.Run(cmd,&out,CP_ACP);\r
                        }\r
 \r
                //      uncheckedfiles += _T("\"")+entry->GetGitPathString()+_T("\" ");\r
@@ -428,6 +452,8 @@ void CCommitDlg::OnOK()
                        }\r
 #endif\r
                }\r
+\r
+               CShellUpdater::Instance().AddPathForUpdate(*entry);\r
        }\r
 \r
        //if(uncheckedfiles.GetLength()>0)\r
@@ -436,26 +462,40 @@ void CCommitDlg::OnOK()
        //      g_Git.Run(cmd,&out);\r
        //}\r
 \r
+       BOOL bCloseCommitDlg=true;\r
        //if(checkedfiles.GetLength()>0)\r
-       if(nchecked)\r
+       if(nchecked||m_bCommitAmend)\r
        {\r
        //      cmd.Format(_T("git.exe update-index -- %s"),checkedfiles);\r
        //      g_Git.Run(cmd,&out);\r
 \r
                CString tempfile=::GetTempFile();\r
-               CFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
-               CStringA log=CUnicodeUtils::GetUTF8( m_sLogMessage);\r
-               file.Write(log,log.GetLength());\r
+               \r
+               CAppUtils::SaveCommitUnicodeFile(tempfile,m_sLogMessage);\r
                //file.WriteString(m_sLogMessage);\r
-               file.Close();\r
+                               \r
        \r
                out =_T("");\r
-               cmd.Format(_T("git.exe commit -F \"%s\""), tempfile);\r
-               g_Git.Run(cmd,&out);\r
-       \r
-               CFile::Remove(tempfile);\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
+               \r
+               CProgressDlg progress;\r
+               progress.m_GitCmd=cmd;\r
+               progress.m_bShowCommand = FALSE;        // don't show the commit command\r
+               progress.m_PreText = out;                       // show any output already generated in log window\r
+               progress.DoModal();\r
+               \r
+               if(progress.m_GitStatus)\r
+               {\r
+                       bCloseCommitDlg = false;\r
+                       this->Refresh();\r
+               }\r
 \r
-               CMessageBox::Show(this->m_hWnd, out, _T("Commit Finish"), MB_OK | MB_ICONINFORMATION);\r
+               CFile::Remove(tempfile);\r
        }else\r
                CMessageBox::Show(this->m_hWnd, _T("Nothing Commit"), _T("Commit Finish"), MB_OK | MB_ICONINFORMATION);\r
 #if 0\r
@@ -573,8 +613,8 @@ void CCommitDlg::OnOK()
 #endif\r
        UpdateData();\r
        m_regAddBeforeCommit = m_bShowUnversioned;\r
-       if (!GetDlgItem(IDC_KEEPLOCK)->IsWindowEnabled())\r
-               m_bKeepLocks = FALSE;\r
+       if (!GetDlgItem(IDC_WHOLE_PROJECT)->IsWindowEnabled())\r
+               m_bWholeProject = FALSE;\r
        m_regKeepChangelists = m_bKeepChangeList;\r
        if (!GetDlgItem(IDC_KEEPLISTS)->IsWindowEnabled())\r
                m_bKeepChangeList = FALSE;\r
@@ -596,7 +636,10 @@ void CCommitDlg::OnOK()
 \r
        SaveSplitterPos();\r
 \r
-       CResizableStandAloneDialog::OnOK();\r
+       if( bCloseCommitDlg )\r
+               CResizableStandAloneDialog::OnOK();\r
+\r
+       CShellUpdater::Instance().Flush();\r
 }\r
 \r
 void CCommitDlg::SaveSplitterPos()\r
@@ -628,31 +671,32 @@ UINT CCommitDlg::StatusThread()
 \r
        DialogEnableWindow(IDOK, false);\r
        DialogEnableWindow(IDC_SHOWUNVERSIONED, false);\r
+    DialogEnableWindow(IDC_WHOLE_PROJECT, false);\r
        DialogEnableWindow(IDC_SELECTALL, false);\r
        GetDlgItem(IDC_EXTERNALWARNING)->ShowWindow(SW_HIDE);\r
        DialogEnableWindow(IDC_EXTERNALWARNING, false);\r
     // read the list of recent log entries before querying the WC for status\r
     // -> the user may select one and modify / update it while we are crawling the WC\r
-#if 0\r
+\r
        if (m_History.GetCount()==0)\r
        {\r
                CString reg;\r
-               if (m_ListCtrl.m_sUUID.IsEmpty() && m_pathList.GetCount()>0)\r
-               {\r
-                       Git Git;\r
-                       reg.Format(_T("Software\\TortoiseGit\\History\\commit%s"), (LPCTSTR)Git.GetUUIDFromPath(m_pathList[0]));\r
-               }\r
-               else\r
-                       reg.Format(_T("Software\\TortoiseGit\\History\\commit%s"), (LPCTSTR)m_ListCtrl.m_sUUID);\r
+               reg.Format(_T("Software\\TortoiseGit\\History\\commit%s"), (LPCTSTR)m_ListCtrl.m_sUUID);\r
+               reg.Replace(_T(':'),_T('_'));\r
                m_History.Load(reg, _T("logmsgs"));\r
        }\r
-#endif\r
+\r
     // Initialise the list control with the status of the files/folders below us\r
-       BOOL success = m_ListCtrl.GetStatus(m_pathList);\r
+       m_ListCtrl.Clear();\r
+       BOOL success;\r
+    if(m_bWholeProject)\r
+        success=m_ListCtrl.GetStatus(NULL);\r
+    else\r
+        success=m_ListCtrl.GetStatus(&m_pathList);\r
 \r
        //m_ListCtrl.UpdateFileList(git_revnum_t(GIT_REV_ZERO));\r
        if(this->m_bShowUnversioned)\r
-               m_ListCtrl.UpdateFileList(CGitStatusListCtrl::FILELIST_UNVER);\r
+               m_ListCtrl.UpdateFileList(CGitStatusListCtrl::FILELIST_UNVER,true,&m_pathList);\r
        \r
        m_ListCtrl.CheckIfChangelistsArePresent(false);\r
 \r
@@ -664,8 +708,8 @@ 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
+                       dwCheck &=~(CTGitPath::LOGACTIONS_UNVER); //don't check unversion file default. \r
                        m_ListCtrl.Show(dwShow, dwCheck);\r
                        m_bSelectFilesForCommit = true;\r
                }\r
@@ -690,17 +734,22 @@ 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 = (DWORD)(SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALSFROMDIFFERENTREPOS | SVNSLC_SHOWUNVERSIONED | SVNSLC_SHOWLOCKS);\r
+                       m_ListCtrl.UpdateFileList(CGitStatusListCtrl::FILELIST_UNVER);\r
+                       m_ListCtrl.Show(dwShow,dwShow&(~CTGitPath::LOGACTIONS_UNVER));\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
+\r
+    if(this->m_bWholeProject)   \r
+        SetWindowText(m_sWindowTitle + _T(" - ") + CString(_T("Whole Project")));\r
+    else\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
@@ -716,11 +765,12 @@ UINT CCommitDlg::StatusThread()
        if (m_bRunThread)\r
        {\r
                DialogEnableWindow(IDC_SHOWUNVERSIONED, true);\r
+        DialogEnableWindow(IDC_WHOLE_PROJECT, true);\r
                DialogEnableWindow(IDC_SELECTALL, true);\r
                if (m_ListCtrl.HasChangeLists())\r
                        DialogEnableWindow(IDC_KEEPLISTS, true);\r
                if (m_ListCtrl.HasLocks())\r
-                       DialogEnableWindow(IDC_KEEPLOCK, true);\r
+                       DialogEnableWindow(IDC_WHOLE_PROJECT, true);\r
                // we have the list, now signal the main thread about it\r
                SendMessage(WM_AUTOLISTREADY);  // only send the message if the thread wasn't told to quit!\r
        }\r
@@ -864,7 +914,10 @@ void CCommitDlg::OnBnClickedShowunversioned()
                        dwShow &= ~SVNSLC_SHOWUNVERSIONED;\r
                if(dwShow & SVNSLC_SHOWUNVERSIONED)\r
                {\r
-                       m_ListCtrl.GetStatus(this->m_pathList,false,false,true);\r
+            if(m_bWholeProject)\r
+                m_ListCtrl.GetStatus(NULL,false,false,true);\r
+            else\r
+                           m_ListCtrl.GetStatus(&this->m_pathList,false,false,true);\r
                }\r
                m_ListCtrl.Show(dwShow);\r
        }\r
@@ -903,7 +956,7 @@ LRESULT CCommitDlg::OnGitStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
        return 0;\r
 }\r
 \r
-LRESULT CCommitDlg::OnFileDropped(WPARAM, LPARAM lParam)\r
+LRESULT CCommitDlg::OnFileDropped(WPARAM, LPARAM /*lParam*/)\r
 {\r
 #if 0\r
        BringWindowToTop();\r
@@ -1182,11 +1235,20 @@ void CCommitDlg::InsertMenuItems(CMenu& mPopup, int& nCmd)
        CString sMenuItemText(MAKEINTRESOURCE(IDS_COMMITDLG_POPUP_PASTEFILELIST));\r
        m_nPopupPasteListCmd = nCmd++;\r
        mPopup.AppendMenu(MF_STRING | MF_ENABLED, m_nPopupPasteListCmd, sMenuItemText);\r
+\r
+       //CString sMenuItemText(MAKEINTRESOURCE(IDS_COMMITDLG_POPUP_PASTEFILELIST));\r
+       if(m_History.GetCount() > 0)\r
+       {\r
+               sMenuItemText.LoadString(IDS_COMMITDLG_POPUP_PASTELASTMESSAGE);\r
+               m_nPopupPasteLastMessage = nCmd++;\r
+               mPopup.AppendMenu(MF_STRING | MF_ENABLED, m_nPopupPasteLastMessage, sMenuItemText);\r
+       }\r
+       \r
 }\r
 \r
 bool CCommitDlg::HandleMenuItemClick(int cmd, CSciEdit * pSciEdit)\r
 {\r
-#if 0\r
+\r
        if (m_bBlock)\r
                return false;\r
        if (cmd == m_nPopupPasteListCmd)\r
@@ -1196,27 +1258,37 @@ bool CCommitDlg::HandleMenuItemClick(int cmd, CSciEdit * pSciEdit)
                int nListItems = m_ListCtrl.GetItemCount();\r
                for (int i=0; i<nListItems; ++i)\r
                {\r
-                       CGitStatusListCtrl::FileEntry * entry = m_ListCtrl.GetListEntry(i);\r
-                       if (entry->IsChecked())\r
+                       CTGitPath * entry = (CTGitPath*)m_ListCtrl.GetItemData(i);\r
+                       if (entry&&entry->m_Checked)\r
                        {\r
                                CString line;\r
-                               Git_wc_status_kind status = entry->status;\r
-                               if (status == Git_wc_status_unversioned)\r
-                                       status = Git_wc_status_added;\r
-                               if (status == Git_wc_status_missing)\r
-                                       status = Git_wc_status_deleted;\r
+                               CString status = entry->GetActionName();\r
+                               if(entry->m_Action & CTGitPath::LOGACTIONS_UNVER)\r
+                                       status = _T("Add");\r
+\r
+                               //git_wc_status_kind status = entry->status;\r
                                WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), GetUserDefaultLangID());\r
                                if (m_ProjectProperties.bFileListInEnglish)\r
                                        langID = 1033;\r
-                               GitStatus::GetStatusString(AfxGetResourceHandle(), status, buf, sizeof(buf)/sizeof(TCHAR), langID);\r
-                               line.Format(_T("%-10s %s\r\n"), buf, (LPCTSTR)m_ListCtrl.GetItemText(i,0));\r
+                               \r
+                               line.Format(_T("%-10s %s\r\n"),status , (LPCTSTR)m_ListCtrl.GetItemText(i,0));\r
                                logmsg += line;\r
                        }\r
                }\r
                pSciEdit->InsertText(logmsg);\r
                return true;\r
        }\r
-#endif\r
+\r
+       if(cmd == m_nPopupPasteLastMessage)\r
+       {\r
+               if(m_History.GetCount() ==0 )\r
+                       return false;\r
+\r
+               CString logmsg;\r
+               logmsg +=m_History.GetEntry(0);\r
+               pSciEdit->InsertText(logmsg);\r
+               return true;\r
+       }\r
        return false;\r
 }\r
 \r
@@ -1395,6 +1467,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
@@ -1402,12 +1475,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
@@ -1449,3 +1524,56 @@ 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
+\r
+void CCommitDlg::OnBnClickedWholeProject()\r
+{\r
+    // TODO: Add your control notification handler code here\r
+    m_tooltips.Pop();  // hide the tooltips\r
+       UpdateData();\r
+    m_ListCtrl.Clear();\r
+       if (!m_bBlock)\r
+       {\r
+           if(m_bWholeProject)\r
+            m_ListCtrl.GetStatus(NULL,true,false,true);\r
+        else\r
+                   m_ListCtrl.GetStatus(&this->m_pathList,true,false,true);\r
+               \r
+               m_ListCtrl.Show(m_ListCtrl.GetShowFlags());\r
+       }\r
+\r
+       CTGitPath commonDir = m_ListCtrl.GetCommonDirectory(false);\r
+\r
+    if(this->m_bWholeProject)   \r
+        SetWindowText(m_sWindowTitle + _T(" - ") + CString(_T("Whole Project")));\r
+    else\r
+           SetWindowText(m_sWindowTitle + _T(" - ") + commonDir.GetWinPathString());\r
+\r
+}\r