public void MarkPackageDirectoryForDeletion(IPackage package, Func <string, IPackage> createZipPackageFromPath)
        {
            IFileSystem          repositoryFileSystem = _repositoryFileSystemFactory();
            IPackagePathResolver pathResolver         = _packagePathResolverFactory();
            string packageDirectoryName = pathResolver.GetPackageDirectory(package);

            try
            {
                if (repositoryFileSystem.DirectoryExists(packageDirectoryName))
                {
                    string   packageFilePath = Path.Combine(packageDirectoryName, pathResolver.GetPackageFileName(package));
                    IPackage zipPackage      = createZipPackageFromPath(repositoryFileSystem.GetFullPath(packageFilePath));

                    IEnumerable <IPackageFile>         origPackageFiles      = zipPackage.GetFiles();
                    IDictionary <string, IPackageFile> origPackageFileLookup = origPackageFiles.ToDictionary(f => Path.Combine(packageDirectoryName, f.Path), StringComparer.OrdinalIgnoreCase);

                    foreach (var filePath in repositoryFileSystem.GetFiles(path: packageDirectoryName, filter: "*.*", recursive: true))
                    {
                        // Assume the package file and the package manifest are unmodified.
                        if (!filePath.Equals(packageFilePath, StringComparison.OrdinalIgnoreCase) &&
                            !Path.GetExtension(filePath).Equals(Constants.ManifestExtension, StringComparison.OrdinalIgnoreCase))
                        {
                            // Don't mark directory for deletion if file has been added.
                            IPackageFile origFile;
                            if (!origPackageFileLookup.TryGetValue(filePath, out origFile))
                            {
                                return;
                            }

                            // Don't mark directory for deletion if file has been modified.
                            using (Stream origStream = origFile.GetStream(),
                                   fileStream = repositoryFileSystem.OpenFile(filePath))
                            {
                                if (!origStream.ContentEquals(fileStream))
                                {
                                    return;
                                }
                            }
                        }
                    }

                    // NOTE: The repository should always be a PhysicalFileSystem, except during testing, so the
                    // .deleteme marker file doesn't get checked into version control
                    repositoryFileSystem.AddFile(packageDirectoryName + DeletionMarkerSuffix, Stream.Null);
                }
            }
            catch (Exception e)
            {
                repositoryFileSystem.Logger.Log(MessageLevel.Warning, String.Format(Resources.VsResources.Warning_FailedToMarkPackageDirectoryForDeletion, packageDirectoryName, e.Message));
            }
        }
        public void MarkPackageDirectoryForDeletion(IPackage package)
        {
            IFileSystem          repositoryFileSystem = _repositoryFileSystemFactory();
            IPackagePathResolver pathResolver         = _packagePathResolverFactory();
            string packageDirectoryName = pathResolver.GetPackageDirectory(package);

            try
            {
                if (repositoryFileSystem.DirectoryExists(packageDirectoryName))
                {
                    // NOTE: The repository should always be a PhysicalFileSystem, except during testing, so the
                    // .deleteme marker file doesn't get checked into version control
                    repositoryFileSystem.AddFile(packageDirectoryName + DeletionMarkerSuffix, Stream.Null);
                }
            }
            catch (Exception e)
            {
                repositoryFileSystem.Logger.Log(MessageLevel.Warning, String.Format(Resources.VsResources.Warning_FailedToMarkPackageDirectoryForDeletion, packageDirectoryName, e.Message));
            }
        }