From cb297c0e2ac45c70467b4ab70848adde17140f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9F=D0=B5=D1=80=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=B2?= Date: Fri, 18 Feb 2022 03:02:42 +0300 Subject: [PATCH 1/3] Modules graph --- .github/workflows/graph.yml | 22 +++++++ MODULES.md | 4 ++ build.gradle | 2 + projectDependencyGraph.gradle | 116 ++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 .github/workflows/graph.yml create mode 100644 MODULES.md create mode 100644 projectDependencyGraph.gradle diff --git a/.github/workflows/graph.yml b/.github/workflows/graph.yml new file mode 100644 index 0000000..58c0eb8 --- /dev/null +++ b/.github/workflows/graph.yml @@ -0,0 +1,22 @@ +generate-dependency-graph: + name: Generate Dependency Graph + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@v1 + + - name: Generate Dependency Graph + run: ./gradlew projectDependencyGraph + + - name: Commmit + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git diff --quiet && git diff --staged --quiet || git commit -am 'Update dependency graph' + - name: Push + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/MODULES.md b/MODULES.md new file mode 100644 index 0000000..c70aa4b --- /dev/null +++ b/MODULES.md @@ -0,0 +1,4 @@ +# Modules graph + +![](gradle/dependency-graph/project.dot.png) + diff --git a/build.gradle b/build.gradle index 53ec164..3595193 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,8 @@ apply plugin: 'signing' apply from: 'versions.gradle' apply from: 'publication.gradle' +apply from: 'projectDependencyGraph.gradle' + buildscript { repositories { google() diff --git a/projectDependencyGraph.gradle b/projectDependencyGraph.gradle new file mode 100644 index 0000000..2cb5b26 --- /dev/null +++ b/projectDependencyGraph.gradle @@ -0,0 +1,116 @@ +task projectDependencyGraph { + doLast { + def dot = new File(rootProject.rootDir, 'gradle/dependency-graph/project.dot') + dot.parentFile.mkdirs() + dot.delete() + + dot << 'digraph {\n' + dot << " graph [label=\"${rootProject.name}\\n \",labelloc=t,fontsize=30,ranksep=1.4];\n" + dot << ' node [style=filled, fillcolor="#bbbbbb"];\n' + dot << ' rankdir=TB;\n' + + def rootProjects = [] + def queue = [rootProject] + while (!queue.isEmpty()) { + def project = queue.remove(0) + rootProjects.add(project) + queue.addAll(project.childProjects.values()) + } + + def projects = new LinkedHashSet() + def dependencies = new LinkedHashMap, List>() + def multiplatformProjects = [] + def jsProjects = [] + def androidProjects = [] + def javaProjects = [] + + queue = [rootProject] + while (!queue.isEmpty()) { + def project = queue.remove(0) + queue.addAll(project.childProjects.values()) + + if (project.plugins.hasPlugin('org.jetbrains.kotlin.multiplatform')) { + multiplatformProjects.add(project) + } + if (project.plugins.hasPlugin('org.jetbrains.kotlin.js')) { + jsProjects.add(project) + } + if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { + androidProjects.add(project) + } + if (project.plugins.hasPlugin('java-library') || project.plugins.hasPlugin('java')) { + javaProjects.add(project) + } + + project.configurations.all { config -> + config.dependencies + .withType(ProjectDependency) + .collect { it.dependencyProject } + .each { dependency -> + projects.add(project) + projects.add(dependency) + rootProjects.remove(dependency) + + def graphKey = new Tuple2(project, dependency) + def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList() } + + if (config.name.toLowerCase().endsWith('implementation')) { + traits.add('style=dotted') + } + } + } + } + + projects = projects.sort { it.path } + + dot << '\n # Projects\n\n' + for (project in projects) { + def traits = [] + + if (rootProjects.contains(project)) { + traits.add('shape=box') + } + + if (multiplatformProjects.contains(project)) { + traits.add('fillcolor="#ffd2b3"') + } else if (jsProjects.contains(project)) { + traits.add('fillcolor="#ffffba"') + } else if (androidProjects.contains(project)) { + traits.add('fillcolor="#baffc9"') + } else if (javaProjects.contains(project)) { + traits.add('fillcolor="#ffb3ba"') + } else { + traits.add('fillcolor="#eeeeee"') + } + + dot << " \"${project.path}\" [${traits.join(", ")}];\n" + } + + dot << '\n {rank = same;' + for (project in projects) { + if (rootProjects.contains(project)) { + dot << " \"${project.path}\";" + } + } + dot << '}\n' + + dot << '\n # Dependencies\n\n' + dependencies.forEach { key, traits -> + dot << " \"${key.first.path}\" -> \"${key.second.path}\"" + if (!traits.isEmpty()) { + dot << " [${traits.join(", ")}]" + } + dot << '\n' + } + + dot << '}\n' + + def p = 'dot -Tpng -O project.dot'.execute([], dot.parentFile) + p.waitFor() + if (p.exitValue() != 0) { + throw new RuntimeException(p.errorStream.text) + } + + println("Project module dependency graph created at ${dot.absolutePath}.png") + } +} From 64b1aac4a9666e5099c5a7b4c95cfc5c789f50b6 Mon Sep 17 00:00:00 2001 From: Igor Perminov Date: Fri, 18 Feb 2022 03:08:05 +0300 Subject: [PATCH 2/3] Update graph.yml --- .github/workflows/graph.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/graph.yml b/.github/workflows/graph.yml index 58c0eb8..13ddfc8 100644 --- a/.github/workflows/graph.yml +++ b/.github/workflows/graph.yml @@ -1,4 +1,10 @@ -generate-dependency-graph: +name: Graph + +on: + workflow_dispatch: + +jobs: + generate-dependency-graph: name: Generate Dependency Graph runs-on: ubuntu-latest steps: @@ -15,8 +21,6 @@ generate-dependency-graph: run: | git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' - git diff --quiet && git diff --staged --quiet || git commit -am 'Update dependency graph' - - name: Push - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} + git add . + git commit -m "Update dependency graph" + git push From afc3d6f5aa58bf6725368af05bdcf04e80658072 Mon Sep 17 00:00:00 2001 From: Igor Perminov Date: Fri, 18 Feb 2022 03:13:32 +0300 Subject: [PATCH 3/3] Update graph.yml --- .github/workflows/graph.yml | 40 ++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/.github/workflows/graph.yml b/.github/workflows/graph.yml index 13ddfc8..c6d2d62 100644 --- a/.github/workflows/graph.yml +++ b/.github/workflows/graph.yml @@ -1,26 +1,30 @@ -name: Graph +name: CI_Graph on: - workflow_dispatch: + push: + branches: + - master jobs: generate-dependency-graph: - name: Generate Dependency Graph - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 + name: Generate Dependency Graph + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 - - name: Setup Graphviz - uses: ts-graphviz/setup-graphviz@v1 + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@v1 - - name: Generate Dependency Graph - run: ./gradlew projectDependencyGraph + - name: Generate Dependency Graph + run: ./gradlew projectDependencyGraph - - name: Commmit - run: | - git config --local user.email 'action@github.com' - git config --local user.name 'GitHub Action' - git add . - git commit -m "Update dependency graph" - git push + - name: Commmit + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git diff --quiet && git diff --staged --quiet || git commit -am 'Update dependency graph' + - name: Push + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }}