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(); } }
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)); } } }
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(); } }