示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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.");
        }