ShareX/ShareX.Setup/Program.cs

297 lines
12 KiB
C#
Raw Normal View History

#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
2016-01-04 04:16:01 +13:00
Copyright (c) 2007-2016 ShareX Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
2016-08-26 12:01:05 +12:00
using System.Net;
2014-12-11 09:25:20 +13:00
namespace ShareX.Setup
{
internal class Program
{
private enum SetupType
{
2015-09-06 21:32:34 +12:00
Stable, // Build setup & create portable zip file
2016-06-06 07:43:38 +12:00
BuildSetup, // Build setup
CreatePortable, // Create portable zip file
PortableApps, // Create PortableApps folder
2015-09-06 21:32:34 +12:00
Beta, // Build setup & upload it using "Debug/ShareX.exe"
2016-08-26 12:01:05 +12:00
Steam, // Create Steam folder
AppVeyor
}
2016-08-26 12:01:05 +12:00
private static SetupType Setup = SetupType.Stable;
2015-09-28 01:46:29 +13:00
2016-08-26 12:10:09 +12:00
private static readonly string binDir = Path.Combine(ParentDir, "ShareX", "bin");
2015-09-28 01:46:29 +13:00
private static readonly string releaseDir = Path.Combine(binDir, "Release");
private static readonly string debugDir = Path.Combine(binDir, "Debug");
private static readonly string steamDir = Path.Combine(binDir, "Steam");
private static readonly string debugPath = Path.Combine(debugDir, "ShareX.exe");
2016-08-26 12:10:09 +12:00
private static readonly string innoSetupDir = Path.Combine(ParentDir, @"ShareX.Setup\InnoSetup");
private static readonly string outputDir = Path.Combine(innoSetupDir, "Output");
2015-09-28 01:46:29 +13:00
private static readonly string portableDir = Path.Combine(outputDir, "ShareX-portable");
private static readonly string steamOutputDir = Path.Combine(outputDir, "ShareX");
2016-08-26 12:10:09 +12:00
private static readonly string portableAppsDir = Path.Combine(ParentDir, @"..\PortableApps\ShareXPortable\App\ShareX");
private static readonly string steamLauncherDir = Path.Combine(ParentDir, @"..\ShareX_Steam\ShareX_Steam\bin\Release");
2015-09-28 01:46:29 +13:00
private static readonly string steamUpdatesDir = Path.Combine(steamOutputDir, "Updates");
2016-08-26 12:10:09 +12:00
private static readonly string chromeReleaseDir = Path.Combine(ParentDir, @"..\ShareX_Chrome\ShareX_Chrome\bin\Release");
private static readonly string innoSetupCompilerPath = @"C:\Program Files (x86)\Inno Setup 5\ISCC.exe";
private static readonly string zipPath = @"C:\Program Files\7-Zip\7z.exe";
2015-09-06 21:32:34 +12:00
2016-08-26 13:39:37 +12:00
private static string ParentDir => Setup == SetupType.AppVeyor ? @"C:\projects\sharex" : @"..\..\..\";
2015-09-06 21:32:34 +12:00
private static string ReleaseDirectory => Setup == SetupType.Steam ? steamDir : releaseDir;
private static void Main(string[] args)
{
2016-08-26 12:01:05 +12:00
Console.WriteLine("ShareX.Setup started.");
if (CheckArgs(args, "-appveyor"))
{
Setup = SetupType.AppVeyor;
}
2015-09-06 21:32:34 +12:00
Console.WriteLine("Setup type: " + Setup);
switch (Setup)
{
case SetupType.Stable:
2014-11-22 02:34:50 +13:00
CompileSetup();
2015-09-06 21:32:34 +12:00
CreatePortable(portableDir);
OpenOutputDirectory();
break;
2016-06-06 07:43:38 +12:00
case SetupType.BuildSetup:
CompileSetup();
OpenOutputDirectory();
break;
case SetupType.CreatePortable:
2015-11-23 09:53:32 +13:00
CreatePortable(portableDir);
OpenOutputDirectory();
break;
case SetupType.PortableApps:
CreatePortable(portableAppsDir);
OpenOutputDirectory();
break;
case SetupType.Beta:
2014-11-22 02:34:50 +13:00
CompileSetup();
UploadLatestFile();
break;
2015-09-06 19:17:32 +12:00
case SetupType.Steam:
2015-09-06 21:32:34 +12:00
CreateSteamFolder();
2015-09-06 19:17:32 +12:00
OpenOutputDirectory();
break;
2016-08-26 12:01:05 +12:00
case SetupType.AppVeyor:
CompileSetup();
break;
}
2016-08-26 12:01:05 +12:00
Console.WriteLine("ShareX.Setup successfully completed.");
}
private static bool CheckArgs(string[] args, string check)
{
if (!string.IsNullOrEmpty(check))
{
foreach (string arg in args)
{
if (!string.IsNullOrEmpty(arg) && arg.Equals(check, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
}
return false;
}
private static void OpenOutputDirectory()
{
Process.Start("explorer.exe", outputDir);
}
private static void UploadLatestFile()
{
FileInfo fileInfo = new DirectoryInfo(outputDir).GetFiles("*.exe").OrderByDescending(f => f.LastWriteTime).FirstOrDefault();
if (fileInfo != null)
{
Console.WriteLine("Uploading setup file...");
Process.Start(debugPath, fileInfo.FullName);
}
}
2014-11-22 02:34:50 +13:00
private static void CompileSetup()
{
2016-08-26 12:01:05 +12:00
if (Setup == SetupType.AppVeyor && !File.Exists(innoSetupCompilerPath))
{
Console.WriteLine("Downloading InnoSetup.");
string innoSetupURL = "http://files.jrsoftware.org/is/5/innosetup-5.5.9-unicode.exe";
string innoSetupFilename = "innosetup-5.5.9-unicode.exe";
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(innoSetupURL, innoSetupFilename);
}
2016-08-26 12:54:17 +12:00
Console.WriteLine("Installing InnoSetup.");
2016-08-26 12:01:05 +12:00
Process.Start(innoSetupFilename, "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-").WaitForExit();
Console.WriteLine("InnoSetup installed.");
}
if (File.Exists(innoSetupCompilerPath))
{
Console.WriteLine("Compiling setup file.");
Process process = new Process();
2016-08-26 13:21:15 +12:00
ProcessStartInfo startInfo = new ProcessStartInfo(innoSetupCompilerPath, "\"ShareX-setup.iss\"");
startInfo.UseShellExecute = false;
2016-08-26 13:32:03 +12:00
startInfo.WorkingDirectory = innoSetupDir;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
2016-08-26 12:01:05 +12:00
Console.WriteLine("Setup file is created.");
2016-08-26 12:01:05 +12:00
}
else
{
Console.WriteLine("InnoSetup compiler is missing: " + innoSetupCompilerPath);
}
}
2015-09-06 21:32:34 +12:00
private static void CreateSteamFolder()
{
if (Directory.Exists(steamOutputDir))
{
Directory.Delete(steamOutputDir, true);
}
Directory.CreateDirectory(steamOutputDir);
2015-09-06 22:10:16 +12:00
CopyFile(Path.Combine(steamLauncherDir, "ShareX_Launcher.exe"), steamOutputDir);
2015-09-13 18:31:16 +12:00
CopyFile(Path.Combine(steamLauncherDir, "steam_appid.txt"), steamOutputDir);
2015-09-12 11:38:10 +12:00
CopyFile(Path.Combine(steamLauncherDir, "installscript.vdf"), steamOutputDir);
2015-09-06 22:10:16 +12:00
CopyFiles(steamLauncherDir, "*.dll", steamOutputDir);
2015-09-06 21:32:34 +12:00
CreatePortable(steamUpdatesDir);
}
private static void CreatePortable(string destination)
{
Console.WriteLine("Creating portable...");
2015-09-06 21:32:34 +12:00
if (Directory.Exists(destination))
2014-11-14 12:28:07 +13:00
{
2015-09-06 21:32:34 +12:00
Directory.Delete(destination, true);
2014-11-14 12:28:07 +13:00
}
2015-09-06 21:32:34 +12:00
Directory.CreateDirectory(destination);
2014-11-14 12:28:07 +13:00
2015-09-28 01:46:29 +13:00
CopyFile(Path.Combine(ReleaseDirectory, "ShareX.exe"), destination);
CopyFile(Path.Combine(ReleaseDirectory, "ShareX.exe.config"), destination);
CopyFiles(ReleaseDirectory, "*.dll", destination);
2016-08-26 12:10:09 +12:00
CopyFiles(Path.Combine(ParentDir, "Licenses"), "*.txt", Path.Combine(destination, "Licenses"));
2015-09-28 01:46:29 +13:00
CopyFile(Path.Combine(outputDir, "Recorder-devices-setup.exe"), destination);
CopyFile(Path.Combine(chromeReleaseDir, "ShareX_Chrome.exe"), destination);
2015-10-27 15:03:24 +13:00
string[] languages = new string[] { "de", "es", "fr", "hu", "ko-KR", "nl-NL", "pt-BR", "ru", "tr", "vi-VN", "zh-CN" };
2015-01-05 05:53:04 +13:00
foreach (string language in languages)
{
2015-09-06 21:32:34 +12:00
CopyFiles(Path.Combine(ReleaseDirectory, language), "*.resources.dll", Path.Combine(destination, "Languages", language));
2015-01-05 05:53:04 +13:00
}
if (Setup == SetupType.Steam)
{
// These git ignored
2016-08-26 12:10:09 +12:00
CopyFile(Path.Combine(ParentDir, "Lib", "ffmpeg.exe"), destination);
CopyFile(Path.Combine(ParentDir, "Lib", "ffmpeg-x64.exe"), destination);
}
else if (Setup == SetupType.PortableApps)
{
File.Create(Path.Combine(destination, "PortableApps")).Dispose();
}
2015-09-28 01:46:29 +13:00
else
2015-09-06 21:32:34 +12:00
{
2015-10-27 15:03:24 +13:00
File.Create(Path.Combine(destination, "Portable")).Dispose();
2015-09-06 21:32:34 +12:00
//FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(releaseDir, "ShareX.exe"));
//string zipFilename = string.Format("ShareX-{0}.{1}.{2}-portable.zip", versionInfo.ProductMajorPart, versionInfo.ProductMinorPart, versionInfo.ProductBuildPart);
string zipPath = Path.Combine(outputDir, "ShareX-portable.zip");
2014-01-13 05:05:31 +13:00
2015-09-06 21:32:34 +12:00
if (File.Exists(zipPath))
{
File.Delete(zipPath);
}
2014-01-13 05:05:31 +13:00
2015-11-22 13:45:26 +13:00
Zip(destination + "\\*", zipPath);
2014-01-13 05:05:31 +13:00
2015-09-06 21:32:34 +12:00
if (Directory.Exists(destination))
{
Directory.Delete(destination, true);
}
2014-01-16 08:12:59 +13:00
}
Console.WriteLine("Portable created.");
}
2014-01-13 05:05:31 +13:00
2015-09-28 01:46:29 +13:00
private static void CopyFiles(string[] files, string toFolder)
2014-11-14 12:28:07 +13:00
{
2015-09-03 01:46:20 +12:00
if (!Directory.Exists(toFolder))
{
Directory.CreateDirectory(toFolder);
}
2014-11-14 12:28:07 +13:00
foreach (string filepath in files)
{
string filename = Path.GetFileName(filepath);
string dest = Path.Combine(toFolder, filename);
File.Copy(filepath, dest);
}
}
2015-09-03 01:46:20 +12:00
private static void CopyFile(string path, string toFolder)
{
2015-09-05 18:51:38 +12:00
CopyFiles(new string[] { path }, toFolder);
2015-09-03 01:46:20 +12:00
}
private static void CopyFiles(string directory, string searchPattern, string toFolder)
2014-11-14 12:28:07 +13:00
{
2015-09-03 01:46:20 +12:00
CopyFiles(Directory.GetFiles(directory, searchPattern), toFolder);
2014-11-14 12:28:07 +13:00
}
2014-01-13 05:05:31 +13:00
private static void Zip(string source, string target)
{
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = zipPath;
2014-11-14 12:28:07 +13:00
p.Arguments = string.Format("a -tzip \"{0}\" \"{1}\" -r -mx=9", target, source);
2014-01-13 05:05:31 +13:00
p.WindowStyle = ProcessWindowStyle.Hidden;
Process process = Process.Start(p);
process.WaitForExit();
}
}
}