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
23 #include "TortoiseProc.h"
24 #include "SettingGitRemote.h"
26 #include "GitAdminDir.h"
27 #include "MessageBox.h"
31 // CSettingGitRemote dialog
33 IMPLEMENT_DYNAMIC(CSettingGitRemote
, ISettingsPropPage
)
35 CSettingGitRemote::CSettingGitRemote(CString cmdPath
)
36 : ISettingsPropPage(CSettingGitRemote::IDD
)
39 , m_strPuttyKeyfile(_T(""))
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
)
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
)
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
));
83 bt
.cbStruct
= sizeof(bt
);
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();
98 if( g_GitAdminDir
.HasAdminDir(m_cmdPath
,&proj
) )
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);
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
,
144 OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT
,
145 CString(MAKEINTRESOURCE(IDS_PUTTYKEYFILEFILTER
)));
148 INT_PTR ret
= dlg
.DoModal();
149 SetCurrentDirectory(g_Git
.m_CurrentDir
);
152 this->m_strPuttyKeyfile
= dlg
.GetPathName();
153 this->UpdateData(FALSE
);
154 OnEnChangeEditPuttyKey();
158 void CSettingGitRemote::OnBnClickedButtonAdd()
162 if(m_strRemote
.IsEmpty())
164 CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_REMOTEEMPTY
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
167 if(m_strUrl
.IsEmpty())
169 CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_URLEMPTY
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
173 m_ChangedMask
= REMOTE_NAME
| REMOTE_URL
| REMOTE_PUTTYKEY
| REMOTE_TAGOPT
| REMOTE_PRUNE
;
174 if(IsRemoteExist(m_strRemote
))
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
;
189 BOOL
CSettingGitRemote::IsRemoteExist(CString
&remote
)
192 for(int i
=0;i
<m_ctrlRemoteList
.GetCount();i
++)
194 m_ctrlRemoteList
.GetText(i
,str
);
203 void CSettingGitRemote::OnLbnSelchangeListRemote()
209 if(CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_SAVEREMOTE
, IDS_APPNAME
, 1, IDI_QUESTION
, IDS_SAVEBUTTON
, IDS_DISCARDBUTTON
) == 1)
216 index
= this->m_ctrlRemoteList
.GetCurSel();
221 m_strPuttyKeyfile
.Empty();
222 this->UpdateData(FALSE
);
226 m_ctrlRemoteList
.GetText(index
,remote
);
227 this->m_strRemote
=remote
;
229 cmd
.Format(_T("remote.%s.url"),remote
);
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
);
240 cmd
.Format(_T("remote.%s.tagopt"), remote
);
241 CString tagopt
= g_Git
.GetConfigValue(cmd
, CP_UTF8
);
243 if (tagopt
== "--no-tags")
245 else if (tagopt
== "--tags")
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
;
265 if( (!this->m_strRemote
.IsEmpty())&&(!this->m_strUrl
.IsEmpty()) )
268 this->SetModified(0);
271 void CSettingGitRemote::OnEnChangeEditUrl()
273 m_ChangedMask
|=REMOTE_URL
;
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()) )
286 this->SetModified(0);
289 void CSettingGitRemote::OnEnChangeEditPuttyKey()
291 m_ChangedMask
|=REMOTE_PUTTYKEY
;
294 if( (!this->m_strRemote
.IsEmpty())&&(!this->m_strUrl
.IsEmpty()) )
297 this->SetModified(0);
300 void CSettingGitRemote::OnCbnSelchangeComboTagOpt()
302 m_ChangedMask
|= REMOTE_TAGOPT
;
305 if (this->m_ctrlTagOpt
.GetCurSel() > 0)
308 this->SetModified(0);
311 void CSettingGitRemote::OnBnClickedCheckprune()
313 m_ChangedMask
|= REMOTE_PRUNE
;
319 this->SetModified(0);
322 BOOL
CSettingGitRemote::Save(CString key
,CString value
)
326 cmd
.Format(_T("remote.%s.%s"),this->m_strRemote
,key
);
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())
334 msg
.Format(IDS_PROC_SAVECONFIGFAILED
, cmd
, value
);
335 CMessageBox::Show(NULL
, msg
, _T("TortoiseGit"), MB_OK
| MB_ICONERROR
);
341 if (g_Git
.SetConfigValue(cmd
, value
, CONFIG_LOCAL
))
344 msg
.Format(IDS_PROC_SAVECONFIGFAILED
, cmd
, value
);
345 CMessageBox::Show(NULL
, msg
, _T("TortoiseGit"), MB_OK
| MB_ICONERROR
);
350 BOOL
CSettingGitRemote::OnApply()
354 if (m_ChangedMask
&& m_strRemote
.Trim().IsEmpty())
356 CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_REMOTEEMPTY
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
360 if(m_ChangedMask
& REMOTE_NAME
)
363 if(m_strRemote
.IsEmpty())
365 CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_REMOTEEMPTY
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
368 if(m_strUrl
.IsEmpty())
370 CMessageBox::Show(NULL
, IDS_PROC_GITCONFIG_URLEMPTY
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
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
'/');
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
);
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
))
407 if(m_ChangedMask
& REMOTE_PUTTYKEY
)
409 if (!Save(_T("puttykeyfile"),this->m_strPuttyKeyfile
))
413 if (m_ChangedMask
& REMOTE_TAGOPT
)
416 int index
= m_ctrlTagOpt
.GetCurSel();
418 tagopt
= "--no-tags";
421 if (!Save(_T("tagopt"), tagopt
))
425 if (m_ChangedMask
& REMOTE_PRUNE
)
427 if (!Save(_T("prune"), m_bPrune
== TRUE
? _T("true") : m_bPrune
== FALSE
? _T("false") : _T("")))
434 return ISettingsPropPage::OnApply();
436 void CSettingGitRemote::OnBnClickedButtonRemove()
439 index
=m_ctrlRemoteList
.GetCurSel();
443 m_ctrlRemoteList
.GetText(index
,str
);
445 msg
.Format(IDS_PROC_GITCONFIG_DELETEREMOTE
, str
);
446 if(CMessageBox::Show(NULL
, msg
, _T("TortoiseGit"), MB_YESNO
| MB_ICONQUESTION
) == IDYES
)
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
);
456 m_ctrlRemoteList
.DeleteString(index
);
457 OnLbnSelchangeListRemote();
462 void CSettingGitRemote::OnBnClickedButtonRenameRemote()
464 int sel
= m_ctrlRemoteList
.GetCurSel();
467 CString oldRemote
, newRemote
;
468 m_ctrlRemoteList
.GetText(sel
, oldRemote
);
469 GetDlgItem(IDC_EDIT_REMOTE
)->GetWindowText(newRemote
);
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
);
478 m_ctrlRemoteList
.DeleteString(sel
);
479 m_ctrlRemoteList
.SetCurSel(m_ctrlRemoteList
.AddString(newRemote
));
480 m_ChangedMask
&= ~REMOTE_NAME
;
482 this->SetModified(FALSE
);