1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2012 - 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.
20 // PullFetchDlg.cpp : implementation file
24 #include "TortoiseProc.h"
25 #include "PullFetchDlg.h"
28 #include "BrowseRefsDlg.h"
29 // CPullFetchDlg dialog
31 IMPLEMENT_DYNAMIC(CPullFetchDlg
, CHorizontalResizableStandAloneDialog
)
33 CPullFetchDlg::CPullFetchDlg(CWnd
* pParent
/*=NULL*/)
34 : CHorizontalResizableStandAloneDialog(CPullFetchDlg::IDD
, pParent
)
37 m_bAutoLoad
= CAppUtils::IsSSHPutty();
38 m_bAutoLoadEnable
=CAppUtils::IsSSHPutty();;
45 m_bAllRemotes
= FALSE
;
48 CPullFetchDlg::~CPullFetchDlg()
52 void CPullFetchDlg::DoDataExchange(CDataExchange
* pDX
)
54 CDialog::DoDataExchange(pDX
);
55 DDX_Control(pDX
, IDC_REMOTE_COMBO
, this->m_Remote
);
56 DDX_Control(pDX
, IDC_OTHER
, this->m_Other
);
57 DDX_Control(pDX
, IDC_REMOTE_BRANCH
, this->m_RemoteBranch
);
58 DDX_Control(pDX
,IDC_REMOTE_MANAGE
, this->m_RemoteManage
);
59 DDX_Check(pDX
,IDC_CHECK_NOFF
, this->m_bNoFF
);
60 DDX_Check(pDX
,IDC_CHECK_SQUASH
, this->m_bSquash
);
61 DDX_Check(pDX
,IDC_CHECK_NOCOMMIT
, this->m_bNoCommit
);
62 DDX_Check(pDX
,IDC_PUTTYKEY_AUTOLOAD
,m_bAutoLoad
);
63 DDX_Check(pDX
,IDC_CHECK_REBASE
,m_bRebase
);
64 DDX_Check(pDX
,IDC_CHECK_PRUNE
,m_bPrune
);
65 DDX_Check(pDX
, IDC_CHECK_FFONLY
, m_bFFonly
);
66 DDX_Check(pDX
, IDC_CHECK_FETCHTAGS
, m_bFetchTags
);
70 BEGIN_MESSAGE_MAP(CPullFetchDlg
, CHorizontalResizableStandAloneDialog
)
71 ON_BN_CLICKED(IDC_REMOTE_RD
, &CPullFetchDlg::OnBnClickedRd
)
72 ON_BN_CLICKED(IDC_OTHER_RD
, &CPullFetchDlg::OnBnClickedRd
)
73 ON_BN_CLICKED(IDOK
, &CPullFetchDlg::OnBnClickedOk
)
74 ON_STN_CLICKED(IDC_REMOTE_MANAGE
, &CPullFetchDlg::OnStnClickedRemoteManage
)
75 ON_BN_CLICKED(IDC_BUTTON_BROWSE_REF
, &CPullFetchDlg::OnBnClickedButtonBrowseRef
)
78 BOOL
CPullFetchDlg::OnInitDialog()
80 CHorizontalResizableStandAloneDialog::OnInitDialog();
81 CAppUtils::MarkWindowAsUnpinnable(m_hWnd
);
83 AddAnchor(IDC_REMOTE_COMBO
, TOP_LEFT
, TOP_RIGHT
);
84 AddAnchor(IDC_OTHER
, TOP_LEFT
,TOP_RIGHT
);
86 AddAnchor(IDC_REMOTE_BRANCH
, TOP_LEFT
,TOP_RIGHT
);
87 AddAnchor(IDC_BUTTON_BROWSE_REF
,TOP_RIGHT
);
89 AddAnchor(IDOK
,BOTTOM_RIGHT
);
90 AddAnchor(IDCANCEL
,BOTTOM_RIGHT
);
91 AddAnchor(IDC_GROUPT_REMOTE
,TOP_LEFT
,TOP_RIGHT
);
92 AddAnchor(IDC_GROUP_OPTION
,TOP_LEFT
,TOP_RIGHT
);
93 AddAnchor(IDC_PUTTYKEY_AUTOLOAD
,BOTTOM_LEFT
);
94 AddAnchor(IDC_CHECK_PRUNE
,BOTTOM_LEFT
);
95 AddAnchor(IDC_CHECK_REBASE
,BOTTOM_LEFT
);
96 AddAnchor(IDC_REMOTE_MANAGE
,BOTTOM_LEFT
);
97 AddAnchor(IDHELP
, BOTTOM_RIGHT
);
99 AdjustControlSize(IDC_REMOTE_RD
);
100 AdjustControlSize(IDC_OTHER_RD
);
101 AdjustControlSize(IDC_CHECK_SQUASH
);
102 AdjustControlSize(IDC_CHECK_NOCOMMIT
);
103 AdjustControlSize(IDC_CHECK_NOFF
);
104 AdjustControlSize(IDC_CHECK_FFONLY
);
105 AdjustControlSize(IDC_CHECK_FETCHTAGS
);
106 AdjustControlSize(IDC_PUTTYKEY_AUTOLOAD
);
107 AdjustControlSize(IDC_CHECK_REBASE
);
108 AdjustControlSize(IDC_CHECK_PRUNE
);
110 CString WorkingDir
=g_Git
.m_CurrentDir
;
111 WorkingDir
.Replace(_T(':'),_T('_'));
113 m_RemoteReg
= CRegString(CString(_T("Software\\TortoiseGit\\History\\PullRemote\\")+WorkingDir
));
115 regkey
.Format(_T("Software\\TortoiseGit\\TortoiseProc\\PullFetch\\%s_%d\\rebase"),WorkingDir
,this->m_IsPull
);
116 m_regRebase
=CRegDWORD(regkey
,false);
117 regkey
.Format(_T("Software\\TortoiseGit\\TortoiseProc\\PullFetch\\%s_%d\\autoload"),WorkingDir
,this->m_IsPull
);
119 m_regAutoLoadPutty
= CRegDWORD(regkey
,this->m_bAutoLoad
);
120 m_bAutoLoad
= m_regAutoLoadPutty
;
122 if(!CAppUtils::IsSSHPutty())
127 this->m_bRebase
= m_regRebase
;
131 GetDlgItem(IDC_CHECK_REBASE
)->ShowWindow(SW_HIDE
);
132 this->m_bRebase
= FALSE
;
135 this->UpdateData(FALSE
);
137 this->AddOthersToAnchor();
139 this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD
)->EnableWindow(m_bAutoLoadEnable
);
141 CheckRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
,IDC_REMOTE_RD
);
142 m_Remote
.EnableWindow(TRUE
);
143 m_Other
.EnableWindow(FALSE
);
145 m_RemoteBranch
.EnableWindow(FALSE
);
149 GetDlgItem(IDC_CHECK_REBASE
)->ShowWindow(SW_HIDE
);
150 GetDlgItem(IDC_CHECK_PRUNE
)->ShowWindow(SW_HIDE
);
151 GetDlgItem(IDC_CHECK_FETCHTAGS
)->EnableWindow(FALSE
);
155 this->GetDlgItem(IDC_GROUP_OPTION
)->EnableWindow(FALSE
);
156 this->GetDlgItem(IDC_CHECK_SQUASH
)->EnableWindow(FALSE
);
157 this->GetDlgItem(IDC_CHECK_NOFF
)->EnableWindow(FALSE
);
158 this->GetDlgItem(IDC_CHECK_FFONLY
)->EnableWindow(FALSE
);
159 this->GetDlgItem(IDC_CHECK_NOCOMMIT
)->EnableWindow(FALSE
);
162 if (g_GitAdminDir
.IsBareRepo(g_Git
.m_CurrentDir
))
163 this->GetDlgItem(IDC_CHECK_REBASE
)->EnableWindow(FALSE
);
165 m_Other
.SetURLHistory(TRUE
);
166 m_Other
.LoadHistory(_T("Software\\TortoiseGit\\History\\PullURLS"), _T("url"));
167 CString clippath
=CAppUtils::GetClipboardLink();
168 if(clippath
.IsEmpty())
169 m_Other
.SetCurSel(0);
171 m_Other
.SetWindowText(clippath
);
173 m_RemoteBranch
.LoadHistory(_T("Software\\TortoiseGit\\History\\PullRemoteBranch"), _T("br"));
174 m_RemoteBranch
.SetCurSel(0);
176 CString sWindowTitle
;
178 sWindowTitle
= CString(MAKEINTRESOURCE(IDS_PROGRS_TITLE_PULL
));
180 sWindowTitle
= CString(MAKEINTRESOURCE(IDS_PROGRS_TITLE_FETCH
));
182 CAppUtils::SetWindowTitle(m_hWnd
, g_Git
.m_CurrentDir
, sWindowTitle
);
186 EnableSaveRestore(_T("PullFetchDlg"));
187 this->m_RemoteManage
.SetURL(CString());
191 void CPullFetchDlg::Refresh()
193 //Select pull-remote from current branch
194 CString currentBranch
= g_Git
.GetSymbolicRef();
196 configName
.Format(L
"branch.%s.remote", currentBranch
);
197 CString pullRemote
= this->m_configPullRemote
= g_Git
.GetConfigValue(configName
);
199 //Select pull-branch from current branch
200 configName
.Format(L
"branch.%s.merge", currentBranch
);
201 CString pullBranch
= m_configPullBranch
= CGit::StripRefName(g_Git
.GetConfigValue(configName
));
202 if (pullBranch
.IsEmpty())
203 m_RemoteBranch
.AddString(currentBranch
);
205 m_RemoteBranch
.AddString(pullBranch
);
207 if(pullRemote
.IsEmpty())
208 pullRemote
= m_RemoteReg
;
210 if (!m_PreSelectRemote
.IsEmpty())
211 pullRemote
= m_PreSelectRemote
;
216 list
.push_back(_T("- all -"));
217 if(!g_Git
.GetRemoteList(list
))
219 if (!m_IsPull
&& list
.size() <= 2)
220 list
.erase(list
.begin());
222 for(unsigned int i
=0;i
<list
.size();i
++)
224 m_Remote
.AddString(list
[i
]);
225 if(list
[i
] == pullRemote
)
229 m_Remote
.SetCurSel(sel
);
231 // CPullFetchDlg message handlers
233 void CPullFetchDlg::OnBnClickedRd()
235 if( GetCheckedRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
) == IDC_REMOTE_RD
)
237 m_Remote
.EnableWindow(TRUE
);
238 m_Other
.EnableWindow(FALSE
);
240 m_RemoteBranch
.EnableWindow(FALSE
);
242 if( GetCheckedRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
) == IDC_OTHER_RD
)
244 m_Remote
.EnableWindow(FALSE
);
245 m_Other
.EnableWindow(TRUE
);;
247 m_RemoteBranch
.EnableWindow(TRUE
);
251 void CPullFetchDlg::OnBnClickedOk()
254 if( GetCheckedRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
) == IDC_REMOTE_RD
)
256 m_RemoteURL
=m_Remote
.GetString();
257 m_bAllRemotes
= (m_Remote
.GetCurSel() == 0 && m_Remote
.GetCount() > 1 && !m_IsPull
);
259 (m_configPullRemote
== m_RemoteURL
&& m_configPullBranch
== m_RemoteBranch
.GetString() ))
260 //When fetching or when pulling from the configured tracking branch, dont explicitly set the remote branch name,
261 //because otherwise git will not update the remote tracking branches.
262 m_RemoteBranchName
.Empty();
264 m_RemoteBranchName
=m_RemoteBranch
.GetString();
266 if( GetCheckedRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
) == IDC_OTHER_RD
)
268 m_Other
.GetWindowTextW(m_RemoteURL
);
269 m_RemoteBranchName
=m_RemoteBranch
.GetString();
272 m_RemoteReg
= m_Remote
.GetString();
274 m_Other
.SaveHistory();
275 m_RemoteBranch
.SaveHistory();
276 this->m_regRebase
=this->m_bRebase
;
278 m_regAutoLoadPutty
= m_bAutoLoad
;
283 void CPullFetchDlg::OnStnClickedRemoteManage()
285 CAppUtils::LaunchRemoteSetting();
289 void CPullFetchDlg::OnBnClickedButtonBrowseRef()
292 initialRef
.Format(L
"refs/remotes/%s/%s", m_Remote
.GetString(), m_RemoteBranch
.GetString());
293 CString selectedRef
= CBrowseRefsDlg::PickRef(false, initialRef
, gPickRef_Remote
);
294 if(selectedRef
.Left(13) != "refs/remotes/")
297 selectedRef
= selectedRef
.Mid(13);
298 int ixSlash
= selectedRef
.Find('/');
300 CString remoteName
= selectedRef
.Left(ixSlash
);
301 CString remoteBranch
= selectedRef
.Mid(ixSlash
+ 1);
303 int ixFound
= m_Remote
.FindStringExact(0, remoteName
);
305 m_Remote
.SetCurSel(ixFound
);
306 m_RemoteBranch
.AddString(remoteBranch
);
308 CheckRadioButton(IDC_REMOTE_RD
,IDC_OTHER_RD
,IDC_REMOTE_RD
);