Ignore:
Timestamp:
May 29, 2010, 4:09:04 AM (14 years ago)
Author:
iritscen
Message:

Fixes for incorrect AE version comparison and trashing of files during update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • AE/Installer/trunk/source/installer.cpp

    r552 r553  
    311311                 run Oni before :-p */
    312312                string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for Edition/ (Oni wants folder that *contains* the GDF)
    313                 //bad Iritscen, bad! fixed buffers can cause crashes.
    314                 /*char prefsCommand[300] = "[ -f ~/Library/Preferences/com.godgames.oni.plist ] && defaults write com.godgames.oni RetailInstallationPath -string '";
    315                 strcat(prefsCommand, fullAEpath.c_str());
    316                 strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
    317                 */
    318313                string prefsCommand = "[ -f ~/Library/Preferences/com.godgames.oni.plist ] && defaults write com.godgames.oni RetailInstallationPath -string '"
    319314                        + fullAEpath + "'";
     
    990985                }
    991986
    992                 if (updateAE->AEVersion.compare(currentAE->AEVersion) >= 1) // is the release update newer than what's installed?
    993                 {
    994                         if (!strEUFN.compare("Edition-patch")) // if update is a patch...
    995                         {
    996                                 if (currentAE->AEVersion.compare(updateAE->AEVersion.substr(0, updateAE->AEVersion.length() - 1))) // ...is it for a different month?
    997                                         return UPDATE_MNTH_REQD_ERR;
    998                         }
     987                if (updateAE->AEVersion.compare(currentAE->AEVersion) > 0) // is the release update newer than what's installed?
     988                {
    999989                        string strNewInstallerPath = "../updates/" + strEUFN + "/install/" + strInstallerName;
    1000990                        string installerVersion = INSTALLER_VERSION;
     
    1009999                                return UPDATE_SIMP_AVAIL;
    10101000                }
     1001                else
     1002                        return UPDATE_MNTH_REQD_ERR;
    10111003        }
    10121004        try
     
    14951487        ProcessPackageUpdates(strPathToEUFNPackages, strPathToPackages);
    14961488       
    1497         // Next, we get a list of which files and folders in the update's Globalize folder to move over; all files not starting with '.' will be moved...
    1498         // ...and folders which do not exist in the current AE will be created there
    1499         vector<string> foldersToMake, filesToMove;
    1500         string thePath;
     1489        // Next, move over files in the update's Globalize folder; subfolders which do not exist in the current AE will be created by Boost's...
     1490        // ...create_directories() function
     1491        string strPath;
     1492        path thePath;
    15011493        for (recursive_directory_iterator dir_itr(strPathToEUFNPackages + strGlobalize), end_itr; dir_itr != end_itr; ++dir_itr)
    15021494        {
    1503                 thePath = dir_itr->path().string();
    1504                 MakePathLocalToGlobalize(&thePath);
     1495                strPath = dir_itr->path().string();
     1496                MakePathLocalToGlobalize(&strPath);
     1497                thePath = (path)strPath;
    15051498                if (is_regular_file(dir_itr->status()))
    15061499                {
    1507                         if (dir_itr->filename().at(0) != '.') // skip over dot-files, which are invisible in Unix
    1508                                 filesToMove.push_back(thePath);
    1509                 }
    1510                 else if (is_directory(dir_itr->status()))
    1511                 {
    1512                         if (!exists(strPathToPackages + strGlobalize + thePath))
    1513                                 foldersToMake.push_back(thePath);
    1514                 }
    1515         }
    1516         // Sort the foldersToMake strings by length, which is a fast solution to the problem of "How do we make sure we create folder 'parent/'...
    1517         // ...before folder 'parent/child/'"?
    1518         sort(foldersToMake.begin(), foldersToMake.end(), SortBySize); // SortBySize is a custom comparison function found later in this source file
    1519         // First make the folders that don't exist in the current AE, so all the files have a place to go
    1520         for (vector<string>::iterator iter = foldersToMake.begin(); iter != foldersToMake.end(); iter++)
    1521         {
    1522                 create_directory(strPathToPackages + strGlobalize + *iter);
    1523         }
    1524         for (vector<string>::iterator iter = filesToMove.begin(); iter != filesToMove.end(); iter++)
    1525         {
    1526                 if (exists(strPathToPackages + strGlobalize + *iter))
     1500                        if (thePath.filename().at(0) != '.') // skip over dot-files, which are invisible in Unix
     1501                        {
     1502                                if (exists(strPathToPackages + strGlobalize + strPath))
     1503                                {
    15271504#ifdef WIN32
    1528                         remove((path)(strPathToPackages + strGlobalize + *iter));
     1505                                        remove((path)(strPathToPackages + strGlobalize + strPath));
    15291506#else
    1530                         rename((path)(strPathToPackages + strGlobalize + *iter), (path)(strTrashDir + *iter));
    1531 #endif
    1532                 rename((path)(strPathToEUFNPackages + strGlobalize + *iter), (path)(strPathToPackages + strGlobalize + *iter));
     1507                                        create_directories((path)(strTrashDir + thePath.parent_path().string()));
     1508                                        rename((path)(strPathToPackages + strGlobalize + strPath), (path)(strTrashDir + strPath));
     1509#endif
     1510                                        rename((path)(strPathToEUFNPackages + strGlobalize + strPath), (path)(strPathToPackages + strGlobalize + strPath));
     1511                                }
     1512                                else
     1513                                {
     1514                                        int slashLoc = 0;
     1515                                        slashLoc = strPath.find("/", 0);
     1516                                        if (slashLoc != string::npos) // then path contains slashes, so we need to make sure its parents' paths exist before moving it
     1517                                                create_directories((path)(strPathToPackages + strGlobalize + thePath.parent_path().string()));
     1518                                        rename((path)(strPathToEUFNPackages + strGlobalize + strPath), (path)(strPathToPackages + strGlobalize + strPath));
     1519                                }
     1520                        }
     1521                }
    15331522        }
    15341523       
     
    15661555                return false;
    15671556        }
    1568        
    15691557}
    15701558
     
    17511739        }
    17521740        else if(from_ph.filename() != ".svn")
    1753         { 
    1754                 path destination; 
    1755                 if(!exists(to_ph)) 
    1756                 { 
    1757                         destination=to_ph; 
    1758                 } 
    1759                 else 
    1760                 { 
    1761                         destination=to_ph/from_ph.filename(); 
    1762                 } 
     1741        {
     1742                path destination;
     1743                if(!exists(to_ph))
     1744                {
     1745                        destination=to_ph;
     1746                }
     1747                else
     1748                {
     1749                        destination=to_ph/from_ph.filename();
     1750                }
    17631751               
    1764                 for(directory_iterator i(from_ph); i!=directory_iterator(); ++i) 
     1752                for(directory_iterator i(from_ph); i!=directory_iterator(); ++i)
    17651753                {
    17661754                        //the idiot who coded this in the first place (not me)
    17671755                        //forgot to make a new directory. Exception city. x_x
    1768                         create_directory(destination); 
    1769                         copy(*i,destination/i->filename());
     1756                        create_directory(destination);
     1757                        copy(*i, destination/i->filename());
    17701758                }
    17711759        }
Note: See TracChangeset for help on using the changeset viewer.