PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/GitCommands/GitExtLinks/GitExtLinksParser.cs

https://github.com/vbjay/gitextensions
C# | 157 lines | 135 code | 22 blank | 0 comment | 25 complexity | e46ca9a00f38838cca4fef6924567fda MD5 | raw file
Possible License(s): GPL-3.0, GPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml;
  7. using System.Xml.Serialization;
  8. using GitCommands.Settings;
  9. namespace GitCommands.GitExtLinks
  10. {
  11. public class GitExtLinksParser
  12. {
  13. private readonly RepoDistSettings Settings;
  14. public List<GitExtLinkDef> LinkDefs;
  15. private readonly GitExtLinksParser LowerPriority;
  16. public GitExtLinksParser(RepoDistSettings aSettings)
  17. {
  18. Settings = new RepoDistSettings(null, aSettings.SettingsCache);
  19. LoadFromSettings();
  20. if (aSettings.LowerPriority == null)
  21. LowerPriority = null;
  22. else
  23. LowerPriority = new GitExtLinksParser(aSettings.LowerPriority);
  24. }
  25. public List<GitExtLinkDef> EffectiveLinkDefs
  26. {
  27. get
  28. {
  29. HashSet<GitExtLinkDef> result = new HashSet<GitExtLinkDef>();
  30. foreach (var def in LinkDefs)
  31. result.Add(def);
  32. if (LowerPriority != null)
  33. {
  34. foreach (var def in LowerPriority.EffectiveLinkDefs)
  35. result.Add(def);
  36. }
  37. return result.ToList();
  38. }
  39. }
  40. public bool ContainsLinkDef(string name)
  41. {
  42. return LinkDefs.Any(linkDef => linkDef.Name.Equals(name));
  43. }
  44. public void AddLinkDef(GitExtLinkDef linkDef)
  45. {
  46. if (LowerPriority == null
  47. || LowerPriority.LowerPriority == null
  48. || ContainsLinkDef(linkDef.Name)
  49. || LowerPriority.ContainsLinkDef(linkDef.Name))
  50. {
  51. LinkDefs.Add(linkDef);
  52. }
  53. else
  54. {
  55. LowerPriority.LowerPriority.AddLinkDef(linkDef);
  56. }
  57. }
  58. public void RemoveLinkDef(GitExtLinkDef linkDef)
  59. {
  60. if (!LinkDefs.Remove(linkDef) && LowerPriority != null)
  61. LowerPriority.RemoveLinkDef(linkDef);
  62. }
  63. public IEnumerable<GitExtLink> Parse(GitRevision revision)
  64. {
  65. return EffectiveLinkDefs.
  66. Where(linkDef => linkDef.Enabled).
  67. Select(linkDef => linkDef.Parse(revision)).
  68. Unwrap();
  69. }
  70. public void LoadFromSettings()
  71. {
  72. if (LowerPriority != null)
  73. LowerPriority.LoadFromSettings();
  74. LinkDefs = null;
  75. try
  76. {
  77. var serializer = new XmlSerializer(typeof(List<GitExtLinkDef>));
  78. StringReader stringReader = null;
  79. try
  80. {
  81. var xml = Settings.GetString("RevisionLinkDefs", null);
  82. if (xml == null)
  83. {
  84. LinkDefs = new List<GitExtLinkDef>();
  85. return;
  86. }
  87. stringReader = new StringReader(xml);
  88. using (var xmlReader = new XmlTextReader(stringReader))
  89. {
  90. stringReader = null;
  91. LinkDefs = serializer.Deserialize(xmlReader) as List<GitExtLinkDef>;
  92. }
  93. }
  94. finally
  95. {
  96. if (stringReader != null)
  97. stringReader.Dispose();
  98. }
  99. }
  100. catch (Exception ex)
  101. {
  102. Debug.WriteLine(ex.Message);
  103. LinkDefs = null;
  104. }
  105. if (LinkDefs == null)
  106. LinkDefs = new List<GitExtLinkDef>();
  107. }
  108. public void SaveToSettings()
  109. {
  110. if (LowerPriority != null)
  111. LowerPriority.SaveToSettings();
  112. string xml;
  113. try
  114. {
  115. if (LinkDefs.Count == 0)
  116. {
  117. xml = null;
  118. }
  119. else
  120. {
  121. LinkDefs.ForEach(linkDef => linkDef.RemoveEmptyFormats());
  122. var sw = new StringWriter();
  123. var serializer = new XmlSerializer(typeof(List<GitExtLinkDef>));
  124. serializer.Serialize(sw, LinkDefs);
  125. xml = sw.ToString();
  126. }
  127. Settings.SetString("RevisionLinkDefs", xml);
  128. }
  129. catch(Exception e)
  130. {
  131. System.Diagnostics.Debug.WriteLine(e);
  132. }
  133. }
  134. }
  135. }