+++ /dev/null
-using System;\r
-using System.IO;\r
-using System.Diagnostics;\r
-using System.Configuration;\r
-using System.Web.Mail;\r
-\r
-namespace ReactOS.CustomRevisionAction\r
-{\r
- public class MainClass\r
- {\r
- /// <summary>\r
- /// Path to store published binaries at.\r
- /// </summary>\r
- private static string publishPath;\r
-\r
- /// <summary>\r
- /// Whether or not to publish ISOs to a remote destination via FTP.\r
- /// </summary>\r
- private static bool PublishToRemoteFtpLocation\r
- {\r
- get\r
- {\r
- return publishPath.StartsWith("ftp://");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Run the application.\r
- /// </summary>\r
- /// <param name="script">Script to run.</param>\r
- /// <param name="args">Arguments to pass to script.</param>\r
- /// <param name="workingDirectory">Working directory.</param>\r
- /// <param name="standardOutput">Receives standard output.</param>\r
- /// <param name="standardError">Receives standard error.</param>\r
- /// <returns>\r
- /// Exit code.\r
- /// </returns>\r
- private static int RunScript(string script,\r
- string args,\r
- string workingDirectory,\r
- out string standardOutput,\r
- out string standardError)\r
- {\r
- ProcessStartInfo scriptProcessStartInfo = new ProcessStartInfo(script,\r
- args);\r
- scriptProcessStartInfo.CreateNoWindow = true;\r
- /*\r
- * All standard streams must be redirected.\r
- * Otherwise DuplicateHandle() will fail.\r
- */\r
- scriptProcessStartInfo.RedirectStandardInput = true;\r
- scriptProcessStartInfo.RedirectStandardError = true;\r
- scriptProcessStartInfo.RedirectStandardOutput = true;\r
- scriptProcessStartInfo.UseShellExecute = false;\r
- scriptProcessStartInfo.WorkingDirectory = workingDirectory;\r
- RedirectableProcess redirectableProcess = new RedirectableProcess(scriptProcessStartInfo);\r
- standardOutput = redirectableProcess.ProcessOutput;\r
- standardError = redirectableProcess.ProcessError;\r
- return redirectableProcess.ExitCode;\r
- }\r
-\r
- /// <summary>\r
- /// Retrieve value of configuration from configuration file.\r
- /// </summary>\r
- /// <param name="name">Name of configuration option.</param>\r
- /// <param name="defaultValue">\r
- /// Default value to be returned if the option does not exist.\r
- /// </param>\r
- /// <returns>\r
- /// Value of configuration option or null if the option does not\r
- /// exist and no default value is provided.\r
- /// </returns>\r
- private static string GetConfigurationOption(string name,\r
- string defaultValue)\r
- {\r
- if (ConfigurationSettings.AppSettings[name] != null)\r
- return ConfigurationSettings.AppSettings[name];\r
- else\r
- return defaultValue;\r
- }\r
- \r
- /// <summary>\r
- /// Send an email.\r
- /// </summary>\r
- /// <param name="subject">Subject of the email.</param>\r
- /// <param name="body">Content of the email.</param>\r
- private static void SendErrorMail(string subject, string body)\r
- {\r
- try\r
- {\r
- string smtpServer = GetConfigurationOption("smtpServer", "localhost");\r
- string toEmail = GetConfigurationOption("errorEmail", null);\r
- if (toEmail == null)\r
- return;\r
- string fromEmail = GetConfigurationOption("fromEmail", null);\r
- if (fromEmail == null)\r
- fromEmail = toEmail;\r
- MailMessage mm = new MailMessage();\r
- mm.Priority = MailPriority.Normal;\r
- mm.From = toEmail;\r
- mm.To = toEmail;\r
- mm.Subject = subject;\r
- mm.Body += body;\r
- mm.Body += "<br>";\r
- mm.BodyFormat = MailFormat.Html;\r
- SmtpMail.SmtpServer = smtpServer;\r
- SmtpMail.Send(mm);\r
- }\r
- catch (Exception ex)\r
- {\r
- Console.Error.WriteLine(ex.Message);\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Fail with an error message.\r
- /// </summary>\r
- /// <param name="revision">Repository revision.</param>\r
- /// <param name="text">Error message.</param>\r
- private static void Fail(int revision,\r
- string text)\r
- {\r
- Console.WriteLine(text);\r
- Console.Error.WriteLine(text);\r
- SendErrorMail(String.Format("[{0}] ReactOS Publish Error", revision), text);\r
- }\r
-\r
- /// <summary>\r
- /// Fail with an error message.\r
- /// </summary>\r
- /// <param name="text">Error message.</param>\r
- private static void Fail(string text)\r
- {\r
- Console.WriteLine(text);\r
- Console.Error.WriteLine(text);\r
- SendErrorMail("ReactOS Publish Error", text);\r
- }\r
-\r
- /// <summary>\r
- /// Generate filename of distribution.\r
- /// </summary>\r
- /// <param name="branch">Branch.</param>\r
- /// <param name="revision">Revision.</param>\r
- private static string GetDistributionFilename(string branch,\r
- int revision)\r
- {\r
- return String.Format("ReactOS-{0}-r{1}.iso",\r
- branch,\r
- revision);\r
- }\r
-\r
- private static void SplitRemotePublishPath(string publishPath,\r
- out string server,\r
- out string directory)\r
- {\r
- string searchString = "://";\r
- int index = publishPath.IndexOf(searchString);\r
- if (index == -1)\r
- throw new InvalidOperationException();\r
- int endOfProtocolIndex = index + searchString.Length;\r
- string withoutProtocol = publishPath.Remove(0, endOfProtocolIndex);\r
- index = withoutProtocol.IndexOf("/");\r
- if (index == -1)\r
- {\r
- server = withoutProtocol;\r
- directory = "";\r
- }\r
- else\r
- {\r
- server = withoutProtocol.Substring(0, index);\r
- directory = withoutProtocol.Remove(0, index + 1);\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Copy ISO to the (remote) destination.\r
- /// </summary>\r
- /// <param name="sourceFilename">Name of source ISO file to copy.</param>\r
- /// <param name="branch">Branch.</param>\r
- /// <param name="revision">Revision.</param>\r
- /// <remarks>\r
- /// Structure is ftp://ftp.server.com/whereever/<branch>/ReactOS-<branch>-r<revision>.iso.\r
- /// </remarks>\r
- private static void CopyISOToRemoteFtpDestination(string sourceFilename,\r
- string branch,\r
- int revision)\r
- {\r
- string distributionFilename = GetDistributionFilename(branch,\r
- revision);\r
- string destinationFilename = Path.Combine(Path.GetDirectoryName(sourceFilename),\r
- distributionFilename);\r
- File.Move(sourceFilename, destinationFilename);\r
- string server;\r
- string directory;\r
- SplitRemotePublishPath(publishPath, out server, out directory);\r
- FtpClient ftpClient = new FtpClient(server, "anonymous", "sin@svn.reactos.com");\r
- ftpClient.Login();\r
- if (directory != "")\r
- ftpClient.ChangeDir(directory);\r
- /* Create destination directory if it does not already exist */\r
- if (!ftpClient.DirectoryExists(branch))\r
- ftpClient.MakeDir(branch);\r
- ftpClient.ChangeDir(branch);\r
- ftpClient.Upload(destinationFilename);\r
- ftpClient.Close();\r
- }\r
-\r
- /// <summary>\r
- /// Copy ISO to the (local) destination.\r
- /// </summary>\r
- /// <param name="sourceFilename">Name of source ISO file to copy.</param>\r
- /// <param name="branch">Branch.</param>\r
- /// <param name="revision">Revision.</param>\r
- /// <remarks>\r
- /// Structure is <branch>\ReactOS-<branch>-r<revision>.iso.\r
- /// </remarks>\r
- private static void CopyISOToLocalDestination(string sourceFilename,\r
- string branch,\r
- int revision)\r
- {\r
- string distributionFilename = GetDistributionFilename(branch,\r
- revision);\r
- string destinationDirectory = Path.Combine(publishPath,\r
- branch);\r
- string destinationFilename = Path.Combine(destinationDirectory,\r
- distributionFilename);\r
- if (!Directory.Exists(destinationDirectory))\r
- Directory.CreateDirectory(destinationDirectory);\r
- File.Copy(sourceFilename,\r
- destinationFilename);\r
- }\r
-\r
- /// <summary>\r
- /// Copy ISO to the destination.\r
- /// </summary>\r
- /// <param name="sourceFilename">Name of source ISO file to copy.</param>\r
- /// <param name="branch">Branch.</param>\r
- /// <param name="revision">Revision.</param>\r
- /// <remarks>\r
- /// Structure is <branch>\ReactOS-<branch>-r<revision>.iso.\r
- /// </remarks>\r
- private static void CopyISOToDestination(string sourceFilename,\r
- string branch,\r
- int revision)\r
- {\r
- if (PublishToRemoteFtpLocation)\r
- CopyISOToRemoteFtpDestination(sourceFilename, branch, revision);\r
- else\r
- CopyISOToLocalDestination(sourceFilename, branch, revision);\r
- }\r
-\r
- /// <summary>\r
- /// Publish a revision of ReactOS.\r
- /// </summary>\r
- /// <param name="text">Error message.</param>\r
- private static int Publish(string branch,\r
- int revision,\r
- string workingDirectory)\r
- {\r
- string make = "mingw32-make";\r
- string makeParameters = GetConfigurationOption("makeParameters", "");\r
- string reactosDirectory = Path.Combine(workingDirectory,\r
- "reactos");\r
- Console.WriteLine(String.Format("ReactOS directory is {0}",\r
- reactosDirectory));\r
- string standardOutput;\r
- string standardError;\r
- int exitCode = RunScript(make,\r
- makeParameters + " bootcd",\r
- reactosDirectory,\r
- out standardOutput,\r
- out standardError);\r
- if (exitCode != 0)\r
- {\r
- Fail(revision,\r
- String.Format("make bootcd failed: (error: {0}) {1}",\r
- standardError,\r
- standardOutput));\r
- return exitCode;\r
- }\r
-\r
- string sourceFilename = Path.Combine(reactosDirectory,\r
- "ReactOS.iso");\r
- if (File.Exists(sourceFilename))\r
- CopyISOToDestination(sourceFilename,\r
- branch,\r
- revision);\r
- else\r
- {\r
- Fail(revision,\r
- "make bootcd produced no ReactOS.iso");\r
- return exitCode;\r
- }\r
-\r
- return exitCode;\r
- }\r
-\r
- /// <summary>\r
- /// Program entry point.\r
- /// </summary>\r
- /// <param name="args">Arguments from command line.</param>\r
- /// <remarks>\r
- /// If exit code is 0, then the commit was processed successfully.\r
- /// If exit code is 1, then the commit was not processed successfully.\r
- /// </remarks>\r
- public static void Main(string[] args)\r
- {\r
- try\r
- {\r
- System.Environment.ExitCode = 1;\r
-\r
- publishPath = ConfigurationSettings.AppSettings["publishPath"];\r
- if (publishPath == null)\r
- {\r
- Fail("PublishPath option not set.");\r
- return;\r
- }\r
-\r
- if (args.Length < 3)\r
- {\r
- Fail("Usage: ReactOS.CustomRevisionAction action branch revision");\r
- return;\r
- }\r
-\r
- string action = args[0]; /* bootcd */\r
- string branch = args[1];\r
- int revision = Int32.Parse(args[2]);\r
- \r
- System.Environment.ExitCode = Publish(branch,\r
- revision,\r
- System.Environment.CurrentDirectory);\r
- }\r
- catch (Exception ex)\r
- {\r
- Fail(String.Format("Exception: {0}", ex));\r
- System.Environment.ExitCode = 1;\r
- }\r
- }\r
- }\r
-}\r