OSDN Git Service

Use new method to update log So the user don't wait for log full log
authorFrank Li <lznuaa@gmail.com>
Mon, 29 Dec 2008 08:45:11 +0000 (16:45 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 29 Dec 2008 08:45:11 +0000 (16:45 +0800)
18 files changed:
src/Git/Git.cpp
src/Git/Git.h
src/Git/Git.vcproj
src/Git/GitRev.cpp
src/Git/GitRev.h
src/Git/GitStatusListCtrl.cpp
src/Git/TGitPath.cpp
src/TortoiseProc/AppUtils.cpp
src/TortoiseProc/Commands/CreateRepositoryCommand.h
src/TortoiseProc/Commands/RenameCommand.cpp
src/TortoiseProc/Commands/RevertCommand.cpp
src/TortoiseProc/CommitDlg.cpp
src/TortoiseProc/GitDiff.cpp
src/TortoiseProc/GitLogList.cpp
src/TortoiseProc/GitLogList.h
src/TortoiseProc/LogDataVector.cpp
src/TortoiseProc/LogDlg.cpp
src/TortoiseProc/LogDlgHelper.h

index 481079d..26891ac 100644 (file)
@@ -103,20 +103,20 @@ int CGit::Run(CString cmd, CString* output)
 CString CGit::GetUserName(void)\r
 {\r
        CString UserName;\r
-       Run(_T("git.cmd config user.name"),&UserName);\r
+       Run(_T("git.exe config user.name"),&UserName);\r
        return UserName;\r
 }\r
 CString CGit::GetUserEmail(void)\r
 {\r
        CString UserName;\r
-       Run(_T("git.cmd config user.email"),&UserName);\r
+       Run(_T("git.exe config user.email"),&UserName);\r
        return UserName;\r
 }\r
 \r
 CString CGit::GetCurrentBranch(void)\r
 {\r
        CString branch;\r
-       Run(_T("git.cmd branch"),&branch);\r
+       Run(_T("git.exe branch"),&branch);\r
        if(branch.GetLength()>0)\r
        {\r
                branch.Replace(_T('*'),_T(' '));\r
@@ -126,39 +126,71 @@ CString CGit::GetCurrentBranch(void)
        return CString("");\r
 }\r
 \r
-int CGit::GetLog(CString& logOut)\r
+int CGit::BuildOutputFormat(CString &format,bool IsFull)\r
 {\r
-\r
-       CString cmd;\r
        CString log;\r
-       cmd=("git.cmd log -C --numstat --raw --pretty=format:\"");\r
        log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);\r
-       cmd += log;\r
-       log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);\r
-       cmd += log;\r
+       format += log;\r
+       if(IsFull)\r
+       {\r
+               log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);\r
+               format += log;\r
+               log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);\r
+               format += log;\r
+       }\r
        log.Format(_T("#<%c>%%H%%n"),LOG_REV_COMMIT_HASH);\r
-       cmd += log;\r
+       format += log;\r
        log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT);\r
+       format += log;\r
+\r
+       if(IsFull)\r
+       {\r
+               log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);\r
+               format += log;\r
+       }\r
+       return 0;\r
+}\r
+\r
+int CGit::GetLog(CString& logOut, CString &hash, int count)\r
+{\r
+\r
+       CString cmd;\r
+       CString log;\r
+       CString num;\r
+       CString since;\r
+       if(count>0)\r
+               num.Format(_T("-n%d"),count);\r
+\r
+       cmd.Format(_T("git.exe log %s -C --numstat --raw --pretty=format:\""),\r
+                               num);\r
+       BuildOutputFormat(log);\r
        cmd += log;\r
-       log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);\r
+       cmd += CString(_T("\"  "))+hash;\r
+       return Run(cmd,&logOut);\r
+}\r
+\r
+\r
+int CGit::GetShortLog(CString &logOut)\r
+{\r
+       CString cmd;\r
+       CString log;\r
+       cmd=("git.exe log --topo-order -n100 --pretty=format:\"");\r
+       BuildOutputFormat(log,false);\r
        cmd += log;\r
        cmd += CString(_T("\" HEAD~40..HEAD"));\r
-       Run(cmd,&logOut);\r
-       return 0;\r
+       return Run(cmd,&logOut);\r
 }\r
 \r
 #define BUFSIZE 512\r
@@ -248,7 +280,7 @@ git_revnum_t CGit::GetHash(CString &friendname)
 {\r
        CString cmd;\r
        CString out;\r
-       cmd.Format(_T("git.cmd rev-parse %s" ),friendname);\r
+       cmd.Format(_T("git.exe rev-parse %s" ),friendname);\r
        Run(cmd,&out);\r
        int pos=out.ReverseFind(_T('\n'));\r
        if(pos>0)\r
index d318dd2..833445a 100644 (file)
@@ -46,8 +46,14 @@ public:
        int GetTagList(CStringList &list);\r
        int GetMapHashToFriendName(MAP_HASH_NAME &map);\r
        \r
-       int GetLog(CString& logOut);\r
+       //hash is empty means all. -1 means all\r
+       int GetLog(CString& logOut,CString &hash, int count=-1);\r
+\r
        git_revnum_t GetHash(CString &friendname);\r
+\r
+       int BuildOutputFormat(CString &format,bool IsFull=TRUE);\r
+       int GetShortLog(CString &log);\r
+       \r
        \r
 };\r
 extern void GetTempPath(CString &path);\r
index 98377f9..0ca9773 100644 (file)
                                RelativePath=".\TGitPath.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\TGitPath.h"\r
+                               >\r
+                       </File>\r
                </Filter>\r
                <Filter\r
                        Name="Header Files"\r
                                RelativePath=".\targetver.h"\r
                                >\r
                        </File>\r
-                       <File\r
-                               RelativePath=".\TGitPath.h"\r
-                               >\r
-                       </File>\r
                </Filter>\r
                <Filter\r
                        Name="Resource Files"\r
index dc08239..a0bf2da 100644 (file)
@@ -1,10 +1,12 @@
 #include "StdAfx.h"\r
 #include "GitRev.h"\r
-\r
+#include "Git.h"\r
 \r
 GitRev::GitRev(void)\r
 {\r
        m_Action=0;\r
+       m_IsFull = 0;\r
+       m_IsUpdateing = 0;\r
 }\r
 \r
 GitRev::~GitRev(void)\r
@@ -33,6 +35,22 @@ void GitRev::Clear()
        m_CommitHash.Empty();\r
 \r
 }\r
+int GitRev::CopyFrom(GitRev &rev)\r
+{\r
+       m_AuthorName    =rev.m_AuthorName       ;\r
+       m_AuthorEmail   =rev.m_AuthorEmail      ;\r
+       m_AuthorDate    =rev.m_AuthorDate       ;\r
+       m_CommitterName =rev.m_CommitterName    ;\r
+       m_CommitterEmail=rev.m_CommitterEmail;\r
+       m_CommitterDate =rev.m_CommitterDate    ;\r
+       m_Subject               =rev.m_Subject          ;\r
+       m_Body                  =rev.m_Body                     ;\r
+       m_CommitHash    =rev.m_CommitHash       ;\r
+       m_ParentHash    =rev.m_ParentHash       ;\r
+       m_Files                 =rev.m_Files                    ;       \r
+       m_Action                =rev.m_Action           ;\r
+       return 0;\r
+}\r
 int GitRev::ParserFromLog(CString &log)\r
 {\r
        int pos=0;\r
@@ -120,3 +138,22 @@ CTime GitRev::ConverFromString(CString input)
                         _wtoi(input.Mid(20,4)));\r
        return tm;\r
 }\r
+\r
+int GitRev::SafeFetchFullInfo(CGit *git)\r
+{\r
+       if(InterlockedExchange(&m_IsUpdateing,TRUE) == FALSE)
+       {
+               //GitRev rev;
+               CString onelog;
+               git->GetLog(onelog,m_CommitHash,1);
+               CString oldhash=m_CommitHash;
+               ParserFromLog(onelog);
+               
+               ASSERT(oldhash==m_CommitHash);
+
+               InterlockedExchange(&m_IsUpdateing,FALSE);
+               InterlockedExchange(&m_IsFull,TRUE);
+               return 0;
+       }
+       return -1;\r
+}
\ No newline at end of file
index bc9b0fb..3070c8a 100644 (file)
@@ -18,7 +18,7 @@ typedef std::vector<git_revnum_t> GIT_REV_LIST;
 #define LOG_REV_ITEM_BEGIN             _T('B')\r
 #define LOG_REV_ITEM_END               _T('C')\r
 \r
-\r
+class CGit;\r
 \r
 class GitRev\r
 {\r
@@ -27,6 +27,7 @@ public:
 //     GitRev(GitRev &rev);\r
 //     GitRev &operator=(GitRev &rev);\r
        ~GitRev(void);\r
+       \r
        enum\r
        {\r
                REV_HEAD = -1,                  ///< head revision\r
@@ -34,8 +35,12 @@ public:
                REV_WC = -3,                    ///< revision of the working copy\r
                REV_UNSPECIFIED = -4,   ///< unspecified revision\r
        };\r
+       \r
+       int CopyFrom(GitRev &rev);\r
+\r
        static CString GetHead(){return CString(_T("HEAD"));};\r
        static CString GetWorkingCopy(){return CString(GIT_REV_ZERO);};\r
+       \r
        CString m_AuthorName;\r
        CString m_AuthorEmail;\r
        CTime   m_AuthorDate;\r
@@ -47,12 +52,18 @@ public:
        git_revnum_t m_CommitHash;\r
        GIT_REV_LIST m_ParentHash;\r
        CTGitPathList m_Files;\r
-       void Clear();\r
        int     m_Action;\r
+       \r
+       void Clear();\r
        int ParserFromLog(CString &log);\r
        CTime ConverFromString(CString input);\r
        inline int ParentsCount(){return m_ParentHash.size();}\r
        \r
        //Show version tree Graphic\r
        std::vector<int> m_Lanes;\r
+\r
+       volatile LONG m_IsFull;\r
+       volatile LONG m_IsUpdateing;\r
+       \r
+       int SafeFetchFullInfo(CGit *git);\r
 };\r
index 8f3995a..8748468 100644 (file)
@@ -2867,7 +2867,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        {\r
                                                CTGitPath * path=(CTGitPath*)GetItemData(index);\r
                                                CString cmd;\r
-                                               cmd.Format(_T("git.cmd add %s"),path->GetGitPathString());\r
+                                               cmd.Format(_T("git.exe add %s"),path->GetGitPathString());\r
                                                CString output;\r
                                                g_Git.Run(cmd,&output);\r
                                                path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
@@ -5389,9 +5389,9 @@ int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list)
                        CString cmdout;\r
                        CString cmd;\r
                        if(list == NULL)\r
-                               cmd=(_T("git.cmd diff-index --raw HEAD --numstat -C -M"));\r
+                               cmd=(_T("git.exe diff-index --raw HEAD --numstat -C -M"));\r
                        else\r
-                               cmd.Format(_T("git.cmd diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
+                               cmd.Format(_T("git.exe diff-index --raw HEAD --numstat -C -M -- \"%s\""),(*list)[i].GetGitPathString());\r
 \r
                        g_Git.Run(cmd,&cmdout);\r
 \r
index 319e17e..7a40b7a 100644 (file)
@@ -838,12 +838,12 @@ int CTGitPathList::FillUnRev(int action,CTGitPathList *list)
                \r
                if(list==NULL)\r
                {\r
-                       cmd=_T("git.cmd ls-files --exclude-standard --full-name --others");\r
+                       cmd=_T("git.exe ls-files --exclude-standard --full-name --others");\r
                        cmd+=ignored;\r
                        \r
                }\r
                else\r
-               {       cmd.Format(_T("git.cmd ls-files --exclude-standard --full-name --others %s-- \"%s\""),\r
+               {       cmd.Format(_T("git.exe ls-files --exclude-standard --full-name --others %s-- \"%s\""),\r
                                        ignored,\r
                                        (*list)[i].GetWinPathString());\r
                }\r
index 07f86d4..2cdbadc 100644 (file)
@@ -995,10 +995,10 @@ bool CAppUtils::StartShowUnifiedDiff(HWND hWnd, const CTGitPath& url1, const git
        CString cmd;\r
        if(rev1 == GitRev::GetWorkingCopy())\r
        {\r
-               cmd.Format(_T("git.cmd diff --stat -p %s"),rev2);\r
+               cmd.Format(_T("git.exe diff --stat -p %s"),rev2);\r
        }else\r
        {       \r
-               cmd.Format(_T("git.cmd diff-tree -r -p --stat %s %s"),rev1,rev2);\r
+               cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),rev1,rev2);\r
        }\r
        g_Git.RunLogFile(cmd,tempfile);\r
        CAppUtils::StartUnifiedDiffViewer(tempfile,rev1.Left(6)+_T(":")+rev2.Left(6));\r
index bcb02a5..1a8d250 100644 (file)
@@ -38,7 +38,7 @@ public:
                git.m_CurrentDir=cmdLinePath.GetWinPath();\r
                CString output;\r
 \r
-               if (git.Run(_T("git.cmd init-db"),&output))\r
+               if (git.Run(_T("git.exe init-db"),&output))\r
                {\r
                        CMessageBox::Show(hwndExplorer, IDS_PROC_REPOCREATEERR, IDS_APPNAME, MB_ICONERROR);\r
                        return false;\r
index 2e6fd36..e05c7d4 100644 (file)
@@ -52,7 +52,7 @@ bool RenameCommand::Execute()
 \r
        CString cmd;\r
        CString output;\r
-       cmd.Format(_T("git.cmd mv \"%s\" \"%s\""),\r
+       cmd.Format(_T("git.exe mv \"%s\" \"%s\""),\r
                                        cmdLinePath.GetGitPathString(),\r
                                        sNewName);\r
                                                                        \r
index bd92333..dc7e0ce 100644 (file)
@@ -36,7 +36,7 @@ bool RevertCommand::Execute()
                CString out;\r
                for(int i=0;i< dlg.m_pathList.GetCount() ;i++)\r
                {\r
-                       cmd.Format(_T("git.cmd reset --hard -- \"%s\""),dlg.m_pathList[i].GetGitPathString());\r
+                       cmd.Format(_T("git.exe reset --hard -- \"%s\""),dlg.m_pathList[i].GetGitPathString());\r
                        g_Git.Run(cmd,&out);\r
                }\r
 #if 0\r
index 8c73866..fae37ac 100644 (file)
@@ -414,13 +414,13 @@ void CCommitDlg::OnOK()
        CString out;\r
        if(uncheckedfiles.GetLength()>0)\r
        {\r
-               cmd.Format(_T("git.cmd reset -- %s"),uncheckedfiles);\r
+               cmd.Format(_T("git.exe reset -- %s"),uncheckedfiles);\r
                g_Git.Run(cmd,&out);\r
        }\r
 \r
        if(checkedfiles.GetLength()>0)\r
        {\r
-               cmd.Format(_T("git.cmd update-index -- %s"),checkedfiles);\r
+               cmd.Format(_T("git.exe update-index -- %s"),checkedfiles);\r
                g_Git.Run(cmd,&out);\r
 \r
                CString tempfile=::GetTempFile();\r
@@ -429,7 +429,7 @@ void CCommitDlg::OnOK()
                file.Close();\r
        \r
                out =_T("");\r
-               cmd.Format(_T("git.cmd commit -F \"%s\""), tempfile);\r
+               cmd.Format(_T("git.exe commit -F \"%s\""), tempfile);\r
                g_Git.Run(cmd,&out);\r
        \r
                CFile::Remove(tempfile);\r
index b1cc743..88adbf2 100644 (file)
@@ -24,7 +24,7 @@ int CGitDiff::Diff(CTGitPath * pPath, git_revnum_t & rev1, git_revnum_t & rev2,
                                pPath->GetBaseFilename(),\r
                                rev1.Left(6),\r
                                pPath->GetFileExtension());\r
-               cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev1,pPath->GetGitPathString());\r
+               cmd.Format(_T("git.exe cat-file -p %s:%s"),rev1,pPath->GetGitPathString());\r
                                g_Git.RunLogFile(cmd,file1);\r
        }else\r
        {\r
@@ -40,7 +40,7 @@ int CGitDiff::Diff(CTGitPath * pPath, git_revnum_t & rev1, git_revnum_t & rev2,
                                pPath->GetBaseFilename(),\r
                                rev2.Left(6),\r
                                pPath->GetFileExtension());\r
-               cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev2,pPath->GetGitPathString());\r
+               cmd.Format(_T("git.exe cat-file -p %s:%s"),rev2,pPath->GetGitPathString());\r
                g_Git.RunLogFile(cmd,file2);\r
        }else\r
        {\r
index 37bbe94..08a41db 100644 (file)
@@ -237,6 +237,10 @@ void CGitLogList::ResizeAllListCtrlCols()
                                {
                                        cx = LOGLIST_MESSAGE_MAX;
                                }
+                               if (cx < LOGLIST_MESSAGE_MIN)
+                               {
+                                       cx = LOGLIST_MESSAGE_MIN;
+                               }
 
                        }
                        // keep the bug id column small
@@ -636,6 +640,8 @@ void CGitLogList::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        if (m_bNoDispUpdates)
                return;
 
+
+
        switch (pLVCD->nmcd.dwDrawStage)
        {
        case CDDS_PREPAINT:
@@ -719,9 +725,17 @@ void CGitLogList::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                if (m_arShownList.GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec)
                                {
                                        GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);
+                                       if(!data->m_IsFull)
+                                       {
+                                               if(data->SafeFetchFullInfo(&g_Git))
+                                                       this->Invalidate();
+                                               TRACE(_T("Update ... %d\r\n"),pLVCD->nmcd.dwItemSpec);
+                                       }
+
                                        if(m_HashMap[data->m_CommitHash].size()!=0)
                                        {
                                                CRect rect;
+
                                                GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);
                                        
                                                FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);
@@ -807,7 +821,8 @@ void CGitLogList::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        GitRev * pLogEntry = NULL;
        if (itemid < m_arShownList.GetCount())
                pLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(pItem->iItem));
-    
+
+           
        // Which column?
        switch (pItem->iSubItem)
        {
@@ -1057,7 +1072,7 @@ void CGitLogList::OnContextMenu(CWnd* pWnd, CPoint point)
                                CString tempfile=GetTempFile();
                                CString cmd;
                                GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));
-                               cmd.Format(_T("git.cmd diff-tree -r -p --stat %s"),r1->m_CommitHash);
+                               cmd.Format(_T("git.exe diff-tree -r -p --stat %s"),r1->m_CommitHash);
                                g_Git.RunLogFile(cmd,tempfile);
                                CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r1->m_Subject);
                        }
@@ -1069,7 +1084,7 @@ void CGitLogList::OnContextMenu(CWnd* pWnd, CPoint point)
                                CString cmd;
                                GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));
                                GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));
-                               cmd.Format(_T("git.cmd diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);
+                               cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);
                                g_Git.RunLogFile(cmd,tempfile);
                                CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r2->m_CommitHash.Left(6));
 
@@ -1696,12 +1711,14 @@ void CGitLogList::OnLvnOdfinditemLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = -1;
 }
 
-int CGitLogList::FillGitLog()
+int CGitLogList::FillGitShortLog()
 {
        ClearText();
 
        this->m_logEntries.ClearAll();
-       this->m_logEntries.ParserFromLog();
+       this->m_logEntries.ParserShortLog();
+
+       //this->m_logEntries.ParserFromLog();
        SetItemCountEx(this->m_logEntries.size());
 
        this->m_arShownList.RemoveAll();
@@ -1800,160 +1817,7 @@ UINT CGitLogList::LogThread()
        temp.LoadString(IDS_PROGRESSWAIT);
        ShowText(temp, true);
 
-//     git_revnum_t r = -1;
-       
-       // get the repository root url, because the changed-files-list has the
-       // paths shown there relative to the repository root.
-//     CTGitPath rootpath;
-//  BOOL succeeded = GetRootAndHead(m_path, rootpath, r);
-
-//    m_sRepositoryRoot = rootpath.GetGitPathString();
-//    m_sURL = m_path.GetGitPathString();
-
-    // we need the UUID to unambigously identify the log cache
-//    if (logCachePool.IsEnabled())
-//        m_sUUID = logCachePool.GetRepositoryInfo().GetRepositoryUUID (rootpath);
-
-    // if the log dialog is started from a working copy, we need to turn that
-    // local path into an url here
-//    if (succeeded)
-//    {
-//        if (!m_path.IsUrl())
-//        {
-//             m_sURL = GetURLFromPath(m_path);
-
-               // The URL is escaped because Git::logReceiver
-               // returns the path in a native format
-//             m_sURL = CPathUtils::PathUnescape(m_sURL);
-  //      }
-//        m_sRelativeRoot = m_sURL.Mid(CPathUtils::PathUnescape(m_sRepositoryRoot).GetLength());
-//             m_sSelfRelativeURL = m_sRelativeRoot;
-  //  }
-#if 0
-    if (succeeded && !m_mergePath.IsEmpty() && m_mergedRevs.empty())
-    {
-           // in case we got a merge path set, retrieve the merge info
-           // of that path and check whether one of the merge URLs
-           // match the URL we show the log for.
-           GitPool localpool(pool);
-           git_error_clear(Err);
-           apr_hash_t * mergeinfo = NULL;
-           if (git_client_mergeinfo_get_merged (&mergeinfo, m_mergePath.GetGitApiPath(localpool), GitRev(GitRev::REV_WC), m_pctx, localpool) == NULL)
-           {
-                   // now check the relative paths
-                   apr_hash_index_t *hi;
-                   const void *key;
-                   void *val;
-
-                   if (mergeinfo)
-                   {
-                           for (hi = apr_hash_first(localpool, mergeinfo); hi; hi = apr_hash_next(hi))
-                           {
-                                   apr_hash_this(hi, &key, NULL, &val);
-                                   if (m_sURL.Compare(CUnicodeUtils::GetUnicode((char*)key)) == 0)
-                                   {
-                                           apr_array_header_t * arr = (apr_array_header_t*)val;
-                                           if (val)
-                                           {
-                                                   for (long i=0; i<arr->nelts; ++i)
-                                                   {
-                                                           git_merge_range_t * pRange = APR_ARRAY_IDX(arr, i, git_merge_range_t*);
-                                                           if (pRange)
-                                                           {
-                                                                   for (git_revnum_t r=pRange->start+1; r<=pRange->end; ++r)
-                                                                   {
-                                                                           m_mergedRevs.insert(r);
-                                                                   }
-                                                           }
-                                                   }
-                                           }
-                                           break;
-                                   }
-                           }
-                   }
-           }
-    }
-
-    m_LogProgress.SetPos(1);
-    if (m_startrev == GitRev::REV_HEAD)
-    {
-           m_startrev = r;
-    }
-    if (m_endrev == GitRev::REV_HEAD)
-    {
-           m_endrev = r;
-    }
-
-    if (m_limit != 0)
-    {
-           m_limitcounter = m_limit;
-           m_LogProgress.SetRange32(0, m_limit);
-    }
-    else
-           m_LogProgress.SetRange32(m_endrev, m_startrev);
-       
-    if (!m_pegrev.IsValid())
-           m_pegrev = m_startrev;
-    size_t startcount = m_logEntries.size();
-    m_lowestRev = -1;
-    m_bStrictStopped = false;
-
-    if (succeeded)
-    {
-        succeeded = ReceiveLog (CTGitPathList(m_path), m_pegrev, m_startrev, m_endrev, m_limit, m_bStrict, m_bIncludeMerges, refresh);
-        if ((!succeeded)&&(!m_path.IsUrl()))
-        {
-               // try again with REV_WC as the start revision, just in case the path doesn't
-               // exist anymore in HEAD
-               succeeded = ReceiveLog(CTGitPathList(m_path), GitRev(), GitRev::REV_WC, m_endrev, m_limit, m_bStrict, m_bIncludeMerges, refresh);
-        }
-    }
-       m_LogList.ClearText();
-    if (!succeeded)
-       {
-               m_LogList.ShowText(GetLastErrorMessage(), true);
-       }
-       else
-       {
-               if (!m_wcRev.IsValid())
-               {
-                       // fetch the revision the wc path is on so we can mark it
-                       CTGitPath revWCPath = m_ProjectProperties.GetPropsPath();
-                       if (!m_path.IsUrl())
-                               revWCPath = m_path;
-                       if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RecursiveLogRev"), FALSE)))
-                       {
-                               git_revnum_t minrev, maxrev;
-                               bool switched, modified, sparse;
-                               GetWCRevisionStatus(revWCPath, true, minrev, maxrev, switched, modified, sparse);
-                               if (maxrev)
-                                       m_wcRev = maxrev;
-                       }
-                       else
-                       {
-                               CTGitPath dummypath;
-                               GitStatus status;
-                               git_wc_status2_t * stat = status.GetFirstFileStatus(revWCPath, dummypath, false, git_depth_empty);
-                               if (stat && stat->entry && stat->entry->cmt_rev)
-                                       m_wcRev = stat->entry->cmt_rev;
-                               if (stat && stat->entry && (stat->entry->kind == git_node_dir))
-                                       m_wcRev = stat->entry->revision;
-                       }
-               }
-       }
-    if (m_bStrict && (m_lowestRev>1) && ((m_limit>0) ? ((startcount + m_limit)>m_logEntries.size()) : (m_endrev<m_lowestRev)))
-               m_bStrictStopped = true;
-       m_LogList.SetItemCountEx(ShownCountWithStopped());
-
-       m_timFrom = (__time64_t(m_tFrom));
-       m_timTo = (__time64_t(m_tTo));
-       m_DateFrom.SetRange(&m_timFrom, &m_timTo);
-       m_DateTo.SetRange(&m_timFrom, &m_timTo);
-       m_DateFrom.SetTime(&m_timFrom);
-       m_DateTo.SetTime(&m_timTo);
-#endif
-       //DialogEnableWindow(IDC_GETALL, TRUE);
-       FillGitLog();
+       FillGitShortLog();
        
        InterlockedExchange(&m_bThreadRunning, FALSE);
 
@@ -1979,12 +1843,36 @@ UINT CGitLogList::LogThread()
                        SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
                }
        }
+       InterlockedExchange(&m_bNoDispUpdates, FALSE);
+
+       int index=0;
+       int updated=0;
+       int percent=0;
+       while(1)
+       {
+               for(int i=0;i<m_logEntries.size();i++)
+               {
+                       if(!m_logEntries.FetchFullInfo(i))
+                       {
+                               updated++;
+                       }
+                       
+                       percent=updated*98/m_logEntries.size() + GITLOG_START+1;
+                       if(percent == GITLOG_END)
+                               percent == GITLOG_END -1;
+                       
+                       if(m_ProcCallBack)
+                               m_ProcCallBack(m_ProcData,percent);
+               }
+               if(updated==m_logEntries.size())
+                       break;
+       }
 
        //RefreshCursor();
        // make sure the filter is applied (if any) now, after we refreshed/fetched
        // the log messages
 
-       InterlockedExchange(&m_bNoDispUpdates, FALSE);
+       
 
        if(m_ProcCallBack)
                m_ProcCallBack(m_ProcData,GITLOG_END);
index 6b8fcf2..97a2634 100644 (file)
@@ -43,6 +43,7 @@ enum LISTITEMSTATES_MINE {
 #define ICONITEMBORDER 5\r
 \r
 #define GITLOG_START 0\r
+#define GITLOG_START_ALL 1\r
 #define GITLOG_END   100\r
 \r
 typedef void CALLBACK_PROCESS(void * data, int progress);\r
@@ -71,7 +72,8 @@ public:
                LOGLIST_AUTHOR,\r
                LOGLIST_DATE,\r
                LOGLIST_BUG,\r
-               LOGLIST_MESSAGE_MAX=250\r
+               LOGLIST_MESSAGE_MAX=300,\r
+               LOGLIST_MESSAGE_MIN=200\r
        };\r
 \r
        enum \r
@@ -120,7 +122,7 @@ public:
        void CopySelectionToClipBoard(bool hashonly=FALSE);\r
        void DiffSelectedRevWithPrevious();\r
        bool IsSelectionContinuous();\r
-       int  FillGitLog();\r
+       int  FillGitShortLog();\r
        inline int ShownCountWithStopped() const { return (int)m_arShownList.GetCount() + (m_bStrictStopped ? 1 : 0); }\r
        int FetchLogAsync(CALLBACK_PROCESS *proc=NULL, void * data=NULL);\r
        CPtrArray                       m_arShownList;\r
index a748856..e4ea92d 100644 (file)
 //#include "EditPropertiesDlg.h"
 #include "FileDiffDlg.h"
 
+int CLogDataVector::ParserShortLog()
+{
+       CString log;
+       GitRev rev;
+
+       CString begin;
+       begin.Format(_T("#<%c>"),LOG_REV_ITEM_BEGIN);
+
+       g_Git.GetShortLog(log);
+       if(log.GetLength()==0)
+               return 0;
+       
+       int start=4;
+       int length;
+       int next =1;
+       while( next>0 )
+       {
+               next=log.Find(begin,start);
+               if(next >0 )
+                       length = next - start+4;
+               else
+                       length = log.GetLength()-start+4;
+
+               CString onelog =log;
+               onelog=log.Mid(start -4,length);
+               rev.ParserFromLog(onelog);
+               rev.m_Subject=_T("Load .................................");
+               this->push_back(rev);
+               m_HashMap[rev.m_CommitHash]=size()-1;
+               start = next +4;
+       }
+
+       return 0;
+       return 0;
+
+}
+int CLogDataVector::FetchFullInfo(int i)
+{
+       return at(i).SafeFetchFullInfo(&g_Git);
+}
 //CLogDataVector Class
 int CLogDataVector::ParserFromLog()
 {
        CString log;
        GitRev rev;
-       g_Git.GetLog(log);
+       CString emptyhash;
+       g_Git.GetLog(log,emptyhash);
 
        CString begin;
        begin.Format(_T("#<%c>"),LOG_REV_ITEM_BEGIN);
index 88c1a17..abbe2ed 100644 (file)
@@ -396,8 +396,8 @@ void CLogDlg::LogRunStatus(int cur)
                }\r
 \r
                // We use a progress bar while getting the logs \r
-               //m_LogProgress.SetRange32(0, 100);\r
-               //m_LogProgress.SetPos(0);\r
+               m_LogProgress.SetRange32(0, 100);\r
+               m_LogProgress.SetPos(0);\r
 \r
                GetDlgItem(IDC_PROGRESS)->ShowWindow(TRUE);\r
 \r
@@ -423,6 +423,8 @@ void CLogDlg::LogRunStatus(int cur)
                PostMessage(WM_TIMER, LOGFILTER_TIMER);\r
 \r
        }\r
+\r
+       m_LogProgress.SetPos(cur);\r
 }\r
 void CLogDlg::SetDlgTitle(bool bOffline)\r
 {\r
@@ -1502,9 +1504,9 @@ void CLogDlg::DoDiffFromLog(INT_PTR selIndex, GitRev* rev1, GitRev* rev2, bool b
 \r
        CString cmd;\r
 \r
-       cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev1->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
+       cmd.Format(_T("git.exe cat-file -p %s:%s"),rev1->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
        g_Git.RunLogFile(cmd,file1);\r
-       cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev2->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
+       cmd.Format(_T("git.exe cat-file -p %s:%s"),rev2->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
        g_Git.RunLogFile(cmd,file2);\r
 \r
        CAppUtils::DiffFlags flags;\r
index ce4a360..e8b04f3 100644 (file)
@@ -80,11 +80,16 @@ public:
        }\r
        void ClearAll();\r
        int  ParserFromLog();\r
+       int ParserShortLog();\r
+       int FetchFullInfo(int i);\r
+\r
        Lanes m_Lanes;\r
        int      m_FirstFreeLane;\r
        MAP_HASH_REV m_HashMap;\r
        void updateLanes(GitRev& c, Lanes& lns, CString &sha) ;\r
        void setLane(CString& sha) ;\r
+       \r
+       \r
 \r
 \r
 #if 0\r