From 5f0724f241659c9cfe7631d4662b60a7ed0df164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Spo=CC=88nemann?= Date: Wed, 8 Jun 2016 11:22:17 +0200 Subject: [PATCH] Created first draft of splitting file, implemented validation of splitting file --- splitting/build.gradle | 21 +- splitting/splitting.txt | 254 ++++++++++++++++++ .../eclipse/xtext/splitting/FindProjects.java | 10 +- .../xtext/splitting/ValidateSplitting.java | 96 +++++++ 4 files changed, 372 insertions(+), 9 deletions(-) create mode 100644 splitting/splitting.txt create mode 100644 splitting/src/org/eclipse/xtext/splitting/ValidateSplitting.java diff --git a/splitting/build.gradle b/splitting/build.gradle index 1e8f89124..e930d415a 100644 --- a/splitting/build.gradle +++ b/splitting/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'java' -def splitDir = file("$buildDir/splitting") - sourceSets.main.java.srcDirs = ['src'] -def splittingPath = "$buildDir/splitting" -def allHistoryFiles = file(splittingPath + "/all-files.txt") -def allProjects = file(splittingPath + "/all-projects.txt") -def unmappedPaths = file(splittingPath + "/unmapped-paths.txt") +def outputFilesDir = "$buildDir/splitting" +def allHistoryFiles = file(outputFilesDir + "/all-files.txt") +def allProjects = file(outputFilesDir + "/all-projects.txt") +def unmappedPaths = file(outputFilesDir + "/unmapped-paths.txt") +def splittingFile = file("splitting.txt") task listFiles(type: Exec) { outputs.file allHistoryFiles @@ -25,5 +24,13 @@ task findProjects(type: JavaExec) { outputs.files allProjects, unmappedPaths classpath = sourceSets.main.runtimeClasspath.filter{it.exists()} main = "org.eclipse.xtext.splitting.FindProjects" - args splittingPath + args outputFilesDir +} + +task validateSplitting(type: JavaExec) { + dependsOn(sourceSets.main.runtimeClasspath, listFiles) + inputs.files splittingFile, allHistoryFiles + classpath = sourceSets.main.runtimeClasspath.filter{it.exists()} + main = "org.eclipse.xtext.splitting.ValidateSplitting" + args splittingFile, outputFilesDir } diff --git a/splitting/splitting.txt b/splitting/splitting.txt new file mode 100644 index 000000000..8b45a6d0c --- /dev/null +++ b/splitting/splitting.txt @@ -0,0 +1,254 @@ +plugins/org.eclipse.xtext >> core +plugins/org.eclipse.xtext.core >> core +plugins/org.eclipse.xtext.ide >> core +plugins/org.eclipse.xtext.util >> core +plugins/org.eclipse.xtext.xtext.generator >> core +plugins/org.eclipse.xtext.xtext.wizard >> core +tests/org.eclipse.xtext.tests >> core, extras +tests/org.eclipse.xtext.ide.tests >> core +devtools/org.eclipse.xtext.bootstrap >> core +devtools/org.eclipse.xtext.contributor >> core + +devtools/org.eclipse.xtext.language-generator >> extras +plugins/org.eclipse.xtext.builder.standalone >> extras +plugins/org.eclipse.xtext.common.types >> extras +plugins/org.eclipse.xtext.ecore >> extras +plugins/org.eclipse.xtext.generator >> extras +plugins/org.eclipse.xtext.generator.parser >> extras +plugins/org.eclipse.xtext.index >> extras +plugins/org.eclipse.xtext.java >> extras +plugins/org.eclipse.xtext.purexbase >> extras +plugins/org.eclipse.xtext.purexbase.test >> extras +plugins/org.eclipse.xtext.smap >> extras +plugins/org.eclipse.xtext.xbase >> extras +plugins/org.eclipse.xtext.xbase.ide >> extras +tests/org.eclipse.xtext.generator.tests >> extras +tests/org.eclipse.xtext.common.types.test >> extras, eclipse +tests/org.eclipse.xtext.common.types.tests >> extras, eclipse +tests/org.eclipse.xtext.java.tests >> extras, eclipse +tests/org.eclipse.xtext.purexbase.tests >> extras, eclipse +tests/org.eclipse.xtext.testlanguages >> extras +tests/org.eclipse.xtext.testlanguages.ide >> extras +tests/org.eclipse.xtext.testlanguages.tests >> extras +tests/org.eclipse.xtext.xbase.tests >> extras + +maven/org.eclipse.xtend.lib.gwt.test >> lib +maven/org.eclipse.xtext.xbase.lib.slim >> lib +plugins/org.eclipse.xtend.lib >> lib +plugins/org.eclipse.xtend.lib.gwt >> lib +plugins/org.eclipse.xtend.lib.macro >> lib +plugins/org.eclipse.xtend.lib.maven >> lib +plugins/org.eclipse.xtend2.lib >> lib +plugins/org.eclipse.xtext.xbase.lib >> lib +plugins/org.eclipse.xtext.xbase.lib.gwt >> lib +plugins/org.eclipse.xtext.xbase.lib.maven >> lib +plugins/org.eclipse.xtext.xtend2.lib >> lib + +docs/org.eclipse.xtend.bootstrapdoc >> xtend +docs/org.eclipse.xtend.doc >> xtend +docs/org.eclipse.xtend.doc.xdoc >> xtend +examples/org.eclipse.xtend.examples >> xtend +examples/org.eclipse.xtend.examples-container >> xtend +plugins/org.eclipse.xtend.bootstrapdoc >> xtend +plugins/org.eclipse.xtend.core >> xtend +plugins/org.eclipse.xtend.doc >> xtend +plugins/org.eclipse.xtend.doc.xdoc >> xtend +plugins/org.eclipse.xtend.gradle.plugin >> xtend +plugins/org.eclipse.xtend.ide >> xtend +plugins/org.eclipse.xtend.ide.common >> xtend +plugins/org.eclipse.xtend.m2e >> xtend +plugins/org.eclipse.xtend.macro >> xtend +plugins/org.eclipse.xtend.macro.lang >> xtend +plugins/org.eclipse.xtend.macro.lang.tests >> xtend +plugins/org.eclipse.xtend.macro.lang.ui >> xtend +plugins/org.eclipse.xtend.maven >> xtend +plugins/org.eclipse.xtend.maven.android.archetype >> xtend +plugins/org.eclipse.xtend.maven.archetype >> xtend +plugins/org.eclipse.xtend.standalone >> xtend +plugins/org.eclipse.xtend.xdoc >> xtend +plugins/org.eclipse.xtext.xtend >> xtend +plugins/org.eclipse.xtext.xtend2 >> xtend +plugins/org.eclipse.xtext.xtend2.bootstrapdoc >> xtend +plugins/org.eclipse.xtext.xtend2.doc >> xtend +plugins/org.eclipse.xtext.xtend2.m2e >> xtend +plugins/org.eclipse.xtext.xtend2.ui >> xtend +tests/org.eclipse.xtend.caliper.tests >> xtend +tests/org.eclipse.xtend.core.tests >> xtend +tests/org.eclipse.xtend.core.tests.java8 >> xtend +tests/org.eclipse.xtend.ide.swtbot.tests >> xtend +tests/org.eclipse.xtend.ide.tests >> xtend +tests/org.eclipse.xtend.ide.tests.data >> xtend +tests/org.eclipse.xtend.macro.lang.tests >> xtend +tests/org.eclipse.xtend.performance.tests >> xtend +tests/org.eclipse.xtend.standalone.tests >> xtend +tests/org.eclipse.xtend.swtbot >> xtend +tests/org.eclipse.xtext.xtend.tests >> xtend +tests/org.eclipse.xtext.xtend2.standalone.tests >> xtend +tests/org.eclipse.xtext.xtend2.tests >> xtend +tests/org.eclipse.xtext.xtend2.ui.tests >> xtend + +features >> eclipse +releng >> eclipse +docs/gen_toc.jar >> eclipse +docs/org.eclipse.xtext.doc >> eclipse +docs/org.eclipse.xtext.doc.xdoc >> eclipse +examples/org.eclipse.xtext.example.domainmodel >> eclipse +examples/org.eclipse.xtext.example.domainmodel.ui >> eclipse +examples/org.eclipse.xtext.example.ecoredsl >> eclipse +examples/org.eclipse.xtext.example.ecoredsl.ui >> eclipse +examples/org.eclipse.xtext.example.fowlerdsl >> eclipse +examples/org.eclipse.xtext.example.fowlerdsl.ui >> eclipse +examples/org.eclipse.xtext.xtext.ui.examples >> eclipse +plugins/org.eclipse.xtext.activities >> eclipse +plugins/org.eclipse.xtext.builder >> eclipse +plugins/org.eclipse.xtext.common.types.edit >> eclipse +plugins/org.eclipse.xtext.common.types.shared >> eclipse +plugins/org.eclipse.xtext.common.types.shared.jdt38 >> eclipse +plugins/org.eclipse.xtext.common.types.ui >> eclipse +plugins/org.eclipse.xtext.common.ui >> eclipse +plugins/org.eclipse.xtext.compatibility.galileo >> eclipse +plugins/org.eclipse.xtext.doc >> eclipse +plugins/org.eclipse.xtext.doc.xdoc >> eclipse +plugins/org.eclipse.xtext.gmf.glue >> eclipse +plugins/org.eclipse.xtext.graphviewer.ui >> eclipse +plugins/org.eclipse.xtext.junit >> eclipse +plugins/org.eclipse.xtext.junit4 >> eclipse +plugins/org.eclipse.xtext.log4j >> eclipse +plugins/org.eclipse.xtext.logging >> eclipse +plugins/org.eclipse.xtext.m2e >> eclipse +plugins/org.eclipse.xtext.purexbase.ui >> eclipse +plugins/org.eclipse.xtext.preference >> eclipse +plugins/org.eclipse.xtext.service >> eclipse +plugins/org.eclipse.xtext.service.ui >> eclipse +plugins/org.eclipse.xtext.ui >> eclipse +plugins/org.eclipse.xtext.ui.builtin >> eclipse +plugins/org.eclipse.xtext.ui.codetemplates >> eclipse +plugins/org.eclipse.xtext.ui.codetemplates.ui >> eclipse +plugins/org.eclipse.xtext.ui.common >> eclipse +plugins/org.eclipse.xtext.ui.common.xtend >> eclipse +plugins/org.eclipse.xtext.ui.core >> eclipse +plugins/org.eclipse.xtext.ui.ecore >> eclipse +plugins/org.eclipse.xtext.ui.generator >> eclipse +plugins/org.eclipse.xtext.ui.junit >> eclipse +plugins/org.eclipse.xtext.ui.shared >> eclipse +plugins/org.eclipse.xtext.wikitext.core >> eclipse +plugins/org.eclipse.xtext.wizard >> eclipse +plugins/org.eclipse.xtext.xbase.doc >> eclipse +plugins/org.eclipse.xtext.xbase.junit >> eclipse +plugins/org.eclipse.xtext.xbase.ui >> eclipse +plugins/org.eclipse.xtext.xtext.ui >> eclipse +plugins/org.eclipse.xtext.xtext.ui.graph >> eclipse +tests/org.eclipse.xtext.automated.tests >> eclipse +tests/org.eclipse.xtext.builder.tests >> eclipse +tests/org.eclipse.xtext.example.domainmodel.ui.tests >> eclipse +tests/org.eclipse.xtext.index.tests >> eclipse +tests/org.eclipse.xtext.junit4.tests >> eclipse +tests/org.eclipse.xtext.preference.tests >> eclipse +tests/org.eclipse.xtext.service.tests >> eclipse +tests/org.eclipse.xtext.service.ui.tests >> eclipse +tests/org.eclipse.xtext.testlanguages.ui >> eclipse +tests/org.eclipse.xtext.ui.codetemplates.tests >> eclipse +tests/org.eclipse.xtext.ui.common.tests >> eclipse +tests/org.eclipse.xtext.ui.core.tests >> eclipse +tests/org.eclipse.xtext.ui.integration.tests >> eclipse +tests/org.eclipse.xtext.ui.tests >> eclipse +tests/org.eclipse.xtext.wikitext.tests >> eclipse +tests/org.eclipse.xtext.xbase.testlanguages >> eclipse +tests/org.eclipse.xtext.xbase.testlanguages.ui >> eclipse +tests/org.eclipse.xtext.xbase.ui.tests >> eclipse +tests/org.eclipse.xtext.xtext.ui.graph.tests >> eclipse +tests/org.eclipse.xtext.xtext.ui.tests >> eclipse + +intellij >> idea + +web >> web + +maven/org.eclipse.xtend.core >> maven +maven/org.eclipse.xtend.ide.common >> maven +maven/org.eclipse.xtend.maven.android.archetype >> maven +maven/org.eclipse.xtend.maven.archetype >> maven +maven/org.eclipse.xtend.maven.plugin >> maven +maven/org.eclipse.xtext >> maven +maven/org.eclipse.xtext.common.types >> maven +maven/org.eclipse.xtext.dependencies >> maven +maven/org.eclipse.xtext.ide >> maven +maven/org.eclipse.xtext.maven.plugin >> maven +maven/org.eclipse.xtext.parent >> maven +maven/org.eclipse.xtext.standalone.parent >> maven +maven/org.eclipse.xtext.target >> maven +maven/org.eclipse.xtext.tycho.parent >> maven +maven/org.eclipse.xtext.tycho.tests.parent >> maven +maven/org.eclipse.xtext.xbase >> maven +maven/org.eclipse.xtext.xtext >> maven +plugins/org.eclipse.xtend.maven.plugin >> maven +plugins/org.eclipse.xtend.standalone.maven >> maven +plugins/org.eclipse.xtend2.lib.maven >> maven +plugins/org.eclipse.xtend2.maven.plugin >> maven +plugins/org.eclipse.xtend2.standalone.maven >> maven +plugins/org.eclipse.xtext.maven.plugin >> maven +plugins/org.eclipse.xtext.standalone.maven >> maven +plugins/org.eclipse.xtext.xtend2.maven >> maven +plugins/org.eclipse.xtext.xtend2.standalone >> maven +plugins/org.eclipse.xtext.xtend2.standalone.maven >> maven + +website >> xtext-website +xtext-website >> xtext-website +xtext.website.generator >> xtext-website + +website-xtend >> xtend-website +xtend-website >> xtend-website +xtend.website.generator >> xtend-website + +.DS_Store >> delete +.gitignore >> delete +.project >> delete +.settings >> delete +CONTRIBUTING >> delete +README.md >> delete +build.gradle >> delete +develop >> delete +devtools/com.rcpquickstart.bundletestcollector >> delete +devtools/org.eclipse.xtext.reference >> delete +devtools/org.eclipse.xtext.reference.ui >> delete +devtools/org.eclipse.xtext.testcollector >> delete +docs/images >> delete +docs/org.xtext.sevenlanguages.doc.xdoc >> delete +dummy.txt >> delete +gradle >> delete +gradle-app.setting >> delete +gradle.ant >> delete +gradle.properties >> delete +gradlew >> delete +gradlew.bat >> delete +hover.patch.txt >> delete +jenkins >> delete +maven/.settings >> delete +maven/build.gradle >> delete +maven/mvnw >> delete +maven/mvnw.bat >> delete +maven/wrapper >> delete +org.eclipse.core.resources.prefs >> delete +org.eclipse.core.runtime.prefs >> delete +org.eclipse.jdt.core.prefs >> delete +org.eclipse.jdt.launching.prefs >> delete +org.eclipse.jdt.ui.prefs >> delete +org.eclipse.xtend.core.Xtend.prefs >> delete +plugins/.settings >> delete +plugins/build.gradle >> delete +plugins/com.google.collect >> delete +plugins/com.google.guava >> delete +plugins/com.google.guice >> delete +plugins/com.google.inject >> delete +plugins/images >> delete +plugins/org.antlr.gen >> delete +plugins/org.antlr.runtime >> delete +plugins/org.apache.log4j >> delete +plugins/org.eclipse.emf.index >> delete +plugins/org.eclipse.emf.index.ui >> delete +plugins/org.eclipse.xtext.doc.manual >> delete +settings.gradle >> delete +test.txt >> delete +tests/.settings >> delete +tests/build.gradle >> delete +tests/org.eclipse.emf.index.tests >> delete +tests/org.eclipse.emf.index.ui.tests >> delete diff --git a/splitting/src/org/eclipse/xtext/splitting/FindProjects.java b/splitting/src/org/eclipse/xtext/splitting/FindProjects.java index f3e293e9c..571f7eff9 100644 --- a/splitting/src/org/eclipse/xtext/splitting/FindProjects.java +++ b/splitting/src/org/eclipse/xtext/splitting/FindProjects.java @@ -26,8 +26,7 @@ public class FindProjects { public static void main(String[] args) { if (args.length != 1) { - System.err.println("Expected file list as argument."); - return; + fail("Expected path to working directory as argument."); } String workingDir = args[0]; try { @@ -82,9 +81,16 @@ public class FindProjects { } } catch (Exception e) { e.printStackTrace(); + System.exit(1); } } + private static void fail(String message) { + System.err.print("ERROR: "); + System.err.println(message); + System.exit(1); + } + private static boolean findProjects(Directory dir, List projects, List otherPaths, boolean skipOtherPaths) { boolean containsProject = dir.parent != null && dir.entries.values().stream().anyMatch((e) -> e.name.equals(".project")); if (containsProject) { diff --git a/splitting/src/org/eclipse/xtext/splitting/ValidateSplitting.java b/splitting/src/org/eclipse/xtext/splitting/ValidateSplitting.java new file mode 100644 index 000000000..32bb5a242 --- /dev/null +++ b/splitting/src/org/eclipse/xtext/splitting/ValidateSplitting.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.splitting; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ValidateSplitting { + + public static final Set REPOSITORIES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( + "core", "extras", "lib", "xtend", "eclipse", "idea", "web", "maven", "xtext-website", "xtend-website" + ))); + + public static final String DELETE = "delete"; + + public static void main(String[] args) { + if (args.length != 2) { + fail("Expected paths to splitting.txt and working directory as arguments."); + } + String workingDir = args[1]; + try { + + // Validate repositories and gather all paths from the splitting file + final Set specifiedPaths = new HashSet<>(); + try (BufferedReader reader = new BufferedReader(new FileReader(args[0]))) { + String line; + while ((line = reader.readLine()) != null) { + if (!line.isEmpty()) { + String[] parts = line.split(">>"); + if (parts.length != 2) { + fail("Invalid line: " + line); + } + String[] repos = parts[1].split(","); + if (repos.length == 0) { + fail("Invalid line: " + line); + } + for (String repo : repos) { + String trimmed = repo.trim(); + if (!(REPOSITORIES.contains(trimmed) || DELETE.equals(trimmed))) { + fail("Invalid repository: " + trimmed); + } + } + String path = parts[0].trim(); + specifiedPaths.add(path); + } + } + } + + // Check whether each file has a specified path as prefix + final Pattern segmentPattern = Pattern.compile("/"); + try (BufferedReader reader = new BufferedReader(new FileReader(workingDir + "/" + FindProjects.ALL_FILES))) { + String line; + while ((line = reader.readLine()) != null) { + if (!line.isEmpty()) { + String file = line.replaceAll("\"|\\\\.", ""); + if (!specifiedPaths.contains(file)) { + Matcher matcher = segmentPattern.matcher(file); + boolean foundSplitting = false; + int lastMatch = -1; + while (!foundSplitting && matcher.find()) { + lastMatch = matcher.start(); + if (specifiedPaths.contains(file.substring(0, lastMatch))) + foundSplitting = true; + } + if (!foundSplitting) { + fail("File not covered by splitting: " + file); + } + } + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + + private static void fail(String message) { + System.err.print("ERROR: "); + System.err.println(message); + System.exit(1); + } + +}