Skip to content

Commit c0bb2b6

Browse files
authored
feat: Add support for exporting raw dependencies (#973)
* feat: Add support for exporting raw dependencies plugin can accept two project parameters * exportDependencies: to enable exporting of raw dependencies * exportDependenciesFile: Name with optional relative path from the root of the project where the dependencies will be exported ( default: .okbuck/raw-deps ) Supports exporting raw dependencies in JSON format. ``` ./gradlew okbuck -PexportDependencies=true -PexportDependenciesFile=.okbuck/raw-deps.json ``` * Moved configurations to OKBuckExtension and handle excludeRule to use group:module when both are not blank * * Addressed review comments * Ran google formatter * Autoclose BufferedWriter to flush the contents and close
1 parent 7faa0c9 commit c0bb2b6

File tree

9 files changed

+236
-52
lines changed

9 files changed

+236
-52
lines changed

buildSrc/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
GROUP=com.uber
2-
VERSION_NAME=0.53.0-SNAPSHOT
2+
VERSION_NAME=0.53.1-SNAPSHOT
33
POM_DESCRIPTION=A Gradle plugin that lets developers utilize the Buck build system on a Gradle project
44
POM_URL=https://github.com/uber/okbuck/
55
POM_SCM_URL=https://github.com/uber/okbuck/

buildSrc/src/main/java/com/uber/okbuck/OkBuckGradlePlugin.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.uber.okbuck.core.annotation.AnnotationProcessorCache;
66
import com.uber.okbuck.core.dependency.DependencyCache;
77
import com.uber.okbuck.core.dependency.DependencyFactory;
8+
import com.uber.okbuck.core.dependency.exporter.DependencyExporter;
9+
import com.uber.okbuck.core.dependency.exporter.JsonDependencyExporter;
810
import com.uber.okbuck.core.manager.BuckFileManager;
911
import com.uber.okbuck.core.manager.BuckManager;
1012
import com.uber.okbuck.core.manager.D8Manager;
@@ -32,6 +34,11 @@
3234
import com.uber.okbuck.template.common.ExportFile;
3335
import com.uber.okbuck.template.core.Rule;
3436
import com.uber.okbuck.wrapper.BuckWrapperTask;
37+
import org.gradle.api.Plugin;
38+
import org.gradle.api.Project;
39+
import org.gradle.api.Task;
40+
import org.gradle.api.artifacts.Configuration;
41+
3542
import java.io.File;
3643
import java.io.FileOutputStream;
3744
import java.io.IOException;
@@ -42,10 +49,6 @@
4249
import java.util.Set;
4350
import java.util.function.Function;
4451
import java.util.stream.Collectors;
45-
import org.gradle.api.Plugin;
46-
import org.gradle.api.Project;
47-
import org.gradle.api.Task;
48-
import org.gradle.api.artifacts.Configuration;
4952

5053
// Dependency Tree
5154
//
@@ -156,7 +159,9 @@ public void apply(Project rootProject) {
156159
new AnnotationProcessorCache(rootBuckProject, buckFileManager, processorBuildFile);
157160

158161
// Create Dependency manager
159-
dependencyManager = new DependencyManager(rootBuckProject, okbuckExt, buckFileManager);
162+
dependencyManager =
163+
new DependencyManager(
164+
rootBuckProject, okbuckExt, buckFileManager, createDependencyExporter(okbuckExt));
160165

161166
// Create Lint Manager
162167
String lintBuildFile = LINT_BUILD_FOLDER + "/" + okbuckExt.buildFileName;
@@ -238,10 +243,7 @@ public void apply(Project rootProject) {
238243
wrapper.ignoredDirs);
239244

240245
Map<String, Configuration> extraConfigurations =
241-
okbuckExt
242-
.extraDepCachesMap
243-
.keySet()
244-
.stream()
246+
okbuckExt.extraDepCachesMap.keySet().stream()
245247
.collect(
246248
Collectors.toMap(
247249
Function.identity(),
@@ -315,9 +317,7 @@ public void apply(Project rootProject) {
315317
rootOkBuckTask.dependsOn(okBuckClean);
316318

317319
// Create okbuck task on each project to generate their buck file
318-
okbuckExt
319-
.buckProjects
320-
.stream()
320+
okbuckExt.buckProjects.stream()
321321
.filter(p -> p.getBuildFile().exists())
322322
.forEach(
323323
bp -> {
@@ -338,9 +338,7 @@ public void apply(Project rootProject) {
338338

339339
private void writeExportedFileRules(Project rootBuckProject, OkBuckExtension okBuckExtension) {
340340
Set<String> currentProjectPaths =
341-
okBuckExtension
342-
.buckProjects
343-
.stream()
341+
okBuckExtension.buckProjects.stream()
344342
.filter(project -> ProjectUtil.getType(project) != ProjectType.UNKNOWN)
345343
.map(
346344
project ->
@@ -369,14 +367,16 @@ private void writeExportedFileRules(Project rootBuckProject, OkBuckExtension okB
369367
.toFile();
370368
try (OutputStream os =
371369
new FileOutputStream(buckFile, currentProjectPaths.contains(entry.getKey()))) {
372-
entry
373-
.getValue()
374-
.stream()
370+
entry.getValue().stream()
375371
.sorted((rule1, rule2) -> rule1.name().compareToIgnoreCase(rule2.name()))
376372
.forEach(rule -> rule.render(os));
377373
} catch (IOException e) {
378374
throw new IllegalStateException(e);
379375
}
380376
}
381377
}
378+
379+
private static DependencyExporter createDependencyExporter(OkBuckExtension okbuckExt) {
380+
return new JsonDependencyExporter(okbuckExt.getExportDependenciesExtension());
381+
}
382382
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.uber.okbuck.core.dependency.exporter;
2+
3+
import org.gradle.api.artifacts.ExternalDependency;
4+
5+
import java.util.Set;
6+
7+
public interface DependencyExporter {
8+
9+
void export(Set<ExternalDependency> dependencies);
10+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.uber.okbuck.core.dependency.exporter;
2+
3+
import org.codehaus.plexus.util.StringUtils;
4+
import org.gradle.api.artifacts.ExternalDependency;
5+
6+
import javax.annotation.Nullable;
7+
import java.util.Set;
8+
import java.util.TreeSet;
9+
import java.util.stream.Collectors;
10+
11+
public class DependencyExporterModel {
12+
13+
@Nullable private final String name;
14+
@Nullable private final String version;
15+
@Nullable private final String group;
16+
private final boolean force;
17+
@Nullable private Set<String> excludeRules = new TreeSet<>();
18+
19+
public DependencyExporterModel(ExternalDependency externalDependency) {
20+
name = externalDependency.getName();
21+
version = externalDependency.getVersion();
22+
group = externalDependency.getGroup();
23+
force = externalDependency.isForce();
24+
25+
if (externalDependency.getExcludeRules() != null) {
26+
excludeRules =
27+
externalDependency.getExcludeRules()
28+
.stream()
29+
.map(
30+
e -> {
31+
if (StringUtils.isNotBlank(e.getGroup())
32+
&& StringUtils.isNotBlank(e.getModule())) {
33+
return String.format("%s:%s", e.getGroup(), e.getModule());
34+
}
35+
36+
if (StringUtils.isNotBlank(e.getGroup())) {
37+
return e.getGroup();
38+
}
39+
40+
if (StringUtils.isNotBlank(e.getModule())) {
41+
return e.getModule();
42+
}
43+
return null;
44+
})
45+
.collect(Collectors.toSet());
46+
}
47+
}
48+
49+
@Nullable
50+
public String getName() {
51+
return name;
52+
}
53+
54+
@Nullable
55+
public String getVersion() {
56+
return version;
57+
}
58+
59+
@Nullable
60+
public String getGroup() {
61+
return group;
62+
}
63+
64+
public boolean isForce() {
65+
return force;
66+
}
67+
68+
@Nullable
69+
public Set<String> getExcludeRules() {
70+
return excludeRules;
71+
}
72+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.uber.okbuck.core.dependency.exporter;
2+
3+
public class ExporterException extends RuntimeException {
4+
public ExporterException(Exception e) {
5+
super(e);
6+
}
7+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.uber.okbuck.core.dependency.exporter;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import com.uber.okbuck.extension.ExportDependenciesExtension;
6+
import org.gradle.api.artifacts.ExternalDependency;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import java.io.BufferedWriter;
11+
import java.io.IOException;
12+
import java.nio.charset.StandardCharsets;
13+
import java.nio.file.Files;
14+
import java.nio.file.Paths;
15+
import java.util.Set;
16+
import java.util.stream.Collectors;
17+
18+
public class JsonDependencyExporter implements DependencyExporter {
19+
20+
private static final Logger LOG = LoggerFactory.getLogger(JsonDependencyExporter.class);
21+
22+
private final ExportDependenciesExtension exportDependenciesExtension;
23+
24+
public JsonDependencyExporter(ExportDependenciesExtension exportDependenciesExtension) {
25+
this.exportDependenciesExtension = exportDependenciesExtension;
26+
}
27+
28+
@Override
29+
public void export(Set<ExternalDependency> dependencies) {
30+
if (!exportDependenciesExtension.isEnabled()) {
31+
LOG.info("Exporting dependencies is disabled");
32+
return;
33+
}
34+
35+
Set<DependencyExporterModel> dependencyModels =
36+
dependencies.stream()
37+
.map(dependency -> new DependencyExporterModel(dependency))
38+
.collect(Collectors.toSet());
39+
40+
Gson gson = new GsonBuilder().setPrettyPrinting().create();
41+
try (BufferedWriter writer =
42+
Files.newBufferedWriter(
43+
Paths.get(exportDependenciesExtension.getFile()), StandardCharsets.UTF_8)) {
44+
LOG.info("Exporting dependencies to JSON at " + exportDependenciesExtension.getFile());
45+
gson.toJson(dependencyModels, writer);
46+
} catch (IOException e) {
47+
throw new ExporterException(e);
48+
}
49+
}
50+
}

buildSrc/src/main/java/com/uber/okbuck/core/manager/DependencyManager.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.uber.okbuck.core.manager;
22

3-
import static com.uber.okbuck.core.dependency.OResolvedDependency.AAR;
4-
import static com.uber.okbuck.core.dependency.OResolvedDependency.JAR;
5-
63
import com.google.common.base.Joiner;
74
import com.google.common.base.Preconditions;
85
import com.google.common.collect.ImmutableList;
@@ -21,6 +18,7 @@
2118
import com.uber.okbuck.core.dependency.LocalOExternalDependency;
2219
import com.uber.okbuck.core.dependency.OExternalDependency;
2320
import com.uber.okbuck.core.dependency.VersionlessDependency;
21+
import com.uber.okbuck.core.dependency.exporter.DependencyExporter;
2422
import com.uber.okbuck.core.model.base.Scope;
2523
import com.uber.okbuck.core.util.FileUtil;
2624
import com.uber.okbuck.core.util.ProjectCache;
@@ -30,6 +28,14 @@
3028
import com.uber.okbuck.extension.OkBuckExtension;
3129
import com.uber.okbuck.template.common.BazelFunctionRule;
3230
import com.uber.okbuck.template.core.Rule;
31+
import org.apache.commons.io.FileUtils;
32+
import org.gradle.api.Project;
33+
import org.gradle.api.artifacts.Configuration;
34+
import org.gradle.api.artifacts.Dependency;
35+
import org.gradle.api.artifacts.ExternalDependency;
36+
import org.gradle.api.artifacts.ResolvedConfiguration;
37+
import org.gradle.api.artifacts.ResolvedDependency;
38+
3339
import java.io.File;
3440
import java.io.IOException;
3541
import java.nio.file.Path;
@@ -43,13 +49,9 @@
4349
import java.util.Set;
4450
import java.util.stream.Collectors;
4551
import java.util.stream.IntStream;
46-
import org.apache.commons.io.FileUtils;
47-
import org.gradle.api.Project;
48-
import org.gradle.api.artifacts.Configuration;
49-
import org.gradle.api.artifacts.Dependency;
50-
import org.gradle.api.artifacts.ExternalDependency;
51-
import org.gradle.api.artifacts.ResolvedConfiguration;
52-
import org.gradle.api.artifacts.ResolvedDependency;
52+
53+
import static com.uber.okbuck.core.dependency.OResolvedDependency.AAR;
54+
import static com.uber.okbuck.core.dependency.OResolvedDependency.JAR;
5355

5456
public class DependencyManager {
5557

@@ -67,13 +69,17 @@ public class DependencyManager {
6769

6870
private final HashMap<String, String> sha256Cache;
6971

72+
private final DependencyExporter dependencyExporter;
73+
7074
public DependencyManager(
71-
Project rootProject, OkBuckExtension okBuckExtension, BuckFileManager buckFileManager) {
75+
Project rootProject, OkBuckExtension okBuckExtension, BuckFileManager buckFileManager,
76+
DependencyExporter dependencyExporter) {
7277

7378
this.project = rootProject;
7479
this.externalDependenciesExtension = okBuckExtension.getExternalDependenciesExtension();
7580
this.jetifierExtension = okBuckExtension.getJetifierExtension();
7681
this.buckFileManager = buckFileManager;
82+
this.dependencyExporter = dependencyExporter;
7783
this.sha256Cache = initSha256Cache(rootProject, externalDependenciesExtension);
7884
}
7985

@@ -145,6 +151,8 @@ private static void resolveDepsWithProject(
145151
}
146152

147153
public void finalizeDependencies(OkBuckExtension okBuckExtension) {
154+
dependencyExporter.export(rawDependencies);
155+
148156
Map<VersionlessDependency, Collection<OExternalDependency>> filteredDependencyMap =
149157
filterDependencies();
150158

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.uber.okbuck.extension;
2+
3+
import org.gradle.api.Project;
4+
import org.gradle.api.tasks.Input;
5+
import org.gradle.api.tasks.Optional;
6+
7+
import java.nio.file.Paths;
8+
9+
public class ExportDependenciesExtension {
10+
@Input private boolean enabled = false;
11+
@Input @Optional private String file = ".okbuck/raw-deps";
12+
13+
private final String projectRoot;
14+
15+
public ExportDependenciesExtension(Project project) {
16+
projectRoot = project.getProjectDir().getAbsolutePath();
17+
}
18+
19+
public boolean isEnabled() {
20+
return enabled;
21+
}
22+
23+
public String getFile() {
24+
return Paths.get(projectRoot, file).toString();
25+
}
26+
}

0 commit comments

Comments
 (0)