OSDN Git Service

5b1159ab0814f6cd9728d3f4f7c17316fdc0236a
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / SyncDlg.cpp
1 // TortoiseGit - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2008-2009 - TortoiseGit\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 \r
20 // SyncDlg.cpp : implementation file\r
21 //\r
22 \r
23 #include "stdafx.h"\r
24 #include "TortoiseProc.h"\r
25 #include "SyncDlg.h"\r
26 #include "progressdlg.h"\r
27 #include "MessageBox.h"\r
28 #include "ImportPatchDlg.h"\r
29 // CSyncDlg dialog\r
30 \r
31 IMPLEMENT_DYNAMIC(CSyncDlg, CResizableStandAloneDialog)\r
32 \r
33 CSyncDlg::CSyncDlg(CWnd* pParent /*=NULL*/)\r
34         : CResizableStandAloneDialog(CSyncDlg::IDD, pParent)\r
35 {\r
36         m_pTooltip=&this->m_tooltips;\r
37         m_bInited=false;\r
38         m_CmdOutCurrentPos=0;\r
39         m_bAutoLoadPuttyKey = CAppUtils::IsSSHPutty();\r
40 }\r
41 \r
42 CSyncDlg::~CSyncDlg()\r
43 {\r
44 }\r
45 \r
46 void CSyncDlg::DoDataExchange(CDataExchange* pDX)\r
47 {\r
48         CDialog::DoDataExchange(pDX);\r
49         DDX_Check(pDX, IDC_CHECK_PUTTY_KEY, m_bAutoLoadPuttyKey);\r
50         DDX_Check(pDX, IDC_CHECK_FORCE,m_bForce);\r
51         DDX_Control(pDX, IDC_COMBOBOXEX_URL, m_ctrlURL);\r
52         DDX_Control(pDX, IDC_BUTTON_TABCTRL, m_ctrlDumyButton);\r
53         DDX_Control(pDX, IDC_BUTTON_PULL, m_ctrlPull);\r
54         DDX_Control(pDX, IDC_BUTTON_PUSH, m_ctrlPush);\r
55         DDX_Control(pDX, IDC_STATIC_STATUS, m_ctrlStatus);\r
56         DDX_Control(pDX, IDC_PROGRESS_SYNC, m_ctrlProgress);\r
57         DDX_Control(pDX, IDC_ANIMATE_SYNC, m_ctrlAnimate);\r
58 \r
59         BRANCH_COMBOX_DDX;\r
60 }\r
61 \r
62 \r
63 BEGIN_MESSAGE_MAP(CSyncDlg, CResizableStandAloneDialog)\r
64         ON_BN_CLICKED(IDC_BUTTON_PULL, &CSyncDlg::OnBnClickedButtonPull)\r
65         ON_BN_CLICKED(IDC_BUTTON_PUSH, &CSyncDlg::OnBnClickedButtonPush)\r
66         ON_BN_CLICKED(IDC_BUTTON_APPLY, &CSyncDlg::OnBnClickedButtonApply)\r
67         ON_BN_CLICKED(IDC_BUTTON_EMAIL, &CSyncDlg::OnBnClickedButtonEmail)\r
68         ON_BN_CLICKED(IDC_BUTTON_MANAGE, &CSyncDlg::OnBnClickedButtonManage)\r
69         BRANCH_COMBOX_EVENT\r
70         ON_NOTIFY(CBEN_ENDEDIT, IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbenEndeditComboboxexUrl)\r
71         ON_CBN_EDITCHANGE(IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbnEditchangeComboboxexUrl)\r
72         ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
73 END_MESSAGE_MAP()\r
74 \r
75 \r
76 void CSyncDlg::EnableControlButton(bool bEnabled)\r
77 {\r
78         GetDlgItem(IDC_BUTTON_PULL)->EnableWindow(bEnabled);\r
79         GetDlgItem(IDC_BUTTON_PUSH)->EnableWindow(bEnabled);\r
80         GetDlgItem(IDC_BUTTON_APPLY)->EnableWindow(bEnabled);\r
81         GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(bEnabled);\r
82         GetDlgItem(IDOK)->EnableWindow(bEnabled);\r
83 }\r
84 // CSyncDlg message handlers\r
85 \r
86 void CSyncDlg::OnBnClickedButtonPull()\r
87 {\r
88         // TODO: Add your control notification handler code here\r
89         this->m_regPullButton =this->m_ctrlPull.GetCurrentEntry();\r
90 }\r
91 \r
92 void CSyncDlg::OnBnClickedButtonPush()\r
93 {\r
94         // TODO: Add your control notification handler code here\r
95         this->UpdateData();\r
96 \r
97         this->m_regPushButton=this->m_ctrlPush.GetCurrentEntry();\r
98         this->SwitchToRun();\r
99         this->m_bAbort=false;\r
100         this->m_GitCmdList.clear();\r
101 \r
102         ShowTab(IDC_CMD_LOG);\r
103 \r
104         CString cmd;\r
105         CString tags;\r
106         CString force;\r
107         CString all;\r
108         this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
109         this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
110         this->m_ctrlURL.GetWindowText(this->m_strURL);\r
111         m_strRemoteBranch=m_strRemoteBranch.Trim();\r
112         \r
113         this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->EnableWindow(this->m_bAutoLoadPuttyKey);\r
114 \r
115         switch (m_ctrlPush.GetCurrentEntry())\r
116         {\r
117         case 1:\r
118                 tags = _T(" --tags ");\r
119                 break;\r
120         case 2:\r
121                 all = _T(" --all ");\r
122                 break;\r
123         }\r
124 \r
125         if(this->m_bForce)\r
126                 force = _T(" --force ");\r
127 \r
128         cmd.Format(_T("git.exe push %s %s %s \"%s\" %s"),\r
129                                 tags,force,all,\r
130                                 m_strURL,\r
131                                 m_strLocalBranch);\r
132 \r
133         if (!m_strRemoteBranch.IsEmpty())\r
134         {\r
135                 cmd += _T(":") + m_strRemoteBranch;\r
136         }\r
137         \r
138         m_GitCmdList.push_back(cmd);\r
139 \r
140         m_CurrentCmd = GIT_COMMAND_PUSH;\r
141 \r
142         if(this->m_bAutoLoadPuttyKey)\r
143         {\r
144                 CAppUtils::LaunchPAgent(NULL,&this->m_strURL);\r
145         }\r
146 \r
147         m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);\r
148         if (m_pThread==NULL)\r
149         {\r
150 //              ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));\r
151         }\r
152         else\r
153         {\r
154                 m_pThread->m_bAutoDelete = TRUE;\r
155                 m_pThread->ResumeThread();\r
156         }\r
157         \r
158 }\r
159 \r
160 void CSyncDlg::OnBnClickedButtonApply()\r
161 {\r
162         // TODO: Add your control notification handler code here\r
163         CString oldhash;\r
164         oldhash=g_Git.GetHash(CString(_T("HEAD")));\r
165         \r
166         CImportPatchDlg dlg;\r
167         CString cmd,output;\r
168 \r
169         if(dlg.DoModal() == IDOK)\r
170         {\r
171                 int err=0;\r
172                 for(int i=0;i<dlg.m_PathList.GetCount();i++)\r
173                 {                       \r
174                         cmd.Format(_T("git.exe am \"%s\""),dlg.m_PathList[i].GetGitPathString());\r
175                         \r
176                         if(g_Git.Run(cmd,&output,CP_ACP))\r
177                         {\r
178                                 CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK);\r
179 \r
180                                 err=1;\r
181                                 break;\r
182                         }\r
183                 }\r
184                 this->m_ctrlCmdOut.SetSel(-1,-1);\r
185                 this->m_ctrlCmdOut.ReplaceSel(output);\r
186 \r
187                 CString newhash=g_Git.GetHash(CString(_T("HEAD")));             \r
188 \r
189                 this->m_InLogList.Clear();\r
190                 this->m_InChangeFileList.Clear();\r
191 \r
192                 if(newhash == oldhash)\r
193                 {\r
194                         this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false);\r
195                         this->m_InLogList.ShowText(_T("No commits get from patch"));\r
196                         this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,true);\r
197 \r
198                 }else\r
199                 {\r
200                         this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,true);\r
201                         this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,true);\r
202                         \r
203                         this->AddDiffFileList(&m_InChangeFileList,&m_arInChangeList,newhash,oldhash);\r
204                 }\r
205 \r
206                 if(err)\r
207                 {\r
208                         this->ShowTab(IDC_CMD_LOG);\r
209 \r
210                 }else\r
211                 {\r
212                         this->ShowTab(IDC_IN_LOGLIST);\r
213                 }\r
214         }\r
215 }\r
216 \r
217 void CSyncDlg::OnBnClickedButtonEmail()\r
218 {\r
219         // TODO: Add your control notification handler code here\r
220         CString cmd,out;\r
221         \r
222         this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
223         this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
224         this->m_ctrlURL.GetWindowText(this->m_strURL);\r
225         m_strURL=m_strURL.Trim();\r
226         m_strRemoteBranch=m_strRemoteBranch.Trim();\r
227         \r
228         cmd.Format(_T("git.exe  format-patch -o \"%s\" %s..%s"),\r
229                                         g_Git.m_CurrentDir,\r
230                                         m_strURL+_T('/')+m_strRemoteBranch,m_strLocalBranch);\r
231         \r
232         if(g_Git.Run(cmd,&out,CP_ACP))\r
233         {\r
234                 CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
235                 return ;\r
236         }\r
237 \r
238         CAppUtils::SendPatchMail(cmd,out);      \r
239 \r
240 }\r
241 void CSyncDlg::ShowProgressCtrl(bool bShow)\r
242 {\r
243         int b=bShow?SW_NORMAL:SW_HIDE;\r
244         this->m_ctrlAnimate.ShowWindow(b);\r
245         this->m_ctrlProgress.ShowWindow(b);\r
246         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
247         if(b == SW_NORMAL)\r
248                 this->m_ctrlAnimate.Play(0,-1,-1);\r
249         else\r
250                 this->m_ctrlAnimate.Stop();\r
251 }\r
252 void CSyncDlg::ShowInputCtrl(bool bShow)\r
253 {\r
254         int b=bShow?SW_NORMAL:SW_HIDE;\r
255         this->m_ctrlURL.ShowWindow(b);\r
256         this->m_ctrlLocalBranch.ShowWindow(b);\r
257         this->m_ctrlRemoteBranch.ShowWindow(b);\r
258         this->GetDlgItem(IDC_BUTTON_LOCAL_BRANCH)->ShowWindow(b);\r
259         this->GetDlgItem(IDC_BUTTON_REMOTE_BRANCH)->ShowWindow(b);\r
260         this->GetDlgItem(IDC_STATIC_LOCAL_BRANCH)->ShowWindow(b);\r
261         this->GetDlgItem(IDC_STATIC_REMOTE_BRANCH)->ShowWindow(b);\r
262         this->GetDlgItem(IDC_BUTTON_MANAGE)->ShowWindow(b);\r
263         this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->ShowWindow(b);\r
264         this->GetDlgItem(IDC_CHECK_FORCE)->ShowWindow(b);\r
265         this->GetDlgItem(IDC_STATIC_REMOTE_URL)->ShowWindow(b);\r
266         \r
267 }\r
268 BOOL CSyncDlg::OnInitDialog()\r
269 {\r
270         CResizableStandAloneDialog::OnInitDialog();\r
271 \r
272         /*\r
273         this->m_ctrlAnimate.ShowWindow(SW_NORMAL);\r
274         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
275         this->m_ctrlAnimate.Play(0,-1,-1);\r
276     */\r
277 \r
278         // ------------------ Create Tabctrl -----------\r
279         CWnd *pwnd=this->GetDlgItem(IDC_BUTTON_TABCTRL);\r
280         CRect rectDummy;\r
281         pwnd->GetWindowRect(&rectDummy);\r
282         this->ScreenToClient(rectDummy);\r
283 \r
284         if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_SYNC_TAB))\r
285         {\r
286                 TRACE0("Failed to create output tab window\n");\r
287                 return FALSE;      // fail to create\r
288         }\r
289         m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);\r
290 \r
291         // -------------Create Command Log Ctrl ---------\r
292         DWORD dwStyle;\r
293         dwStyle= ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL |WS_VSCROLL  ;\r
294 \r
295         if( !m_ctrlCmdOut.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_CMD_LOG))\r
296         {\r
297                 TRACE0("Failed to create Log commits window\n");\r
298                 return FALSE;      // fail to create\r
299         }\r
300 \r
301         m_ctrlTabCtrl.InsertTab(&m_ctrlCmdOut,_T("Log"),-1);\r
302         \r
303         //m_ctrlCmdOut.ReplaceSel(_T("Hello"));\r
304 \r
305         //----------  Create in coming list ctrl -----------\r
306         dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;;\r
307 \r
308         if( !m_InLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_LOGLIST))\r
309         {\r
310                 TRACE0("Failed to create output commits window\n");\r
311                 return FALSE;      // fail to create\r
312 \r
313         }\r
314 \r
315         m_ctrlTabCtrl.InsertTab(&m_InLogList,_T("In Commits"),-1);\r
316 \r
317         m_InLogList.InsertGitColumn();\r
318 \r
319         //----------- Create In Change file list -----------\r
320         dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
321         \r
322         if( !m_InChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_CHANGELIST))\r
323         {\r
324                 TRACE0("Failed to create output change files window\n");\r
325                 return FALSE;      // fail to create\r
326         }\r
327         m_ctrlTabCtrl.InsertTab(&m_InChangeFileList,_T("Out ChangeList"),-1);\r
328 \r
329         m_InChangeFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
330                                     (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
331                                                         CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
332 \r
333 \r
334         //----------  Create Commit List Ctrl---------------\r
335                         \r
336         dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;;\r
337 \r
338         if( !m_OutLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_LOGLIST))\r
339         {\r
340                 TRACE0("Failed to create output commits window\n");\r
341                 return FALSE;      // fail to create\r
342 \r
343         }\r
344 \r
345         m_ctrlTabCtrl.InsertTab(&m_OutLogList,_T("Out Commits"),-1);\r
346         \r
347 \r
348         m_OutLogList.InsertGitColumn();\r
349 \r
350         //------------- Create Change File List Control ----------------\r
351 \r
352         dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
353         \r
354         if( !m_OutChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_CHANGELIST))\r
355         {\r
356                 TRACE0("Failed to create output change files window\n");\r
357                 return FALSE;      // fail to create\r
358         }\r
359         m_ctrlTabCtrl.InsertTab(&m_OutChangeFileList,_T("Out ChangeList"),-1);\r
360 \r
361         m_OutChangeFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
362                                     (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
363                                                         CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
364 \r
365         this->m_tooltips.Create(this);\r
366 \r
367         AddAnchor(IDC_SYNC_TAB,TOP_LEFT,BOTTOM_RIGHT);\r
368 \r
369         AddAnchor(IDC_GROUP_INFO,TOP_LEFT,TOP_RIGHT);\r
370         AddAnchor(IDC_COMBOBOXEX_URL,TOP_LEFT,TOP_RIGHT);\r
371         AddAnchor(IDC_BUTTON_MANAGE,TOP_RIGHT);\r
372         AddAnchor(IDC_BUTTON_PULL,BOTTOM_LEFT);\r
373         AddAnchor(IDC_BUTTON_PUSH,BOTTOM_LEFT);\r
374         AddAnchor(IDC_BUTTON_APPLY,BOTTOM_LEFT);\r
375         AddAnchor(IDC_BUTTON_EMAIL,BOTTOM_LEFT);\r
376         AddAnchor(IDC_PROGRESS_SYNC,TOP_LEFT,TOP_RIGHT);\r
377         AddAnchor(IDOK,BOTTOM_RIGHT);\r
378         AddAnchor(IDHELP,BOTTOM_RIGHT);\r
379         AddAnchor(IDC_STATIC_STATUS,BOTTOM_LEFT);\r
380         AddAnchor(IDC_ANIMATE_SYNC,TOP_LEFT);\r
381         \r
382         BRANCH_COMBOX_ADD_ANCHOR();\r
383 \r
384         CString WorkingDir=g_Git.m_CurrentDir;\r
385         WorkingDir.Replace(_T(':'),_T('_'));\r
386         m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir;\r
387 \r
388 \r
389         this->AddOthersToAnchor();\r
390         // TODO:  Add extra initialization here\r
391 \r
392         this->m_ctrlPush.AddEntry(CString(_T("Push")));\r
393         this->m_ctrlPush.AddEntry(CString(_T("Push tags")));\r
394         ///this->m_ctrlPush.AddEntry(CString(_T("Push All")));\r
395 \r
396         this->m_ctrlPull.AddEntry(CString(_T("&Pull")));\r
397         this->m_ctrlPull.AddEntry(CString(_T("&Fetch")));\r
398         this->m_ctrlPull.AddEntry(CString(_T("Fetch&&Rebase")));\r
399 \r
400         \r
401         WorkingDir.Replace(_T(':'),_T('_'));\r
402 \r
403         CString regkey ;\r
404         regkey.Format(_T("Software\\TortoiseGit\\TortoiseProc\\Sync\\%s"),WorkingDir);\r
405 \r
406         this->m_regPullButton = CRegDWORD(regkey+_T("\\Pull"),0);\r
407         this->m_regPushButton = CRegDWORD(regkey+_T("\\Push"),0);\r
408 \r
409         this->m_ctrlPull.SetCurrentEntry(this->m_regPullButton);\r
410         this->m_ctrlPush.SetCurrentEntry(this->m_regPushButton);\r
411 \r
412         CString str;\r
413         this->GetWindowText(str);\r
414         str += _T(" - ") + g_Git.m_CurrentDir;\r
415         this->SetWindowText(str);\r
416 \r
417         EnableSaveRestore(_T("SyncDlg"));\r
418 \r
419         this->LoadBranchInfo();\r
420 \r
421         this->m_bInited=true;\r
422         FetchOutList();\r
423         \r
424         m_ctrlTabCtrl.ShowTab(IDC_CMD_LOG-1,false);\r
425         m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,false);\r
426         m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false);\r
427         \r
428         return TRUE;  // return TRUE unless you set the focus to a control\r
429         // EXCEPTION: OCX Property Pages should return FALSE\r
430 }\r
431 \r
432 void CSyncDlg::OnBnClickedButtonManage()\r
433 {\r
434         // TODO: Add your control notification handler code here\r
435         CAppUtils::LaunchRemoteSetting();\r
436 }\r
437 \r
438 BOOL CSyncDlg::PreTranslateMessage(MSG* pMsg)\r
439 {\r
440         // TODO: Add your specialized code here and/or call the base class\r
441         m_tooltips.RelayEvent(pMsg);\r
442         return __super::PreTranslateMessage(pMsg);\r
443 }\r
444 void CSyncDlg::FetchOutList(bool force)\r
445 {\r
446         if(!m_bInited)\r
447                 return;\r
448         m_OutChangeFileList.Clear();\r
449         this->m_OutLogList.Clear();\r
450 \r
451         CString remote;\r
452         this->m_ctrlURL.GetWindowText(remote);\r
453         CString remotebranch;\r
454         this->m_ctrlRemoteBranch.GetWindowText(remotebranch);\r
455         remotebranch=remote+_T("/")+remotebranch;\r
456 \r
457         if(IsURL())\r
458         {\r
459                 CString str;\r
460                 str=_T("Don't know what will push befause you enter URL");\r
461                 m_OutLogList.ShowText(str);\r
462                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
463                 m_OutLocalBranch.Empty();\r
464                 m_OutRemoteBranch.Empty();\r
465 \r
466                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
467                 return ;\r
468         \r
469         }else if(g_Git.GetHash(remotebranch).GetLength()<40)\r
470         {\r
471                 CString str;\r
472                 str.Format(_T("Don't know what will push befause unkown \"%s\""),remotebranch);\r
473                 m_OutLogList.ShowText(str);\r
474                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
475                 m_OutLocalBranch.Empty();\r
476                 m_OutRemoteBranch.Empty();\r
477 \r
478                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
479                 return ;\r
480         }\r
481         else\r
482         {\r
483                 CString localbranch;\r
484                 localbranch=this->m_ctrlLocalBranch.GetString();\r
485 \r
486                 if(localbranch != m_OutLocalBranch || m_OutRemoteBranch != remotebranch || force)\r
487                 {\r
488                         m_OutLogList.ClearText();\r
489                         m_OutLogList.FillGitLog(NULL,CGit::     LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
490                                 &remotebranch,&localbranch);\r
491                         \r
492                         CString str;\r
493                         if(m_OutLogList.GetItemCount() == 0)\r
494                         {                       \r
495                                 str.Format(_T("No commits ahead \"%s\""),remotebranch);\r
496                                 m_OutLogList.ShowText(str);\r
497                                 this->m_ctrlStatus.SetWindowText(str);\r
498                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
499                                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
500                         }\r
501                         else\r
502                         {\r
503                                 str.Format(_T("%d commits ahead \"%s\""),m_OutLogList.GetItemCount(),remotebranch);\r
504                                 this->m_ctrlStatus.SetWindowText(str);\r
505 \r
506                                 AddDiffFileList(&m_OutChangeFileList,&m_arOutChangeList,localbranch,remotebranch);\r
507                                 \r
508                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,TRUE);\r
509                                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(TRUE);\r
510                         }\r
511                 }\r
512                 this->m_OutLocalBranch=localbranch;\r
513                 this->m_OutRemoteBranch=remotebranch;\r
514         }\r
515 \r
516 }\r
517 \r
518 bool CSyncDlg::IsURL()\r
519 {\r
520         CString str;\r
521         this->m_ctrlURL.GetWindowText(str);\r
522         if(str.Find(_T('\\'))>=0 || str.Find(_T('/'))>=0)\r
523                 return true;\r
524         else\r
525                 return false;\r
526 }\r
527 void CSyncDlg::OnCbenEndeditComboboxexUrl(NMHDR *pNMHDR, LRESULT *pResult)\r
528 {\r
529         // TODO: Add your control notification handler code here\r
530         *pResult = 0;\r
531 }\r
532 \r
533 void CSyncDlg::OnCbnEditchangeComboboxexUrl()\r
534 {\r
535         this->FetchOutList();\r
536         // TODO: Add your control notification handler code here\r
537 }\r
538 \r
539 UINT CSyncDlg::ProgressThread()\r
540 {\r
541         m_GitCmdStatus=CProgressDlg::RunCmdList(this,m_GitCmdList,true,NULL,&this->m_bAbort);\r
542         return 0;\r
543 }\r
544 \r
545 \r
546 LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)\r
547 {\r
548         if(wParam == MSG_PROGRESSDLG_START)\r
549         {\r
550                 m_ctrlAnimate.Play(0,-1,-1);\r
551                 this->m_ctrlProgress.SetPos(0);\r
552         }\r
553 \r
554         if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
555         {\r
556                 //m_bDone = true;\r
557                 m_ctrlAnimate.Stop();\r
558                 m_ctrlProgress.SetPos(100);\r
559                 //this->DialogEnableWindow(IDOK,TRUE);\r
560 \r
561                 //if(wParam == MSG_PROGRESSDLG_END)\r
562                 {\r
563                         EnableControlButton(true);\r
564                         SwitchToInput();\r
565                         this->FetchOutList(true);\r
566                 }\r
567         }\r
568 \r
569         if(lParam != 0)\r
570                 ParserCmdOutput((TCHAR)lParam);\r
571 \r
572         return 0;\r
573 }\r
574 \r
575 void CSyncDlg::ParserCmdOutput(TCHAR ch)\r
576 {\r
577         //TRACE(_T("%c"),ch);\r
578         int linenum;\r
579         int index;\r
580         linenum = this->m_ctrlCmdOut.GetLineCount();\r
581 \r
582         if( ch == _T('\r') )\r
583         {\r
584                 if(linenum>0)\r
585                         m_CmdOutCurrentPos = this->m_ctrlCmdOut.LineIndex(linenum-1);\r
586                 else\r
587                         m_CmdOutCurrentPos = 0;\r
588 \r
589                 //TRACE(_T("line %d - %d\n"),index,m_ctrlCmdOut.GetTextLength());\r
590         }else\r
591                 m_CmdOutCurrentPos++;\r
592                 \r
593         this->m_ctrlCmdOut.SetSel(m_CmdOutCurrentPos,m_CmdOutCurrentPos+1);\r
594         \r
595         if( ch != _T('\r') )\r
596                 this->m_ctrlCmdOut.ReplaceSel(CString(ch));\r
597         \r
598         int firstline = m_ctrlCmdOut.GetFirstVisibleLine();\r
599         if( linenum - firstline > 4 )\r
600                 this->m_ctrlCmdOut.LineScroll(linenum - firstline -4);\r
601 \r
602         if( ch == _T('\r') || ch == _T('\n') )\r
603         {\r
604                 int s1=m_LogText.Find(_T(':'));\r
605                 int s2=m_LogText.Find(_T('%'));\r
606                 if(s1>0 && s2>0)\r
607                 {\r
608                         //      this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));\r
609                         int pos=CProgressDlg::FindPercentage(m_LogText);\r
610                         TRACE(_T("Pos %d\r\n"),pos);\r
611                         if(pos>0)\r
612                                 this->m_ctrlProgress.SetPos(pos);\r
613                 }\r
614                 m_LogText=_T("");       \r
615         }\r
616         m_LogText+=ch;\r
617 \r
618 }