internal static ForgeJsonMetadata CreateJsonMetadata(ForgeData forgeData, FilesToPack filesToPack) { if (null == forgeData) { throw new ArgumentNullException("forgeData"); } if (null == filesToPack) { throw new ArgumentNullException("filesToPack"); } ForgeJsonMetadata forgeJsonMetadata = null; if (filesToPack.Count > 0) { var forgeUserName = forgeData[Conatants.PuppetForgeUserName]; var forgeModuleName = forgeData[Conatants.PuppetForgeModuleName]; var forgeModuleVersion = forgeData[Conatants.PuppetForgeModuleVersion]; var forgeModuleDependency = forgeData[Conatants.PuppetForgeModuleDependency]; var forgeModuleSummary = forgeData[Conatants.PuppetForgeModuleSummary]; var forgeModuleDescription = forgeData[Conatants.PuppetForgeModuleDescription]; forgeJsonMetadata = new ForgeJsonMetadata { name = string.Format("{0}-{1}", forgeUserName, forgeModuleName.ToLower()), author = forgeUserName, version = forgeModuleVersion, summary = forgeModuleSummary, description = forgeModuleDescription }; // Parse dependency forgeJsonMetadata.dependencies.Add(SELF.ParseDependency(forgeModuleDependency)); // Add MD5 checksums to json using (var md5 = MD5.Create()) { foreach (var fileToPack in filesToPack) { var fileInfo = fileToPack.Item1; var subdir = fileToPack.Item2; var combinedName = string.IsNullOrWhiteSpace(subdir) ? fileInfo.Name : string.Format("{0}/{1}", subdir.Replace(Path.DirectorySeparatorChar, '/'), fileInfo.Name); using (var stream = File.OpenRead(fileToPack.Item1.FullName)) { var byteArray = md5.ComputeHash(stream); forgeJsonMetadata.checksums.Add(combinedName, string.Join("", byteArray.Select(b => b.ToString("x2")))); } } } } return(forgeJsonMetadata); }
internal FilesToPack GetFileStructure(OAProject project) { var filesToPack = new FilesToPack(); foreach (var projectItem in project.ProjectItems) { var fileItem = projectItem as OAFileItem; if (fileItem != null) { var fileNode = fileItem.Object as FileNode; if (fileNode != null) { filesToPack.Add(new Tuple <FileInfo, string>(new FileInfo(fileNode.Url), string.Empty)); } } else if (projectItem is OAFolderItem) { var q = new Queue <object>(); q.Enqueue(projectItem); var subfolder = string.Empty; while (q.Count > 0) { var folderItem = q.Dequeue() as OAFolderItem; if (folderItem == null) { continue; } subfolder = Path.Combine(subfolder, folderItem.Name); foreach (var item in folderItem.ProjectItems) { if (item is OAFolderItem) { q.Enqueue(item); } else if (item is OAFileItem) { var fileNode = (item as OAFileItem).Object as FileNode; if (fileNode != null) { filesToPack.Add(new Tuple <FileInfo, string>(new FileInfo(fileNode.Url), subfolder)); } } } } } // ignore other types } if (filesToPack.Count == 0) { throw new Exception(Resources.EmptyModule); } return(filesToPack); }
private static string TarGz(ForgeData forgeData, FilesToPack filesToPack, ForgeJsonMetadata forgeJsonMetadata) { if (null == forgeData) { throw new ArgumentNullException("forgeData"); } if (null == filesToPack) { throw new ArgumentNullException("filesToPack"); } if (null == forgeJsonMetadata) { throw new ArgumentNullException("forgeJsonMetadata"); } // Add files to a Tarball if (filesToPack.Count <= 0) { return(null); } var forgeUserName = forgeData[Conatants.PuppetForgeUserName]; var forgeModuleName = forgeData[Conatants.PuppetForgeModuleName]; var forgeModuleVersion = forgeData[Conatants.PuppetForgeModuleVersion]; // Create a temp directory. var tmpDir = new DirectoryInfo(Path.GetTempPath()); var puppetTmpDir = tmpDir.CreateSubdirectory("PuppetLab"); var rndDir = puppetTmpDir.CreateSubdirectory(Path.GetRandomFileName()); var moduleDirName = string.Format("{0}-{1}-{2}", forgeUserName, forgeModuleName, forgeModuleVersion).ToLower(); var moduleDir = rndDir.CreateSubdirectory(moduleDirName); Directory.SetCurrentDirectory(rndDir.ToString()); // Create json metadata file in module directory MemoryStream ms = null; FileStream fs = null; try { ms = new MemoryStream(); fs = File.Create(Path.Combine(moduleDir.ToString(), "metadata.json")); var sr = new StreamReader(ms); var sw = new StreamWriter(fs); var s = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true }; var jonSerializer = new DataContractJsonSerializer(typeof(ForgeJsonMetadata), s); jonSerializer.WriteObject(ms, forgeJsonMetadata); // Remove backslashes that DataContractJsonSerializer adds before forward slashes (don't know how to disable this) ms.Position = 0; sw.WriteLine(sr.ReadToEnd().Replace("\\", string.Empty)); sw.Close(); sr.Close(); ms = null; fs = null; } finally { if (ms != null) { ms.Dispose(); } if (fs != null) { fs.Dispose(); } } // Copy module's files to a tmp dir considering module dir tree foreach (var fileToPack in filesToPack) { var srcFileInfo = fileToPack.Item1; var relSubdir = fileToPack.Item2; if (!string.IsNullOrEmpty(relSubdir)) { moduleDir.CreateSubdirectory(relSubdir); } var absSubdir = Path.Combine(moduleDir.ToString(), relSubdir); var dstFileName = Path.Combine(absSubdir, srcFileInfo.Name); srcFileInfo.CopyTo(dstFileName); } // Create a TAR GZ archive var tarFileName = moduleDirName + ".tar"; var gzFileName = tarFileName + ".gz"; CreateTarGz(gzFileName, moduleDir.ToString()); return(gzFileName); }
public static string PackGame(Constants strings) { try { string new_dat_file = Path.Combine(strings.PATCHED_YGODATA_OUT_FOLDER, strings.LOTD_DAT_FILENAME); string new_toc_file = Path.Combine(strings.PATCHED_YGODATA_OUT_FOLDER, strings.LOTD_TOC_FILENAME); if (File.Exists(new_dat_file)) { File.Delete(new_dat_file); } if (File.Exists(new_toc_file)) { File.Delete(new_toc_file); } List <FileNames> Files = new List <FileNames>(); string[] FilesToPack; Files = Utilities.ParseTocFile(Path.Combine(Properties.Settings.Default.LOTDPath, strings.LOTD_TOC_FILENAME)); FilesToPack = Directory.GetFiles($"{strings.YGO_DATA_WORKING_FOLDER}", "*.*", SearchOption.AllDirectories); File.AppendAllText(new_toc_file, "UT\n"); using (var Writer = new BinaryWriter(File.Open(new_dat_file, FileMode.Append, FileAccess.Write))) { foreach (var Item in Files) { var CurrentFileName = FilesToPack?.First(File => File.Contains(Item.FileName)); //Utilities.Log($"Packing File: {CurrentFileName}.", Utilities.Event.Information); var CurrentFileNameLength = Utilities.DecToHex(CurrentFileName .Split(new[] { strings.YGO_DATA_WORKING_FOLDER }, StringSplitOptions.None).Last().TrimStart('\\').Length.ToString()); var CurrentFileSize = Utilities.DecToHex(new FileInfo($"{CurrentFileName}").Length.ToString()); while (CurrentFileSize.Length != 12) { CurrentFileSize = CurrentFileSize.Insert(0, " "); } while (CurrentFileNameLength.Length != 2) { CurrentFileNameLength = CurrentFileNameLength.Insert(0, " "); } var Reader = new BinaryReader(File.Open(CurrentFileName, FileMode.Open, FileAccess.Read)); var NewSize = new FileInfo(CurrentFileName).Length; while (NewSize % 4 != 0) { NewSize = NewSize + 1; } var BufferSize = NewSize - new FileInfo(CurrentFileName).Length; Writer.Write(Reader.ReadBytes((int)new FileInfo(CurrentFileName).Length)); if (BufferSize > 0) { while (BufferSize != 0) { Writer.Write(new byte[] { 00 }); BufferSize = BufferSize - 1; } } File.AppendAllText(new_toc_file, $"{CurrentFileSize} {CurrentFileNameLength} {CurrentFileName.Split(new[] { strings.YGO_DATA_WORKING_FOLDER + "\\" }, StringSplitOptions.None).Last()}\n"); } } } catch (Exception ex) { return("Error: Couldn't pack files. " + ex); } return("Sucessfully finished Packing Files."); }