private void DisplayMerge(CurrencyConvertItem item) { if (Merges == null) { Merges = new ObservableCollection <CurrencyConvertItem>(); Merges.Add(item); return; } var existItems = from i in Merges where i.FromCode == item.FromCode && i.ToCode == item.ToCode select i; if (existItems.Count() == 0) { merges.Add(item); return; } var theItem = existItems.FirstOrDefault(); Merges.Remove(theItem); if (item.Rate != 1m) { merges.Add(item); } }
/// <summary> /// Realiza o merge do primeiro item da lista e retorna o resultado /// </summary> /// <returns></returns> public async Task <Tuple <string, bool> > RealizaMerges() { foreach (var item in Merges.Where(d => d.Finalizado == false)) { Tuple <string, Exception> retorno = await Task.Run(() => { try { if (item.Conflitos > 0) { if (VerificaConflitos(item) > 0) { return(new Tuple <string, Exception>(item.Mensagem, null)); } } else { RealizaMerge(item); if (VerificaConflitos(item) > 0) { return(new Tuple <string, Exception>(item.Mensagem, null)); } } item.Finalizado = true; Checkin(item.Mensagem); return(new Tuple <string, Exception>("", null)); } catch (Exception ex) { return(new Tuple <string, Exception>("", ex)); } }); if (!string.IsNullOrEmpty(retorno.Item1)) { return(new Tuple <string, bool>(retorno.Item1, true)); } if (retorno.Item2 != null) { throw retorno.Item2; } } return(new Tuple <string, bool>("", Merges.Where(d => d.Finalizado == false).Count() > 0)); }
public bool HasResolvedConflict(ModFile conflict) { var merge = Merges.FirstOrDefault(mrg => mrg.RelativePath.EqualsIgnoreCase(conflict.RelativePath)); if (merge == null) { return(false); } if (conflict.Mods.Any(mod => !mod.Name.EqualsIgnoreCase(merge.MergedModName) && !merge.ContainsMod(mod.Name))) { return(false); } if (merge.Mods.Any(mod => new LoadOrderComparer().Compare(merge.MergedModName, mod.Name) > 0)) { return(false); } return (merge.Mods.All(mod => mod.Hash == Tools.Hasher.ComputeHash(merge.GetModFile(mod.Name)))); }
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 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 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(); } }
public Merge GetMergeByRelativePath(string relativePath) { return(Merges.FirstOrDefault(m => m.RelativePath.EqualsIgnoreCase(relativePath))); }