Exemplo n.º 1
0
        protected override void FinishItemCore()
        {
            if (!Directory.Exists(_folder))
            {
                throw new SwixSemanticException(CurrentLine, $"Directory '{_folder}' does not exists");
            }

            var excludePathRegex = PrepareExcludeRegex();

            if (!_directlySetAttributes.TryGetValue("filter", out string filter))
            {
                filter = "*.*";
            }

            bool withSubfolders = _directlySetAttributes.ContainsKey("withSubfolders") && _directlySetAttributes["withSubfolders"] == "yes";

            var manuallySpecifiedSourcePaths = new HashSet <string>(GatheredComponents.Select(c => Path.GetFullPath(c.SourcePath)), StringComparer.OrdinalIgnoreCase);
            var harvestedComponents          = new List <WixComponent>();
            var folder = Path.GetFullPath(_folder); // eliminates relative parts like a\b\..\b2\c
            var files  = Directory.GetFiles(folder, filter, withSubfolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);

            foreach (var filepath in files)
            {
                if (manuallySpecifiedSourcePaths.Contains(filepath))
                {
                    continue;
                }
                int harvestingRootSubstringLength = folder.Length;
                if (filepath[harvestingRootSubstringLength] == '\\')
                {
                    harvestingRootSubstringLength++;
                }
                var relativeToHarvestingRoot = filepath.Substring(harvestingRootSubstringLength);
                if (excludePathRegex.IsMatch(relativeToHarvestingRoot))
                {
                    continue;
                }
                var relativeDir = Path.GetDirectoryName(relativeToHarvestingRoot);
                try
                {
                    var component = WixComponent.FromContext(filepath, CurrentAttributeContext);
                    if (relativeDir != null)
                    {
                        component.TargetDir = component.TargetDir == null
                            ? relativeDir
                            : Path.Combine(component.TargetDir, relativeDir);
                    }

                    harvestedComponents.Add(component);
                }
                catch (SwixItemParsingException e)
                {
                    throw new SwixSemanticException(CurrentLine, $"During harvesting of {filepath} file, exception occurs:\n{e}");
                }
            }

            GatheredComponents.AddRange(harvestedComponents);

            base.FinishItemCore();
        }
Exemplo n.º 2
0
        public ZipSemanticContext(int line, string archivePath, IAttributeContext context, List <WixComponent> components)
            : base(line, context, components)
        {
            var originalFrom = context.GetInheritedAttribute("from");

            if (originalFrom != null)
            {
                archivePath = Path.Combine(originalFrom, archivePath);
            }

            if (!File.Exists(archivePath))
            {
                throw new SwixSemanticException(line, $"File {archivePath} not found");
            }

            var tmp          = SwixProcessor.TempDir;
            var g            = context.GuidProvider.Get(SwixGuidType.ZipArchive, archivePath.ToLowerInvariant()).ToString("N");
            var unpackedPath = Path.GetFullPath(Path.Combine(tmp, g));

            try
            {
                ZipFile.ExtractToDirectory(archivePath, unpackedPath);
            }
            catch (Exception e)
            {
                throw new SwixSemanticException(line, $"Error while unzipping {archivePath} to {unpackedPath}: {e}");
            }

            context.SetAttributes(new[]
            {
                new AhlAttribute("fromBase", unpackedPath),
                new AhlAttribute("from", null)
            });

            int rootSubstringLength = unpackedPath.Length;

            var files = Directory.GetFiles(unpackedPath);

            foreach (string path in files)
            {
                var component = WixComponent.FromContext(path, context);
                if (path[rootSubstringLength] == '\\')
                {
                    rootSubstringLength++;
                }
                var relativeDir = Path.GetDirectoryName(path.Substring(rootSubstringLength));
                if (relativeDir != null)
                {
                    component.TargetDir = component.TargetDir == null
                        ? relativeDir
                        : Path.Combine(component.TargetDir, relativeDir);
                }

                GatheredComponents.Add(component);
            }
        }