All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alexvasilkov.vcs.VcsSettingsPlugin.groovy Maven / Gradle / Ivy

package com.alexvasilkov.vcs

import com.alexvasilkov.vcs.dependency.GitDependency
import com.alexvasilkov.vcs.dependency.SvnDependency
import com.alexvasilkov.vcs.dependency.VcsDependency
import com.alexvasilkov.vcs.util.CredentialsHelper
import com.alexvasilkov.vcs.util.DependenciesHelper
import com.alexvasilkov.vcs.util.GitHelper
import com.alexvasilkov.vcs.util.SvnHelper
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.initialization.Settings
import org.gradle.initialization.BaseSettings
import org.gradle.initialization.DefaultProjectDescriptor

class VcsSettingsPlugin implements Plugin {

    private DependenciesHelper dependencies = new DependenciesHelper()
    private GroovyShell shell = new GroovyShell()

    void apply(Settings settings) {
        // Adding configuration method
        settings.metaClass.vcs = VcsProperties.instance.&apply

        CredentialsHelper.init(settings.gradle)

        settings.gradle.settingsEvaluated { BaseSettings s ->
            resolveDependenciesRecursively(s, s.projectDescriptorRegistry.allProjects)
            cleanup(s)
        }

        // Adding created vcs projects dependencies for each project
        settings.gradle.afterProject { Project p ->
            dependencies.get(p.name).each { VcsDependency d ->
                p.dependencies.add('compile', p.project(projectName(d)))
            }
        }
    }


    void resolveDependenciesRecursively(BaseSettings s, Set projects) {
        Set newProjects = new HashSet<>()

        // Building vcs dependencies list by invoking build.gradle#vcs() method for each project
        projects.each { DefaultProjectDescriptor project ->

            if (project.buildFile.exists()) {
                Script script = shell.parse(project.buildFile)

                // Checks if there is a vcs dependencies configuration method
                if (script.metaClass.respondsTo(script, 'vcs')) {
                    // Adding git method
                    script.binding.setVariable('git', { Map params ->
                        dependencies.add(project.name, new GitDependency(project, params))
                    })

                    // Adding svn method
                    script.binding.setVariable('svn', { Map params ->
                        dependencies.add(project.name, new SvnDependency(project, params))
                    })

                    // Executing configuration method
                    script.vcs()

                    // Initializing vcs repositories. Including vcs project dependencies.
                    dependencies.get(project.name).each { VcsDependency d ->
                        if (d instanceof SvnDependency) {
                            SvnHelper.init((SvnDependency) d)
                        }
                        if (d instanceof GitDependency) {
                            GitHelper.init((GitDependency) d)
                        }

                        s.include(projectName(d))
                        DefaultProjectDescriptor newProject = s.project(projectName(d))
                        newProject.projectDir = d.projectDir
                        newProjects.add(newProject)
                    }
                }
            }

        }

        // If we have new projects we should process them too
        if (newProjects) resolveDependenciesRecursively(s, newProjects)
    }


    private void cleanup(BaseSettings s) {
        if (VcsProperties.instance.cleanup) {
            // Cleaning up unused directories and files
            File libsDir = VcsDependency.getDefaultDir(s.defaultProject)
            libsDir.listFiles().each { File dir ->
                boolean found = false
                dependencies.all().each { VcsDependency d ->
                    if (dir == d.repoDir) found = true
                }
                if (!found) dir.deleteDir()
            }
            if (!libsDir.list()) libsDir.deleteDir()
        }
    }


    private static String projectName(VcsDependency d) {
        return ":${d.name}"
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy