Update the meaning of git fetch --tags and tagopt=--tags
[TortoiseGit.git] / src / TortoiseProc / Settings / SettingGitRemote.cpp
blob3c3604d3182ac025d49e67e8f163897e13fcab77
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2014 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 // SettingGitRemote.cpp : implementation file
22 #include "stdafx.h"
23 #include "TortoiseProc.h"
24 #include "SettingGitRemote.h"
25 #include "Settings.h"
26 #include "GitAdminDir.h"
27 #include "MessageBox.h"
28 #include "AppUtils.h"
29 #include "Git.h"
31 // CSettingGitRemote dialog
33 IMPLEMENT_DYNAMIC(CSettingGitRemote, ISettingsPropPage)
35 CSettingGitRemote::CSettingGitRemote(CString cmdPath)
36 : ISettingsPropPage(CSettingGitRemote::IDD)
37 , m_strRemote(_T(""))
38 , m_strUrl(_T(""))
39 , m_strPuttyKeyfile(_T(""))
40 , m_cmdPath(cmdPath)
41 , m_bNoFetch(false)
42 , m_bPrune(2)
45 m_ChangedMask = 0;
48 CSettingGitRemote::~CSettingGitRemote()
52 void CSettingGitRemote::DoDataExchange(CDataExchange* pDX)
54 CPropertyPage::DoDataExchange(pDX);
55 DDX_Control(pDX, IDC_LIST_REMOTE, m_ctrlRemoteList);
56 DDX_Text(pDX, IDC_EDIT_REMOTE, m_strRemote);
57 DDX_Text(pDX, IDC_EDIT_URL, m_strUrl);
58 DDX_Text(pDX, IDC_EDIT_PUTTY_KEY, m_strPuttyKeyfile);
59 DDX_Control(pDX, IDC_COMBO_TAGOPT, m_ctrlTagOpt);
60 DDX_Check(pDX, IDC_CHECK_PRUNE, m_bPrune);
64 BEGIN_MESSAGE_MAP(CSettingGitRemote, CPropertyPage)
65 ON_WM_TIMER()
66 ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CSettingGitRemote::OnBnClickedButtonBrowse)
67 ON_BN_CLICKED(IDC_BUTTON_ADD, &CSettingGitRemote::OnBnClickedButtonAdd)
68 ON_LBN_SELCHANGE(IDC_LIST_REMOTE, &CSettingGitRemote::OnLbnSelchangeListRemote)
69 ON_EN_CHANGE(IDC_EDIT_REMOTE, &CSettingGitRemote::OnEnChangeEditRemote)
70 ON_EN_CHANGE(IDC_EDIT_URL, &CSettingGitRemote::OnEnChangeEditUrl)
71 ON_EN_CHANGE(IDC_EDIT_PUTTY_KEY, &CSettingGitRemote::OnEnChangeEditPuttyKey)
72 ON_CBN_SELCHANGE(IDC_COMBO_TAGOPT, &CSettingGitRemote::OnCbnSelchangeComboTagOpt)
73 ON_BN_CLICKED(IDC_CHECK_PRUNE, &CSettingGitRemote::OnBnClickedCheckprune)
74 ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CSettingGitRemote::OnBnClickedButtonRemove)
75 ON_BN_CLICKED(IDC_BUTTON_RENAME_REMOTE, &CSettingGitRemote::OnBnClickedButtonRenameRemote)
76 END_MESSAGE_MAP()
78 static void ShowEditBalloon(HWND hDlg, UINT nIdControl, UINT nIdText, UINT nIdTitle, int nIcon = TTI_WARNING)
80 CString text(MAKEINTRESOURCE(nIdText));
81 CString title(MAKEINTRESOURCE(nIdTitle));
82 EDITBALLOONTIP bt;
83 bt.cbStruct = sizeof(bt);
84 bt.pszText = text;
85 bt.pszTitle = title;
86 bt.ttiIcon = nIcon;
87 SendDlgItemMessage(hDlg, nIdControl, EM_SHOWBALLOONTIP, 0, (LPARAM)&bt);
90 #define TIMER_PREFILL 1
92 BOOL CSettingGitRemote::OnInitDialog()
94 ISettingsPropPage::OnInitDialog();
96 //CString str=((CSettings*)GetParent())->m_CmdPath.GetWinPath();
97 CString proj;
98 if( g_GitAdminDir.HasAdminDir(m_cmdPath,&proj) )
100 CString title;
101 this->GetWindowText(title);
102 this->SetWindowText(title + _T(" - ") + proj);
105 STRING_VECTOR remotes;
106 g_Git.GetRemoteList(remotes);
107 m_ctrlRemoteList.ResetContent();
108 for (size_t i = 0; i < remotes.size(); i++)
109 m_ctrlRemoteList.AddString(remotes[i]);
111 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_REACHABLE)));
112 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_NONE)));
113 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(CAppUtils::GetMsysgitVersion() < 0x01090000 ? IDS_FETCH_TAGS_ONLY : IDS_ALL)));
114 m_ctrlTagOpt.SetCurSel(0);
116 if (CAppUtils::GetMsysgitVersion() < 0x0108050)
117 GetDlgItem(IDC_CHECK_PRUNE)->ShowWindow(SW_HIDE);
119 //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE);
120 this->UpdateData(FALSE);
122 SetTimer(TIMER_PREFILL, 1000, nullptr);
123 return TRUE;
125 // CSettingGitRemote message handlers
127 void CSettingGitRemote::OnTimer(UINT_PTR nIDEvent)
129 if (nIDEvent == TIMER_PREFILL)
131 if (m_strRemote.IsEmpty() && m_ctrlRemoteList.GetCount() == 0)
133 ShowEditBalloon(m_hWnd, IDC_EDIT_URL, IDS_B_T_PREFILL_ORIGIN, IDS_HINT, TTI_INFO);
136 KillTimer(TIMER_PREFILL);
140 void CSettingGitRemote::OnBnClickedButtonBrowse()
142 CFileDialog dlg(TRUE,NULL,
143 NULL,
144 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
145 CString(MAKEINTRESOURCE(IDS_PUTTYKEYFILEFILTER)));
147 this->UpdateData();
148 INT_PTR ret = dlg.DoModal();
149 SetCurrentDirectory(g_Git.m_CurrentDir);
150 if (ret == IDOK)
152 this->m_strPuttyKeyfile = dlg.GetPathName();
153 this->UpdateData(FALSE);
154 OnEnChangeEditPuttyKey();
158 void CSettingGitRemote::OnBnClickedButtonAdd()
160 this->UpdateData();
162 if(m_strRemote.IsEmpty())
164 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
165 return;
167 if(m_strUrl.IsEmpty())
169 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
170 return;
173 m_ChangedMask = REMOTE_NAME | REMOTE_URL | REMOTE_PUTTYKEY | REMOTE_TAGOPT | REMOTE_PRUNE;
174 if(IsRemoteExist(m_strRemote))
176 CString msg;
177 msg.Format(IDS_PROC_GITCONFIG_OVERWRITEREMOTE, m_strRemote);
178 if(CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES)
180 m_ChangedMask &= ~REMOTE_NAME;
182 else
183 return;
186 this->OnApply();
189 BOOL CSettingGitRemote::IsRemoteExist(CString &remote)
191 CString str;
192 for(int i=0;i<m_ctrlRemoteList.GetCount();i++)
194 m_ctrlRemoteList.GetText(i,str);
195 if(str == remote)
197 return true;
200 return false;
203 void CSettingGitRemote::OnLbnSelchangeListRemote()
205 CWaitCursor wait;
207 if(m_ChangedMask)
209 if(CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_SAVEREMOTE, IDS_APPNAME, 1, IDI_QUESTION, IDS_SAVEBUTTON, IDS_DISCARDBUTTON) == 1)
210 OnApply();
212 SetModified(FALSE);
214 CString cmd,output;
215 int index;
216 index = this->m_ctrlRemoteList.GetCurSel();
217 if(index<0)
219 m_strUrl.Empty();
220 m_strRemote.Empty();
221 m_strPuttyKeyfile.Empty();
222 this->UpdateData(FALSE);
223 return;
225 CString remote;
226 m_ctrlRemoteList.GetText(index,remote);
227 this->m_strRemote=remote;
229 cmd.Format(_T("remote.%s.url"),remote);
230 m_strUrl.Empty();
231 m_strUrl = g_Git.GetConfigValue(cmd, CP_UTF8);
233 cmd.Format(_T("remote.%s.puttykeyfile"),remote);
235 this->m_strPuttyKeyfile = g_Git.GetConfigValue(cmd, CP_UTF8);
237 m_ChangedMask=0;
240 cmd.Format(_T("remote.%s.tagopt"), remote);
241 CString tagopt = g_Git.GetConfigValue(cmd, CP_UTF8);
242 index = 0;
243 if (tagopt == "--no-tags")
244 index = 1;
245 else if (tagopt == "--tags")
246 index = 2;
247 m_ctrlTagOpt.SetCurSel(index);
249 cmd.Format(_T("remote.%s.prune"), remote);
250 CString prune = g_Git.GetConfigValue(cmd, CP_UTF8);
251 m_bPrune = prune == _T("true") ? TRUE : prune == _T("false") ? FALSE : 2;
253 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
254 GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(TRUE);
255 GetDlgItem(IDC_BUTTON_RENAME_REMOTE)->EnableWindow(TRUE);
256 this->UpdateData(FALSE);
260 void CSettingGitRemote::OnEnChangeEditRemote()
262 m_ChangedMask|=REMOTE_NAME;
264 this->UpdateData();
265 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
266 this->SetModified();
267 else
268 this->SetModified(0);
271 void CSettingGitRemote::OnEnChangeEditUrl()
273 m_ChangedMask|=REMOTE_URL;
275 this->UpdateData();
277 if (m_strRemote.IsEmpty() && !m_strUrl.IsEmpty() && m_ctrlRemoteList.GetCount() == 0)
279 GetDlgItem(IDC_EDIT_REMOTE)->SetWindowText(_T("origin"));
280 OnEnChangeEditRemote();
283 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
284 this->SetModified();
285 else
286 this->SetModified(0);
289 void CSettingGitRemote::OnEnChangeEditPuttyKey()
291 m_ChangedMask|=REMOTE_PUTTYKEY;
293 this->UpdateData();
294 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
295 this->SetModified();
296 else
297 this->SetModified(0);
300 void CSettingGitRemote::OnCbnSelchangeComboTagOpt()
302 m_ChangedMask |= REMOTE_TAGOPT;
304 this->UpdateData();
305 if (this->m_ctrlTagOpt.GetCurSel() > 0)
306 this->SetModified();
307 else
308 this->SetModified(0);
311 void CSettingGitRemote::OnBnClickedCheckprune()
313 m_ChangedMask |= REMOTE_PRUNE;
315 this->UpdateData();
316 if (m_bPrune != 2)
317 this->SetModified();
318 else
319 this->SetModified(0);
322 BOOL CSettingGitRemote::Save(CString key,CString value)
324 CString cmd,out;
326 cmd.Format(_T("remote.%s.%s"),this->m_strRemote,key);
327 if (value.IsEmpty())
329 // don't check result code. it fails if the entry not exist
330 g_Git.UnsetConfigValue(cmd, CONFIG_LOCAL);
331 if (!g_Git.GetConfigValue(cmd).IsEmpty())
333 CString msg;
334 msg.Format(IDS_PROC_SAVECONFIGFAILED, cmd, value);
335 CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_OK | MB_ICONERROR);
336 return FALSE;
338 return TRUE;
341 if (g_Git.SetConfigValue(cmd, value, CONFIG_LOCAL))
343 CString msg;
344 msg.Format(IDS_PROC_SAVECONFIGFAILED, cmd, value);
345 CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_OK | MB_ICONERROR);
346 return FALSE;
348 return TRUE;
350 BOOL CSettingGitRemote::OnApply()
352 CWaitCursor wait;
353 this->UpdateData();
354 if (m_ChangedMask && m_strRemote.Trim().IsEmpty())
356 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
357 return FALSE;
360 if(m_ChangedMask & REMOTE_NAME)
362 //Add Remote
363 if(m_strRemote.IsEmpty())
365 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
366 return FALSE;
368 if(m_strUrl.IsEmpty())
370 CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
371 return FALSE;
374 if (m_ctrlRemoteList.GetCount() > 0)
376 // tagopt not --no-tags
377 if (m_ctrlTagOpt.GetCurSel() != 1)
379 if (CMessageBox::ShowCheck(GetSafeHwnd(), IDS_PROC_GITCONFIG_ASKTAGOPT, IDS_APPNAME, MB_YESNO | MB_ICONQUESTION, _T("TagOptNoTagsWarning"), IDS_MSGBOX_DONOTSHOWAGAIN) == IDYES)
380 m_ctrlTagOpt.SetCurSel(1);
384 m_strUrl.Replace(L'\\', L'/');
385 CString cmd,out;
386 cmd.Format(_T("git.exe remote add \"%s\" \"%s\""),m_strRemote,m_strUrl);
387 if (g_Git.Run(cmd, &out, CP_UTF8))
389 CMessageBox::Show(NULL,out,_T("TorotiseGit"),MB_OK|MB_ICONERROR);
390 return FALSE;
392 m_ChangedMask &= ~REMOTE_URL;
394 m_ctrlRemoteList.SetCurSel(m_ctrlRemoteList.AddString(m_strRemote));
395 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
396 GetDlgItem(IDC_BUTTON_RENAME_REMOTE)->EnableWindow(TRUE);
397 if (!m_bNoFetch && CMessageBox::Show(NULL, IDS_SETTINGS_FETCH_ADDEDREMOTE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO) == IDYES)
398 CCommonAppUtils::RunTortoiseGitProc(_T("/command:fetch /path:\"") + g_Git.m_CurrentDir + _T("\" /remote:\"") + m_strRemote + _T("\""));
400 if(m_ChangedMask & REMOTE_URL)
402 m_strUrl.Replace(L'\\', L'/');
403 if (!Save(_T("url"),this->m_strUrl))
404 return FALSE;
407 if(m_ChangedMask & REMOTE_PUTTYKEY)
409 if (!Save(_T("puttykeyfile"),this->m_strPuttyKeyfile))
410 return FALSE;
413 if (m_ChangedMask & REMOTE_TAGOPT)
415 CString tagopt;
416 int index = m_ctrlTagOpt.GetCurSel();
417 if (index == 1)
418 tagopt = "--no-tags";
419 else if (index == 2)
420 tagopt = "--tags";
421 if (!Save(_T("tagopt"), tagopt))
422 return FALSE;
425 if (m_ChangedMask & REMOTE_PRUNE)
427 if (!Save(_T("prune"), m_bPrune == TRUE ? _T("true") : m_bPrune == FALSE ? _T("false") : _T("")))
428 return FALSE;
431 SetModified(FALSE);
433 m_ChangedMask = 0;
434 return ISettingsPropPage::OnApply();
436 void CSettingGitRemote::OnBnClickedButtonRemove()
438 int index;
439 index=m_ctrlRemoteList.GetCurSel();
440 if(index>=0)
442 CString str;
443 m_ctrlRemoteList.GetText(index,str);
444 CString msg;
445 msg.Format(IDS_PROC_GITCONFIG_DELETEREMOTE, str);
446 if(CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)
448 CString cmd,out;
449 cmd.Format(_T("git.exe remote rm %s"),str);
450 if (g_Git.Run(cmd, &out, CP_UTF8))
452 CMessageBox::Show(NULL, out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
453 return;
456 m_ctrlRemoteList.DeleteString(index);
457 OnLbnSelchangeListRemote();
462 void CSettingGitRemote::OnBnClickedButtonRenameRemote()
464 int sel = m_ctrlRemoteList.GetCurSel();
465 if (sel >= 0)
467 CString oldRemote, newRemote;
468 m_ctrlRemoteList.GetText(sel, oldRemote);
469 GetDlgItem(IDC_EDIT_REMOTE)->GetWindowText(newRemote);
470 CString cmd, out;
471 cmd.Format(_T("git.exe remote rename %s %s"), oldRemote, newRemote);
472 if (g_Git.Run(cmd, &out, CP_UTF8))
474 CMessageBox::Show(NULL, out,_T("TortoiseGit"), MB_OK | MB_ICONERROR);
475 return;
478 m_ctrlRemoteList.DeleteString(sel);
479 m_ctrlRemoteList.SetCurSel(m_ctrlRemoteList.AddString(newRemote));
480 m_ChangedMask &= ~REMOTE_NAME;
481 if (!m_ChangedMask)
482 this->SetModified(FALSE);