Beispiel #1
0
            public CacheEntry(string cacheAbsolutePath, string originalAbsolutePath, List <string> mergePaths)
            {
                _cacheAbsolutePath  = cacheAbsolutePath;
                CachePath           = ModTek.GetRelativePath(cacheAbsolutePath, ModTek.GameDirectory);
                ContainingDirectory = Path.GetDirectoryName(cacheAbsolutePath);
                OriginalTime        = File.GetLastWriteTimeUtc(originalAbsolutePath);

                if (string.IsNullOrEmpty(ContainingDirectory))
                {
                    HasErrors = true;
                    return;
                }

                // get the parent JSON
                JObject parentJObj;

                try
                {
                    parentJObj = ModTek.ParseGameJSONFile(originalAbsolutePath);
                }
                catch (Exception e)
                {
                    Log($"\tParent JSON at path {originalAbsolutePath} has errors preventing any merges!");
                    Log($"\t\t{e.Message}");
                    HasErrors = true;
                    return;
                }

                foreach (var mergePath in mergePaths)
                {
                    Merges.Add(new PathTimeTuple(ModTek.GetRelativePath(mergePath, ModTek.GameDirectory), File.GetLastWriteTimeUtc(mergePath)));
                }

                Directory.CreateDirectory(ContainingDirectory);

                using (var writer = File.CreateText(cacheAbsolutePath))
                {
                    // merge all of the merges
                    foreach (var mergePath in mergePaths)
                    {
                        JObject mergeJObj;
                        try
                        {
                            mergeJObj = ModTek.ParseGameJSONFile(mergePath);
                        }
                        catch (Exception e)
                        {
                            Log($"\tMod merge JSON at path {originalAbsolutePath} has errors preventing any merges!");
                            Log($"\t\t{e.Message}");
                            continue;
                        }

                        if (AdvancedJSONMerger.IsAdvancedJSONMerge(mergeJObj))
                        {
                            try
                            {
                                AdvancedJSONMerger.ProcessInstructionsJObject(parentJObj, mergeJObj);
                                continue;
                            }
                            catch (Exception e)
                            {
                                Log($"\tMod advanced merge JSON at path {mergePath} has errors preventing advanced json merges!");
                                Log($"\t\t{e.Message}");
                            }
                        }

                        // assume standard merging
                        parentJObj.Merge(mergeJObj, new JsonMergeSettings {
                            MergeArrayHandling = MergeArrayHandling.Replace
                        });
                    }

                    // write the merged onto file to disk
                    var jsonWriter = new JsonTextWriter(writer)
                    {
                        Formatting = Formatting.Indented
                    };
                    parentJObj.WriteTo(jsonWriter);
                    jsonWriter.Close();
                }
            }
Beispiel #2
0
            public CacheEntry(string absolutePath, string originalAbsolutePath, List <string> mergePaths)
            {
                cacheAbsolutePath   = absolutePath;
                CachePath           = ModTek.GetRelativePath(absolutePath, ModTek.GameDirectory);
                ContainingDirectory = Path.GetDirectoryName(absolutePath);
                OriginalTime        = File.GetLastWriteTimeUtc(originalAbsolutePath);

                if (string.IsNullOrEmpty(ContainingDirectory))
                {
                    HasErrors = true;
                    return;
                }

                foreach (var mergePath in mergePaths)
                {
                    Merges.Add(new PathTimeTuple(ModTek.GetRelativePath(mergePath, ModTek.GameDirectory), File.GetLastWriteTimeUtc(mergePath)));
                }

                Directory.CreateDirectory(ContainingDirectory);

                // do json merge if json
                if (Path.GetExtension(absolutePath)?.ToLowerInvariant() == ".json")
                {
                    // get the parent JSON
                    JObject parentJObj;
                    try
                    {
                        parentJObj = ModTek.ParseGameJSONFile(originalAbsolutePath);
                    }
                    catch (Exception e)
                    {
                        LogException($"\tParent JSON at path {originalAbsolutePath} has errors preventing any merges!", e);
                        HasErrors = true;
                        return;
                    }

                    using (var writer = File.CreateText(absolutePath))
                    {
                        // merge all of the merges
                        foreach (var mergePath in mergePaths)
                        {
                            try
                            {
                                // since all json files are opened and parsed before this point, they won't have errors
                                JSONMerger.MergeIntoTarget(parentJObj, ModTek.ParseGameJSONFile(mergePath));
                            }
                            catch (Exception e)
                            {
                                LogException($"\tMod JSON merge at path {ModTek.GetRelativePath(mergePath, ModTek.GameDirectory)} has errors preventing merge!", e);
                            }
                        }

                        // write the merged onto file to disk
                        var jsonWriter = new JsonTextWriter(writer)
                        {
                            Formatting = Formatting.Indented
                        };
                        parentJObj.WriteTo(jsonWriter);
                        jsonWriter.Close();
                    }

                    return;
                }

                // do file append if not json
                using (var writer = File.CreateText(absolutePath))
                {
                    writer.Write(File.ReadAllText(originalAbsolutePath));

                    foreach (var mergePath in mergePaths)
                    {
                        writer.Write(File.ReadAllText(mergePath));
                    }
                }
            }
Beispiel #3
0
            public CacheEntry(string path, string originalPath, List <string> mergePaths)
            {
                CachePath           = path;
                ContainingDirectory = Path.GetDirectoryName(path);
                OriginalPath        = originalPath;
                OriginalTime        = File.GetLastWriteTimeUtc(originalPath);

                if (string.IsNullOrEmpty(ContainingDirectory))
                {
                    HasErrors = true;
                    return;
                }

                // get the parent JSON
                JObject parentJObj;

                try
                {
                    parentJObj = ModTek.ParseGameJSON(File.ReadAllText(originalPath));
                }
                catch (Exception e)
                {
                    Log($"\tParent JSON at path {originalPath} has errors preventing any merges!");
                    Log($"\t\t{e.Message}");
                    HasErrors = true;
                    return;
                }

                foreach (var mergePath in mergePaths)
                {
                    Merges.Add(new PathTimeTuple(mergePath, File.GetLastWriteTimeUtc(mergePath)));
                }

                Directory.CreateDirectory(ContainingDirectory);

                using (var writer = File.CreateText(path))
                {
                    // merge all of the merges
                    foreach (var mergePath in mergePaths)
                    {
                        JObject mergeJObj;
                        try
                        {
                            mergeJObj = ModTek.ParseGameJSON(File.ReadAllText(mergePath));
                        }
                        catch (Exception e)
                        {
                            Log($"\tMod merge JSON at path {originalPath} has errors preventing any merges!");
                            Log($"\t\t{e.Message}");
                            continue;
                        }

                        parentJObj.Merge(mergeJObj, new JsonMergeSettings {
                            MergeArrayHandling = MergeArrayHandling.Replace
                        });
                    }

                    // write the merged onto file to disk
                    var jsonWriter = new JsonTextWriter(writer)
                    {
                        Formatting = Formatting.Indented
                    };
                    parentJObj.WriteTo(jsonWriter);
                    jsonWriter.Close();
                }
            }