int CRebaseDlg::CheckNextCommitIsSquash() { int index; if(m_CommitList.m_IsOldFirst) index=m_CurrentRebaseIndex+1; else index=m_CurrentRebaseIndex-1; GitRev *curRev; do { if(index<0) return -1; if(index>= m_CommitList.GetItemCount()) return -1; curRev=(GitRev*)m_CommitList.m_arShownList[index]; if( curRev->GetAction(&m_CommitList)&CTGitPath::LOGACTIONS_REBASE_SQUASH ) return 0; if( curRev->GetAction(&m_CommitList)&CTGitPath::LOGACTIONS_REBASE_SKIP) { if(m_CommitList.m_IsOldFirst) index++; else index--; } else return -1; }while(curRev->GetAction(&m_CommitList)&CTGitPath::LOGACTIONS_REBASE_SKIP); return -1; }
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; }