Publish ISOs via FTP
[reactos.git] / cis / ReactOS.CustomRevisionAction / Main.cs
index 3535671..319b102 100644 (file)
@@ -13,6 +13,17 @@ namespace ReactOS.CustomRevisionAction
                /// </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
@@ -138,8 +149,59 @@ namespace ReactOS.CustomRevisionAction
                                             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 destination.\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 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.GetFileList(branch).Length < 1)\r
+                               ftpClient.MakeDir(branch);\r
+                       ftpClient.ChangeDir(branch);\r
+                       ftpClient.Upload(sourceFilename);\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
@@ -147,9 +209,9 @@ namespace ReactOS.CustomRevisionAction
                /// <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
+               private static void CopyISOToLocalDestination(string sourceFilename,\r
+                                                             string branch,\r
+                                                             int revision)\r
                {\r
                        string distributionFilename = GetDistributionFilename(branch,\r
                                                                              revision);\r
@@ -163,6 +225,25 @@ namespace ReactOS.CustomRevisionAction
                                  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