OSDN Git Service

PATCH: [ 1310710 ] Fix bug #1309450
authorKimmo Varis <kimmov@gmail.com>
Sun, 30 Oct 2005 10:15:46 +0000 (10:15 +0000)
committerKimmo Varis <kimmov@gmail.com>
Sun, 30 Oct 2005 10:15:46 +0000 (10:15 +0000)
 - submitted by Jochen

Src/Changes.txt
Src/DiffContext.cpp
Src/DiffContext.h
Src/DiffFileInfo.cpp
Src/DiffFileInfo.h
Src/DirScan.cpp

index c232571..f72f0d2 100644 (file)
@@ -1,6 +1,9 @@
 2005-10-30 Kimmo
  PATCH: [ 1341813 ] VSS project linking misdetects project files
   Src: VSSHelper.cpp
+ PATCH: [ 1310710 ] Fix bug #1309450
+  Submitted by Jochen
+  Src: DiffContext.cpp DiffContext.h DiffFileInfo.cpp DiffFileInfo.h DirScan.cpp
 
 2005-10-29 Kimmo
  PATCH: [ 1341183 ] Fix VSS checkout canceling
index 5f3b1f4..0236096 100644 (file)
@@ -143,19 +143,22 @@ void CDiffContext::UpdateStatusFromDisk(POSITION diffpos, BOOL bLeft, BOOL bRigh
 
 /**
  * @brief Update information from disk (for one side)
+ * @return TRUE if file exists
  */
-void CDiffContext::UpdateInfoFromDiskHalf(DIFFITEM & di, DiffFileInfo & dfi)
+BOOL CDiffContext::UpdateInfoFromDiskHalf(DIFFITEM & di, DiffFileInfo & dfi)
 {
-       UpdateVersion(di, dfi);
-       ASSERT(&dfi == &di.left || &dfi == &di.right);
        CString filepath
        (
                &dfi == &di.left
        ?       paths_ConcatPath(di.getLeftFilepath(GetNormalizedLeft()), di.sLeftFilename)
        :       paths_ConcatPath(di.getRightFilepath(GetNormalizedRight()), di.sRightFilename)
        );
-       dfi.Update(filepath);
+       if (!dfi.Update(filepath))
+               return FALSE;
+       UpdateVersion(di, dfi);
+       ASSERT(&dfi == &di.left || &dfi == &di.right);
        GuessCodepageEncoding(filepath, &dfi.unicoding, &dfi.codepage, m_bGuessEncoding);
+       return TRUE;
 }
 
 /**
index b308630..805d3dd 100644 (file)
@@ -77,7 +77,7 @@ public:
        //@}
 
        // change an existing difference
-       void UpdateInfoFromDiskHalf(DIFFITEM & di, DiffFileInfo & dfi);
+       BOOL UpdateInfoFromDiskHalf(DIFFITEM & di, DiffFileInfo & dfi);
        void UpdateStatusFromDisk(POSITION diffpos, BOOL bLeft, BOOL bRight);
 
        // retrieve or manufacture plugin info for specified file comparison
index 3f4a0c1..c0a8174 100644 (file)
@@ -37,12 +37,13 @@ static __int64 FileTimeToInt64(FILETIME & ft)
 /**
  * @brief Update fileinfo from given file
  * @param [in] sFilePath Full path to file/directory to update
+ * @return TRUE if file exists
  */
-void DiffFileInfo::Update(CString sFilePath)
+BOOL DiffFileInfo::Update(LPCTSTR sFilePath)
 {
        // CFileFind doesn't expose the attributes
        // CFileStatus doesn't expose 64 bit size
-
+       BOOL Update = FALSE;
        WIN32_FIND_DATA wfd;
        HANDLE h = FindFirstFile(sFilePath, &wfd);
        __int64 mtime64 = 0;
@@ -53,13 +54,14 @@ void DiffFileInfo::Update(CString sFilePath)
        {
                mtime64 = FileTimeToInt64(wfd.ftLastWriteTime);
                flags.attributes = wfd.dwFileAttributes;
-
                // No size for directory (remains as -1)
                if ((flags.attributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
                        size = (wfd.nFileSizeHigh << 32) + wfd.nFileSizeLow;
                FindClose(h);
+               Update = TRUE;
        }
        mtime = mtime64;
+       return Update;
 }
 
 /**
index 929aac3..df07f6f 100644 (file)
@@ -89,7 +89,7 @@ struct DiffFileInfo : public FileInfo
        // We could stash a pointer here to the parent DIFFITEM
        // but, I ran into trouble with, I think, the DIFFITEM copy constructor
        
-       void Update(CString sFilePath);
+       BOOL Update(LPCTSTR sFilePath);
        void Clear();
 };
 
index 6a86585..177521c 100644 (file)
@@ -8,7 +8,6 @@
 
 #include "stdafx.h"
 #include <shlwapi.h>
-#include <sys/stat.h>
 #include "DirScan.h"
 #include "CompareStats.h"
 #include "common/unicoder.h"
@@ -328,48 +327,25 @@ int DirScan_CompareItems(CDiffContext * pCtxt)
  */
 void UpdateDiffItem(DIFFITEM & di, BOOL & bExists, CDiffContext *pCtxt)
 {
-       struct _stat stats;
-       BOOL bLeftExists = FALSE;
-       BOOL bRightExists = FALSE;
-
-       bExists = TRUE;
-       CString leftpath = di.getLeftFilepath(pCtxt->GetNormalizedLeft());
-       leftpath = paths_ConcatPath(leftpath, di.sLeftFilename);
-       CString rightpath = di.getRightFilepath(pCtxt->GetNormalizedRight());
-       rightpath = paths_ConcatPath(rightpath, di.sRightFilename);
-       
-       // Re-check if left/right sides still exists (or are added)
-       if (_tstat(leftpath, &stats) == 0)
-               bLeftExists = TRUE;
-       if (_tstat(rightpath, &stats) == 0)
-               bRightExists = TRUE;
-
        // Clear side-info and file-infos
-       di.setSideNone();
        di.left.Clear();
        di.right.Clear();
-
-       // Update infos for existing sides
-       if (bLeftExists && bRightExists)
-       {
-               di.setSideBoth();
-               di.diffcode |= DIFFCODE::BOTH;
-               pCtxt->UpdateInfoFromDiskHalf(di, di.left);
-               pCtxt->UpdateInfoFromDiskHalf(di, di.right);
-       }
-       else if (bLeftExists && !bRightExists)
-       {
-               di.setSideLeft();
-               pCtxt->UpdateInfoFromDiskHalf(di, di.left);
-       }
-       else if (!bLeftExists && bRightExists)
+       BOOL bLeftExists = pCtxt->UpdateInfoFromDiskHalf(di, di.left);
+       BOOL bRightExists = pCtxt->UpdateInfoFromDiskHalf(di, di.right);
+       bExists = bLeftExists && bRightExists;
+       if (bLeftExists)
        {
-               di.setSideRight();
-               pCtxt->UpdateInfoFromDiskHalf(di, di.right);
+               if (bRightExists)
+                       di.setSideBoth();
+               else
+                       di.setSideLeft();
        }
-       else if (!bLeftExists && !bRightExists)
+       else
        {
-               bExists = FALSE;
+               if (bRightExists)
+                       di.setSideRight();
+               else
+                       di.setSideNone();
        }
 }
 
@@ -390,94 +366,74 @@ void CompareDiffItem(DIFFITEM di, CDiffContext * pCtxt)
 {
        // Clear rescan-request flag (not set by all codepaths)
        di.diffcode &= ~DIFFCODE::NEEDSCAN;
-
-       // 1. Test against filters
+       // Is it a directory?
        if (di.isDirectory())
        {
-               if (!pCtxt->m_piFilterGlobal->includeDir(di.sLeftFilename, di.sRightFilename))
-               {
-                       di.diffcode |= DIFFCODE::SKIPPED;
-                       StoreDiffResult(di, pCtxt, NULL);
-                       return;
-               }
-               else
+               // 1. Test against filters
+               if (pCtxt->m_piFilterGlobal->includeDir(di.sLeftFilename, di.sRightFilename))
                        di.diffcode |= DIFFCODE::INCLUDED;
-
+               else
+                       di.diffcode |= DIFFCODE::SKIPPED;
                // We don't actually 'compare' directories, just add non-ignored
                // directories to list.
                StoreDiffResult(di, pCtxt, NULL);
-               return;
-       }
-       else
-       {
-               if (!pCtxt->m_piFilterGlobal->includeFile(di.sLeftFilename, di.sRightFilename))
-                       di.diffcode |= DIFFCODE::SKIPPED;
-               else
-                       di.diffcode |= DIFFCODE::INCLUDED;
-       }
-
-       // 2. Add unique files
-       // We must compare unique files to itself to detect encoding
-       if (di.isSideLeft())
-       {
-               if (pCtxt->m_nCompMethod != CMP_DATE)
-               {
-                       DiffFileData diffdata;
-                       diffdata.prepAndCompareTwoFiles(pCtxt, di);
-                       StoreDiffResult(di, pCtxt, &diffdata);
-               }
-               else
-               {
-                       StoreDiffResult(di, pCtxt, NULL);
-               }
-               return;
        }
-       else if (di.isSideRight())
-       {
-               if (pCtxt->m_nCompMethod != CMP_DATE)
-               {
-                       DiffFileData diffdata;
-                       diffdata.prepAndCompareTwoFiles(pCtxt, di);
-                       StoreDiffResult(di, pCtxt, &diffdata);
-
-               }
-               else
-               {
-                       StoreDiffResult(di, pCtxt, NULL);
-               }
-               return;
-       }
-       // 3. Compare two files
        else
        {
-               if (pCtxt->m_nCompMethod == CMP_DATE)
+               // 1. Test against filters
+               if (pCtxt->m_piFilterGlobal->includeFile(di.sLeftFilename, di.sRightFilename))
                {
-                       // Compare by modified date
-                       __int64 nTimeDiff = di.left.mtime - di.right.mtime;
-                       // Remove sign
-                       nTimeDiff = (nTimeDiff > 0 ? nTimeDiff : -nTimeDiff);
-                       if (pCtxt->m_bIgnoreSmallTimeDiff)
+                       di.diffcode |= DIFFCODE::INCLUDED;
+                       // 2. Add unique files
+                       // We must compare unique files to itself to detect encoding
+                       if (di.isSideLeft() || di.isSideRight())
+                       {
+                               if (pCtxt->m_nCompMethod != CMP_DATE)
+                               {
+                                       DiffFileData diffdata;
+                                       diffdata.prepAndCompareTwoFiles(pCtxt, di);
+                                       StoreDiffResult(di, pCtxt, &diffdata);
+                               }
+                               else
+                               {
+                                       StoreDiffResult(di, pCtxt, NULL);
+                               }
+                       }
+                       // 3. Compare two files
+                       else if (pCtxt->m_nCompMethod == CMP_DATE)
                        {
-                               // If option to ignore small timediffs (couple of seconds)
-                               // is set, decrease absolute difference by allowed diff
-                               nTimeDiff -= SmallTimeDiff;
+                               // Compare by modified date
+                               __int64 nTimeDiff = di.left.mtime - di.right.mtime;
+                               // Remove sign
+                               nTimeDiff = (nTimeDiff > 0 ? nTimeDiff : -nTimeDiff);
+                               if (pCtxt->m_bIgnoreSmallTimeDiff)
+                               {
+                                       // If option to ignore small timediffs (couple of seconds)
+                                       // is set, decrease absolute difference by allowed diff
+                                       nTimeDiff -= SmallTimeDiff;
+                               }
+                               if (nTimeDiff <= 0)
+                                       di.diffcode |= DIFFCODE::TEXT | DIFFCODE::SAME;
+                               else
+                                       di.diffcode |= DIFFCODE::TEXT | DIFFCODE::DIFF;
+                               // report result back to caller
+                               StoreDiffResult(di, pCtxt, NULL);
                        }
-                       if (nTimeDiff <= 0)
-                               di.diffcode |= DIFFCODE::TEXT | DIFFCODE::SAME;
                        else
-                               di.diffcode |= DIFFCODE::TEXT | DIFFCODE::DIFF;
-                       // report result back to caller
+                       {
+                               // Really compare
+                               DiffFileData diffdata;
+                               di.diffcode |= diffdata.prepAndCompareTwoFiles(pCtxt, di);
+                               // report result back to caller
+                               StoreDiffResult(di, pCtxt, &diffdata);
+                       }
+               }
+               else
+               {
+                       di.diffcode |= DIFFCODE::SKIPPED;
                        StoreDiffResult(di, pCtxt, NULL);
-                       return;
                }
-               // Really compare
-               DiffFileData diffdata;
-               di.diffcode |= diffdata.prepAndCompareTwoFiles(pCtxt, di);
-               // report result back to caller
-               StoreDiffResult(di, pCtxt, &diffdata);
        }
-                               
-       return;
 }
 
 /**