Skip to content
Snippets Groups Projects
Commit 1c1fdb89 authored by Sebastian's avatar Sebastian
Browse files

Add plugin in buildSrc to provide some build metadata to app at runtime

parent 4c0b42eb
No related branches found
No related tags found
1 merge request!90Add plugin in buildSrc to provide some build metadata to app at runtime
Showing
with 246 additions and 0 deletions
......@@ -36,6 +36,7 @@ plugins {
id("java")
id("idea")
id("org.jlleitschuh.gradle.ktlint") version "10.1.0"
id("org.briarproject.briar.desktop.build-data-gradle-plugin")
}
group = "app.briar.desktop"
......@@ -50,6 +51,10 @@ allprojects {
}
}
buildData {
packageName = "org.briarproject.briar.desktop"
}
dependencies {
implementation(compose.desktop.currentOs)
implementation(compose.materialIconsExtended)
......
apply plugin: 'java'
package org.briarproject.briar.desktop.builddata;
import org.gradle.api.internal.ConventionTask;
import org.gradle.api.logging.Logger;
import org.gradle.api.tasks.Nested;
public abstract class AbstractBuildDataTask extends ConventionTask {
protected final Logger logger = getLogger();
@Nested
protected BuildDataPluginExtension configuration;
public BuildDataPluginExtension getConfiguration() {
return configuration;
}
public void setConfiguration(BuildDataPluginExtension configuration) {
this.configuration = configuration;
}
}
package org.briarproject.briar.desktop.builddata;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.logging.Logger;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSet;
import java.nio.file.Path;
public class BuildDataPlugin implements Plugin<Project> {
@Override
public void apply(final Project project) {
Logger logger = project.getLogger();
logger.info("applying version access plugin");
BuildDataPluginExtension extension = project.getExtensions().create(
"buildData", BuildDataPluginExtension.class);
GenerateBuildDataSourceTask task = project.getTasks().create(
"buildData", GenerateBuildDataSourceTask.class);
task.setConfiguration(extension);
project.getTasks().findByName("compileJava").dependsOn(task);
Path pathBuildDir = project.getBuildDir().toPath();
Path source = Util.getSourceDir(pathBuildDir);
SourceSet sourceSets = project.getConvention()
.getPlugin(JavaPluginConvention.class).getSourceSets()
.findByName("main");
sourceSets.java(sourceSet -> {
sourceSet.srcDir(source);
});
}
}
package org.briarproject.briar.desktop.builddata;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
public class BuildDataPluginExtension {
@Input
private String packageName;
@Input
@Optional
private String className;
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
package org.briarproject.briar.desktop.builddata;
class FileBuilder {
private static String nl = System.getProperty("line.separator");
private StringBuilder buffer = new StringBuilder();
void append(String string) {
buffer.append(string);
}
void line() {
buffer.append(nl);
}
void line(String string) {
buffer.append(string);
buffer.append(nl);
}
public String toString() {
return buffer.toString();
}
}
package org.briarproject.briar.desktop.builddata;
import org.gradle.api.Project;
import org.gradle.api.tasks.TaskAction;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class GenerateBuildDataSourceTask extends AbstractBuildDataTask {
public GenerateBuildDataSourceTask() {
setGroup("build");
}
@TaskAction
protected void generateSource() throws IOException {
Project project = getProject();
String packageName = configuration.getPackageName();
String className = configuration.getClassName();
if (className == null) {
className = "BuildData";
}
String version = project.getVersion().toString();
long buildTime = System.currentTimeMillis();
// TODO: fetch correct current git hash using JGit in a platform-independent way
String gitHash = "abcdefgh";
if (packageName == null) {
throw new IllegalStateException("Please specify 'packageName'.");
}
String[] parts = packageName.split("\\.");
Path pathBuildDir = project.getBuildDir().toPath();
Path source = Util.getSourceDir(pathBuildDir);
Path path = source;
for (int i = 0; i < parts.length; i++) {
path = path.resolve(parts[i]);
}
Files.createDirectories(path);
Path file = path.resolve(className + ".java");
String content =
createSource(packageName, className, version, buildTime,
gitHash);
InputStream in = new ByteArrayInputStream(
content.getBytes(StandardCharsets.UTF_8));
Files.copy(in, file, StandardCopyOption.REPLACE_EXISTING);
}
private String createSource(String packageName, String className,
String version, long timestamp, String gitHash) {
FileBuilder buffer = new FileBuilder();
// // this file is generated, do not edit
// package org.briarproject.briar.desktop;
//
// public class BuildData {
buffer.line("// this file is generated, do not edit");
buffer.line("package " + packageName + ";");
buffer.line();
buffer.line("public class " + className + " {");
buffer.line();
// public static String getVersion() {
// return "0.1";
// }
buffer.line(" public static String getVersion() {");
buffer.line(" return \"" + version + "\";");
buffer.line(" }");
// public static long getBuildTime() {
// return 1641645802088L;
// }
buffer.line(" public static long getBuildTime() {");
buffer.line(" return " + timestamp + "L;");
buffer.line(" }");
// public static long getGitHash() {
// return "749dda081c3e7862050255817bc239b9255b1582";
// }
buffer.line(" public static String getGitHash() {");
buffer.line(" return \"" + gitHash + "\";");
buffer.line(" }");
buffer.line();
buffer.line("}");
return buffer.toString();
}
}
package org.briarproject.briar.desktop.builddata;
import java.nio.file.Path;
class Util {
static Path getSourceDir(Path pathBuildDir) {
return pathBuildDir.resolve("generatedBuildData");
}
}
implementation-class=org.briarproject.briar.desktop.builddata.BuildDataPlugin
......@@ -8,6 +8,7 @@ import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.flag
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.types.int
import mu.KotlinLogging
import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT
......@@ -22,6 +23,9 @@ import java.lang.System.getProperty
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.time.Instant
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.logging.Level.ALL
import java.util.logging.Level.INFO
import java.util.logging.Level.WARNING
......@@ -32,6 +36,11 @@ private class Main : CliktCommand(
name = "briar-desktop",
help = i18n("main.help.title")
) {
companion object {
private val LOG = KotlinLogging.logger {}
}
private val debug by option("--debug", "-d", help = i18n("main.help.debug")).flag(
default = false
)
......@@ -65,6 +74,12 @@ private class Main : CliktCommand(
LogUtils.setupLogging(level)
val buildTime = Instant.ofEpochMilli(BuildData.getBuildTime()).atZone(ZoneId.systemDefault()).toLocalDateTime()
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
LOG.info { "This is briar-desktop version ${BuildData.getVersion()}" }
LOG.info { "Build time ${formatter.format(buildTime)}" }
LOG.info { "Built from Git hash ${BuildData.getGitHash()}" }
val dataDir = getDataDir()
val app =
DaggerBriarDesktopApp.builder().desktopModule(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment