public static Package ConvertToPackage(Version version)
        {
            var metadataWrapper = new MetadataWrapper(version.Metadata);

            var package = new Package
            {
                Id = version.Project,
                Version = version.Name,


                Title = metadataWrapper["Title"],
                Authors = metadataWrapper["Authors"],
                Copyright = metadataWrapper["Copyrights"],
                Description = metadataWrapper["Description"],
                IconUrl = metadataWrapper["IconUrl"],
                LicenseUrl = metadataWrapper["LicenseUrl"],
                ProjectUrl = metadataWrapper["ProjectUrl"],
                ReleaseNotes = metadataWrapper["RequireLicenseAcceptance"],
                RequireLicenseAcceptance = (metadataWrapper["LicenseUrl"] ?? "").Equals("true", StringComparison.OrdinalIgnoreCase),
                Summary = metadataWrapper["Summary"],
                Tags = metadataWrapper["Tags"],
                Dependencies = metadataWrapper["Dependencies"],
                PackageHash = metadataWrapper["PackageHash"] ?? version.PackageHash,
                PackageHashAlgorithm = metadataWrapper["PackageHashAlgorithm"] ?? "SHA512",
                PackageSize = int.Parse(metadataWrapper["PackageSize"] ?? "-1"),
                DownloadCount = int.Parse(metadataWrapper["DownloadCount"] ?? "0"),
                LastUpdated = DateTime.UtcNow,
                Published = DateTime.UtcNow,
                IsLatestVersion = (metadataWrapper["IsLatestVersion"] ?? "").Equals("true", StringComparison.OrdinalIgnoreCase),
                IsAbsoluteLatestVersion = (metadataWrapper["IsAbsoluteLatestName"] ?? "").Equals("true", StringComparison.OrdinalIgnoreCase),
            };

            return package;
        }
        public Version[] GetPackages(ref Repository repository, ref PackageFilter filter, string packageFormat, string projectId)
        {
#if DEBUG
            var startTime = DateTime.Now;
            System.Diagnostics.Trace.WriteLine(string.Format("Start: {0}", startTime.ToString("s")));
#endif
            if (_cachedVersionRepository.Count == 0)
            {
                lock (_syncLock)
                {
                    if (_cachedVersionRepository.Count == 0)
                    {
                        var repositoryCopy = repository;

                        var versions =
                            Directory.EnumerateDirectories(configuration.DataPath)
                                .SelectMany(
                                    projectPath =>
                                        Directory.EnumerateDirectories(projectPath)
                                            .Select(
                                                versionPath =>
                                                    new Version
                                                    {
                                                        Company = repositoryCopy.Company,
                                                        Repository = repositoryCopy.Name,
                                                        Project = Path.GetFileName(projectPath),
                                                        Name = Path.GetFileName(versionPath),
                                                        PackageFormat = packageFormat,
                                                    })
                                            .Where(version => GetPackagePathFromVersion(version, packageFormat) != null)
                                            .Select(version => new Version
                                            {
                                                Company = version.Company,
                                                Repository = version.Repository,
                                                Project = version.Project,
                                                Name = version.Name,
                                                PackageFormat = "SHA512",
                                                PackageHash =
                                                    GetPackageSHA512(GetPackagePathFromVersion(version, packageFormat)),
                                            })
                                )
                                .ToArray();

                        // Reorder according semver
                        List<Version> sortedVersions = versions.ToList();
                        sortedVersions.Sort();
                        sortedVersions.Reverse();

                        foreach (var version in sortedVersions)
                        {
                            bool isLatest =
                                sortedVersions.Where(v => v.Project == version.Project && !v.Name.Contains("-"))
                                    .Select(v => v.Name)
                                    .FirstOrDefault() == version.Name;
                            bool isAbsoluteLatest =
                                sortedVersions.Where(v => v.Project == version.Project)
                                    .Select(v => v.Name)
                                    .FirstOrDefault() ==
                                version.Name;
                            var metadata =
                                new List<MetadataEntry>(
                                    GetPackageMetadata(GetPackagePathFromVersion(version, packageFormat), packageFormat) ??
                                    new MetadataEntry[0]);
                            var metadataWrapper = new MetadataWrapper(metadata);
                            metadataWrapper["IsLatestVersion"] = isLatest.ToString();
                            metadataWrapper["IsAbsoluteLatestName"] = isAbsoluteLatest.ToString();
                            version.Metadata = metadata.ToArray();
                        }

                        _cachedVersionRepository = sortedVersions;
                    }
                }
            }
#if DEBUG
            TimeSpan elapsed2 = DateTime.Now - startTime;
            System.Diagnostics.Trace.WriteLine(string.Format("End: {0} - Elapsed2: {1}", DateTime.Now.ToString("s"), elapsed2.ToString("g")));
#endif
            return _cachedVersionRepository.ToArray();
        }
        public static Version ConvertToVersion(Stream stream)
        {
            var package = new ZipPackage(stream);

            var version = new Version
            {
                Project = package.Id,
                Name = package.Version.ToString(),
            };

            var metadata = new List<MetadataEntry>();
            var metadataWrapper = new MetadataWrapper(metadata);

            if (!package.Authors.IsEmpty())
                metadataWrapper["Authors"] = String.Join(",", package.Authors);

            if (!string.IsNullOrEmpty(package.Copyright))
                metadataWrapper["Copyrights"] = package.Copyright;

            if (!string.IsNullOrEmpty(package.Description))
                metadataWrapper["Description"] = package.Description;

            if (package.IconUrl != null)
                metadataWrapper["IconUrl"] = package.IconUrl.ToString();

            if (!string.IsNullOrEmpty(package.Language))
                metadataWrapper["Language"] = package.Language;

            if (package.LicenseUrl != null)
                metadataWrapper["LicenseUrl"] = package.LicenseUrl.ToString();

            if (!package.Owners.IsEmpty())
                metadataWrapper["Owners"] = String.Join(",", package.Owners);

            if (package.ProjectUrl != null)
                metadataWrapper["ProjectUrl"] = package.ProjectUrl.ToString();

            if (!string.IsNullOrEmpty(package.ReleaseNotes))
                metadataWrapper["ReleaseNotes"] = package.ReleaseNotes;

            metadataWrapper["RequireLicenseAcceptance"] = package.RequireLicenseAcceptance.ToString();

            if (!string.IsNullOrEmpty(package.Summary))
                metadataWrapper["Summary"] = package.Summary;

            if (!string.IsNullOrEmpty(package.Tags))
                metadataWrapper["Tags"] = package.Tags;

            if (package.DependencySets.SelectMany(ConvertDependencySetToStrings).Any())
                metadataWrapper["Dependencies"] = String.Join("|", package.DependencySets.SelectMany(ConvertDependencySetToStrings));

            if (!string.IsNullOrEmpty(package.Title))
                metadataWrapper["Title"] = package.Title;

            metadataWrapper["PackageSize"] = stream.Length.ToString();
            metadataWrapper["PackageHashAlgorithm"] = "SHA512";

            stream.Seek(0, SeekOrigin.Begin);
            using (var hasher = new SHA512Managed())
                metadataWrapper["PackageHash"] = Convert.ToBase64String(hasher.ComputeHash(stream));

            metadataWrapper["DownloadCount"] = "000000";
            metadataWrapper["CreatedDate"] = DateTime.UtcNow.ToString("s");

            version.Metadata = metadata.ToArray();

            return version;
        }
        public Version[] GetPackages(ref Repository repository, ref PackageFilter filter, string packageFormat, string projectId)
        {
            var repositoryCopy = repository;

            var versions =
                Directory.EnumerateDirectories(configuration.DataPath)
                    .SelectMany(
                        projectPath =>
                            Directory.EnumerateDirectories(projectPath)
                                .Select(
                                    versionPath =>
                                        new Version
                                        {
                                            Company = repositoryCopy.Company,
                                            Repository = repositoryCopy.Name,
                                            Project = Path.GetFileName(projectPath),
                                            Name = Path.GetFileName(versionPath),
                                            PackageFormat = packageFormat,
                                        })
                                .Where(version => GetPackagePathFromVersion(version, packageFormat) != null)
                                .Select(version => new Version
                                {
                                    Company = version.Company,
                                    Repository = version.Repository,
                                    Project = version.Project,
                                    Name = version.Name,
                                    PackageFormat = "SHA512",
                                    PackageHash =
                                        GetPackageSHA512(GetPackagePathFromVersion(version, packageFormat)),
                                })
                    )
                    .ToArray();

            // Reorder according semver
            List<Version> sortedVersions = versions.ToList();
            sortedVersions.Sort();
            sortedVersions.Reverse();

            foreach (var version in sortedVersions)
            {
                bool isLatest =
                    sortedVersions.Where(v => v.Project == version.Project && !v.Name.Contains("-"))
                        .Select(v => v.Name)
                        .FirstOrDefault() == version.Name;
                bool isAbsoluteLatest =
                    sortedVersions.Where(v => v.Project == version.Project)
                        .Select(v => v.Name)
                        .FirstOrDefault() ==
                    version.Name;
                var metadata =
                    new List<MetadataEntry>(
                        GetPackageMetadata(GetPackagePathFromVersion(version, packageFormat), packageFormat) ??
                        new MetadataEntry[0]);
                var metadataWrapper = new MetadataWrapper(metadata);
                metadataWrapper["IsLatestVersion"] = isLatest.ToString();
                metadataWrapper["IsAbsoluteLatestName"] = isAbsoluteLatest.ToString();
                version.Metadata = metadata.ToArray();
            }
            return sortedVersions.ToArray();
        }
        public Version[] GetPackages(ref Repository repository, ref PackageFilter filter, string packageFormat, string projectId)
        {
            var repositoryCopy = repository;

            var versions = (projectId == null ? Directory.EnumerateDirectories(configuration.DataPath) : Directory.EnumerateDirectories(configuration.DataPath, projectId))
                .SelectMany(
                    projectPath =>
                    Directory.EnumerateDirectories(projectPath)
                        .Select(
                            versionPath =>
                            new Version
                                {
                                    Company = repositoryCopy.Company,
                                    Repository = repositoryCopy.Name,
                                    Project = Path.GetFileName(projectPath),
                                    Name = Path.GetFileName(versionPath),
                                    PackageFormat = packageFormat,
                                })
                        .Where(version => GetPackagePathFromVersion(version, packageFormat) != null)
                        .Select(version => new Version
                                               {
                                                   Company = version.Company,
                                                   Repository = version.Repository,
                                                   Project = version.Project,
                                                   Name = version.Name,
                                                   PackageFormat = "SHA512",
                                                   PackageHash = GetPackageSHA512(GetPackagePathFromVersion(version, packageFormat)),
                                               })
                )
                .OrderByDescending(v => v.Name)
                .ToArray();

            foreach(var version in versions)
            {
                bool isLatest = versions.Where(v => v.Project == version.Project).Select(v => v.Name).FirstOrDefault() == version.Name;
                var metadata = new List<MetadataEntry>(GetPackageMetadata(GetPackagePathFromVersion(version, packageFormat), packageFormat) ?? new MetadataEntry[0]);
                var metadataWrapper = new MetadataWrapper(metadata);
                metadataWrapper["IsLatestVersion"] = isLatest.ToString();
                version.Metadata = metadata.ToArray();
            }
            return versions;
        }
        private static IList<MetadataEntry> GetMetadataEntries(IPackageMetadata package)
        {
            var metadata = new List<MetadataEntry>();
            var metadataWrapper = new MetadataWrapper(metadata);

            if (!package.Authors.IsEmpty())
                metadataWrapper["Authors"] = String.Join(",", package.Authors);

            if (!string.IsNullOrEmpty(package.Copyright))
                metadataWrapper["Copyrights"] = package.Copyright;

            if (!string.IsNullOrEmpty(package.Description))
                metadataWrapper["Description"] = package.Description;

            if (package.IconUrl != null)
                metadataWrapper["IconUrl"] = package.IconUrl.ToString();

            if (!string.IsNullOrEmpty(package.Language))
                metadataWrapper["Language"] = package.Language;

            if (package.LicenseUrl != null)
                metadataWrapper["LicenseUrl"] = package.LicenseUrl.ToString();

            if (!package.Owners.IsEmpty())
                metadataWrapper["Owners"] = String.Join(",", package.Owners);

            if (package.ProjectUrl != null)
                metadataWrapper["ProjectUrl"] = package.ProjectUrl.ToString();

            if (!string.IsNullOrEmpty(package.ReleaseNotes))
                metadataWrapper["ReleaseNotes"] = package.ReleaseNotes;

            metadataWrapper["RequireLicenseAcceptance"] = package.RequireLicenseAcceptance.ToString();

            if (!string.IsNullOrEmpty(package.Summary))
                metadataWrapper["Summary"] = package.Summary;

            if (!string.IsNullOrEmpty(package.Tags))
                metadataWrapper["Tags"] = package.Tags;

            if (!string.IsNullOrEmpty(package.Title))
                metadataWrapper["Title"] = package.Title;

            return metadata;
        }