Browse Source

more auto-update work

tags/2021-05-28
jules 11 years ago
parent
commit
4b28a4bb23
7 changed files with 145 additions and 49 deletions
  1. +1
    -0
      extras/Introjucer/Source/Application/jucer_Application.h
  2. +106
    -21
      extras/Introjucer/Source/Application/jucer_AutoUpdater.h
  3. +21
    -0
      extras/Introjucer/Source/Application/jucer_MainWindow.cpp
  4. +10
    -0
      extras/Introjucer/Source/Project/jucer_Module.cpp
  5. +5
    -0
      extras/Introjucer/Source/Project/jucer_Module.h
  6. +2
    -1
      extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
  7. +0
    -27
      extras/Introjucer/Source/Wizards/jucer_NewProjectWizard.h

+ 1
- 0
extras/Introjucer/Source/Application/jucer_Application.h View File

@@ -28,6 +28,7 @@
#include "../jucer_Headers.h"
#include "jucer_MainWindow.h"
#include "jucer_CommandLine.h"
#include "jucer_Module.h"
#include "jucer_AutoUpdater.h"
#include "../Code Editor/jucer_SourceCodeEditor.h"


+ 106
- 21
extras/Introjucer/Source/Application/jucer_AutoUpdater.h View File

@@ -141,14 +141,56 @@ return true;
}
else
{
JUCE_COMPILER_WARNING("todo")
File targetFolder (findDefaultModulesFolder());
File targetFolder;
if (isJuceModulesFolder (targetFolder))
targetFolder = targetFolder.getParentDirectory();
// FileChooser f;
FileChooser chooser (TRANS("Please select the location into which you'd like to download the new version"),
targetFolder);
DownloadNewVersionThread::performDownload (info.url, targetFolder);
if (chooser.browseForDirectory())
{
targetFolder = chooser.getResult();
if (isJuceModulesFolder (targetFolder))
targetFolder = targetFolder.getParentDirectory();
if (targetFolder.getChildFile ("JUCE").isDirectory())
targetFolder = targetFolder.getChildFile ("JUCE");
if (targetFolder.getChildFile (".git").isDirectory())
{
AlertWindow::showMessageBox (AlertWindow::WarningIcon,
TRANS ("Downloading new JUCE version"),
TRANS ("This folder is a GIT repository!\n\n"
"You should use a \"git pull\" to update it to the latest version. "
"Or to use the Introjucer to get an update, you should select an empty "
"folder into which you'd like to download the new code."));
return;
}
if (isJuceFolder (targetFolder))
{
if (! AlertWindow::showOkCancelBox (AlertWindow::WarningIcon,
TRANS("Overwrite existing JUCE folder?"),
TRANS("Do you want to overwrite the folder:\n\n"
"xfldrx\n\n"
" ..with the latest version from juce.com?\n\n"
"(Please note that this will overwrite everything in that folder!)")
.replace ("xfldrx", targetFolder.getFullPathName())))
{
return;
}
}
else
{
targetFolder = targetFolder.getChildFile ("JUCE").getNonexistentSibling();
}
DownloadNewVersionThread::performDownload (info.url, targetFolder);
}
}
}
}
@@ -220,7 +262,7 @@ private:
}
else
{
JUCE_COMPILER_WARNING("todo")
new RelaunchTimer (targetFolder);
}
}
}
@@ -273,7 +315,8 @@ JUCE_COMPILER_WARNING("todo")
{
setStatusMessage ("Installing...");
File tempUnzipped;
File unzipTarget;
bool isUsingTempFolder = false;
{
MemoryInputStream input (data, false);
@@ -282,32 +325,43 @@ JUCE_COMPILER_WARNING("todo")
if (zip.getNumEntries() == 0)
return Result::fail ("The downloaded file wasn't a valid JUCE file!");
tempUnzipped = targetFolder.getNonexistentSibling();
unzipTarget = targetFolder;
if (! tempUnzipped.createDirectory())
return Result::fail ("Couldn't create a folder to unzip the new version!");
if (unzipTarget.exists())
{
isUsingTempFolder = true;
unzipTarget = targetFolder.getNonexistentSibling();
if (! unzipTarget.createDirectory())
return Result::fail ("Couldn't create a folder to unzip the new version!");
}
Result r (zip.uncompressTo (tempUnzipped));
Result r (zip.uncompressTo (unzipTarget));
if (r.failed())
{
tempUnzipped.deleteRecursively();
if (isUsingTempFolder)
unzipTarget.deleteRecursively();
return r;
}
}
File oldFolder (targetFolder.getSiblingFile (targetFolder.getFileNameWithoutExtension() + "_old").getNonexistentSibling());
if (! targetFolder.moveFileTo (targetFolder.getNonexistentSibling()))
if (isUsingTempFolder)
{
tempUnzipped.deleteRecursively();
return Result::fail ("Could not remove the existing folder!");
}
File oldFolder (targetFolder.getSiblingFile (targetFolder.getFileNameWithoutExtension() + "_old").getNonexistentSibling());
if (! tempUnzipped.moveFileTo (targetFolder))
{
tempUnzipped.deleteRecursively();
return Result::fail ("Could not overwrite the existing folder!");
if (! targetFolder.moveFileTo (oldFolder))
{
unzipTarget.deleteRecursively();
return Result::fail ("Could not remove the existing folder!");
}
if (! unzipTarget.moveFileTo (targetFolder))
{
unzipTarget.deleteRecursively();
return Result::fail ("Could not overwrite the existing folder!");
}
}
return Result::ok();
@@ -320,6 +374,37 @@ JUCE_COMPILER_WARNING("todo")
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DownloadNewVersionThread)
};
struct RelaunchTimer : private Timer
{
RelaunchTimer (const File& f) : parentFolder (f)
{
startTimer (1500);
}
void timerCallback() override
{
stopTimer();
File app = parentFolder.getChildFile (
#if JUCE_MAC
"Introjucer.app");
#elif JUCE_WINDOWS
"Introjucer.exe");
#elif JUCE_LINUX
"Introjucer");
#endif
JUCEApplication::quit();
if (app.exists())
app.startAsProcess();
delete this;
}
File parentFolder;
};
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LatestVersionChecker)
};


+ 21
- 0
extras/Introjucer/Source/Application/jucer_MainWindow.cpp View File

@@ -543,3 +543,24 @@ Project* MainWindowList::getFrontmostProject()
return nullptr;
}
File findDefaultModulesFolder (bool mustContainJuceCoreModule)
{
const MainWindowList& windows = IntrojucerApp::getApp().mainWindowList;
for (int i = windows.windows.size(); --i >= 0;)
{
if (Project* p = windows.windows.getUnchecked (i)->getProject())
{
const File f (EnabledModuleList::findDefaultModulesFolder (*p));
if (isJuceModulesFolder (f) || (f.isDirectory() && ! mustContainJuceCoreModule))
return f;
}
}
if (mustContainJuceCoreModule)
return findDefaultModulesFolder (false);
return File::nonexistent;
}

+ 10
- 0
extras/Introjucer/Source/Project/jucer_Module.cpp View File

@@ -895,3 +895,13 @@ void EnabledModuleList::addModuleOfferingToCopy (const File& f)
addModule (m.manifestFile, areMostModulesCopiedLocally());
}
bool isJuceFolder (const File& f)
{
return isJuceModulesFolder (f.getChildFile ("modules"));
}
bool isJuceModulesFolder (const File& f)
{
return f.isDirectory() && f.getChildFile ("juce_core").isDirectory();
}

+ 5
- 0
extras/Introjucer/Source/Project/jucer_Module.h View File

@@ -30,6 +30,11 @@
class ProjectExporter;
class ProjectSaver;
//==============================================================================
File findDefaultModulesFolder (bool mustContainJuceCoreModule = true);
bool isJuceModulesFolder (const File&);
bool isJuceFolder (const File&);
//==============================================================================
struct ModuleDescription
{


+ 2
- 1
extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp View File

@@ -241,7 +241,8 @@ void ProjectContentComponent::resized()
if (contentView != nullptr)
contentView->setBounds (r);
logo->setBounds (r.reduced (r.getWidth() / 4, r.getHeight() / 4));
if (logo != nullptr)
logo->setBounds (r.reduced (r.getWidth() / 4, r.getHeight() / 4));
}
void ProjectContentComponent::lookAndFeelChanged()


+ 0
- 27
extras/Introjucer/Source/Wizards/jucer_NewProjectWizard.h View File

@@ -77,33 +77,6 @@ static File& getLastWizardFolder()
return lastFolder;
}
static bool isJuceModulesFolder (const File& f)
{
return f.isDirectory()
&& f.getChildFile ("juce_core").isDirectory();
}
static File findDefaultModulesFolder (bool mustContainJuceCoreModule = true)
{
const MainWindowList& windows = IntrojucerApp::getApp().mainWindowList;
for (int i = windows.windows.size(); --i >= 0;)
{
if (Project* p = windows.windows.getUnchecked (i)->getProject())
{
const File f (EnabledModuleList::findDefaultModulesFolder (*p));
if (isJuceModulesFolder (f) || (f.isDirectory() && ! mustContainJuceCoreModule))
return f;
}
}
if (mustContainJuceCoreModule)
return findDefaultModulesFolder (false);
return File::nonexistent;
}
//==============================================================================
struct NewProjectWizard
{


Loading…
Cancel
Save