Reduce C style casts
[TortoiseGit.git] / src / TortoiseProc / Settings / SettingGitRemote.cpp
blob8a310848928c593159302b38702da46b3071d095
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2016 - 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"
30 #include "HistoryCombo.h"
32 // CSettingGitRemote dialog
34 IMPLEMENT_DYNAMIC(CSettingGitRemote, ISettingsPropPage)
36 CSettingGitRemote::CSettingGitRemote()
37 : ISettingsPropPage(CSettingGitRemote::IDD)
38 , m_bNoFetch(false)
39 , m_bPrune(2)
40 , m_bPruneAll(FALSE)
41 , m_bPushDefault(FALSE)
43 m_ChangedMask = 0;
46 CSettingGitRemote::~CSettingGitRemote()
50 void CSettingGitRemote::DoDataExchange(CDataExchange* pDX)
52 CPropertyPage::DoDataExchange(pDX);
53 DDX_Control(pDX, IDC_LIST_REMOTE, m_ctrlRemoteList);
54 DDX_Text(pDX, IDC_EDIT_REMOTE, m_strRemote);
55 DDX_Text(pDX, IDC_EDIT_URL, m_strUrl);
56 DDX_Text(pDX, IDC_EDIT_PUSHURL, m_strPushUrl);
57 DDX_Text(pDX, IDC_EDIT_PUTTY_KEY, m_strPuttyKeyfile);
58 DDX_Control(pDX, IDC_COMBO_TAGOPT, m_ctrlTagOpt);
59 DDX_Check(pDX, IDC_CHECK_PRUNE, m_bPrune);
60 DDX_Check(pDX, IDC_CHECK_PRUNEALL, m_bPruneAll);
61 DDX_Check(pDX, IDC_CHECK_PUSHDEFAULT, m_bPushDefault);
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_PUSHURL, &CSettingGitRemote::OnEnChangeEditPushUrl)
72 ON_EN_CHANGE(IDC_EDIT_PUTTY_KEY, &CSettingGitRemote::OnEnChangeEditPuttyKey)
73 ON_CBN_SELCHANGE(IDC_COMBO_TAGOPT, &CSettingGitRemote::OnCbnSelchangeComboTagOpt)
74 ON_BN_CLICKED(IDC_CHECK_PRUNE, &CSettingGitRemote::OnBnClickedCheckprune)
75 ON_BN_CLICKED(IDC_CHECK_PRUNEALL, &CSettingGitRemote::OnBnClickedCheckpruneall)
76 ON_BN_CLICKED(IDC_CHECK_PUSHDEFAULT, &CSettingGitRemote::OnBnClickedCheckpushdefault)
77 ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CSettingGitRemote::OnBnClickedButtonRemove)
78 ON_BN_CLICKED(IDC_BUTTON_RENAME_REMOTE, &CSettingGitRemote::OnBnClickedButtonRenameRemote)
79 END_MESSAGE_MAP()
81 static void ShowEditBalloon(HWND hDlg, UINT nIdControl, UINT nIdText, UINT nIdTitle, int nIcon = TTI_WARNING)
83 CString text(MAKEINTRESOURCE(nIdText));
84 CString title(MAKEINTRESOURCE(nIdTitle));
85 EDITBALLOONTIP bt;
86 bt.cbStruct = sizeof(bt);
87 bt.pszText = text;
88 bt.pszTitle = title;
89 bt.ttiIcon = nIcon;
90 SendDlgItemMessage(hDlg, nIdControl, EM_SHOWBALLOONTIP, 0, (LPARAM)&bt);
93 #define TIMER_PREFILL 1
95 BOOL CSettingGitRemote::OnInitDialog()
97 ISettingsPropPage::OnInitDialog();
99 AdjustControlSize(IDC_CHECK_PRUNE);
100 AdjustControlSize(IDC_CHECK_PRUNEALL);
101 AdjustControlSize(IDC_CHECK_PUSHDEFAULT);
103 STRING_VECTOR remotes;
104 g_Git.GetRemoteList(remotes);
105 m_ctrlRemoteList.ResetContent();
106 for (size_t i = 0; i < remotes.size(); i++)
107 m_ctrlRemoteList.AddString(remotes[i]);
109 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_REACHABLE)));
110 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_NONE)));
111 m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_ALL)));
112 m_ctrlTagOpt.SetCurSel(0);
114 CString pruneAll = g_Git.GetConfigValue(_T("fetch.prune"));
115 m_bPruneAll = pruneAll == _T("true") ? TRUE : FALSE;
117 //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE);
118 this->UpdateData(FALSE);
120 SetTimer(TIMER_PREFILL, 1000, nullptr);
121 return TRUE;
123 // CSettingGitRemote message handlers
125 void CSettingGitRemote::OnTimer(UINT_PTR nIDEvent)
127 if (nIDEvent == TIMER_PREFILL)
129 if (m_strRemote.IsEmpty() && m_ctrlRemoteList.GetCount() == 0)
130 ShowEditBalloon(IDC_EDIT_URL, IDS_B_T_PREFILL_ORIGIN, IDS_HINT, TTI_INFO);
132 KillTimer(TIMER_PREFILL);
136 void CSettingGitRemote::OnBnClickedButtonBrowse()
138 CFileDialog dlg(TRUE, nullptr, nullptr, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, CString(MAKEINTRESOURCE(IDS_PUTTYKEYFILEFILTER)));
140 this->UpdateData();
141 INT_PTR ret = dlg.DoModal();
142 SetCurrentDirectory(g_Git.m_CurrentDir);
143 if (ret == IDOK)
145 this->m_strPuttyKeyfile = dlg.GetPathName();
146 this->UpdateData(FALSE);
147 OnEnChangeEditPuttyKey();
151 void CSettingGitRemote::OnBnClickedButtonAdd()
153 this->UpdateData();
155 if(m_strRemote.IsEmpty())
157 CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
158 return;
160 if(m_strUrl.IsEmpty())
162 CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
163 return;
166 m_ChangedMask = REMOTE_NAME | REMOTE_URL | REMOTE_PUTTYKEY | REMOTE_TAGOPT | REMOTE_PRUNE | REMOTE_PRUNEALL | REMOTE_PUSHDEFAULT | REMOTE_PUSHURL;
167 if(IsRemoteExist(m_strRemote))
169 CString msg;
170 msg.Format(IDS_PROC_GITCONFIG_OVERWRITEREMOTE, (LPCTSTR)m_strRemote);
171 if (CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES)
172 m_ChangedMask &= ~REMOTE_NAME;
173 else
174 return;
177 this->OnApply();
180 BOOL CSettingGitRemote::IsRemoteExist(CString &remote)
182 CString str;
183 for(int i=0;i<m_ctrlRemoteList.GetCount();i++)
185 m_ctrlRemoteList.GetText(i,str);
186 if(str == remote)
187 return true;
189 return false;
192 struct CheckRefspecStruct
194 CStringA remote;
195 bool result;
198 static int CheckRemoteCollideWithRefspec(const git_config_entry *entry, void * payload)
200 auto crs = reinterpret_cast<CheckRefspecStruct*>(payload);
201 crs->result = false;
202 if (entry->name == "remote." + crs->remote + ".fetch")
203 return 0;
204 CStringA value = CStringA(entry->value);
205 CStringA match = ":refs/remotes/" + crs->remote;
206 int pos = value.Find(match);
207 if (pos < 0)
208 return 0;
209 if ((pos + match.GetLength() == value.GetLength()) || (value[pos + match.GetLength()] == '/'))
211 crs->result = true;
212 return GIT_EUSER;
214 return 0;
217 bool CSettingGitRemote::IsRemoteCollideWithRefspec(CString remote)
219 CheckRefspecStruct crs = { CUnicodeUtils::GetUTF8(remote), false };
220 CAutoConfig config(true);
221 git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitLocalConfig()), GIT_CONFIG_LEVEL_LOCAL, FALSE);
222 for (const auto pattern : { "remote\\..*\\.fetch", "svn-remote\\..*\\.fetch", "svn-remote\\..*\\.branches", "svn-remote\\..*\\.tags" })
224 git_config_foreach_match(config, pattern, CheckRemoteCollideWithRefspec, &crs);
225 if (crs.result)
226 return true;
228 return false;
231 void CSettingGitRemote::OnLbnSelchangeListRemote()
233 CWaitCursor wait;
235 if(m_ChangedMask)
237 if (CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_SAVEREMOTE, IDS_APPNAME, 1, IDI_QUESTION, IDS_SAVEBUTTON, IDS_DISCARDBUTTON) == 1)
238 OnApply();
240 SetModified(FALSE);
242 CString cmd,output;
243 int index;
244 index = this->m_ctrlRemoteList.GetCurSel();
245 if(index<0)
247 m_strUrl.Empty();
248 m_strPushUrl.Empty();
249 m_strRemote.Empty();
250 m_strPuttyKeyfile.Empty();
251 this->UpdateData(FALSE);
252 return;
254 CString remote;
255 m_ctrlRemoteList.GetText(index,remote);
256 this->m_strRemote=remote;
258 cmd.Format(_T("remote.%s.url"), (LPCTSTR)remote);
259 m_strUrl.Empty();
260 m_strUrl = g_Git.GetConfigValue(cmd);
262 cmd.Format(_T("remote.%s.pushurl"), (LPCTSTR)remote);
263 m_strPushUrl.Empty();
264 m_strPushUrl = g_Git.GetConfigValue(cmd);
266 cmd.Format(_T("remote.%s.puttykeyfile"), (LPCTSTR)remote);
268 this->m_strPuttyKeyfile = g_Git.GetConfigValue(cmd);
270 m_ChangedMask=0;
273 cmd.Format(_T("remote.%s.tagopt"), (LPCTSTR)remote);
274 CString tagopt = g_Git.GetConfigValue(cmd);
275 index = 0;
276 if (tagopt == "--no-tags")
277 index = 1;
278 else if (tagopt == "--tags")
279 index = 2;
280 m_ctrlTagOpt.SetCurSel(index);
282 CString pushDefault = g_Git.GetConfigValue(_T("remote.pushdefault"));
283 m_bPushDefault = pushDefault == remote ? TRUE : FALSE;
284 cmd.Format(_T("remote.%s.prune"), (LPCTSTR)remote);
285 CString prune = g_Git.GetConfigValue(cmd);
286 m_bPrune = prune == _T("true") ? TRUE : prune == _T("false") ? FALSE : 2;
287 CString pruneAll = g_Git.GetConfigValue(_T("fetch.prune"));
288 m_bPruneAll = pruneAll == _T("true") ? TRUE : FALSE;
290 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
291 GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(TRUE);
292 GetDlgItem(IDC_BUTTON_RENAME_REMOTE)->EnableWindow(TRUE);
293 this->UpdateData(FALSE);
296 void CSettingGitRemote::OnEnChangeEditRemote()
298 m_ChangedMask|=REMOTE_NAME;
300 this->UpdateData();
302 if (IsRemoteCollideWithRefspec(m_strRemote))
303 ShowEditBalloon(IDC_EDIT_REMOTE, IDS_B_T_REMOTE_NAME_COLLIDE, IDS_HINT, TTI_WARNING);
304 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
305 this->SetModified();
308 void CSettingGitRemote::OnEnChangeEditUrl()
310 m_ChangedMask|=REMOTE_URL;
312 this->UpdateData();
314 if (m_strRemote.IsEmpty() && !m_strUrl.IsEmpty() && m_ctrlRemoteList.GetCount() == 0)
316 GetDlgItem(IDC_EDIT_REMOTE)->SetWindowText(_T("origin"));
317 OnEnChangeEditRemote();
320 if( (!this->m_strRemote.IsEmpty())&&(!this->m_strUrl.IsEmpty()) )
321 this->SetModified();
324 void CSettingGitRemote::OnEnChangeEditPushUrl()
326 m_ChangedMask |= REMOTE_PUSHURL;
328 this->UpdateData();
330 if (!this->m_strRemote.IsEmpty())
331 this->SetModified();
334 void CSettingGitRemote::OnEnChangeEditPuttyKey()
336 m_ChangedMask|=REMOTE_PUTTYKEY;
338 this->UpdateData();
339 if (!this->m_strUrl.IsEmpty())
340 this->SetModified();
343 void CSettingGitRemote::OnCbnSelchangeComboTagOpt()
345 m_ChangedMask |= REMOTE_TAGOPT;
347 this->UpdateData();
348 this->SetModified();
351 void CSettingGitRemote::OnBnClickedCheckprune()
353 m_ChangedMask |= REMOTE_PRUNE;
355 this->UpdateData();
356 this->SetModified();
359 void CSettingGitRemote::OnBnClickedCheckpruneall()
361 m_ChangedMask |= REMOTE_PRUNEALL;
362 UpdateData();
363 SetModified();
366 void CSettingGitRemote::OnBnClickedCheckpushdefault()
368 m_ChangedMask |= REMOTE_PUSHDEFAULT;
369 UpdateData();
370 SetModified();
373 BOOL CSettingGitRemote::Save(CString key,CString value)
375 CString cmd,out;
377 cmd.Format(_T("remote.%s.%s"), (LPCTSTR)m_strRemote, (LPCTSTR)key);
378 if (value.IsEmpty())
380 // don't check result code. it fails if the entry not exist
381 g_Git.UnsetConfigValue(cmd, CONFIG_LOCAL);
382 if (!g_Git.GetConfigValue(cmd).IsEmpty())
384 CString msg;
385 msg.Format(IDS_PROC_SAVECONFIGFAILED, (LPCTSTR)cmd, (LPCTSTR)value);
386 CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_OK | MB_ICONERROR);
387 return FALSE;
389 return TRUE;
392 if (g_Git.SetConfigValue(cmd, value, CONFIG_LOCAL))
394 CString msg;
395 msg.Format(IDS_PROC_SAVECONFIGFAILED, (LPCTSTR)cmd, (LPCTSTR)value);
396 CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_OK | MB_ICONERROR);
397 return FALSE;
399 return TRUE;
402 BOOL CSettingGitRemote::SaveGeneral(CString key, CString value)
404 if (value.IsEmpty())
406 // don't check result code. it fails if the entry not exist
407 g_Git.UnsetConfigValue(key, CONFIG_LOCAL);
408 if (!g_Git.GetConfigValue(key).IsEmpty())
410 CString msg;
411 msg.Format(IDS_PROC_SAVECONFIGFAILED, (LPCTSTR)key, (LPCTSTR)value);
412 CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_OK | MB_ICONERROR);
413 return FALSE;
415 return TRUE;
418 if (g_Git.SetConfigValue(key, value, CONFIG_LOCAL))
420 CString msg;
421 msg.Format(IDS_PROC_SAVECONFIGFAILED, (LPCTSTR)key, (LPCTSTR)value);
422 CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_OK | MB_ICONERROR);
423 return FALSE;
426 return TRUE;
429 BOOL CSettingGitRemote::OnApply()
431 CWaitCursor wait;
432 this->UpdateData();
434 if (m_ChangedMask & REMOTE_PUSHDEFAULT)
436 if (!m_strRemote.Trim().IsEmpty() && m_bPushDefault)
438 if (!SaveGeneral(_T("remote.pushdefault"), m_strRemote.Trim()))
439 return FALSE;
441 if (!m_bPushDefault)
443 if (!SaveGeneral(_T("remote.pushdefault"), _T("")))
444 return FALSE;
447 m_ChangedMask &= ~REMOTE_PUSHDEFAULT;
450 if (m_ChangedMask & REMOTE_PRUNEALL)
452 if (!SaveGeneral(_T("fetch.prune"), m_bPruneAll == TRUE ? _T("true") : _T("")))
453 return FALSE;
454 m_ChangedMask &= ~REMOTE_PRUNEALL;
457 if (m_ChangedMask && m_strRemote.Trim().IsEmpty())
459 CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
460 return FALSE;
463 if(m_ChangedMask & REMOTE_NAME)
465 //Add Remote
466 if(m_strRemote.IsEmpty())
468 CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_REMOTEEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
469 return FALSE;
471 if(m_strUrl.IsEmpty())
473 CMessageBox::Show(GetSafeHwnd(), IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR);
474 return FALSE;
477 if (m_ctrlRemoteList.GetCount() > 0)
479 // tagopt not --no-tags
480 if (m_ctrlTagOpt.GetCurSel() != 1)
482 if (CMessageBox::ShowCheck(GetSafeHwnd(), IDS_PROC_GITCONFIG_ASKTAGOPT, IDS_APPNAME, MB_YESNO | MB_ICONQUESTION, _T("TagOptNoTagsWarning"), IDS_MSGBOX_DONOTSHOWAGAIN) == IDYES)
484 m_ctrlTagOpt.SetCurSel(1);
485 m_ChangedMask |= REMOTE_TAGOPT;
490 m_strUrl.Replace(L'\\', L'/');
491 CString cmd,out;
492 cmd.Format(_T("git.exe remote add \"%s\" \"%s\""), (LPCTSTR)m_strRemote, (LPCTSTR)m_strUrl);
493 if (g_Git.Run(cmd, &out, CP_UTF8))
495 CMessageBox::Show(GetSafeHwnd(), out, L"TorotiseGit", MB_OK | MB_ICONERROR);
496 return FALSE;
498 m_ChangedMask &= ~REMOTE_URL;
500 m_ctrlRemoteList.SetCurSel(m_ctrlRemoteList.AddString(m_strRemote));
501 GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE);
502 GetDlgItem(IDC_BUTTON_RENAME_REMOTE)->EnableWindow(TRUE);
503 if (!m_bNoFetch && CMessageBox::Show(GetSafeHwnd(), IDS_SETTINGS_FETCH_ADDEDREMOTE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO) == IDYES)
504 CCommonAppUtils::RunTortoiseGitProc(_T("/command:fetch /path:\"") + g_Git.m_CurrentDir + _T("\" /remote:\"") + m_strRemote + _T("\""));
506 if(m_ChangedMask & REMOTE_URL)
508 m_strUrl.Replace(L'\\', L'/');
509 if (!Save(_T("url"),this->m_strUrl))
510 return FALSE;
513 if(m_ChangedMask & REMOTE_PUTTYKEY)
515 if (!Save(_T("puttykeyfile"),this->m_strPuttyKeyfile))
516 return FALSE;
519 if (m_ChangedMask & REMOTE_TAGOPT)
521 CString tagopt;
522 int index = m_ctrlTagOpt.GetCurSel();
523 if (index == 1)
524 tagopt = "--no-tags";
525 else if (index == 2)
526 tagopt = "--tags";
527 if (!Save(_T("tagopt"), tagopt))
528 return FALSE;
531 if (m_ChangedMask & REMOTE_PRUNE)
533 if (!Save(_T("prune"), m_bPrune == TRUE ? _T("true") : m_bPrune == FALSE ? _T("false") : _T("")))
534 return FALSE;
537 if (m_ChangedMask & REMOTE_PUSHURL)
539 m_strPushUrl.Replace(L'\\', L'/');
540 if (!Save(_T("pushurl"), m_strPushUrl))
541 return FALSE;
544 SetModified(FALSE);
546 m_ChangedMask = 0;
547 return ISettingsPropPage::OnApply();
550 void CleanupSyncRemotes(const CString& remote)
552 CString workingDir = g_Git.m_CurrentDir;
553 workingDir.Replace(_T(':'), _T('_'));
554 CHistoryCombo::RemoveEntryFromHistory(_T("Software\\TortoiseGit\\History\\SyncURL\\") + workingDir, _T("url"), remote);
557 void CSettingGitRemote::OnBnClickedButtonRemove()
559 int index;
560 index=m_ctrlRemoteList.GetCurSel();
561 if(index>=0)
563 CString str;
564 m_ctrlRemoteList.GetText(index,str);
565 CString msg;
566 msg.Format(IDS_WARN_REMOVE, (LPCTSTR)str);
567 if (CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_YESNO | MB_ICONQUESTION) == IDYES)
569 CString cmd,out;
570 cmd.Format(_T("git.exe remote rm %s"), (LPCTSTR)str);
571 if (g_Git.Run(cmd, &out, CP_UTF8))
573 CMessageBox::Show(GetSafeHwnd(), out, L"TortoiseGit", MB_OK | MB_ICONERROR);
574 return;
577 CleanupSyncRemotes(str);
578 m_ctrlRemoteList.DeleteString(index);
579 OnLbnSelchangeListRemote();
584 void CSettingGitRemote::OnBnClickedButtonRenameRemote()
586 int sel = m_ctrlRemoteList.GetCurSel();
587 if (sel >= 0)
589 CString oldRemote, newRemote;
590 m_ctrlRemoteList.GetText(sel, oldRemote);
591 GetDlgItem(IDC_EDIT_REMOTE)->GetWindowText(newRemote);
592 CString cmd, out;
593 cmd.Format(_T("git.exe remote rename %s %s"), (LPCTSTR)oldRemote, (LPCTSTR)newRemote);
594 if (g_Git.Run(cmd, &out, CP_UTF8))
596 CMessageBox::Show(GetSafeHwnd(), out, L"TortoiseGit", MB_OK | MB_ICONERROR);
597 return;
600 CleanupSyncRemotes(oldRemote);
601 m_ctrlRemoteList.DeleteString(sel);
602 m_ctrlRemoteList.SetCurSel(m_ctrlRemoteList.AddString(newRemote));
603 m_ChangedMask &= ~REMOTE_NAME;
604 if (!m_ChangedMask)
605 this->SetModified(FALSE);