コード例 #1
0
    public static void WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
      , Func<string, int, XmlWriter> callback = null)
    {
      Func<IDiffFile, IComparable> keyGetter = i => i.Path;
      var basePaths = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
      var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();
      var completed = 0;
      var total = basePaths.Length + comparePaths.Length;

      var result = new List<FileDiff>();

      basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
      {
        try
        {
          var path = (b ?? c).Path;
          if (path.EndsWith(".xslt.xml"))
            return;

          completed++;
          switch (i)
          {
            case -1: // Delete
              using (var baseStream = ReadFile(b, p => basePaths.FirstOrDefault(f => f.Path == p)))
              using (var writer = callback(path, completed * 100 / total))
              {
                var elem = AmlDiff.GetMergeScript(baseStream, null);
                if (elem.Elements().Any())
                  elem.WriteTo(writer);
              }
              break;
            case 1: // Add
              using (var baseStream = c.OpenRead())
              using (var writer = callback(path, completed * 100 / total))
              {
                XElement.Load(baseStream).WriteTo(writer);
              }
              break;
            default: // Edit
              total--;
              using (var baseStream = ReadFile(b, p => basePaths.FirstOrDefault(f => f.Path == p)))
              using (var compareStream = ReadFile(c, p => comparePaths.FirstOrDefault(f => f.Path == p)))
              using (var writer = callback(path, completed * 100 / total))
              {
                var elem = AmlDiff.GetMergeScript(baseStream, compareStream);
                if (elem.Elements().Any())
                  elem.WriteTo(writer);
              }
              break;
          }
        }
        catch (XmlException ex)
        {
          throw new XmlException(string.Format("{0} ({1}, {2}, {3})", ex.Message, i, b.Path, c.Path), ex);
        }
      });
    }
コード例 #2
0
        public InstallScript Merge(IDiffDirectory baseDir, IDiffDirectory compareDir)
        {
            var docs     = new List <Tuple <XmlDocument, string> >();
            var metadata = baseDir.WriteAmlMergeScripts(compareDir, (path, prog) =>
            {
                ProgressChanged?.Invoke(this, new ProgressChangedEventArgs("Reading files", prog / 2));
                var doc = new XmlDocument();
                docs.Add(Tuple.Create(doc, path));
                return(new XmlNodeWriter(doc));
            });

            ProgressChanged?.Invoke(this, new ProgressChangedEventArgs("Performing cleanup", 50));

            var allItems = docs
                           .Where(d => d.Item1.DocumentElement != null)
                           .SelectMany(d => d.Item1.DocumentElement
                                       .DescendantsAndSelf(el => el.LocalName == "Item"))
                           .ToArray();

            RemoveDeletesForItemsWithMultipleScripts(allItems);
            RemoveChangesToSystemProperties(allItems);

            var installScripts = docs
                                 .Where(d => d.Item1.DocumentElement != null)
                                 .SelectMany(d => XmlUtils.RootItems(d.Item1.DocumentElement)
                                             .Select(i => InstallItem.FromScript(i, d.Item2)))
                                 .ToArray();

            ProgressChanged?.Invoke(this, new ProgressChangedEventArgs("Processing dependencies", 75));

            var lines = (SortDependencies
        ? ExportProcessor.SortByDependencies(installScripts, metadata)
        : installScripts).ToList();

            lines.RemoveWhere(i => i.Type == InstallType.DependencyCheck);

            var script = new InstallScript()
            {
                Created = DateTime.Now,
                Creator = Environment.UserName,
                Title   = "MergeScript",
                Lines   = lines
            };

            lines.InsertRange(0, FillInNullsOnRequiredProperties(allItems, metadata));

            ProgressChanged?.Invoke(this, new ProgressChangedEventArgs("Processing dependencies", 80));

            return(script);
        }
コード例 #3
0
ファイル: IDiffDirectory.cs プロジェクト: GCAE/InnovatorAdmin
        public static IEnumerable <FileDiff> GetDiffs(this IDiffDirectory baseDir, IDiffDirectory compareDir)
        {
            Func <IDiffFile, IComparable> keyGetter = i => i.Path;
            var basePaths    = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
            var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();

            var result = new List <FileDiff>();

            basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
            {
                switch (i)
                {
                case -1:
                    result.Add(new FileDiff()
                    {
                        Path      = b.Path,
                        InBase    = FileStatus.Unchanged,
                        InCompare = FileStatus.DoesntExist
                    });
                    break;

                case 1:
                    result.Add(new FileDiff()
                    {
                        Path      = c.Path,
                        InBase    = FileStatus.DoesntExist,
                        InCompare = FileStatus.Unchanged
                    });
                    break;

                default:
                    result.Add(new FileDiff()
                    {
                        Path      = b.Path,
                        InBase    = FileStatus.Unchanged,
                        InCompare = b.CompareKey.CompareTo(c.CompareKey) == 0
                ? FileStatus.Unchanged : FileStatus.Unchanged
                    });
                    break;
                }
            });
            return(result);
        }
コード例 #4
0
ファイル: IDiffDirectory.cs プロジェクト: GCAE/InnovatorAdmin
        public static void WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
                                                , string outputDirectory, Action <int> progressCallback = null)
        {
            WriteAmlMergeScripts(baseDir, compareDir, (path, progress) =>
            {
                progressCallback?.Invoke(progress);

                var savePath = Path.Combine(outputDirectory, path);
                Directory.CreateDirectory(Path.GetDirectoryName(savePath));

                var settings = new XmlWriterSettings()
                {
                    OmitXmlDeclaration = true,
                    Indent             = true,
                    IndentChars        = "  "
                };
                var stream = new FileStream(savePath, FileMode.Create, FileAccess.Write);
                return(XmlWriter.Create(stream, settings));
            });
        }
コード例 #5
0
    public static IEnumerable<FileDiff> GetDiffs(this IDiffDirectory baseDir, IDiffDirectory compareDir)
    {
      Func<IDiffFile, IComparable> keyGetter = i => i.Path;
      var basePaths = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
      var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();

      var result = new List<FileDiff>();
      basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
      {
        switch (i)
        {
          case -1:
            result.Add(new FileDiff()
            {
              Path = b.Path,
              InBase = FileStatus.Unchanged,
              InCompare = FileStatus.DoesntExist
            });
            break;
          case 1:
            result.Add(new FileDiff()
            {
              Path = c.Path,
              InBase = FileStatus.DoesntExist,
              InCompare = FileStatus.Unchanged
            });
            break;
          default:
            result.Add(new FileDiff()
            {
              Path = b.Path,
              InBase = FileStatus.Unchanged,
              InCompare = b.CompareKey.CompareTo(c.CompareKey) == 0
                ? FileStatus.Unchanged : FileStatus.Unchanged
            });
            break;
        }
      });
      return result;
    }
コード例 #6
0
    public static void WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
      , string outputDirectory)
    {
      Func<IDiffFile, IComparable> keyGetter = i => i.Path;
      var basePaths = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
      var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();

      var result = new List<FileDiff>();

      basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
      {
        var savePath = Path.Combine(outputDirectory, (b ?? c).Path);
        if (savePath.EndsWith(".xslt.xml"))
          return;

        Directory.CreateDirectory(Path.GetDirectoryName(savePath));
        switch (i)
        {
          case -1:
            SaveFile(AmlDiff.GetMergeScript(ReadFile(b,
              p => basePaths.FirstOrDefault(f => f.Path == p)), null), savePath);
            break;
          case 1:
            using (var baseStream = c.OpenRead())
            using (var outStream = File.OpenWrite(savePath))
            {
              baseStream.CopyTo(outStream);
            }
            break;
          default:
            SaveFile(AmlDiff.GetMergeScript(
              ReadFile(b, p => basePaths.FirstOrDefault(f => f.Path == p)), 
              ReadFile(c, p => comparePaths.FirstOrDefault(f => f.Path == p))), savePath);
            break;
        }
      });
    }
コード例 #7
0
    public static void WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
      , string outputDirectory, Action<int> progressCallback = null)
    {
      WriteAmlMergeScripts(baseDir, compareDir, (path, progress) =>
      {
        if (progressCallback != null) progressCallback(progress);

        var savePath = Path.Combine(outputDirectory, path);
        Directory.CreateDirectory(Path.GetDirectoryName(savePath));

        var settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        settings.Indent = true;
        settings.IndentChars = "  ";
        var stream = new FileStream(path, FileMode.Create, FileAccess.Write);
        return XmlWriter.Create(stream, settings);
      });
    }
コード例 #8
0
ファイル: IDiffDirectory.cs プロジェクト: GCAE/InnovatorAdmin
        public static PackageMetadataProvider WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
                                                                   , Func <string, int, XmlWriter> callback = null)
        {
            Func <IDiffFile, IComparable> keyGetter = i => i.Path.Replace('\\', '/').TrimStart('/');
            var basePaths    = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
            var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();
            var completed    = 0;
            var total        = basePaths.Length + comparePaths.Length;
            var result       = new List <FileDiff>();
            var metadata     = new PackageMetadataProvider();

            basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
            {
                try
                {
                    var path = (c ?? b).Path;
                    if (path.EndsWith(".xslt.xml") || path.EndsWith(".innpkg"))
                    {
                        return;
                    }

                    completed++;
                    switch (i)
                    {
                    case -1: // Delete
                        using (var baseStream = ReadFile(b, p => Array.Find(basePaths, f => f.Path == p)))
                            using (var writer = callback(path, completed * 100 / total))
                            {
                                var elem = AmlDiff.GetMergeScript(baseStream, null);
                                if (elem.Elements().Any())
                                {
                                    elem.WriteTo(writer);
                                }
                            }
                        break;

                    case 1: // Add
                        using (var baseStream = ReadFile(c, p => Array.Find(comparePaths, f => f.Path == p)))
                        {
                            var elem = XElement.Load(baseStream);
                            IdentityMergeToAdd(elem);
                            if (ItemAddToIgnore(elem))
                            {
                                return;
                            }

                            using (var writer = callback(path, completed * 100 / total))
                            {
                                elem.WriteTo(writer);
                                metadata.Add(elem);
                            }
                        }
                        break;

                    default: // Edit
                        total--;
                        using (var baseStream = ReadFile(b, p => Array.Find(basePaths, f => f.Path == p)))
                            using (var compareStream = ReadFile(c, p => Array.Find(comparePaths, f => f.Path == p)))
                                using (var writer = callback(path, completed * 100 / total))
                                {
                                    var baseElem    = Utils.LoadXml(baseStream);
                                    var compareElem = Utils.LoadXml(compareStream);
                                    metadata.Add(compareElem);
                                    var elem = AmlDiff.GetMergeScript(baseElem, compareElem);
                                    if (elem.Elements().Any())
                                    {
                                        elem.WriteTo(writer);
                                    }
                                }
                        break;
                    }
                }
                catch (XmlException ex)
                {
                    ex.Data["Index"] = i;
                    if (b != null)
                    {
                        ex.Data["BasePath"] = b.Path;
                    }
                    if (c != null)
                    {
                        ex.Data["ComparePath"] = c.Path;
                    }
                    throw;
                }
            });

            return(metadata);
        }
コード例 #9
0
        public static PackageMetadataProvider WriteAmlMergeScripts(this IDiffDirectory baseDir, IDiffDirectory compareDir
                                                                   , Func <string, int, XmlWriter> callback = null)
        {
            Func <IDiffFile, IComparable> keyGetter = i => i.Path;
            var basePaths    = baseDir.GetFiles().OrderBy(keyGetter).ToArray();
            var comparePaths = compareDir.GetFiles().OrderBy(keyGetter).ToArray();
            var completed    = 0;
            var total        = basePaths.Length + comparePaths.Length;
            var result       = new List <FileDiff>();
            var metadata     = new PackageMetadataProvider();

            basePaths.MergeSorted(comparePaths, keyGetter, (i, b, c) =>
            {
                try
                {
                    var path = (c ?? b).Path;
                    if (path.EndsWith(".xslt.xml") || path.EndsWith(".innpkg"))
                    {
                        return;
                    }

                    completed++;
                    switch (i)
                    {
                    case -1: // Delete
                        using (var baseStream = ReadFile(b, p => Array.Find(basePaths, f => f.Path == p)))
                            using (var writer = callback(path, completed * 100 / total))
                            {
                                var elem = AmlDiff.GetMergeScript(baseStream, null);
                                if (elem.Elements().Any())
                                {
                                    elem.WriteTo(writer);
                                }
                            }
                        break;

                    case 1: // Add
                        using (var baseStream = c.OpenRead())
                            using (var writer = callback(path, completed * 100 / total))
                            {
                                var elem = XElement.Load(baseStream);
                                elem.WriteTo(writer);
                                metadata.Add(elem);
                            }
                        break;

                    default: // Edit
                        total--;
                        using (var baseStream = ReadFile(b, p => Array.Find(basePaths, f => f.Path == p)))
                            using (var compareStream = ReadFile(c, p => Array.Find(comparePaths, f => f.Path == p)))
                                using (var writer = callback(path, completed * 100 / total))
                                {
                                    var baseElem    = Utils.LoadXml(baseStream);
                                    var compareElem = Utils.LoadXml(compareStream);
                                    metadata.Add(compareElem);
                                    var elem = AmlDiff.GetMergeScript(baseElem, compareElem);
                                    if (elem.Elements().Any())
                                    {
                                        elem.WriteTo(writer);
                                    }
                                }
                        break;
                    }
                }
                catch (XmlException ex)
                {
                    throw new XmlException(string.Format("{0} ({1}, {2}, {3})", ex.Message, i, b.Path, c.Path), ex);
                }
            });

            return(metadata);
        }