<title>Acknowledgments</title>\r
<variablelist>\r
<varlistentry>\r
- <term>Frank Li</term>\r
+ <term>Frank Li "lznuaa@gmail.com"</term>\r
<listitem>\r
<para>\r
for founding the TortoiseGit project\r
</listitem>\r
</varlistentry>\r
<varlistentry>\r
- <term>Colin Law</term>\r
+ <term>myagi(Georg Fischer) "snowcoder@gmail.com"</term>\r
<listitem>\r
- <para> \r
+ <para>\r
+ \r
+ For hard work to get TortoiseGit Overlay work.\r
</para>\r
</listitem>\r
</varlistentry>\r
<varlistentry>\r
- <term>myagi</term>\r
+ <term>Colin Law</term>\r
<listitem>\r
<para> \r
</para>\r
</listitem>\r
- </varlistentry>\r
+ </varlistentry> \r
<varlistentry>\r
<term>Johan t Hart</term>\r
<listitem>\r
class CGitCall_EnumFiles : public CGitCall\r
{\r
public:\r
- CGitCall_EnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData)\r
+ CGitCall_EnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData)\r
: m_pszProjectPath(pszProjectPath),\r
m_pszSubPath(pszSubPath),\r
m_nFlags(nFlags),\r
\r
typedef std::map<CStringA,char> TStrCharMap;\r
\r
- const char * m_pszProjectPath;\r
- const char * m_pszSubPath;\r
+ const TCHAR * m_pszProjectPath;\r
+ const TCHAR * m_pszSubPath;\r
unsigned int m_nFlags;\r
WGENUMFILECB * m_pEnumCb;\r
void * m_pUserData;\r
}\r
};\r
\r
-BOOL CGit::EnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData)\r
+BOOL CGit::EnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData)\r
{\r
if(!pszProjectPath || *pszProjectPath=='\0')\r
return FALSE;\r
SetCurrentDirectoryA(W_szToDir);\r
GetCurrentDirectoryA(sizeof(W_szToDir)-1,W_szToDir);\r
*/\r
- SetCurrentDir(CUnicodeUtils::GetUnicode(pszProjectPath));\r
+ SetCurrentDir(pszProjectPath);\r
\r
CString sMode;\r
if (nFlags)\r
}\r
\r
if (pszSubPath)\r
- cmd.Format(_T("igit.exe \"%s\" status %s \"%s\""), CUnicodeUtils::GetUnicode(pszProjectPath), sMode, CUnicodeUtils::GetUnicode(pszSubPath));\r
+ cmd.Format(_T("igit.exe \"%s\" status %s \"%s\""), pszProjectPath, sMode, pszSubPath);\r
else\r
- cmd.Format(_T("igit.exe \"%s\" status %s"), CUnicodeUtils::GetUnicode(pszProjectPath), sMode);\r
+ cmd.Format(_T("igit.exe \"%s\" status %s"), pszProjectPath, sMode);\r
\r
W_GitCall.SetCmd(cmd);\r
// NOTE: should igit get added as a part of msysgit then use below line instead of the above one\r
int GetLog(BYTE_VECTOR& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME,\r
CString *from=NULL,CString *to=NULL);\r
\r
- BOOL EnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData);\r
+ BOOL EnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData);\r
\r
git_revnum_t GetHash(CString &friendname);\r
\r
\r
extern CGit g_Git;\r
\r
-inline static BOOL wgEnumFiles(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData) { return g_Git.EnumFiles(pszProjectPath, pszSubPath, nFlags, pEnumCb, pUserData); }\r
+inline static BOOL wgEnumFiles(const TCHAR *pszProjectPath, const TCHAR *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData) { return g_Git.EnumFiles(pszProjectPath, pszSubPath, nFlags, pEnumCb, pUserData); }\r
{\r
// extract the sub-path (relative to project root)\r
//MessageBox(NULL, filepath.GetDirectory().GetWinPathString(), sProjectRoot, MB_OK);\r
- LPCSTR lpszSubPath = NULL;\r
- CStringA sSubPath;\r
+ LPCTSTR lpszSubPath = NULL;\r
+ CString sSubPath;\r
CString s = filepath.GetDirectory().GetWinPathString();\r
if (s.GetLength() > sProjectRoot.GetLength())\r
{\r
- sSubPath = CStringA(s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/));\r
+ sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/);\r
lpszSubPath = sSubPath;\r
}\r
\r
//if (lpszSubPath) MessageBoxA(NULL, lpszSubPath, "BuildCache", MB_OK);\r
//MessageBoxA(NULL, CStringA(sProjectRoot), sSubPath, MB_OK);\r
- err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath|WGEFF_DirStatusAll, &fillstatusmap, this);\r
+ err = !wgEnumFiles(sProjectRoot, lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath|WGEFF_DirStatusAll, &fillstatusmap, this);\r
\r
/*err = svn_client_status4 (&youngest,\r
filepath.GetDirectory().GetSVNApiPath(pool),\r
}\r
else\r
{\r
- LPCSTR lpszSubPath = NULL;\r
- CStringA sSubPath;\r
+ LPCTSTR lpszSubPath = NULL;\r
+ CString sSubPath;\r
CString s = path.GetWinPathString();\r
if (s.GetLength() > sProjectRoot.GetLength())\r
{\r
- sSubPath = CStringA(s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/));\r
+ sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/);\r
lpszSubPath = sSubPath;\r
}\r
\r
nFlags |= WGEFF_NoRecurse;\r
#endif\r
\r
- err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, nFlags, &getallstatus, &statuskind);\r
+ err = !wgEnumFiles(sProjectRoot, lpszSubPath, nFlags, &getallstatus, &statuskind);\r
\r
/*err = git_client_status4 (&youngest,\r
path.GetSVNApiPath(pool),\r
}\r
else\r
{\r
- LPCSTR lpszSubPath = NULL;\r
- CStringA sSubPath;\r
+ LPCTSTR lpszSubPath = NULL;\r
+ CString sSubPath;\r
CString s = path.GetWinPathString();\r
if (s.GetLength() > sProjectRoot.GetLength())\r
{\r
- sSubPath = CStringA(s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/));\r
+ sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/);\r
lpszSubPath = sSubPath;\r
}\r
\r
m_status.prop_status = m_status.text_status = git_wc_status_none;\r
\r
// NOTE: currently wgEnumFiles will not enumerate file if it isn't versioned (so status will be git_wc_status_none)\r
- m_err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, nFlags, &getstatus, &m_status);\r
+ m_err = !wgEnumFiles(sProjectRoot, lpszSubPath, nFlags, &getstatus, &m_status);\r
\r
/*m_err = git_client_status4 (&youngest,\r
path.GetGitApiPath(m_pool),\r
this->m_bBusy=TRUE;\r
m_CurrentVersion=hash;\r
\r
+ int count = 0;\r
+ if(list == NULL)\r
+ count = 1;\r
+ else\r
+ count = list->GetCount();\r
+\r
if(hash == GIT_REV_ZERO)\r
{\r
- int count = 0;\r
- if(list == NULL)\r
- count = 1;\r
- else\r
- count = list->GetCount();\r
-\r
for(int i=0;i<count;i++)\r
{ \r
BYTE_VECTOR cmdout;\r
else\r
this->m_StatusFileList.ParserFromLog(out);\r
\r
- \r
+ //handle delete conflict case, when remote : modified, local : deleted. \r
+ for(int i=0;i<count;i++)\r
+ { \r
+ BYTE_VECTOR cmdout;\r
+ CString cmd;\r
+\r
+ if(list == NULL)\r
+ cmd=_T("git.exe ls-files -u -t -z");\r
+ else\r
+ cmd.Format(_T("git.exe ls-files -u -t -z -- \"%s\""),(*list)[i].GetGitPathString());\r
+\r
+ g_Git.Run(cmd,&cmdout);\r
+\r
+ CTGitPathList conflictlist;\r
+ conflictlist.ParserFromLog(cmdout);\r
+ for(int i=0;i<conflictlist.GetCount();i++)\r
+ {\r
+ CTGitPath *p=m_StatusFileList.LookForGitPath(conflictlist[i].GetGitPathString());\r
+ if(p)\r
+ p->m_Action|=CTGitPath::LOGACTIONS_UNMERGED;\r
+ else\r
+ m_StatusFileList.AddPath(conflictlist[i]);\r
+ } \r
+ }\r
+\r
}else\r
{\r
int count = 0;\r
this->m_StatusFileList.ParserFromLog(out);\r
\r
}\r
+ \r
for(int i=0;i<m_StatusFileList.GetCount();i++)\r
{\r
CTGitPath * gitpatch=(CTGitPath*)&m_StatusFileList[i];\r
gitpatch->m_Checked = TRUE;\r
m_arStatusArray.push_back((CTGitPath*)&m_StatusFileList[i]);\r
}\r
+\r
this->m_bBusy=FALSE;\r
return 0;\r
}\r
return S_OK;\r
}f\r
\r
-#endif
\ No newline at end of file
+#endif\r
}\r
CString CTGitPath::GetActionName(int action)\r
{\r
+ if(action & CTGitPath::LOGACTIONS_UNMERGED)\r
+ return _T("Conflict");\r
if(action & CTGitPath::LOGACTIONS_ADDED)\r
return _T("Added");\r
if(action & CTGitPath::LOGACTIONS_DELETED)\r
return _T("Deleted");\r
- if(action & CTGitPath::LOGACTIONS_UNMERGED)\r
- return _T("Conflict");\r
if(action & CTGitPath::LOGACTIONS_MODIFIED)\r
return _T("Modified");\r
if(action & CTGitPath::LOGACTIONS_REPLACED)\r
m_directoryPath.HasAdminDir(&sProjectRoot);\r
ATLASSERT( !m_directoryPath.IsEmpty() );\r
\r
- LPCSTR lpszSubPath = NULL;\r
- CStringA sSubPath;\r
+ LPCTSTR lpszSubPath = NULL;\r
+ CString sSubPath;\r
CString s = m_directoryPath.GetDirectory().GetWinPathString();\r
if (s.GetLength() > sProjectRoot.GetLength())\r
{\r
- sSubPath = CStringA(s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/));\r
+ sSubPath = s.Right(s.GetLength() - sProjectRoot.GetLength() - 1/*otherwise it gets initial slash*/);\r
lpszSubPath = sSubPath;\r
}\r
//MessageBoxA(NULL, CStringA(sProjectRoot), sSubPath, MB_OK);\r
//OutputDebugStringA("###");OutputDebugStringW(sProjectRoot);OutputDebugStringA(" - ");OutputDebugStringA(sSubPath);OutputDebugStringA("\r\n");\r
- BOOL pErr = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath, &GetStatusCallback, this);\r
+ BOOL pErr = !wgEnumFiles(sProjectRoot, lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath, &GetStatusCallback, this);\r
\r
/*git_error_t* pErr = svn_client_status4 (\r
NULL,\r
// Combine our OWN folder status with the most important of our *FILES'* status.\r
git_wc_status_kind retVal = GitStatus::GetMoreImportant(m_mostImportantFileStatus, m_ownStatus.GetEffectiveStatus());\r
\r
- if ((retVal != git_wc_status_modified)&&(retVal != m_ownStatus.GetEffectiveStatus()))\r
+ // NOTE: TSVN marks dir as modified if it contains added/deleted/missing files, but we prefer the most important\r
+ // status to propagate upward in its original state\r
+ /*if ((retVal != git_wc_status_modified)&&(retVal != m_ownStatus.GetEffectiveStatus()))\r
{\r
if ((retVal == git_wc_status_added)||(retVal == git_wc_status_deleted)||(retVal == git_wc_status_missing))\r
retVal = git_wc_status_modified;\r
- }\r
+ }*/\r
\r
// Now combine all our child-directorie's status\r
\r
for(it = m_childDirectories.begin(); it != m_childDirectories.end(); ++it)\r
{\r
retVal = GitStatus::GetMoreImportant(retVal, it->second);\r
- if ((retVal != git_wc_status_modified)&&(retVal != m_ownStatus.GetEffectiveStatus()))\r
+ /*if ((retVal != git_wc_status_modified)&&(retVal != m_ownStatus.GetEffectiveStatus()))\r
{\r
if ((retVal == git_wc_status_added)||(retVal == git_wc_status_deleted)||(retVal == git_wc_status_missing))\r
retVal = git_wc_status_modified;\r
- }\r
+ }*/\r
}\r
\r
return retVal;\r
</Component>\r
\r
<Component Id="C__wingit" Guid="$(var.GuidGitLib)" Win64="$(var.Win64YesNo)">\r
- <File Id="F__wingit" ShortName="IGIT.EXE" Name="igit.exe" DiskId="1" Source="..\..\ext\igit.exe" KeyPath="yes" />\r
+ <File Id="F__wingit" ShortName="IGIT.EXE" Name="igit.exe" DiskId="1" Source="..\..\ext\gitexe\igit.exe" KeyPath="yes" />\r
+ <File Id="F__libiconv2" ShortName="LIBICONV.DLL" Name="libiconv2.dll" DiskId="1" Source="..\..\ext\gitexe\libiconv2.dll" />\r
</Component>\r
\r
<Component Id="C__TortoiseSVN" Guid="$(var.GuidTortoiseSVN)" Win64="$(var.Win64YesNo)">\r
<?xml version="1.0" encoding="utf-8"?>\r
<Include Id="VersionNumberInclude">\r
<?define MajorVersion="0" ?>\r
- <?define MinorVersion="3" ?>\r
- <?define MicroVersion="3" ?>\r
+ <?define MinorVersion="4" ?>\r
+ <?define MicroVersion="0" ?>\r
<?define BuildVersion="0" ?>\r
</Include>\r
#include "CreateBranchTagDlg.h"\r
#include "GitSwitchDlg.h"\r
#include "ResetDlg.h"\r
+#include "DeleteConflictDlg.h"\r
\r
CAppUtils::CAppUtils(void)\r
{\r
return FALSE;\r
}\r
\r
+void CAppUtils::DescribeFile(bool mode, bool base,CString &descript)\r
+{\r
+ if(mode == FALSE)\r
+ {\r
+ descript=_T("Deleted");\r
+ return;\r
+ }\r
+ if(base)\r
+ {\r
+ descript=_T("Modified");\r
+ return;\r
+ }\r
+ descript=_T("Created");\r
+ return;\r
+}\r
+\r
bool CAppUtils::ConflictEdit(CTGitPath &path,bool bAlternativeTool)\r
{\r
bool bRet = false;\r
tempfile.Open(base.GetWinPathString(),CFile::modeCreate|CFile::modeReadWrite);\r
tempfile.Close();\r
\r
+ bool b_base=false, b_local=false, b_remote=false;\r
\r
for(int i=0;i<list.GetCount();i++)\r
{\r
\r
if( list[i].m_Stage == 1)\r
{\r
+ b_base = true;\r
outfile=base.GetWinPathString();\r
}\r
if( list[i].m_Stage == 2 )\r
{\r
+ b_local = true;\r
outfile=mine.GetWinPathString();\r
}\r
if( list[i].m_Stage == 3 )\r
{\r
+ b_remote = true;\r
outfile=theirs.GetWinPathString();\r
} \r
g_Git.RunLogFile(cmd,outfile);\r
}\r
\r
- merge.SetFromWin(g_Git.m_CurrentDir+_T("\\")+merge.GetWinPathString());\r
- bRet = !!CAppUtils::StartExtMerge(base, theirs, mine, merge,_T("BASE"),_T("REMOTE"),_T("LOCAL"));\r
+ if(b_local && b_remote )\r
+ {\r
+ merge.SetFromWin(g_Git.m_CurrentDir+_T("\\")+merge.GetWinPathString());\r
+ bRet = !!CAppUtils::StartExtMerge(base, theirs, mine, merge,_T("BASE"),_T("REMOTE"),_T("LOCAL"));\r
+ \r
+ }else\r
+ {\r
+ CFile::Remove(mine.GetWinPathString());\r
+ CFile::Remove(theirs.GetWinPathString());\r
+ CFile::Remove(base.GetWinPathString());\r
+\r
+ CDeleteConflictDlg dlg;\r
+ DescribeFile(b_local, b_base,dlg.m_LocalStatus);\r
+ DescribeFile(b_remote,b_base,dlg.m_RemoteStatus);\r
+ dlg.m_bShowModifiedButton=b_base;\r
+ dlg.m_File=merge.GetGitPathString();\r
+ if(dlg.DoModal() == IDOK)\r
+ {\r
+ CString cmd,out;\r
+ if(dlg.m_bIsDelete)\r
+ {\r
+ cmd.Format(_T("git.exe rm \"%s\""),merge.GetGitPathString());\r
+ }else\r
+ cmd.Format(_T("git.exe add \"%s\""),merge.GetGitPathString());\r
+\r
+ if(g_Git.Run(cmd,&out,CP_ACP))\r
+ {\r
+ CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+ return FALSE;\r
+ }\r
+ return TRUE;\r
+ }\r
+ else \r
+ return FALSE;\r
+\r
+ \r
+\r
+ }\r
\r
#if 0\r
\r
*/\r
static CString ToRelativeTimeString(COleDateTime time,COleDateTime RelativeTo);\r
static CString ExpandRelativeTime( int count, UINT format_1, UINT format_n );\r
+\r
+ static void DescribeFile(bool mode, bool base,CString &descript);\r
};\r
mPopup.AppendMenu(MF_STRING | MF_ENABLED, m_nPopupPasteListCmd, sMenuItemText);\r
}\r
\r
-bool CCommitDlg::HandleMenuItemClick(int /*cmd*/, CSciEdit * /*pSciEdit*/)\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
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
return false;\r
}\r
\r
--- /dev/null
+// DeleteConflictDlg.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "resource.h"\r
+#include "DeleteConflictDlg.h"\r
+\r
+\r
+// CDeleteConflictDlg dialog\r
+\r
+IMPLEMENT_DYNAMIC(CDeleteConflictDlg, CResizableStandAloneDialog)\r
+\r
+CDeleteConflictDlg::CDeleteConflictDlg(CWnd* pParent /*=NULL*/)\r
+ : CResizableStandAloneDialog(CDeleteConflictDlg::IDD, pParent)\r
+\r
+ , m_LocalStatus(_T(""))\r
+ , m_RemoteStatus(_T(""))\r
+{\r
+ m_bIsDelete =FALSE;\r
+}\r
+\r
+CDeleteConflictDlg::~CDeleteConflictDlg()\r
+{\r
+}\r
+\r
+void CDeleteConflictDlg::DoDataExchange(CDataExchange* pDX)\r
+{\r
+ CDialog::DoDataExchange(pDX);\r
+\r
+ DDX_Text(pDX, IDC_LOCAL_STATUS, m_LocalStatus);\r
+ DDX_Text(pDX, IDC_REMOTE_STATUS, m_RemoteStatus);\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CDeleteConflictDlg, CResizableStandAloneDialog)\r
+ ON_BN_CLICKED(IDC_DELETE, &CDeleteConflictDlg::OnBnClickedDelete)\r
+ ON_BN_CLICKED(IDC_MODIFY, &CDeleteConflictDlg::OnBnClickedModify)\r
+END_MESSAGE_MAP()\r
+\r
+\r
+BOOL CDeleteConflictDlg::OnInitDialog()\r
+{\r
+ CResizableStandAloneDialog::OnInitDialog();\r
+ AddAnchor(IDC_DEL_GROUP, TOP_LEFT, BOTTOM_RIGHT);\r
+ AddAnchor(IDC_DELETE, BOTTOM_RIGHT);\r
+ AddAnchor(IDC_MODIFY, BOTTOM_RIGHT);\r
+ AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
+\r
+ if(this->m_bShowModifiedButton )\r
+ this->GetDlgItem(IDC_MODIFY)->SetWindowText(_T("Modified"));\r
+ else\r
+ this->GetDlgItem(IDC_MODIFY)->SetWindowText(_T("Created"));\r
+\r
+ CString title;\r
+ this->GetWindowText(title);\r
+ title +=_T(" - ") +this->m_File;\r
+ this->SetWindowText(title);\r
+ return TRUE;\r
+}\r
+// CDeleteConflictDlg message handlers\r
+\r
+void CDeleteConflictDlg::OnBnClickedDelete()\r
+{\r
+ // TODO: Add your control notification handler code here\r
+ m_bIsDelete = TRUE;\r
+ OnOK();\r
+}\r
+\r
+void CDeleteConflictDlg::OnBnClickedModify()\r
+{\r
+ // TODO: Add your control notification handler code here\r
+ m_bIsDelete = FALSE;\r
+ OnOK();\r
+}\r
--- /dev/null
+#pragma once\r
+\r
+#include "StandAloneDlg.h"\r
+// CDeleteConflictDlg dialog\r
+\r
+class CDeleteConflictDlg : public CResizableStandAloneDialog\r
+{\r
+ DECLARE_DYNAMIC(CDeleteConflictDlg)\r
+\r
+public:\r
+ CDeleteConflictDlg(CWnd* pParent = NULL); // standard constructor\r
+ virtual ~CDeleteConflictDlg();\r
+\r
+// Dialog Data\r
+ enum { IDD = IDD_RESOLVE_CONFLICT };\r
+\r
+protected:\r
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support\r
+ BOOL OnInitDialog();\r
+ DECLARE_MESSAGE_MAP()\r
+\r
+public:\r
+ CString m_LocalStatus;\r
+public:\r
+ CString m_RemoteStatus;\r
+ BOOL m_bShowModifiedButton;\r
+ CString m_File;\r
+ BOOL m_bIsDelete;\r
+public:\r
+ afx_msg void OnBnClickedDelete();\r
+public:\r
+ afx_msg void OnBnClickedModify();\r
+};\r
dlg.m_CommitList.m_logEntries.push_back(*(GitRev*)m_arShownList[indexNext]);\r
dlg.m_CommitList.m_logEntries.at(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
}\r
-\r
+ \r
if(dlg.DoModal() == IDOK)\r
{\r
Refresh();\r
\r
if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_TAG))\r
popup.AppendMenuIcon(ID_CREATE_TAG, _T("Create Tag at this version"), IDI_COPY);\r
- }\r
- \r
- if ( GetSelectedCount() >0 )\r
- {\r
- if(m_ContextMenuMask&GetContextMenuBit(ID_CHERRY_PICK))\r
- popup.AppendMenuIcon(ID_CHERRY_PICK, _T("Cherry Pick this version"), IDI_EXPORT);\r
- \r
- }\r
-\r
- if (GetSelectedCount() == 1)\r
- {\r
- CString str;\r
+ \r
str.Format(_T("*Rebase %s to this"),g_Git.GetCurrentBranch());\r
\r
if(pSelLogEntry->m_CommitHash != m_HeadHash)\r
\r
\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
+\r
}\r
- else if (GetSelectedCount() >= 2)\r
+ \r
+ if (GetSelectedCount() >= 2)\r
{\r
bool bAddSeparator = false;\r
if (IsSelectionContinuous() || (GetSelectedCount() == 2))\r
bAddSeparator = true;\r
}\r
\r
- if ( IsSelectionContinuous() )\r
+ if (m_hasWC)\r
+ {\r
+ //popup.AppendMenuIcon(ID_REVERTREV, IDS_LOG_POPUP_REVERTREVS, IDI_REVERT);\r
+// if (m_hasWC)\r
+// popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREVS, IDI_MERGE);\r
+ bAddSeparator = true;\r
+ }\r
+ if (bAddSeparator)\r
+ popup.AppendMenu(MF_SEPARATOR, NULL);\r
+ }\r
+\r
+ if ( GetSelectedCount() >0 )\r
+ {\r
+ if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_COMBINE_COMMIT))\r
{\r
hash=hash.Left(40);\r
GitRev* pLastEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
if(pLastEntry->m_CommitHash == hash)\r
- popup.AppendMenuIcon(ID_COMBINE_COMMIT,_T("*Combine to one commit"),IDI_MERGE);\r
+ popup.AppendMenuIcon(ID_COMBINE_COMMIT,_T("*Combine to one commit"),IDI_COMBINE);\r
}\r
}\r
}\r
- if (m_hasWC)\r
- {\r
- //popup.AppendMenuIcon(ID_REVERTREV, IDS_LOG_POPUP_REVERTREVS, IDI_REVERT);\r
-// if (m_hasWC)\r
-// popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREVS, IDI_MERGE);\r
- bAddSeparator = true;\r
- }\r
- if (bAddSeparator)\r
- popup.AppendMenu(MF_SEPARATOR, NULL);\r
+ if(m_ContextMenuMask&GetContextMenuBit(ID_CHERRY_PICK))\r
+ popup.AppendMenuIcon(ID_CHERRY_PICK, _T("Cherry Pick this version"), IDI_EXPORT);\r
+ popup.AppendMenu(MF_SEPARATOR, NULL);\r
+ \r
}\r
+\r
+ \r
#if 0\r
// if ((selEntries.size() > 0)&&(bAllFromTheSameAuthor))\r
// {\r
m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV)|\r
m_CommitList.GetContextMenuBit(CGitLogListBase::ID_COMBINE_COMMIT));\r
\r
+ if(m_CommitList.m_IsOldFirst)\r
+ this->m_CurrentRebaseIndex = -1;\r
+ else\r
+ this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size();\r
+\r
+\r
return TRUE;\r
}\r
// CRebaseDlg message handlers\r
return -1;\r
\r
//Todo call pre_rebase_hook\r
+ return 0;\r
}\r
int CRebaseDlg::StartRebase()\r
{\r
CString cmd,out;\r
- //Todo call comment_for_reflog\r
- cmd.Format(_T("git.exe checkout %s"),this->m_BranchCtrl.GetString());\r
- this->AddLogString(cmd);\r
\r
- if(g_Git.Run(cmd,&out,CP_UTF8))\r
- return -1;\r
+ if(!this->m_IsCherryPick)\r
+ {\r
+ //Todo call comment_for_reflog\r
+ cmd.Format(_T("git.exe checkout %s"),this->m_BranchCtrl.GetString());\r
+ this->AddLogString(cmd);\r
\r
- this->AddLogString(out);\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ return -1;\r
+\r
+ this->AddLogString(out);\r
+ }\r
\r
cmd=_T("git.exe rev-parse --verify HEAD");\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
return -1;\r
}\r
\r
- cmd.Format(_T("git.exe update-ref ORIG_HEAD HEAD"));\r
-\r
- cmd.Format(_T("git.exe checkout %s"),this->m_UpstreamCtrl.GetString());\r
- this->AddLogString(cmd);\r
-\r
- out.Empty();\r
- if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ if( !this->m_IsCherryPick )\r
{\r
- return -1;\r
+ cmd.Format(_T("git.exe checkout %s"),this->m_UpstreamCtrl.GetString());\r
+ this->AddLogString(cmd);\r
+\r
+ out.Empty();\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ return -1;\r
+ }\r
}\r
\r
- cmd.Format(_T("git.exe rev-parse %s"),this->m_UpstreamCtrl.GetString());\r
- if(g_Git.Run(cmd,&this->m_OrigUpstreamHash,CP_UTF8))\r
+ m_OrigUpstreamHash.Empty();\r
+ m_OrigUpstreamHash= g_Git.GetHash(this->m_UpstreamCtrl.GetString());\r
+ if(m_OrigUpstreamHash.IsEmpty())\r
{\r
this->AddLogString(m_OrigUpstreamHash);\r
return -1;\r
}\r
\r
- cmd.Format(_T("git.exe rev-parse %s"),this->m_BranchCtrl.GetString());\r
- if(g_Git.Run(cmd,&this->m_OrigBranchHash,CP_UTF8))\r
+ if( !this->m_IsCherryPick )\r
{\r
- this->AddLogString(m_OrigBranchHash);\r
- return -1;\r
- }\r
+ cmd.Format(_T("git.exe rev-parse %s"),this->m_BranchCtrl.GetString());\r
+ if(g_Git.Run(cmd,&this->m_OrigBranchHash,CP_UTF8))\r
+ {\r
+ this->AddLogString(m_OrigBranchHash);\r
+ return -1;\r
+ }\r
+ this->AddLogString(_T("Start Rebase\r\n"));\r
\r
- this->AddLogString(_T("Start Rebase\r\n"));\r
+ }else\r
+ this->AddLogString(_T("Start Cherry-pick\r\n"));\r
+ \r
return 0;\r
}\r
int CRebaseDlg::VerifyNoConflict()\r
return 0;\r
\r
}\r
+int CRebaseDlg::FinishRebase()\r
+{\r
+ if(this->m_IsCherryPick) //cherry pick mode no "branch", working at upstream branch\r
+ return 0;\r
+\r
+ CString cmd,out;\r
+ cmd.Format(_T("git.exe branch -f %s"),this->m_BranchCtrl.GetString());\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return -1;\r
+ }\r
+ out.Empty();\r
+ cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash);\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return -1;\r
+ }\r
+ out.Empty();\r
+ cmd.Format(_T("git.exe checkout -f %s"),this->m_BranchCtrl.GetString());\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return -1;\r
+ }\r
+ return 0;\r
+}\r
void CRebaseDlg::OnBnClickedContinue()\r
{\r
if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE )\r
m_RebaseStage = REBASE_START;\r
}\r
\r
+ if( m_RebaseStage == REBASE_DONE)\r
+ {\r
+ OnOK();\r
+ }\r
+\r
if( m_RebaseStage == REBASE_FINISH )\r
{\r
- CString cmd,out;\r
- cmd.Format(_T("git branch -f %s"),this->m_BranchCtrl.GetString());\r
- if(g_Git.Run(cmd,&out,CP_UTF8))\r
- {\r
- AddLogString(out);\r
- return ;\r
- }\r
- cmd.Format(_T("git reset --hard %s"),this->m_OrigUpstreamHash);\r
- if(g_Git.Run(cmd,&out,CP_UTF8))\r
- {\r
- AddLogString(out);\r
+ if(FinishRebase())\r
return ;\r
- }\r
+\r
OnOK();\r
}\r
\r
GitRev *curRev;\r
do\r
{\r
+ if(index<0)\r
+ return -1;\r
+ if(index>= m_CommitList.GetItemCount())\r
+ return -1;\r
+\r
curRev=(GitRev*)m_CommitList.m_arShownList[index];\r
\r
if( curRev->m_Action&CTGitPath::LOGACTIONS_REBASE_SQUASH )\r
else\r
index--;\r
}else\r
- return -1;\r
-\r
- if(index<0)\r
- return -1;\r
- if(index>= m_CommitList.GetItemCount())\r
- return -1;\r
+ return -1; \r
\r
}while(curRev->m_Action&CTGitPath::LOGACTIONS_REBASE_SKIP);\r
\r
case REBASE_FINISH:\r
Text = _T("Finish");\r
break;\r
+\r
+ case REBASE_DONE:\r
+ Text = _T("Done");\r
+ break;\r
}\r
this->GetDlgItem(IDC_REBASE_CONTINUE)->SetWindowText(Text);\r
}\r
case REBASE_CONFLICT:\r
case REBASE_EDIT:\r
case REBASE_SQUASH_CONFLICT:\r
+ case REBASE_DONE:\r
this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(FALSE);\r
this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(FALSE);\r
this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(FALSE);\r
m_ProgressBar.SetRange(1,m_CommitList.GetItemCount());\r
m_ProgressBar.SetPos(index);\r
\r
- if(m_CurrentRebaseIndex>0 && m_CurrentRebaseIndex< m_CommitList.GetItemCount())\r
+ if(m_CurrentRebaseIndex>=0 && m_CurrentRebaseIndex< m_CommitList.GetItemCount())\r
{\r
CString text;\r
text.Format(_T("Rebasing...(%d/%d)"),index,m_CommitList.GetItemCount());\r
\r
void CRebaseDlg::UpdateCurrentStatus()\r
{\r
- if( m_CurrentRebaseIndex < 0)\r
+ if( m_CurrentRebaseIndex < 0 && m_RebaseStage!= REBASE_DONE)\r
{\r
if(m_CommitList.m_IsOldFirst)\r
m_RebaseStage = CRebaseDlg::REBASE_START;\r
m_RebaseStage = CRebaseDlg::REBASE_FINISH;\r
}\r
\r
- if( m_CurrentRebaseIndex == m_CommitList.m_arShownList.GetSize())\r
+ if( m_CurrentRebaseIndex == m_CommitList.m_arShownList.GetSize() && m_RebaseStage!= REBASE_DONE)\r
{\r
if(m_CommitList.m_IsOldFirst)\r
- m_RebaseStage = CRebaseDlg::REBASE_FINISH;\r
+ m_RebaseStage = CRebaseDlg::REBASE_DONE;\r
else\r
- m_RebaseStage = CRebaseDlg::REBASE_START;\r
+ m_RebaseStage = CRebaseDlg::REBASE_FINISH;\r
}\r
\r
SetContinueButtonText();\r
return 0;\r
}\r
if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT)\r
+ {\r
+ this->m_RebaseStage = REBASE_EDIT ;\r
return -1; // Edit return -1 to stop rebase. \r
- \r
+ }\r
// Squash Case\r
if(CheckNextCommitIsSquash())\r
{ // no squash\r
return 0;\r
}\r
if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT)\r
+ {\r
+ this->m_RebaseStage = REBASE_EDIT ;\r
return -1; // Edit return -1 to stop rebase. \r
+ }\r
\r
// Squash Case\r
if(CheckNextCommitIsSquash())\r
{\r
ret = 0;\r
m_RebaseStage = REBASE_FINISH;\r
- break;\r
- }\r
-\r
- ret = DoRebase();\r
+ \r
+ }else\r
+ {\r
+ ret = DoRebase();\r
\r
- if( ret )\r
- { \r
- break;\r
+ if( ret )\r
+ { \r
+ break;\r
+ }\r
}\r
\r
+ }else if( m_RebaseStage == REBASE_FINISH )\r
+ { \r
+ FinishRebase();\r
+ m_RebaseStage = REBASE_DONE;\r
+ break;\r
+ \r
}else\r
+ {\r
break;\r
+ }\r
this->PostMessage(MSG_REBASE_UPDATE_UI);\r
//this->UpdateCurrentStatus();\r
}\r
list.AddPath(path);\r
\r
this->m_FileListCtrl.GetStatus(&list,true);\r
- this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED|CTGitPath::LOGACTIONS_MODIFIED,CTGitPath::LOGACTIONS_UNMERGED);\r
+ this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED|CTGitPath::LOGACTIONS_MODIFIED|CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_DELETED,\r
+ CTGitPath::LOGACTIONS_UNMERGED);\r
if( this->m_FileListCtrl.GetItemCount() == 0 )\r
{\r
\r
if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES)\r
return;\r
\r
+ cmd.Format(_T("git.exe checkout -f %s"),this->m_UpstreamCtrl.GetString());\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return ;\r
+ }\r
+\r
cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash.Left(40));\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
return ;\r
}\r
\r
+ if(this->m_IsCherryPick) //there are not "branch" at cherry pick mode\r
+ return;\r
+\r
cmd.Format(_T("git checkout -f %s"),this->m_BranchCtrl.GetString());\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
return ;\r
}\r
\r
+ cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash.Left(40));\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return ;\r
+ }\r
__super::OnCancel();\r
}\r
REBASE_EDIT,\r
REBASE_SQUASH_EDIT,\r
REBASE_SQUASH_CONFLICT,\r
+ REBASE_DONE,\r
};\r
\r
protected:\r
\r
int CheckNextCommitIsSquash();\r
int GetCurrentCommitID();\r
+ int FinishRebase();\r
\r
public:\r
\r
RelativePath=".\AppUtils.cpp"\r
>\r
</File>\r
+ <File\r
+ RelativePath=".\DeleteConflictDlg.cpp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\DeleteConflictDlg.h"\r
+ >\r
+ </File>\r
</Filter>\r
<Filter\r
Name="UI"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\explorer.ico"\r
+ RelativePath=".\explorer.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\explorer.ico"\r
+ RelativePath="..\Resources\explorer.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\newfolder.ico"\r
+ RelativePath=".\newfolder.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\newfolder.ico"\r
+ RelativePath="..\Resources\newfolder.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\open.ico"\r
+ RelativePath=".\open.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\open.ico"\r
+ RelativePath="..\Resources\open.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\save.ico"\r
+ RelativePath=".\save.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\save.ico"\r
+ RelativePath="..\Resources\save.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\saveas.ico"\r
+ RelativePath=".\saveas.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\saveas.ico"\r
+ RelativePath="..\Resources\saveas.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\up.ico"\r
+ RelativePath=".\up.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\up.ico"\r
+ RelativePath="..\Resources\up.ico"\r
>\r
</File>\r
<File\r