void CRebaseDlg::FillLogMessageCtrl() { int selCount = m_CommitList.GetSelectedCount(); if (selCount == 1 && (m_RebaseStage == CHOOSE_BRANCH || m_RebaseStage == CHOOSE_COMMIT_PICK_MODE)) { POSITION pos = m_CommitList.GetFirstSelectedItemPosition(); int selIndex = m_CommitList.GetNextSelectedItem(pos); GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_CommitList.m_arShownList.SafeGetAt(selIndex)); m_FileListCtrl.UpdateWithGitPathList(pLogEntry->GetFiles(&m_CommitList)); m_FileListCtrl.m_CurrentVersion = pLogEntry->m_CommitHash; m_FileListCtrl.Show(GITSLC_SHOWVERSIONED); m_LogMessageCtrl.Call(SCI_SETREADONLY, FALSE); m_LogMessageCtrl.SetText(pLogEntry->GetSubject() + _T("\n") + pLogEntry->GetBody()); m_LogMessageCtrl.Call(SCI_SETREADONLY, TRUE); } }
void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch) { if(pBranch) { CString text=pBranch->GetString(); CString tooltip; GitRev rev; rev.GetCommit(text); tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"), rev.m_CommitHash.ToString(), rev.GetAuthorName(), CLoglistUtils::FormatDateAndTime(rev.GetAuthorDate(), DATE_LONGDATE), rev.GetSubject(), rev.GetBody()); pBranch->DisableTooltip(); this->m_tooltips.AddTool(pBranch->GetComboBoxCtrl(),tooltip); } }
void GetRevParsingTests() { GitRev rev; EXPECT_TRUE(rev.m_CommitHash.IsEmpty()); EXPECT_EQ(0, rev.GetCommit(_T("HEAD"))); EXPECT_STREQ(_T("7c3cbfe13a929d2291a574dca45e4fd2d2ac1aa6"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-07 18:03:58"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-07 18:03:58"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Changed ASCII file"), rev.GetSubject()); EXPECT_STREQ(_T(""), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_EQ(0, rev.GetParentFromHash(rev.m_CommitHash)); ASSERT_EQ(1, rev.ParentsCount()); EXPECT_STREQ(_T("1fc3c9688e27596d8717b54f2939dc951568f6cb"), rev.m_ParentHash[0].ToString()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_EQ(0, rev.GetCommit(GitRev::GetWorkingCopy())); EXPECT_TRUE(rev.m_CommitHash.IsEmpty()); EXPECT_STREQ(_T(""), rev.GetAuthorName()); EXPECT_STREQ(_T(""), rev.GetAuthorEmail()); EXPECT_STREQ(_T(""), rev.GetCommitterName()); EXPECT_STREQ(_T(""), rev.GetCommitterEmail()); EXPECT_STREQ(_T("Working Copy"), rev.GetSubject()); EXPECT_STREQ(_T(""), rev.GetBody()); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); EXPECT_EQ(0, rev.GetCommit(_T("aa5b97f89cea6863222823c8289ce392d06d1691"))); EXPECT_STREQ(_T("aa5b97f89cea6863222823c8289ce392d06d1691"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Another dummy with ümlaut"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-14 22:30:06"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Another dummy with ümlaut"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-14 22:30:06"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Subject line"), rev.GetSubject()); EXPECT_STREQ(_T("\nalso some more lines\n\nhere in body\n\nSigned-off-by: Another dummy with ümlaut <*****@*****.**>\n"), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_TRUE(rev.m_CommitHash.IsEmpty()); EXPECT_EQ(0, rev.GetCommit(_T("1fc3c9688e27596d8717b54f2939dc951568f6cb"))); EXPECT_STREQ(_T("1fc3c9688e27596d8717b54f2939dc951568f6cb"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Some other User"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-07 18:03:39"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-07 18:03:39"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Added an ascii file"), rev.GetSubject()); EXPECT_STREQ(_T(""), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_EQ(-1, rev.GetCommit(_T("does-not-exist"))); EXPECT_FALSE(rev.GetLastErr().IsEmpty()); EXPECT_TRUE(rev.m_CommitHash.IsEmpty()); rev.Clear(); CGitHash hash(_T("aa5b97f89cea6863222823c8289ce392d06d1691")); EXPECT_EQ(0, rev.GetCommitFromHash(hash)); EXPECT_EQ(hash, rev.m_CommitHash); EXPECT_STREQ(_T("Another dummy with ümlaut"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-14 22:30:06"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Another dummy with ümlaut"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-14 22:30:06"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Subject line"), rev.GetSubject()); EXPECT_STREQ(_T("\nalso some more lines\n\nhere in body\n\nSigned-off-by: Another dummy with ümlaut <*****@*****.**>\n"), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_EQ(0, rev.GetCommit(_T("8d1ebbcc7eeb63af10ff8bcf7712afb9fcc90b8a"))); EXPECT_STREQ(_T("8d1ebbcc7eeb63af10ff8bcf7712afb9fcc90b8a"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-04 17:50:24"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-04 17:50:24"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Merge branch 'for-merge' into subdir/branch"), rev.GetSubject()); EXPECT_STREQ(_T(""), rev.GetBody()); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_EQ(0, rev.GetParentFromHash(rev.m_CommitHash)); ASSERT_EQ(2, rev.ParentsCount()); EXPECT_STREQ(_T("3686b9cf74f1a4ef96d6bfe736595ef9abf0fb8d"), rev.m_ParentHash[0].ToString()); EXPECT_STREQ(_T("1ce788330fd3a306c8ad37654063ceee13a7f172"), rev.m_ParentHash[1].ToString()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); EXPECT_TRUE(rev.m_CommitHash.IsEmpty()); EXPECT_EQ(0, rev.GetCommit(_T("844309789a13614b52d5e7cbfe6350dd73d1dc72"))); // root-commit EXPECT_STREQ(_T("844309789a13614b52d5e7cbfe6350dd73d1dc72"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-04 17:35:13"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-04 17:35:13"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("added ansi file"), rev.GetSubject()); EXPECT_STREQ(_T(""), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_EQ(0, rev.GetParentFromHash(rev.m_CommitHash)); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); rev.Clear(); // GPG signed commit which was also amended with different dates EXPECT_EQ(0, rev.GetCommit(_T("subdir/branch"))); EXPECT_STREQ(_T("4c5c93d2a0b368bc4570d5ec02ab03b9c4334d44"), rev.m_CommitHash.ToString()); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetAuthorName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetAuthorEmail()); EXPECT_STREQ(_T("2015-03-16 12:52:29"), rev.GetAuthorDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Sven Strickroth"), rev.GetCommitterName()); EXPECT_STREQ(_T("*****@*****.**"), rev.GetCommitterEmail()); EXPECT_STREQ(_T("2015-03-16 13:06:08"), rev.GetCommitterDate().FormatGmt(L"%Y-%m-%d %H:%M:%S")); EXPECT_STREQ(_T("Several actions"), rev.GetSubject()); EXPECT_STREQ(_T("\n* amended with different date\n* make utf16-be-nobom.txt a symlink ti ascii.txt\n* remove utf8-bom.txt\n* Copied ascii.txt\n\nSigned-off-by: Sven Strickroth <*****@*****.**>\n"), rev.GetBody()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); EXPECT_EQ(0, rev.ParentsCount()); EXPECT_EQ(0, rev.GetParentFromHash(rev.m_CommitHash)); ASSERT_EQ(1, rev.ParentsCount()); EXPECT_STREQ(_T("aa5b97f89cea6863222823c8289ce392d06d1691"), rev.m_ParentHash[0].ToString()); EXPECT_TRUE(rev.GetLastErr().IsEmpty()); }
int CRebaseDlg::DoRebase() { CString cmd,out; if(m_CurrentRebaseIndex <0) return 0; if(m_CurrentRebaseIndex >= m_CommitList.GetItemCount() ) return 0; GitRev *pRev = (GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex]; int mode=pRev->GetAction(&m_CommitList) & CTGitPath::LOGACTIONS_REBASE_MODE_MASK; CString nocommit; if( mode== CTGitPath::LOGACTIONS_REBASE_SKIP) { pRev->GetAction(&m_CommitList)|= CTGitPath::LOGACTIONS_REBASE_DONE; return 0; } if( mode != CTGitPath::LOGACTIONS_REBASE_PICK ) { this->m_SquashMessage+= pRev->GetSubject(); this->m_SquashMessage+= _T("\n"); this->m_SquashMessage+= pRev->GetBody(); } else this->m_SquashMessage.Empty(); if(mode == CTGitPath::LOGACTIONS_REBASE_SQUASH) nocommit=_T(" --no-commit "); CString log; log.Format(_T("%s %d: %s"),CTGitPath::GetActionName(mode),this->GetCurrentCommitID(),pRev->m_CommitHash.ToString()); AddLogString(log); AddLogString(pRev->GetSubject()); if (pRev->GetSubject().IsEmpty()) { CMessageBox::Show(m_hWnd, _T("Found an empty commit message. You have to enter one or rebase cannot proceed."), _T("TortoiseGit"), MB_OK | MB_ICONEXCLAMATION); mode = CTGitPath::LOGACTIONS_REBASE_EDIT; } cmd.Format(_T("git.exe cherry-pick %s %s"),nocommit,pRev->m_CommitHash.ToString()); if(g_Git.Run(cmd,&out,CP_UTF8)) { AddLogString(out); CTGitPathList list; if(g_Git.ListConflictFile(list)) { AddLogString(_T("Get conflict files fail")); return -1; } if(list.GetCount() == 0 ) { if(mode == CTGitPath::LOGACTIONS_REBASE_PICK) { pRev->GetAction(&m_CommitList)|= CTGitPath::LOGACTIONS_REBASE_DONE; return 0; } if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT) { this->m_RebaseStage = REBASE_EDIT ; return -1; // Edit return -1 to stop rebase. } // Squash Case if(CheckNextCommitIsSquash()) { // no squash // let user edit last commmit message this->m_RebaseStage = REBASE_SQUASH_EDIT; return -1; } } if(mode == CTGitPath::LOGACTIONS_REBASE_SQUASH) m_RebaseStage = REBASE_SQUASH_CONFLICT; else m_RebaseStage = REBASE_CONFLICT; return -1; } else { AddLogString(out); if(mode == CTGitPath::LOGACTIONS_REBASE_PICK) { pRev->GetAction(&m_CommitList)|= CTGitPath::LOGACTIONS_REBASE_DONE; return 0; } if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT) { this->m_RebaseStage = REBASE_EDIT ; return -1; // Edit return -1 to stop rebase. } // Squash Case if(CheckNextCommitIsSquash()) { // no squash // let user edit last commmit message this->m_RebaseStage = REBASE_SQUASH_EDIT; return -1; } else if(mode == CTGitPath::LOGACTIONS_REBASE_SQUASH) pRev->GetAction(&m_CommitList)|= CTGitPath::LOGACTIONS_REBASE_DONE; } return 0; }
LRESULT CRefLogDlg::OnFindDialogMessage(WPARAM /*wParam*/, LPARAM /*lParam*/) { ASSERT(m_pFindDialog != NULL); if (m_RefList.m_arShownList.IsEmpty()) return 0; // If the FR_DIALOGTERM flag is set, // invalidate the handle identifying the dialog box. if (m_pFindDialog->IsTerminating()) { m_pFindDialog = NULL; return 0; } // If the FR_FINDNEXT flag is set, // call the application-defined search routine // to search for the requested string. if (m_pFindDialog->FindNext()) { //read data from dialog CString findString = m_pFindDialog->GetFindString(); bool bFound = false; bool bCaseSensitive = !!(m_pFindDialog->m_nFlags & FR_MATCHCASE); if (!bCaseSensitive) findString.MakeLower(); int i = m_nSearchLine; if (i < 0 || i >= m_RefList.m_arShownList.GetCount()) i = 0; do { GitRev * data = (GitRev*)m_RefList.m_arShownList.SafeGetAt(i); CString str; str += data->m_Ref; str += _T("\n"); str += data->m_RefAction; str += _T("\n"); str += data->m_CommitHash.ToString(); str += _T("\n"); str += data->GetSubject(); str += _T("\n"); str += data->GetBody(); str += _T("\n"); if (!bCaseSensitive) str.MakeLower(); if (str.Find(findString) >= 0) bFound = true; ++i; if(!bFound && i >= m_RefList.m_arShownList.GetCount()) i=0; } while (i != m_nSearchLine && (!bFound)); if (bFound) { m_RefList.SetHotItem(i - 1); m_RefList.EnsureVisible(i - 1, FALSE); m_nSearchLine = i; } else MessageBox(_T("\"") + findString + _T("\" ") + CString(MAKEINTRESOURCE(IDS_NOTFOUND)), _T("TortoiseGit"), MB_ICONINFORMATION); } return 0; }