static int DeleteOtherKeys(int type) { CString match; if (type == SimpleCredentialType::LocalWincred) match = _T("L\ncredential.helper\nwincred"); else if (type == SimpleCredentialType::LocalWinstore) match = _T("L\ncredential.helper\n") + GetWinstorePath(); else if (type == SimpleCredentialType::GlobalWincred) match = _T("G\ncredential.helper\nwincred"); else if (type == SimpleCredentialType::GlobalWinstore) match = _T("G\ncredential.helper\n") + GetWinstorePath(); else if (type == SimpleCredentialType::SystemWincred) match = _T("S\ncredential.helper\nwincred"); CAutoConfig config(true); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitLocalConfig()), GIT_CONFIG_LEVEL_LOCAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitGlobalConfig()), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitGlobalXDGConfig()), GIT_CONFIG_LEVEL_XDG, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitSystemConfig()), GIT_CONFIG_LEVEL_SYSTEM, FALSE); STRING_VECTOR list; git_config_foreach_match(config, "credential\\..*", GetCredentialAnyEntryCallback, &list); for (size_t i = 0; i < list.size(); ++i) { int pos = 0; CString prefix = list[i].Tokenize(_T("\n"), pos); if (prefix == _T("S") && !CAppUtils::IsAdminLogin()) { RunUAC(); return -1; } } int result = 0; // workaround gitdll bug // TODO: switch to libgit2 bool old = g_Git.m_IsUseGitDLL; g_Git.m_IsUseGitDLL = false; for (size_t i = 0; i < list.size(); ++i) { if (list[i] != match) { int pos = 0; CString prefix = list[i].Tokenize(_T("\n"), pos); CString key = list[i].Tokenize(_T("\n"), pos); CONFIG_TYPE configLevel = prefix == _T("S") ? CONFIG_SYSTEM : prefix == _T("G") || prefix == _T("X") ? CONFIG_GLOBAL : CONFIG_LOCAL; if (g_Git.UnsetConfigValue(key, configLevel)) { CString msg; msg.Format(IDS_PROC_SAVECONFIGFAILED, key, _T("")); CMessageBox::Show(NULL, msg, _T("TortoiseGit"), MB_OK | MB_ICONERROR); result = 1; break; } } } g_Git.m_IsUseGitDLL = old; return result; }
void CPushDlg::Refresh() { CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'),_T('_')); CRegString remote(CString(_T("Software\\TortoiseGit\\History\\PushRemote\\")+WorkingDir)); m_RemoteReg = remote; int sel = -1; STRING_VECTOR list; m_Remote.Reset(); if(!g_Git.GetRemoteList(list)) { if (list.size() > 1) m_Remote.AddString(CString(MAKEINTRESOURCE(IDS_PROC_PUSHFETCH_ALLREMOTES))); for (unsigned int i = 0; i < list.size(); ++i) { m_Remote.AddString(list[i]); if(list[i] == remote) sel = i + (list.size() > 1 ? 1 : 0); } } else MessageBox(g_Git.GetGitLastErr(_T("Could not get list of remotes.")), _T("TortoiseGit"), MB_ICONERROR); // if the last selected remote was "- All -" and "- All -" is still in the list -> select it if (list.size() > 1 && remote == CString(MAKEINTRESOURCE(IDS_PROC_PUSHFETCH_ALLREMOTES))) sel = 0; m_Remote.SetCurSel(sel); int current = -1; list.clear(); m_BranchSource.Reset(); m_BranchSource.SetMaxHistoryItems(0x7FFFFFFF); if(!g_Git.GetBranchList(list,¤t)) m_BranchSource.SetList(list); else MessageBox(g_Git.GetGitLastErr(_T("Could not get list of local branches.")), _T("TortoiseGit"), MB_ICONERROR); if (wcsncmp(m_BranchSourceName, _T("refs/"), 5) == 0) m_BranchSourceName = m_BranchSourceName.Mid(5); if (wcsncmp(m_BranchSourceName, _T("heads/"), 6) == 0) { m_BranchSourceName = m_BranchSourceName.Mid(6); m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); } else if (wcsncmp(m_BranchSourceName, _T("remotes/"), 8) == 0) m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); else m_BranchSource.SetCurSel(current); GetRemoteBranch(m_BranchSource.GetString()); this->GetDlgItem(IDOK)->EnableWindow(m_BranchSource.GetCount() != 0); if (list.size() > 1 && m_bPushAllRemotes) m_Remote.SetCurSel(0); m_bPushAllRemotes = FALSE; // reset to FALSE, so that a refresh does not reselect all even if it was already deselected by user; correct value will be set in OnBnClickedOk method }
void CPushDlg::Refresh() { CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'),_T('_')); CRegString remote(CString(_T("Software\\TortoiseGit\\History\\PushRemote\\")+WorkingDir)); m_RemoteReg = remote; int sel = -1; STRING_VECTOR list; m_Remote.Reset(); list.push_back(CString(MAKEINTRESOURCE(IDS_PROC_PUSHFETCH_ALLREMOTES))); if(!g_Git.GetRemoteList(list)) { if (list.size() <= 2) list.erase(list.begin()); for (unsigned int i = 0; i < list.size(); ++i) { m_Remote.AddString(list[i]); if(list[i] == remote) sel = i; } } // if the last selected remote was "- All -" and "- All -" is still in the list -> select it if (list.size() > 1 && remote == CString(MAKEINTRESOURCE(IDS_PROC_PUSHFETCH_ALLREMOTES))) sel = 0; m_Remote.SetCurSel(sel); int current=0; list.clear(); m_BranchSource.Reset(); m_BranchSource.AddString(_T(" ")); // empty string does not work, for removal of remote branches/tags m_BranchSource.SetMaxHistoryItems(0x7FFFFFFF); if(!g_Git.GetBranchList(list,¤t)) { for (unsigned int i = 0; i < list.size(); ++i) m_BranchSource.AddString(list[i]); ++current; // shift for " " } if (wcsncmp(m_BranchSourceName, _T("refs/"), 5) == 0) m_BranchSourceName = m_BranchSourceName.Mid(5); if (wcsncmp(m_BranchSourceName, _T("heads/"), 6) == 0) { m_BranchSourceName = m_BranchSourceName.Mid(6); m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); } else if (wcsncmp(m_BranchSourceName, _T("remotes/"), 8) == 0) m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); else m_BranchSource.SetCurSel(current); GetRemoteBranch(m_BranchSource.GetString()); this->GetDlgItem(IDOK)->EnableWindow(m_BranchSource.GetCount() != 0); }
BOOL CBisectStartDlg::OnInitDialog() { CHorizontalResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDC_BUTTON_GOOD, TOP_RIGHT); AddAnchor(IDC_BUTTON_BAD, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_GOOD, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_BAD, TOP_LEFT, TOP_RIGHT); EnableSaveRestore(_T("BisectStartDlg")); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); STRING_VECTOR list; int current; g_Git.GetBranchList(list, ¤t, CGit::BRANCH_ALL); m_cLastGoodRevision.SetMaxHistoryItems(0x7FFFFFFF); m_cFirstBadRevision.SetMaxHistoryItems(0x7FFFFFFF); for (unsigned int i = 0; i < list.size(); ++i) { m_cLastGoodRevision.AddString(list[i]); m_cFirstBadRevision.AddString(list[i]); } list.clear(); g_Git.GetTagList(list); for (unsigned int i = 0; i < list.size(); ++i) { m_cLastGoodRevision.AddString(list[i]); m_cFirstBadRevision.AddString(list[i]); } if (m_sLastGood.IsEmpty()) m_cLastGoodRevision.SetCurSel(-1); else m_cLastGoodRevision.SetWindowTextW(m_sLastGood); if (m_sFirstBad.IsEmpty()) m_cFirstBadRevision.SetCurSel(current); else m_cFirstBadRevision.SetWindowTextW(m_sFirstBad); this->UpdateData(FALSE); // EnDisable OK Button OnChangedRevision(); return TRUE; }
void CPushDlg::Refresh() { CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'),_T('_')); CRegString remote(CString(_T("Software\\TortoiseGit\\History\\PushRemote\\")+WorkingDir)); m_RemoteReg = remote; int sel=0; STRING_VECTOR list; m_Remote.Reset(); if(!g_Git.GetRemoteList(list)) { for(unsigned int i=0;i<list.size();i++) { m_Remote.AddString(list[i]); if(list[i] == remote) sel = i; } } m_Remote.SetCurSel(sel); int current=0; list.clear(); m_BranchSource.Reset(); m_BranchSource.SetMaxHistoryItems(0x7FFFFFFF); if(!g_Git.GetBranchList(list,¤t)) { for(unsigned int i=0;i<list.size();i++) m_BranchSource.AddString(list[i]); } if (wcsncmp(m_BranchSourceName, _T("refs/"), 5) == 0) m_BranchSourceName = m_BranchSourceName.Mid(5); if (wcsncmp(m_BranchSourceName, _T("heads/"), 6) == 0) { m_BranchSourceName = m_BranchSourceName.Mid(6); m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); } else if (wcsncmp(m_BranchSourceName, _T("remotes/"), 8) == 0) m_BranchSource.SetCurSel(m_BranchSource.FindStringExact(-1, m_BranchSourceName)); else m_BranchSource.SetCurSel(current); GetRemoteBranch(m_BranchSource.GetString()); this->GetDlgItem(IDOK)->EnableWindow(m_BranchSource.GetCount() != 0); }
static int SplitRemoteBranchName(CString ref, CString &remote, CString &branch) { if (ref.Left(13) == _T("refs/remotes/")) ref = ref.Mid(13); else if (ref.Left(8) == _T("remotes/")) ref = ref.Mid(8); STRING_VECTOR list; int result = g_Git.GetRemoteList(list); if (result != 0) return result; for (size_t i = 0; i < list.size(); ++i) { if (ref.Left(list[i].GetLength() + 1) == list[i] + _T("/")) { remote = list[i]; branch = ref.Mid(list[i].GetLength() + 1); return 0; } if (ref == list[i]) { remote = list[i]; branch = _T(""); return 0; } } return -1; }
void CRefLogDlg::Refresh() { STRING_VECTOR list; list.push_back(_T("HEAD")); if (g_Git.GetRefList(list)) MessageBox(g_Git.GetGitLastErr(_T("Could not get all refs.")), _T("TortoiseGit"), MB_ICONERROR); m_ChooseRef.SetList(list); if (m_CurrentBranch.IsEmpty()) { m_CurrentBranch.Format(_T("refs/heads/%s"), (LPCTSTR)g_Git.GetCurrentBranch()); m_ChooseRef.SetCurSel(0); /* Choose HEAD */ } else { bool found = false; for (int i = 0; i < (int)list.size(); ++i) { if(list[i] == m_CurrentBranch) { m_ChooseRef.SetCurSel(i); found = true; break; } } if (!found) m_ChooseRef.SetCurSel(0); } m_RefList.m_RevCache.clear(); OnCbnSelchangeRef(); }
BOOL CSettingGitRemote::OnInitDialog() { ISettingsPropPage::OnInitDialog(); //CString str=((CSettings*)GetParent())->m_CmdPath.GetWinPath(); CString proj; if( g_GitAdminDir.HasAdminDir(m_cmdPath,&proj) ) { CString title; this->GetWindowText(title); this->SetWindowText(title + _T(" - ") + proj); } STRING_VECTOR remotes; g_Git.GetRemoteList(remotes); m_ctrlRemoteList.ResetContent(); for (size_t i = 0; i < remotes.size(); i++) m_ctrlRemoteList.AddString(remotes[i]); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_REACHABLE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_NONE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_TAGS_ONLY))); m_ctrlTagOpt.SetCurSel(0); //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE); this->UpdateData(FALSE); if (remotes.empty()) { GetDlgItem(IDC_EDIT_REMOTE)->SetWindowText(_T("origin")); OnEnChangeEditRemote(); } return TRUE; }
void CHistoryCombo::AddString(STRING_VECTOR &list,BOOL isSel) { for(unsigned int i=0;i<list.size();i++) { AddString(list[i], -1, isSel); } }
void CSettingGitCredential::OnBnClickedButtonRemove() { int index = m_ctrlUrlList.GetCurSel(); if (index >= 0) { CString str; m_ctrlUrlList.GetText(index, str); CString msg; msg.Format(IDS_WARN_REMOVE, (LPCTSTR)str); if (CMessageBox::Show(GetSafeHwnd(), msg, L"TortoiseGit", MB_YESNO | MB_ICONQUESTION) == IDYES) { CAutoConfig config(true); int pos = str.Find(L':'); CString prefix = pos >= 0 ? str.Left(pos) : str; CString url = pos >= 0 ? str.Mid(pos + 1) : L""; CONFIG_TYPE configLevel = CONFIG_LOCAL; switch (prefix[0]) { case L'L': { configLevel = CONFIG_LOCAL; git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitLocalConfig()), GIT_CONFIG_LEVEL_LOCAL, FALSE); break; } case L'G': case L'X': { configLevel = CONFIG_GLOBAL; git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitGlobalConfig()), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitGlobalXDGConfig()), GIT_CONFIG_LEVEL_XDG, FALSE); break; } case L'P': case L'S': { if (!CAppUtils::IsAdminLogin()) { RunUAC(); EndDialog(0); return; } configLevel = CONFIG_SYSTEM; git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitSystemConfig()), GIT_CONFIG_LEVEL_SYSTEM, FALSE); if (!g_Git.ms_bCygwinGit && !g_Git.ms_bMsys2Git) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(g_Git.GetGitProgramDataConfig()), GIT_CONFIG_LEVEL_PROGRAMDATA, FALSE); break; } } STRING_VECTOR list; CStringA urlA = CUnicodeUtils::GetUTF8(url); CStringA pattern = urlA.IsEmpty() ? "^credential\\.[^.]+$" : ("credential\\." + RegexEscape(urlA) + "\\..*"); git_config_foreach_match(config, pattern, GetCredentialEntryCallback, &list); for (size_t i = 0; i < list.size(); ++i) g_Git.UnsetConfigValue(list[i], configLevel); m_ctrlUrlList.DeleteString(index); OnLbnSelchangeListUrl(); } } }
void CSubmoduleUpdateDlg::Refresh() { while (m_PathListBox.GetCount() > 0) m_PathListBox.DeleteString(m_PathListBox.GetCount() - 1); CString WorkingDir = g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'), _T('_')); m_regPath = CRegString(CString(_T("Software\\TortoiseGit\\History\\SubmoduleUpdatePath\\") + WorkingDir)); CString path = m_regPath; STRING_VECTOR emptylist; STRING_VECTOR list; GetSubmodulePathList(list, m_bWholeProject ? emptylist : m_PathFilterList); STRING_VECTOR selected; if (m_PathList.empty()) { int pos = 0; while (pos >= 0) { CString part = path.Tokenize(_T("|"), pos); if (!part.IsEmpty()) selected.push_back(part); } } else { for (size_t i = 0; i < m_PathList.size(); ++i) selected.push_back(m_PathList[i]); } for (size_t i = 0; i < list.size(); ++i) { m_PathListBox.AddString(list[i]); if (selected.size() == 0) m_PathListBox.SetSel((int)i); else { for (size_t j = 0; j < selected.size(); ++j) { if (selected[j] == list[i]) m_PathListBox.SetSel((int)i); } } } OnLbnSelchangeListPath(); }
BOOL CRequestPullDlg::OnInitDialog() { CHorizontalResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDCANCEL,BOTTOM_RIGHT); AddAnchor(IDHELP,BOTTOM_RIGHT); AddAnchor(IDC_BUTTON_LOCAL_BRANCH, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH, TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_URL, TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_REMOTE_BRANCH, TOP_LEFT,TOP_RIGHT); EnableSaveRestore(_T("RequestPullDlg")); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); STRING_VECTOR list; int current; g_Git.GetBranchList(list, ¤t, CGit::BRANCH_ALL); m_cStartRevision.SetMaxHistoryItems(0x7FFFFFFF); for (unsigned int i = 0; i < list.size(); i++) { m_cStartRevision.AddString(list[i]); } CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'), _T('_')); m_RegStartRevision = CRegString(_T("Software\\TortoiseGit\\History\\RequestPull\\")+WorkingDir+_T("\\startrevision")); if(m_StartRevision.IsEmpty()) { m_StartRevision = m_RegStartRevision; } m_cStartRevision.SetWindowTextW(m_StartRevision); // store URLs in global history, but save last used local url separately, // because one normally has only one writable repository m_cRepositoryURL.SetURLHistory(TRUE); m_cRepositoryURL.LoadHistory(_T("Software\\TortoiseGit\\History\\RequestPull"), _T("url")); m_RegRepositoryURL = CRegString(_T("Software\\TortoiseGit\\History\\RequestPull\\")+WorkingDir+_T("\\repositoryurl")); if(m_RepositoryURL.IsEmpty()) { m_RepositoryURL = m_RegRepositoryURL; } m_cRepositoryURL.SetWindowTextW(m_RepositoryURL); m_RegEndRevision = CRegString(_T("Software\\TortoiseGit\\History\\RequestPull\\")+WorkingDir+_T("\\endrevision"), _T("HEAD")); if(m_EndRevision.IsEmpty()) { m_EndRevision = m_RegEndRevision; } m_cEndRevision.SetWindowTextW(m_EndRevision); this->UpdateData(FALSE); return TRUE; }
void CPullFetchDlg::Refresh() { //Select pull-remote from current branch CString currentBranch = g_Git.GetSymbolicRef(); CString configName; configName.Format(L"branch.%s.remote", currentBranch); CString pullRemote = this->m_configPullRemote = g_Git.GetConfigValue(configName); //Select pull-branch from current branch configName.Format(L"branch.%s.merge", currentBranch); CString pullBranch = m_configPullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName)); if (pullBranch.IsEmpty()) m_RemoteBranch.AddString(currentBranch); else m_RemoteBranch.AddString(pullBranch); if(pullRemote.IsEmpty()) pullRemote = m_RemoteReg; if (!m_PreSelectRemote.IsEmpty()) pullRemote = m_PreSelectRemote; STRING_VECTOR list; int sel=0; if (!m_IsPull) list.push_back(_T("- all -")); if(!g_Git.GetRemoteList(list)) { if (!m_IsPull && list.size() <= 2) list.erase(list.begin()); for (unsigned int i = 0; i < list.size(); ++i) { m_Remote.AddString(list[i]); if (!m_bAllRemotes && list[i] == pullRemote) sel = i; } } m_Remote.SetCurSel(sel); OnCbnSelchangeRemote(); }
void CPullFetchDlg::Refresh() { //Select pull-remote from current branch CString currentBranch; if (g_Git.GetCurrentBranchFromFile(g_Git.m_CurrentDir, currentBranch)) currentBranch.Empty(); CString pullRemote, pullBranch; g_Git.GetRemoteTrackedBranch(currentBranch, pullRemote, pullBranch); m_configPullRemote = pullRemote; m_configPullBranch = pullBranch; if (pullBranch.IsEmpty()) m_RemoteBranch.AddString(currentBranch); else m_RemoteBranch.AddString(pullBranch); if(pullRemote.IsEmpty()) pullRemote = m_RemoteReg; if (!m_PreSelectRemote.IsEmpty()) pullRemote = m_PreSelectRemote; STRING_VECTOR list; m_Remote.Reset(); int sel=0; if(!g_Git.GetRemoteList(list)) { if (!m_IsPull && list.size() > 1) m_Remote.AddString(CString(MAKEINTRESOURCE(IDS_PROC_PUSHFETCH_ALLREMOTES))); for (unsigned int i = 0; i < list.size(); ++i) { m_Remote.AddString(list[i]); if (!m_bAllRemotes && list[i] == pullRemote) sel = i + (!m_IsPull && list.size() > 1 ? 1 : 0); } } m_Remote.SetCurSel(sel); OnCbnSelchangeRemote(); }
BOOL CRefLogDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDCANCEL,BOTTOM_RIGHT); AddAnchor(IDC_REFLOG_LIST,TOP_LEFT,BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddOthersToAnchor(); this->EnableSaveRestore(_T("RefLogDlg")); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); STRING_VECTOR list; list.push_back(_T("HEAD")); g_Git.GetRefList(list); m_RefList.m_hasWC = !g_GitAdminDir.IsBareRepo(g_Git.m_CurrentDir); m_ChooseRef.SetMaxHistoryItems(0x7FFFFFFF); this->m_ChooseRef.AddString(list); this->m_RefList.InsertRefLogColumn(); //m_RefList.m_logEntries.ParserFromRefLog(_T("master")); if(this->m_CurrentBranch.IsEmpty()) { m_CurrentBranch.Format(_T("refs/heads/%s"),g_Git.GetCurrentBranch()); m_ChooseRef.SetCurSel(0); /* Choose HEAD */ } else { for(int i=0;i<list.size();i++) { if(list[i] == m_CurrentBranch) { m_ChooseRef.SetCurSel(i); break; } } } OnCbnSelchangeRef(); return TRUE; }
int CGit::GetBranchList(STRING_VECTOR &list,int *current,BRANCH_TYPE type) { int ret; CString cmd, output, cur; cmd = _T("git.exe branch --no-color"); if((type&BRANCH_ALL) == BRANCH_ALL) cmd += _T(" -a"); else if(type&BRANCH_REMOTE) cmd += _T(" -r"); ret = Run(cmd, &output, NULL, CP_UTF8); if(!ret) { int pos=0; CString one; while( pos>=0 ) { one=output.Tokenize(_T("\n"),pos); one.Trim(L" \r\n\t"); if(one.Find(L" -> ") >= 0 || one.IsEmpty()) continue; // skip something like: refs/origin/HEAD -> refs/origin/master if(one[0] == _T('*')) { one = one.Mid(2); cur = one; } if (one != _T("(no branch)")) list.push_back(one); } } if(type & BRANCH_FETCH_HEAD && !DerefFetchHead().IsEmpty()) list.push_back(L"FETCH_HEAD"); std::sort(list.begin(), list.end(), LogicalComparePredicate); if (current && cur != _T("(no branch)")) { for (unsigned int i = 0; i < list.size(); i++) { if (list[i] == cur) { *current = i; break; } } } return ret; }
void CHistoryCombo::SetList(const STRING_VECTOR& list) { Reset(); for (size_t i = 0; i < list.size(); ++i) { CString combostring = list[i]; combostring.Replace('\r', ' '); combostring.Replace('\n', ' '); if (m_bTrim) combostring.Trim(); if (combostring.IsEmpty()) continue; InsertEntry(combostring, i); } }
BOOL CRevGraphFilterDlg::OnInitDialog() { CDialog::OnInitDialog(); this->m_ctrlFromRev.Init(); this->m_ctrlToRev.Init(); STRING_VECTOR list; g_Git.GetRefList(list); m_ctrlFromRev.AddSearchString(_T("HEAD")); m_ctrlToRev.AddSearchString(_T("HEAD")); for(int i=0;i<list.size();i++) { CString str=list[i]; m_ctrlFromRev.AddSearchString(list[i]); m_ctrlToRev.AddSearchString(list[i]); if(str.Find(_T("refs/")) == 0) { m_ctrlFromRev.AddSearchString(list[i].Mid(5)); m_ctrlToRev.AddSearchString(list[i].Mid(5)); } if(str.Find(_T("refs/heads/")) == 0) { m_ctrlFromRev.AddSearchString(list[i].Mid(11)); m_ctrlToRev.AddSearchString(list[i].Mid(11)); } if(str.Find(_T("refs/remotes/")) == 0) { m_ctrlFromRev.AddSearchString(list[i].Mid(13)); m_ctrlToRev.AddSearchString(list[i].Mid(13)); } if(str.Find(_T("refs/tags/")) == 0) { m_ctrlFromRev.AddSearchString(list[i].Mid(10)); m_ctrlToRev.AddSearchString(list[i].Mid(10)); } } return TRUE; }
void CSyncDlg::Refresh() { theApp.DoWaitCursor(1); int lastSelected = m_ctrlURL.GetCurSel(); CString url; this->m_ctrlURL.GetWindowText(url); this->m_ctrlURL.Reset(); CString workingDir = g_Git.m_CurrentDir; workingDir.Replace(_T(':'), _T('_')); this->m_ctrlURL.LoadHistory(_T("Software\\TortoiseGit\\History\\SyncURL\\") + workingDir, _T("url")); STRING_VECTOR list; bool found = false; if (!g_Git.GetRemoteList(list)) { for (size_t i = 0; i < list.size(); ++i) { m_ctrlURL.AddString(list[i]); if (list[i] == url) found = true; } } if (lastSelected >= 0 && !found) { m_ctrlURL.SetCurSel(0); m_ctrlURL.GetWindowText(url); } CString local; CString remote; this->m_ctrlLocalBranch.GetWindowText(local); this->m_ctrlRemoteBranch.GetWindowText(remote); this->LoadBranchInfo(); this->m_ctrlLocalBranch.AddString(local); this->m_ctrlRemoteBranch.AddString(remote); this->m_ctrlURL.AddString(url); m_OutLogList.ShowText(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_REFRESHING))); this->FetchOutList(true); theApp.DoWaitCursor(-1); }
static int SubmoduleCallback(git_submodule *sm, const char * /*name*/, void *payload) { STRING_VECTOR *list = *(STRING_VECTOR **)payload; STRING_VECTOR *prefixList = *((STRING_VECTOR **)payload + 1); CString path = CUnicodeUtils::GetUnicode(git_submodule_path(sm)); if (prefixList->empty()) list->push_back(path); else { for (size_t i = 0; i < prefixList->size(); ++i) { CString prefix = prefixList->at(i) + L'/'; if (CStringUtils::StartsWith(path, prefix)) list->push_back(path); } } return 0; }
BOOL CSettingGitRemote::OnInitDialog() { ISettingsPropPage::OnInitDialog(); //CString str=((CSettings*)GetParent())->m_CmdPath.GetWinPath(); CString proj; if( g_GitAdminDir.HasAdminDir(m_cmdPath,&proj) ) { CString title; this->GetWindowText(title); this->SetWindowText(title + _T(" - ") + proj); } STRING_VECTOR remotes; g_Git.GetRemoteList(remotes); m_ctrlRemoteList.ResetContent(); for (size_t i = 0; i < remotes.size(); i++) m_ctrlRemoteList.AddString(remotes[i]); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_REACHABLE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_NONE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(CAppUtils::GetMsysgitVersion() < 0x01090000 ? IDS_FETCH_TAGS_ONLY : IDS_ALL))); m_ctrlTagOpt.SetCurSel(0); if (CAppUtils::GetMsysgitVersion() < 0x0108030) { GetDlgItem(IDC_CHECK_PUSHDEFAULT)->ShowWindow(SW_HIDE); } if (CAppUtils::GetMsysgitVersion() < 0x0108050) { GetDlgItem(IDC_CHECK_PRUNE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_CHECK_PRUNEALL)->ShowWindow(SW_HIDE); } CString pruneAll = g_Git.GetConfigValue(_T("fetch.prune")); m_bPruneAll = pruneAll == _T("true") ? TRUE : FALSE; //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE); this->UpdateData(FALSE); SetTimer(TIMER_PREFILL, 1000, nullptr); return TRUE; }
static int SubmoduleCallback(git_submodule *sm, const char * /*name*/, void *payload) { STRING_VECTOR *list = *(STRING_VECTOR **)payload; STRING_VECTOR *prefixList = *((STRING_VECTOR **)payload + 1); CString path = CUnicodeUtils::GetUnicode(git_submodule_path(sm)); if (prefixList->empty()) { list->push_back(path); } else { for (size_t i = 0; i < prefixList->size(); ++i) { CString prefix = prefixList->at(i) + _T("/"); if (path.Left(prefix.GetLength()) == prefix) list->push_back(path); } } return 0; }
BOOL CSettingGitRemote::OnInitDialog() { ISettingsPropPage::OnInitDialog(); AdjustControlSize(IDC_CHECK_PRUNE); AdjustControlSize(IDC_CHECK_PRUNEALL); AdjustControlSize(IDC_CHECK_PUSHDEFAULT); STRING_VECTOR remotes; g_Git.GetRemoteList(remotes); m_ctrlRemoteList.ResetContent(); for (size_t i = 0; i < remotes.size(); i++) m_ctrlRemoteList.AddString(remotes[i]); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_FETCH_REACHABLE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_NONE))); m_ctrlTagOpt.AddString(CString(MAKEINTRESOURCE(IDS_ALL))); m_ctrlTagOpt.SetCurSel(0); CString pruneAll = g_Git.GetConfigValue(L"fetch.prune"); m_bPruneAll = pruneAll == L"true" ? TRUE : FALSE; { CString tmp; tmp.Format(IDS_GITCONFIG_SETTING, L"remote.pushdefault"); m_tooltips.AddTool(IDC_CHECK_PUSHDEFAULT, tmp); tmp.Format(IDS_GITCONFIG_SETTING, L"remote.<name>.prune"); m_tooltips.AddTool(IDC_CHECK_PRUNE, tmp); tmp.Format(IDS_GITCONFIG_SETTING, L"fetch.prune"); m_tooltips.AddTool(IDC_CHECK_PRUNEALL, tmp); tmp.Format(IDS_GITCONFIG_SETTING, L"remote<name>.tagopt"); m_tooltips.AddTool(IDC_COMBO_TAGOPT, tmp); } //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE); this->UpdateData(FALSE); SetTimer(TIMER_PREFILL, 1000, nullptr); return TRUE; }
BOOL CPullFetchDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); AddAnchor(IDC_REMOTE_COMBO, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_OTHER, TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_REMOTE_BRANCH, TOP_LEFT,TOP_RIGHT); AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDCANCEL,BOTTOM_RIGHT); CheckRadioButton(IDC_REMOTE_RD,IDC_OTHER_RD,IDC_REMOTE_RD); m_Remote.EnableWindow(TRUE); m_Other.EnableWindow(FALSE); m_RemoteBranch.EnableWindow(FALSE); m_Other.SetURLHistory(TRUE); m_Other.LoadHistory(_T("Software\\TortoiseGit\\History\\PullURLS"), _T("url")); m_Other.SetCurSel(0); m_RemoteBranch.LoadHistory(_T("Software\\TortoiseGit\\History\\PullRemoteBranch"), _T("br")); m_RemoteBranch.SetCurSel(0); if(m_IsPull) this->SetWindowTextW(_T("Pull")); else this->SetWindowTextW(_T("Fetch")); STRING_VECTOR list; if(!g_Git.GetRemoteList(list)) { for(unsigned int i=0;i<list.size();i++) m_Remote.AddString(list[i]); } EnableSaveRestore(_T("PullFetchDlg")); return TRUE; }
BOOL CSettingGitRemote::OnInitDialog() { ISettingsPropPage::OnInitDialog(); //CString str=((CSettings*)GetParent())->m_CmdPath.GetWinPath(); CString proj; if( g_GitAdminDir.HasAdminDir(m_cmdPath,&proj) ) { CString title; this->GetWindowText(title); this->SetWindowText(title + _T(" - ") + proj); } STRING_VECTOR remotes; g_Git.GetRemoteList(remotes); m_ctrlRemoteList.ResetContent(); for (size_t i = 0; i < remotes.size(); i++) m_ctrlRemoteList.AddString(remotes[i]); //this->GetDlgItem(IDC_EDIT_REMOTE)->EnableWindow(FALSE); this->UpdateData(FALSE); return TRUE; }
//static function, Share with SyncDialog UINT CProgressDlg::RunCmdList(CWnd* pWnd, STRING_VECTOR& cmdlist, STRING_VECTOR& dirlist, bool bShowCommand, CString* pfilename, volatile bool* bAbort, CGitGuardedByteArray* pdata, CGit* git) { UINT ret=0; std::vector<std::unique_ptr<CBlockCacheForPath>> cacheBlockList; std::vector<std::unique_ptr<CGit>> gitList; if (dirlist.empty()) cacheBlockList.push_back(std::make_unique<CBlockCacheForPath>(git->m_CurrentDir)); else { for (const auto& dir : dirlist) { auto pGit = std::make_unique<CGit>(); pGit->m_CurrentDir = dir; gitList.push_back(std::move(pGit)); cacheBlockList.push_back(std::make_unique<CBlockCacheForPath>(dir)); } } EnsurePostMessage(pWnd, MSG_PROGRESSDLG_UPDATE_UI, MSG_PROGRESSDLG_START, 0); if(pdata) pdata->clear(); for (size_t i = 0; i < cmdlist.size(); ++i) { if(cmdlist[i].IsEmpty()) continue; if (bShowCommand) { CStringA str; if (gitList.empty() || gitList.size() == 1 && gitList[0]->m_CurrentDir == git->m_CurrentDir) str = CUnicodeUtils::GetMulti(cmdlist[i].Trim() + _T("\r\n\r\n"), CP_UTF8); else str = CUnicodeUtils::GetMulti((i > 0 ? _T("\r\n") : _T("")) + gitList[i]->m_CurrentDir + _T("\r\n") + cmdlist[i].Trim() + _T("\r\n\r\n"), CP_UTF8); for (int j = 0; j < str.GetLength(); ++j) { if(pdata) { pdata->m_critSec.Lock(); pdata->push_back(str[j]); pdata->m_critSec.Unlock(); } else pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]); } if(pdata) pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0); } PROCESS_INFORMATION pi; CAutoGeneralHandle hRead; int runAsyncRet = -1; if (gitList.empty()) runAsyncRet = git->RunAsync(cmdlist[i].Trim(), &pi, hRead.GetPointer(), nullptr, pfilename); else runAsyncRet = gitList[i]->RunAsync(cmdlist[i].Trim(), &pi, hRead.GetPointer(), nullptr, pfilename); if (runAsyncRet) { EnsurePostMessage(pWnd, MSG_PROGRESSDLG_UPDATE_UI, MSG_PROGRESSDLG_FAILED, -1 * runAsyncRet); return runAsyncRet; } CAutoGeneralHandle piProcess(pi.hProcess); CAutoGeneralHandle piThread(pi.hThread); DWORD readnumber; char lastByte = '\0'; char byte; CString output; while (ReadFile(hRead, &byte, 1, &readnumber, nullptr)) { if(pdata) { if(byte == 0) byte = '\n'; pdata->m_critSec.Lock(); if (byte == '\n' && lastByte != '\r') pdata->push_back('\r'); pdata->push_back( byte); lastByte = byte; pdata->m_critSec.Unlock(); if(byte == '\r' || byte == '\n') pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0); } else pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,byte); } if (pdata) { pdata->m_critSec.Lock(); bool post = !pdata->empty(); pdata->m_critSec.Unlock(); if (post) EnsurePostMessage(pWnd, MSG_PROGRESSDLG_UPDATE_UI, MSG_PROGRESSDLG_RUN, 0); } CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": waiting for process to finish (%s), aborted: %d\n"), (LPCTSTR)cmdlist[i], *bAbort); WaitForSingleObject(pi.hProcess, INFINITE); DWORD status=0; if(!GetExitCodeProcess(pi.hProcess,&status) || *bAbort) { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": process %s finished, status code could not be fetched, (error %d; %s), aborted: %d\n"), (LPCTSTR)cmdlist[i], GetLastError(), (LPCTSTR)CFormatMessageWrapper(), *bAbort); EnsurePostMessage(pWnd, MSG_PROGRESSDLG_UPDATE_UI, MSG_PROGRESSDLG_FAILED, status); return TGIT_GIT_ERROR_GET_EXIT_CODE; } CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": process %s finished with code %d\n"), (LPCTSTR)cmdlist[i], status); ret |= status; } EnsurePostMessage(pWnd, MSG_PROGRESSDLG_UPDATE_UI, MSG_PROGRESSDLG_END, ret); return ret; }
/** * @ingroup TestWebRtc * @brief WebSocket 클라이언트 데이터 수신 이벤트 callback * @param pszClientIp WebSocket 클라이언트 IP 주소 * @param iClientPort WebSocket 클라이언트 포트 번호 * @param strData WebSocket 클라이언트가 전송한 데이터 * @param pclsSession HTTP 세션 정보 * @returns WebSocket 클라이언트 연결을 유지하려면 true 를 리턴하고 그렇지 않으면 false 를 리턴한다. */ bool CHttpCallBack::WebSocketData( const char * pszClientIp, int iClientPort, std::string & strData, CHttpStackSession * pclsSession ) { CLog::Print( LOG_NETWORK, "WebSocket[%s:%d] recv[%s]", pszClientIp, iClientPort, strData.c_str() ); printf( "WebSocket[%s:%d] recv[%s]\n", pszClientIp, iClientPort, strData.c_str() ); STRING_VECTOR clsList; SplitString( strData.c_str(), clsList, '|' ); int iCount = clsList.size(); if( iCount < 2 ) { return false; } bool bReq = true; if( strcmp( clsList[0].c_str(), "req" ) ) bReq = false; const char * pszCommand = clsList[1].c_str(); std::string strUserId; if( !strcmp( pszCommand, "register" ) ) { if( iCount < 5 ) { printf( "register request arg is not correct\n" ); return false; } if( gclsUserMap.Insert( clsList[2].c_str(), clsList[3].c_str(), clsList[4].c_str(), pszClientIp, iClientPort, pclsSession->m_strUserAgent.c_str() ) == false ) { Send( pszClientIp, iClientPort, "res|register|500" ); } else { Send( pszClientIp, iClientPort, "res|register|200" ); } } else if( !strcmp( pszCommand, "invite" ) ) { if( bReq ) { if( iCount < 4 ) { printf( "invite request arg is not correct\n" ); return false; } const char * pszToId = clsList[2].c_str(); const char * pszSdp = clsList[3].c_str(); CUserInfo clsUserInfo; CRtpThreadArg * pclsRtpArg = new CRtpThreadArg(); if( pclsRtpArg == NULL ) { Send( pszClientIp, iClientPort, "res|invite|500" ); return true; } pclsRtpArg->m_strUserId = strUserId; pclsRtpArg->m_strToId = pszToId; pclsRtpArg->m_strSdp = pszSdp; pclsRtpArg->m_bStartCall = true; if( pclsRtpArg->CreateSocket() == false || gclsUserMap.Update( strUserId.c_str(), pclsRtpArg, false ) == false || StartRtpThread( pclsRtpArg ) == false ) { delete pclsRtpArg; Send( pszClientIp, iClientPort, "res|invite|500" ); return true; } } else { if( iCount < 3 ) { printf( "invite response arg is not correct\n" ); return false; } CUserInfo clsUserInfo; if( gclsUserMap.SelectUserId( pszClientIp, iClientPort, strUserId ) == false || gclsUserMap.Select( strUserId.c_str(), clsUserInfo ) == false ) { return true; } int iStatus = atoi( clsList[2].c_str() ); if( iStatus == 200 && iCount >= 4 ) { CRtpThreadArg * pclsRtpArg = new CRtpThreadArg(); if( pclsRtpArg == NULL ) { Send( pszClientIp, iClientPort, "req|bye" ); return true; } const char * pszSdp = clsList[3].c_str(); pclsRtpArg->m_strUserId = strUserId; pclsRtpArg->m_strSdp = pszSdp; pclsRtpArg->m_bStartCall = false; if( pclsRtpArg->CreateSocket() == false || gclsUserMap.Update( strUserId.c_str(), pclsRtpArg, false ) == false || StartRtpThread( pclsRtpArg ) == false ) { delete pclsRtpArg; Send( pszClientIp, iClientPort, "req|bye" ); return true; } } } } else if( !strcmp( pszCommand, "bye" ) ) { std::string strUserId; CUserInfo clsUserInfo; if( gclsUserMap.SelectUserId( pszClientIp, iClientPort, strUserId ) == false || gclsUserMap.Select( strUserId.c_str(), clsUserInfo ) == false ) { Send( pszClientIp, iClientPort, "res|invite|403" ); return true; } if( clsUserInfo.m_pclsRtpArg ) { clsUserInfo.m_pclsRtpArg->m_bStop = true; gclsUserMap.Update( strUserId.c_str(), clsUserInfo.m_pclsRtpArg, true ); } } return true; }
BOOL CFormatPatchDlg::OnInitDialog() { CHorizontalResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AdjustControlSize(IDC_RADIO_SINCE); AdjustControlSize(IDC_RADIO_NUM); AdjustControlSize(IDC_RADIO_RANGE); AdjustControlSize(IDC_CHECK_SENDMAIL); AdjustControlSize(IDC_CHECK_NOPREFIX); AddAnchor(IDC_GROUP_DIR, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_DIR,TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_BUTTON_DIR, TOP_RIGHT); AddAnchor(IDC_GROUP_VERSION, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_SINCE, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_EDIT_NUM, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_SPIN_NUM, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_FROM, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_TO, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_BUTTON_FROM, TOP_RIGHT); AddAnchor(IDC_BUTTON_TO, TOP_RIGHT); AddAnchor(IDC_CHECK_SENDMAIL,BOTTOM_LEFT); AddAnchor(IDC_CHECK_NOPREFIX, BOTTOM_LEFT); AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDCANCEL,BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDC_BUTTON_REF,TOP_RIGHT); this->AddOthersToAnchor(); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); m_cDir.SetPathHistory(TRUE); m_cDir.LoadHistory(L"Software\\TortoiseGit\\History\\FormatPatchURLS", L"path"); m_cDir.AddString(g_Git.m_CurrentDir); STRING_VECTOR list; g_Git.GetBranchList(list, nullptr, CGit::BRANCH_ALL_F); m_cSince.SetMaxHistoryItems(static_cast<int>(list.size())); m_cSince.SetList(list); if (!m_Since.IsEmpty()) m_cSince.SetWindowText(m_Since); else m_cSince.SetWindowText(static_cast<CString>(m_regSince)); m_cFrom.LoadHistory(L"Software\\TortoiseGit\\History\\FormatPatchFromURLS", L"ver"); m_cFrom.SetCurSel(0); if(!m_From.IsEmpty()) m_cFrom.SetWindowText(m_From); m_cTo.LoadHistory(L"Software\\TortoiseGit\\History\\FormatPatchToURLS", L"ver"); m_cTo.SetCurSel(0); if(!m_To.IsEmpty()) m_cTo.SetWindowText(m_To); m_spinNum.SetRange32(1, INT_MAX); this->CheckRadioButton(IDC_RADIO_SINCE,IDC_RADIO_RANGE,this->m_Radio); OnBnClickedRadio(); if (g_Git.IsInitRepos()) DialogEnableWindow(IDOK, FALSE); EnableSaveRestore(L"FormatPatchDlg"); return TRUE; }
void CSyncDlg::OnBnClickedButtonPull() { int CurrentEntry; CurrentEntry = (int)this->m_ctrlPull.GetCurrentEntry(); this->m_regPullButton = CurrentEntry; this->m_bAbort=false; this->m_GitCmdList.clear(); m_ctrlCmdOut.SetWindowTextW(_T("")); m_LogText = ""; this->UpdateData(); UpdateCombox(); if (g_Git.GetHash(m_oldHash, _T("HEAD"))) { MessageBox(g_Git.GetGitLastErr(_T("Could not get HEAD hash.")), _T("TortoiseGit"), MB_ICONERROR); return; } m_refList.Clear(); m_newHashMap.clear(); m_oldHashMap.clear(); if( CurrentEntry == 0) { CGitHash localBranchHash; if (g_Git.GetHash(localBranchHash, m_strLocalBranch)) { MessageBox(g_Git.GetGitLastErr(_T("Could not get hash of \"") + m_strLocalBranch + _T("\".")), _T("TortoiseGit"), MB_ICONERROR); return; } if (localBranchHash != m_oldHash) { CMessageBox::Show(NULL, IDS_PROC_SYNC_PULLWRONGBRANCH, IDS_APPNAME, MB_OK | MB_ICONERROR); return; } } if(this->m_strURL.IsEmpty()) { CMessageBox::Show(NULL, IDS_PROC_GITCONFIG_URLEMPTY, IDS_APPNAME, MB_OK | MB_ICONERROR); return; } if (m_bAutoLoadPuttyKey && CurrentEntry != 3) // CurrentEntry (Remote Update) handles this on its own) { CAppUtils::LaunchPAgent(NULL,&this->m_strURL); } this->SwitchToRun(); CString force; if(this->m_bForce) force = _T(" --force "); CString cmd; ShowTab(IDC_CMD_LOG); this->m_ctrlTabCtrl.ShowTab(IDC_REFLIST-1,true); this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,false); this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false); this->m_ctrlTabCtrl.ShowTab(IDC_IN_CONFLICT-1,false); ///Pull if(CurrentEntry == 0) //Pull { CString remotebranch; remotebranch = m_strRemoteBranch; if(!IsURL()) { CString configName; configName.Format(L"branch.%s.merge", this->m_strLocalBranch); CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName)); configName.Format(L"branch.%s.remote", m_strLocalBranch); CString pullRemote = g_Git.GetConfigValue(configName); if(pullBranch == remotebranch && pullRemote == this->m_strURL) remotebranch.Empty(); } if(m_Gitverion >= 0x01070203) //above 1.7.0.2 force += _T("--progress "); cmd.Format(_T("git.exe pull -v %s \"%s\" %s"), force, m_strURL, remotebranch); m_CurrentCmd = GIT_COMMAND_PULL; m_GitCmdList.push_back(cmd); m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); if (m_pThread==NULL) { // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED))); } else { m_pThread->m_bAutoDelete = TRUE; m_pThread->ResumeThread(); } } ///Fetch if(CurrentEntry == 1 || CurrentEntry ==2 ) //Fetch { CString remotebranch; if(this->IsURL() || m_strRemoteBranch.IsEmpty()) { remotebranch=this->m_strRemoteBranch; } else { remotebranch.Format(_T("remotes/%s/%s"), m_strURL,m_strRemoteBranch); CGitHash remoteBranchHash; g_Git.GetHash(remoteBranchHash, remotebranch); if (remoteBranchHash.IsEmpty()) remotebranch=m_strRemoteBranch; else remotebranch=m_strRemoteBranch+_T(":")+remotebranch; } if(CurrentEntry == 1) m_CurrentCmd = GIT_COMMAND_FETCH; else m_CurrentCmd = GIT_COMMAND_FETCHANDREBASE; if (g_Git.UsingLibGit2(CGit::GIT_CMD_FETCH)) { CString refspec; // current libgit2 only supports well formated refspec refspec.Format(_T("refs/heads/%s:refs/remotes/%s/%s"), m_strRemoteBranch, m_strURL, m_strRemoteBranch); m_GitProgressList.SetUrl(m_strURL); m_GitProgressList.SetRefSpec(refspec); m_GitProgressList.SetCommand(CGitProgressList::GitProgress_Fetch); m_GitProgressList.Init(); ShowTab(IDC_CMD_GIT_PROG); } else { if(m_Gitverion >= 0x01070203) //above 1.7.0.2 force += _T("--progress "); cmd.Format(_T("git.exe fetch -v %s \"%s\" %s"), force, m_strURL, remotebranch); m_GitCmdList.push_back(cmd); m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); if (m_pThread==NULL) { // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED))); } else { m_pThread->m_bAutoDelete = TRUE; m_pThread->ResumeThread(); } } } ///Remote Update if(CurrentEntry == 3) { if (m_bAutoLoadPuttyKey) { STRING_VECTOR list; if (!g_Git.GetRemoteList(list)) { for (size_t i = 0; i < list.size(); ++i) CAppUtils::LaunchPAgent(NULL, &list[i]); } } m_CurrentCmd = GIT_COMMAND_REMOTE; cmd=_T("git.exe remote update"); m_GitCmdList.push_back(cmd); InterlockedExchange(&m_bBlock, TRUE); m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); if (m_pThread==NULL) { // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED))); InterlockedExchange(&m_bBlock, FALSE); } else { m_pThread->m_bAutoDelete = TRUE; m_pThread->ResumeThread(); } } ///Cleanup stale remote banches if(CurrentEntry == 4) { m_CurrentCmd = GIT_COMMAND_REMOTE; cmd.Format(_T("git.exe remote prune \"%s\""), m_strURL); m_GitCmdList.push_back(cmd); InterlockedExchange(&m_bBlock, TRUE); m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); if (m_pThread==NULL) { // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED))); InterlockedExchange(&m_bBlock, FALSE); } else { m_pThread->m_bAutoDelete = TRUE; m_pThread->ResumeThread(); } } }
BOOL CSyncDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); // Let the TaskbarButtonCreated message through the UIPI filter. If we don't // do this, Explorer would be unable to send that message to our window if we // were running elevated. It's OK to make the call all the time, since if we're // not elevated, this is a no-op. CHANGEFILTERSTRUCT cfs = { sizeof(CHANGEFILTERSTRUCT) }; typedef BOOL STDAPICALLTYPE ChangeWindowMessageFilterExDFN(HWND hWnd, UINT message, DWORD action, PCHANGEFILTERSTRUCT pChangeFilterStruct); CAutoLibrary hUser = AtlLoadSystemLibraryUsingFullPath(_T("user32.dll")); if (hUser) { ChangeWindowMessageFilterExDFN *pfnChangeWindowMessageFilterEx = (ChangeWindowMessageFilterExDFN*)GetProcAddress(hUser, "ChangeWindowMessageFilterEx"); if (pfnChangeWindowMessageFilterEx) { pfnChangeWindowMessageFilterEx(m_hWnd, WM_TASKBARBTNCREATED, MSGFLT_ALLOW, &cfs); } } m_pTaskbarList.Release(); if (FAILED(m_pTaskbarList.CoCreateInstance(CLSID_TaskbarList))) m_pTaskbarList = nullptr; this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->EnableWindow(CAppUtils::IsSSHPutty()); /* this->m_ctrlAnimate.ShowWindow(SW_NORMAL); this->m_ctrlAnimate.Open(IDR_DOWNLOAD); this->m_ctrlAnimate.Play(0,-1,-1); */ // ------------------ Create Tabctrl ----------- CWnd *pwnd=this->GetDlgItem(IDC_BUTTON_TABCTRL); CRect rectDummy; pwnd->GetWindowRect(&rectDummy); this->ScreenToClient(rectDummy); if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_SYNC_TAB)) { TRACE0("Failed to create output tab window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO); // -------------Create Command Log Ctrl --------- DWORD dwStyle; dwStyle= ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL |WS_VSCROLL ; if( !m_ctrlCmdOut.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_CMD_LOG)) { TRACE0("Failed to create Log commits window\n"); return FALSE; // fail to create } // set the font to use in the log message view, configured in the settings dialog CFont m_logFont; CAppUtils::CreateFontForLogs(m_logFont); //GetDlgItem(IDC_CMD_LOG)->SetFont(&m_logFont); m_ctrlCmdOut.SetFont(&m_logFont); m_ctrlTabCtrl.InsertTab(&m_ctrlCmdOut, CString(MAKEINTRESOURCE(IDS_LOG)), -1); //m_ctrlCmdOut.ReplaceSel(_T("Hello")); //---------- Create in coming list ctrl ----------- dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;; if( !m_InLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_LOGLIST)) { TRACE0("Failed to create output commits window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_InLogList, CString(MAKEINTRESOURCE(IDS_PROC_SYNC_INCOMMITS)), -1); m_InLogList.m_ColumnRegKey=_T("SyncIn"); m_InLogList.InsertGitColumn(); //----------- Create In Change file list ----------- dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE; if( !m_InChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_CHANGELIST)) { TRACE0("Failed to create output change files window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_InChangeFileList, CString(MAKEINTRESOURCE(IDS_PROC_SYNC_INCHANGELIST)), -1); m_InChangeFileList.Init(GITSLC_COLEXT | GITSLC_COLSTATUS |GITSLC_COLADD|GITSLC_COLDEL , _T("InSyncDlg"), (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_COMPARETWO)| CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_GNUDIFF2)), false, true, GITSLC_COLEXT | GITSLC_COLSTATUS | GITSLC_COLADD| GITSLC_COLDEL); //---------- Create Conflict List Ctrl ----------------- dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE; if( !m_ConflictFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_CONFLICT)) { TRACE0("Failed to create output change files window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_ConflictFileList, CString(MAKEINTRESOURCE(IDS_PROC_SYNC_CONFLICTS)), -1); m_ConflictFileList.Init(GITSLC_COLEXT | GITSLC_COLSTATUS |GITSLC_COLADD|GITSLC_COLDEL , _T("ConflictSyncDlg"), (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_COMPARETWO)| CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_GNUDIFF2)| GITSLC_POPCONFLICT|GITSLC_POPRESOLVE),false); //---------- Create Commit Out List Ctrl--------------- dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;; if( !m_OutLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_LOGLIST)) { TRACE0("Failed to create output commits window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_OutLogList, CString(MAKEINTRESOURCE(IDS_PROC_SYNC_OUTCOMMITS)), -1); m_OutLogList.m_ColumnRegKey = _T("SyncOut"); m_OutLogList.InsertGitColumn(); //------------- Create Change File List Control ---------------- dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE; if( !m_OutChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_CHANGELIST)) { TRACE0("Failed to create output change files window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_OutChangeFileList, CString(MAKEINTRESOURCE(IDS_PROC_SYNC_OUTCHANGELIST)), -1); m_OutChangeFileList.Init(GITSLC_COLEXT | GITSLC_COLSTATUS | GITSLC_COLADD | GITSLC_COLDEL, _T("OutSyncDlg"), (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_COMPARETWO)| CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDGITLC_GNUDIFF2)), false, true, GITSLC_COLEXT | GITSLC_COLSTATUS | GITSLC_COLADD| GITSLC_COLDEL); if (!m_GitProgressList.Create(dwStyle | LVS_OWNERDATA, rectDummy, &m_ctrlTabCtrl, IDC_CMD_GIT_PROG)) { TRACE0("Failed to create Git Progress List Window\n"); return FALSE; // fail to create } m_ctrlTabCtrl.InsertTab(&m_GitProgressList, CString(MAKEINTRESOURCE(IDS_LOG)), -1); m_GitProgressList.m_pAnimate = &m_ctrlAnimate; m_GitProgressList.m_pPostWnd = this; m_GitProgressList.m_pProgressLabelCtrl = &m_ctrlProgLabel; m_GitProgressList.m_pProgControl = &m_ctrlProgress; m_GitProgressList.m_pTaskbarList = m_pTaskbarList; dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE; DWORD exStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT; m_refList.Create(dwStyle, rectDummy, &m_ctrlTabCtrl, IDC_REFLIST); m_refList.SetExtendedStyle(exStyle); m_refList.Init(); m_ctrlTabCtrl.InsertTab(&m_refList, CString(MAKEINTRESOURCE(IDS_REFLIST)), -1); this->m_tooltips.Create(this); AddAnchor(IDC_SYNC_TAB,TOP_LEFT,BOTTOM_RIGHT); AddAnchor(IDC_GROUP_INFO,TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_COMBOBOXEX_URL,TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_BUTTON_MANAGE,TOP_RIGHT); AddAnchor(IDC_BUTTON_PULL,BOTTOM_LEFT); AddAnchor(IDC_BUTTON_PUSH,BOTTOM_LEFT); AddAnchor(IDC_BUTTON_SUBMODULE,BOTTOM_LEFT); AddAnchor(IDC_BUTTON_STASH,BOTTOM_LEFT); AddAnchor(IDC_BUTTON_APPLY,BOTTOM_RIGHT); AddAnchor(IDC_BUTTON_EMAIL,BOTTOM_RIGHT); AddAnchor(IDC_PROGRESS_SYNC,TOP_LEFT,TOP_RIGHT); AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDHELP,BOTTOM_RIGHT); AddAnchor(IDC_STATIC_STATUS, BOTTOM_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_ANIMATE_SYNC,TOP_LEFT); AddAnchor(IDC_BUTTON_COMMIT,BOTTOM_LEFT); AddAnchor(IDC_LOG, BOTTOM_LEFT); // do not use BRANCH_COMBOX_ADD_ANCHOR here, we want to have different stylings AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH, TOP_LEFT,TOP_CENTER); AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH, TOP_CENTER, TOP_RIGHT); AddAnchor(IDC_BUTTON_LOCAL_BRANCH, TOP_CENTER); AddAnchor(IDC_BUTTON_REMOTE_BRANCH, TOP_RIGHT); AddAnchor(IDC_STATIC_REMOTE_BRANCH, TOP_CENTER); AddAnchor(IDC_PROG_LABEL, TOP_LEFT); AdjustControlSize(IDC_CHECK_PUTTY_KEY); AdjustControlSize(IDC_CHECK_FORCE); CString WorkingDir=g_Git.m_CurrentDir; WorkingDir.Replace(_T(':'),_T('_')); m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir; this->AddOthersToAnchor(); this->m_ctrlPush.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_PUSH))); this->m_ctrlPush.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_PUSHTAGS))); this->m_ctrlPush.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_PUSHNOTES))); this->m_ctrlPull.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_PULL))); this->m_ctrlPull.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_FETCH))); this->m_ctrlPull.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_FETCHREBASE))); this->m_ctrlPull.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_REMOTEUPDATE))); this->m_ctrlPull.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_CLEANUPSTALEBRANCHES))); this->m_ctrlSubmodule.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_SUBKODULEUPDATE))); this->m_ctrlSubmodule.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_SUBKODULEINIT))); this->m_ctrlSubmodule.AddEntry(CString(MAKEINTRESOURCE(IDS_PROC_SYNC_SUBKODULESYNC))); this->m_ctrlStash.AddEntry(CString(MAKEINTRESOURCE(IDS_MENUSTASHSAVE))); this->m_ctrlStash.AddEntry(CString(MAKEINTRESOURCE(IDS_MENUSTASHPOP))); this->m_ctrlStash.AddEntry(CString(MAKEINTRESOURCE(IDS_MENUSTASHAPPLY))); WorkingDir.Replace(_T(':'),_T('_')); CString regkey ; regkey.Format(_T("Software\\TortoiseGit\\TortoiseProc\\Sync\\%s"),WorkingDir); this->m_regPullButton = CRegDWORD(regkey+_T("\\Pull"),0); this->m_regPushButton = CRegDWORD(regkey+_T("\\Push"),0); this->m_regSubmoduleButton = CRegDWORD(regkey+_T("\\Submodule")); this->m_regAutoLoadPutty = CRegDWORD(regkey + _T("\\AutoLoadPutty"), CAppUtils::IsSSHPutty()); this->UpdateData(); this->m_bAutoLoadPuttyKey = m_regAutoLoadPutty; if(!CAppUtils::IsSSHPutty()) m_bAutoLoadPuttyKey = false; this->UpdateData(FALSE); this->m_ctrlPull.SetCurrentEntry(this->m_regPullButton); this->m_ctrlPush.SetCurrentEntry(this->m_regPushButton); this->m_ctrlSubmodule.SetCurrentEntry(this->m_regSubmoduleButton); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); EnableSaveRestore(_T("SyncDlg")); m_ctrlURL.SetCaseSensitive(TRUE); this->m_ctrlURL.LoadHistory(CString(_T("Software\\TortoiseGit\\History\\SyncURL\\"))+WorkingDir, _T("url")); STRING_VECTOR list; if(!g_Git.GetRemoteList(list)) { for (unsigned int i = 0; i < list.size(); ++i) { m_ctrlURL.AddString(list[i]); } } m_ctrlURL.SetCurSel(0); m_ctrlRemoteBranch.SetCurSel(0); m_ctrlURL.SetURLHistory(true); this->LoadBranchInfo(); this->m_bInited=true; FetchOutList(); m_ctrlTabCtrl.ShowTab(IDC_CMD_LOG-1,false); m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,false); m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false); m_ctrlTabCtrl.ShowTab(IDC_IN_CONFLICT-1,false); m_ctrlTabCtrl.ShowTab(IDC_CMD_GIT_PROG-1, false); m_ctrlTabCtrl.ShowTab(IDC_REFLIST-1, false); m_ctrlRemoteBranch.m_bWantReturn = TRUE; m_ctrlURL.m_bWantReturn = TRUE; this->m_Gitverion = CAppUtils::GetMsysgitVersion(); if (m_seq > 0 && (DWORD)CRegDWORD(_T("Software\\TortoiseGit\\SyncDialogRandomPos"))) { m_seq %= 5; RECT rect; GetWindowRect(&rect); rect.top -= m_seq * 30; rect.bottom -= m_seq * 30; if (rect.top < 0) { rect.top += 150; rect.bottom += 150; } MoveWindow(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }