From d20d28ae5562ae8f66f857e764fede78f47869e2 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Fri, 26 Oct 2012 15:50:42 +0200 Subject: [PATCH] Fixed issue #1487: Do not use libgit in TortoiseShell for displaying HEAD commit (might set %GIT_DIR% permanently) Signed-off-by: Sven Strickroth --- src/Changelog.txt | 1 + src/TortoiseShell/GITPropertyPage.cpp | 102 +++++++++++++++------------------- src/TortoiseShell/resourceshell.rc | 10 ++-- 3 files changed, 50 insertions(+), 63 deletions(-) diff --git a/src/Changelog.txt b/src/Changelog.txt index 288fde878..cb0098d86 100644 --- a/src/Changelog.txt +++ b/src/Changelog.txt @@ -17,6 +17,7 @@ Released: unreleased * Fixed issue #1465: Clean up does not work with core.quotepath=true * Fixed issue #1419: Push window doesn't load PuTTY key when pushing to multiple remotes * Fixed issue #1482: Allow to show log of other branches if current HEAD points to an orphan branch + * Fixed issue #1487: Do not use libgit in TortoiseShell for displaying HEAD commit (might set %GIT_DIR% permanently) = Release 1.7.14.0 = Released: 2012-10-14 diff --git a/src/TortoiseShell/GITPropertyPage.cpp b/src/TortoiseShell/GITPropertyPage.cpp index 0f03552d0..da3fb7a17 100644 --- a/src/TortoiseShell/GITPropertyPage.cpp +++ b/src/TortoiseShell/GITPropertyPage.cpp @@ -313,6 +313,14 @@ void CGitPropertyPage::InitWorkfileView() if(!path.HasAdminDir(&ProjectTopDir)) return; + CStringA gitdir = CUnicodeUtils::GetMulti(ProjectTopDir, CP_UTF8); + git_repository *repository = NULL; + + int ret = git_repository_open(&repository, gitdir.GetBuffer()); + gitdir.ReleaseBuffer(); + if (ret) + return; + CGit git; git.SetCurrentDir(ProjectTopDir); @@ -326,14 +334,11 @@ void CGitPropertyPage::InitWorkfileView() git.Run(_T("git.exe config core.safecrlf"), &safecrlf, CP_UTF8); CString branch; - CString headhash; CString remotebranch; - CString cmd,log; - if (!g_Git.GetCurrentBranchFromFile(ProjectTopDir, branch)) { - CString remote; + CString cmd, remote; cmd.Format(_T("git.exe config branch.%s.merge"), branch.Trim()); git.Run(cmd, &remotebranch, CP_UTF8); cmd.Format(_T("git.exe config branch.%s.remote"), branch.Trim()); @@ -347,12 +352,6 @@ void CGitPropertyPage::InitWorkfileView() else branch = _T("detached HEAD"); - TCHAR oldpath[MAX_PATH+1]; - - ::GetCurrentDirectory(MAX_PATH, oldpath); - - ::SetCurrentDirectory(ProjectTopDir); - if (autocrlf.Trim().IsEmpty()) autocrlf = _T("false"); if (safecrlf.Trim().IsEmpty()) @@ -367,19 +366,41 @@ void CGitPropertyPage::InitWorkfileView() remotebranch.Trim().Replace(_T("\n"), _T("; ")); SetDlgItemText(m_hwnd,IDC_SHELL_REMOTE_BRANCH, remotebranch); - try + git_oid oid; + git_commit *HEADcommit = NULL; + if (!git_reference_name_to_oid(&oid, repository, "HEAD") && !git_commit_lookup(&HEADcommit, repository, &oid) && HEADcommit != NULL) { - AutoLocker lock(g_Git.m_critGitDllSec); - g_Git.CheckAndInitDll(); - GitRev revHEAD; - revHEAD.GetCommit(CString(_T("HEAD"))); + int encode = CP_UTF8; + const char * encodingString = git_commit_message_encoding(HEADcommit); + if (encodingString != NULL) + { + CString str; + g_Git.StringAppend(&str, (BYTE*)encodingString, CP_UTF8); + encode = CUnicodeUtils::GetCPCode(str); + } + + CGitHash HEADcommitHash((char*)(git_commit_id(HEADcommit)->id)); - SetDlgItemText(m_hwnd, IDC_HEAD_HASH, revHEAD.m_CommitHash.ToString()); - SetDlgItemText(m_hwnd, IDC_HEAD_SUBJECT, revHEAD.GetSubject()); - SetDlgItemText(m_hwnd, IDC_HEAD_AUTHOR, revHEAD.GetAuthorName()); - if (!revHEAD.m_CommitHash.IsEmpty()) - SetDlgItemText(m_hwnd, IDC_HEAD_DATE, revHEAD.GetAuthorDate().Format(_T("%Y-%m-%d %H:%M:%S"))); + const git_signature * author = git_commit_author(HEADcommit); + CTime authorDate(author->when.time); + CString authorName; + g_Git.StringAppend(&authorName, (BYTE*)author->name, encode); + CString message; + g_Git.StringAppend(&message, (BYTE*)git_commit_message(HEADcommit), encode); + + int start = 0; + message = message.Tokenize(L"\n", start); + + SetDlgItemText(m_hwnd, IDC_HEAD_HASH, HEADcommitHash.ToString()); + SetDlgItemText(m_hwnd, IDC_HEAD_SUBJECT, message); + SetDlgItemText(m_hwnd, IDC_HEAD_AUTHOR, authorName); + SetDlgItemText(m_hwnd, IDC_HEAD_DATE, authorDate.Format(_T("%Y-%m-%d %H:%M:%S"))); + + git_commit_free(HEADcommit); + } + + { if (filenames.size() == 1) { CTGitPath relatepath; @@ -393,35 +414,13 @@ void CGitPropertyPage::InitWorkfileView() { relatepath.SetFromWin( strpath.Right(strpath.GetLength()-ProjectTopDir.GetLength()-1)); } - +/* GitRev revLast; if(! relatepath.GetGitPathString().IsEmpty()) { cmd=_T("-z --topo-order -n1 --parents -- \""); cmd+=relatepath.GetGitPathString(); cmd+=_T("\""); - - GIT_LOG handle; - do - { - if(git_open_log(&handle, CUnicodeUtils::GetUTF8(cmd).GetBuffer())) - break; - if(git_get_log_firstcommit(handle)) - break; - - GIT_COMMIT commit; - if (git_get_log_nextcommit(handle, &commit, 0)) - break; - - git_close_log(handle); - handle = NULL; - revLast.ParserFromCommit(&commit); - git_free_commit(&commit); - - }while(0); - if (handle != NULL) { - git_close_log(handle); - } } SetDlgItemText(m_hwnd, IDC_LAST_HASH, revLast.m_CommitHash.ToString()); @@ -431,7 +430,7 @@ void CGitPropertyPage::InitWorkfileView() SetDlgItemText(m_hwnd, IDC_LAST_DATE, _T("")); else SetDlgItemText(m_hwnd, IDC_LAST_DATE, revLast.GetAuthorDate().Format(_T("%Y-%m-%d %H:%M:%S"))); - +*/ if (!path.IsDirectory()) { // get assume valid flag @@ -440,20 +439,10 @@ void CGitPropertyPage::InitWorkfileView() bool executable = false; do { - CStringA gitdir = CUnicodeUtils::GetMulti(ProjectTopDir, CP_UTF8); - git_repository *repository = NULL; git_index *index = NULL; - int ret = git_repository_open(&repository, gitdir.GetBuffer()); - gitdir.ReleaseBuffer(); - if (ret) - break; - if (git_repository_index(&index, repository)) - { - git_repository_free(repository); break; - } CStringA pathA = CUnicodeUtils::GetMulti(relatepath.GetGitPathString(), CP_UTF8); int idx = git_index_find(index, pathA); @@ -496,11 +485,8 @@ void CGitPropertyPage::InitWorkfileView() ShowWindow(GetDlgItem(m_hwnd, IDC_SKIPWORKTREE), SW_HIDE); ShowWindow(GetDlgItem(m_hwnd, IDC_EXECUTABLE), SW_HIDE); } - - }catch(...) - { } - ::SetCurrentDirectory(oldpath); + git_repository_free(repository); } diff --git a/src/TortoiseShell/resourceshell.rc b/src/TortoiseShell/resourceshell.rc index 64624e0a7..fc3b59bcd 100644 --- a/src/TortoiseShell/resourceshell.rc +++ b/src/TortoiseShell/resourceshell.rc @@ -119,11 +119,11 @@ BEGIN EDITTEXT IDC_HEAD_SUBJECT,80,47,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT EDITTEXT IDC_HEAD_AUTHOR,80,59,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT EDITTEXT IDC_HEAD_DATE,80,71,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT - LTEXT "Last Modified:",IDC_STATIC,4,97,76,8 - EDITTEXT IDC_LAST_HASH,80,97,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT - EDITTEXT IDC_LAST_SUBJECT,80,108,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT - EDITTEXT IDC_LAST_AUTHOR,80,121,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT - EDITTEXT IDC_LAST_DATE,80,132,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_TRANSPARENT + LTEXT "Last Modified:",IDC_STATIC,4,97,76,8,NOT WS_VISIBLE + EDITTEXT IDC_LAST_HASH,80,97,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER,WS_EX_TRANSPARENT + EDITTEXT IDC_LAST_SUBJECT,80,108,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER,WS_EX_TRANSPARENT + EDITTEXT IDC_LAST_AUTHOR,80,121,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER,WS_EX_TRANSPARENT + EDITTEXT IDC_LAST_DATE,80,132,163,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER,WS_EX_TRANSPARENT AUTOCHECKBOX "Assume valid/unchanged",IDC_ASSUMEVALID,4,145,116,10,BS_AUTOCHECKBOX | WS_TABSTOP AUTOCHECKBOX "Executable (+x)",IDC_EXECUTABLE,120,145,116,10,BS_AUTOCHECKBOX | WS_TABSTOP AUTOCHECKBOX "Skip worktree",IDC_SKIPWORKTREE,4,157,116,10,BS_AUTOCHECKBOX | WS_TABSTOP -- 2.11.4.GIT