Beispiel #1
0
        private void UpdateKnownFileTypes()
        {
            IncludedExtensions.Clear();

            foreach (var extension in _knownFileTypes.All
                     .OrderBy(x => x)
                     .Select(x => CreateIncludedExtension(x))
                     .ToList())
            {
                _searchOptions.IncludeExtensions.Add(extension.Name);
                IncludedExtensions.Add(extension);
                SearchAllSearchableFileTypes = true;
            }
        }
        public override bool Execute()
        {
            if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                Log.LogMessage(MessageImportance.High, $"Skipping WiX update, we're not on Windows.");
                return(true);
            }

            if (!File.Exists(InputManifestPath))
            {
                throw new ArgumentException($"Input manifest {InputManifestPath} does not exist.", nameof(InputManifestPath));
            }

            if (!Directory.Exists(SourceDirectory))
            {
                throw new ArgumentException($"Source directory {SourceDirectory} does not exist.", nameof(SourceDirectory));
            }

            XDocument wixManifest;

            using (var sr = new StreamReader(InputManifestPath))
                wixManifest = XDocument.Load(sr);

            var targetComponentGroup = GetComponentGroup(wixManifest, ComponentGroupId);

            if (targetComponentGroup == null)
            {
                throw new ArgumentException($"Could not find ComponentGroup with ID {ComponentGroupId}.");
            }

            var hasChanges = false;

            // Handle the easy case first, scanning just the single directory.
            var sourcePath   = new FilePath(SourceDirectory);
            var searchOption = ScanRecursively ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
            var sourceFiles  = IncludedExtensions.SelectMany(
                extension => sourcePath.EnumerateFiles($"*.{extension}", searchOption));
            var excludedHash = new HashSet <string> (ExcludedExtensions, StringComparer.OrdinalIgnoreCase);

            var newFiles = new List <string> ();

            foreach (var file in sourceFiles)
            {
                var fileName     = file.Name;
                var extension    = Path.GetExtension(file).TrimStart('.');
                var relativePath = file.GetRelativePath(sourcePath);

                if (excludedHash.Contains(extension))
                {
                    Log.LogMessage(
                        MessageImportance.Low,
                        $"Skipping file {fileName}, its extension matches the exclusion list.");
                    continue;
                }

                // Look up by relative path--in the case of non-recursion, relativePath == fileName.
                var hasExisting = HasExistingFileElement(targetComponentGroup, relativePath);
                if (hasExisting)
                {
                    Log.LogMessage(
                        MessageImportance.Low,
                        $"Skipping file {fileName}, it's already present in the component group.");
                    continue;
                }

                // Use the relative path for generating ID hashes--hash IDs are useful for generating
                // a full tree that may have repeated file names.
                var id           = UseHashForId ? Hash(file.FullPath) : GenerateIdForFile(IdPrefix, fileName);
                var newComponent = CreateComponentForFile(id, DirectoryVariable, relativePath);

                targetComponentGroup.Add(newComponent);
                hasChanges = true;

                newFiles.Add(fileName);

                Log.LogMessage(
                    MessageImportance.Low,
                    $"Added file {fileName} (id: {id}) to target component group.");
            }

            if (hasChanges)
            {
                using (var fs = File.Open(InputManifestPath, FileMode.Create))
                    wixManifest.Save(fs);
            }

            if (hasChanges && FailOnManifestChanges)
            {
                var manifestFileName = Path.GetFileNameWithoutExtension(InputManifestPath);

                Log.LogError(
                    $"Manifest {manifestFileName} has changes, and FailOnManifestChanges is true. " +
                    $"Please check the manifest output and commit it if it's correct.");

                newFiles.ForEach(newFile => Log.LogError(
                                     $"New file {newFile} added to manifest {InputManifestPath}."));

                return(false);
            }

            return(true);
        }
Beispiel #3
0
        bool ShouldProcessFile(string file)
        {
            var extension = Helpers.File.Extension(file);
            var included  = IncludedExtensions == null || IncludedExtensions.Count == 0 || IncludedExtensions.Any(e => extension.EndsWith(e, System.StringComparison.OrdinalIgnoreCase));
            var exclude   = IgnoredExtensions.Contains(extension);

            return(included && !exclude);
        }