Example #1
0
 public bool CanPublishPackage(ILocalPackage package)
 {
     return(package is IDotNetLocalPackage &&
            package.PublishName.StartsWith(_repositoryFilter.ProjectPrefix) &&
            !package.PublishName.EndsWith(".Sample") &&
            !package.PublishName.EndsWith(".Tests"));
 }
Example #2
0
    public bool CanPublishPackage(ILocalPackage package)
    {
        var folderPathName = Path.GetFileName(package.FolderPath);

        return(package is INodeJsLocalPackage &&
               folderPathName.StartsWith(_repositoryFilter.ProjectPrefix));
    }
Example #3
0
    public async Task BuildPackageAsync(
        ILocalPackage package,
        IRemoteSourceControlRepository repository)
    {
        var nugetPackage = (IDotNetLocalPackage)package;

        foreach (var preprocessor in _dotNetLocalPackagePreprocessors)
        {
            await preprocessor.PreprocessPackageAsync(nugetPackage);
        }

        await UpdateProjectFileAsync(
            nugetPackage,
            repository);

        DotNetHelper.RestorePackages(nugetPackage.FolderPath);
        DotNetHelper.Build(nugetPackage.FolderPath);

        var folderDirectory         = new DirectoryInfo(nugetPackage.FolderPath);
        var targetTestDirectoryPath = folderDirectory.Name + ".Tests";
        var testDirectory           = folderDirectory
                                      .Parent
                                      .GetDirectories()
                                      .SingleOrDefault(x => x.Name == targetTestDirectoryPath);

        if (testDirectory != null)
        {
            Console.WriteLine("Test directory for package " + nugetPackage.PublishName + " found at " + testDirectory.FullName + ".");
            DotNetHelper.Test(testDirectory.FullName);
        }
        else
        {
            Console.WriteLine("No test directory for package " + nugetPackage.PublishName + " found.");
        }
    }
Example #4
0
    public async Task UpsertPackageAsync(ILocalPackage package)
    {
        Console.WriteLine("Upserting package " + package.PublishName + " version " + package.Version + " to remote package repository.");

        await NpmHelper.PublishAsync(
            package.FolderPath,
            _npmSettings.AuthToken);

        package.PublishUrl = $"https://www.npmjs.com/package/{package.PublishName}/v/{package.Version}";
    }
Example #5
0
    public async Task <bool?> DoesPackageWithVersionExistAsync(ILocalPackage package)
    {
        using var client = new HttpClient();
        var response = await client.GetAsync($"https://api.nuget.org/packages/{package.PublishName.ToLowerInvariant()}.{package.Version}.nupkg");

        if (response.StatusCode != HttpStatusCode.NotFound && response.IsSuccessStatusCode)
        {
            return(true);
        }

        return(false);
    }
Example #6
0
    public async Task UpsertPackageAsync(ILocalPackage package)
    {
        Console.WriteLine("Upserting package " + package.PublishName + " version " + package.Version + " to remote package repository.");

        var basePath = Path.Combine(
            package.FolderPath,
            package.PublishName + "." + package.Version);

        await NuGetHelper.PublishAsync(
            basePath + ".nupkg",
            _nuGetSettings.ApiKey);

        package.PublishUrl = $"https://www.nuget.org/packages/{package.PublishName}/{package.Version}";
    }
    public async Task BuildPackageAsync(
        ILocalPackage package,
        IRemoteSourceControlRepository repository)
    {
        var nugetPackage = (INodeJsLocalPackage)package;

        await UpdateProjectFileAsync(
            nugetPackage,
            repository);

        NodeJsHelper.RestorePackages(package.FolderPath);
        NodeJsHelper.Build(nugetPackage.FolderPath);
        NodeJsHelper.Test(nugetPackage.FolderPath);
    }
Example #8
0
    public async Task RegisterPackageReleaseAsync(ILocalPackage package)
    {
        if (package.Version == null)
        {
            return;
        }

        if (package.PublishName == null)
        {
            return;
        }

        if (package.PublishUrl == null)
        {
            return;
        }

        var versionSlug = "v" + package.Version;

        var allReleases = await this._client.Repository.Release.GetAll(Owner, Name);

        var descriptionLine = "**" + package.PublishName + "**" + Environment.NewLine + package.PublishUrl;
        var existingRelease = allReleases.SingleOrDefault(x => x.TagName == versionSlug);

        if (existingRelease != null)
        {
            if (existingRelease.Body.Contains(descriptionLine))
            {
                return;
            }

            await this._client.Repository.Release.Edit(Owner, Name, existingRelease.Id, new ReleaseUpdate()
            {
                Body = existingRelease.Body + Environment.NewLine + Environment.NewLine + descriptionLine
            });
        }
        else
        {
            await this._client.Repository.Release.Create(Owner, Name, new NewRelease(versionSlug)
            {
                Name = versionSlug,
                Body = $"Published automatically by https://github.com/ffMathy/FluffySpoon.Publishers." +
                       Environment.NewLine + Environment.NewLine + descriptionLine
            });
        }
    }
    private async Task RefreshPackageAsync(
        ILocalPackage package,
        IRemoteSourceControlRepository repository)
    {
        foreach (var remotePackageSystem in _remotePackageSystems)
        {
            var processor = package.Processor;

            if (!remotePackageSystem.CanPublishPackage(package))
            {
                continue;
            }

            try
            {
                await processor.BuildPackageAsync(
                    package,
                    repository);

                var doesPackageExist = await remotePackageSystem.DoesPackageWithVersionExistAsync(package);

                if (doesPackageExist.HasValue && doesPackageExist.Value)
                {
                    Console.WriteLine("Can't publish package " + package.PublishName + " because it already exists");
                    continue;
                }

                await remotePackageSystem.UpsertPackageAsync(package);
            }
            catch (CommandLineException ex)
            {
                Console.WriteLine("Could not refresh the package " + package.PublishName + ". " + ex);
            }
        }

        await repository.RegisterPackageReleaseAsync(package);
    }
Example #10
0
    private async Task PrepareProjectFileForPushingAsync(
        ILocalPackage package,
        IRemoteSourceControlRepository repository,
        XDocument projectFileXml)
    {
        var system = repository.System;

        var revision = await system.GetRevisionOfRepository(repository);

        Console.WriteLine("Updating project revision " + revision + " of project file for package " + package.PublishName);

        var projectUrlElement        = GetPackageProjectUrlElement(projectFileXml);
        var descriptionElement       = GetDescriptionElement(projectFileXml);
        var versionElement           = GetProjectFileVersionElement(projectFileXml);
        var repositoryUrlElement     = GetPackageRepositoryUrlElement(projectFileXml);
        var repositoryTypeElement    = GetPackageRepositoryTypeElement(projectFileXml);
        var packageReadmeFileElement = GetPackageReadmeFileElement(projectFileXml);

        if (!Version.TryParse(versionElement.Value, out Version? existingVersion))
        {
            existingVersion = new Version(1, 0, 0, 0);
        }

        projectUrlElement.Value        = repository.PublicUrl ?? string.Empty;
        descriptionElement.Value       = repository.Summary ?? string.Empty;
        versionElement.Value           = package.Version = $"{existingVersion.Major}.{existingVersion.Minor+revision}.{existingVersion.Build}";
        repositoryUrlElement.Value     = repository.ContributeUrl;
        repositoryTypeElement.Value    = "git";
        packageReadmeFileElement.Value = "README.md";

        var readmeIncludeElement = _projectFileParser.CreateItemGroupElement(projectFileXml, "None");

        readmeIncludeElement.SetAttributeValue("Include", "../../README.md");
        readmeIncludeElement.SetAttributeValue("Pack", "true");
        readmeIncludeElement.SetAttributeValue("PackagePath", "\\");
    }
Example #11
0
 public Task <bool?> DoesPackageWithVersionExistAsync(ILocalPackage package)
 {
     return(Task.FromResult <bool?>(null));
 }