use of com.google.copybara.config.Config in project copybara by google.
the class Copybara method run.
/**
* Runs the migration specified by {@code migrationName}.
*/
public void run(Options options, ConfigLoader<?> configLoader, String migrationName, Path workdir, @Nullable String sourceRef) throws RepoException, ValidationException, IOException {
Config config = loadConfig(options, configLoader, migrationName);
Migration migration = config.getMigration(migrationName);
if (configLoaderProvider == null) {
this.migrationRanConsumer.accept(migration);
migration.run(workdir, sourceRef);
return;
}
// A safeguard, mirror workflows are not supported in the service anyway
if (!(migration instanceof Workflow)) {
throw new ValidationException("Flag --read-config-from-change is not supported for non-workflow migrations: %s", migrationName);
}
migrationRanConsumer.accept(migration);
@SuppressWarnings("unchecked") Workflow<? extends Revision, ? extends Revision> workflow = (Workflow<? extends Revision, ? extends Revision>) migration;
new ReadConfigFromChangeWorkflow<>(workflow, options, configLoaderProvider, configValidator).run(workdir, sourceRef);
}
use of com.google.copybara.config.Config in project copybara by google.
the class MigrateCmd method loadConfig.
private Config loadConfig(Options options, ConfigLoader configLoader, String migrationName) throws IOException, ValidationException {
GeneralOptions generalOptions = options.get(GeneralOptions.class);
Console console = generalOptions.console();
Config config = configLoader.load(console);
console.progress("Validating configuration");
ValidationResult result = configValidator.validate(config, migrationName);
if (!result.hasErrors()) {
return config;
}
result.getErrors().forEach(console::error);
console.error("Configuration is invalid.");
throw new ValidationException("Error validating configuration: Configuration is invalid.");
}
use of com.google.copybara.config.Config in project copybara by google.
the class ValidateCmd method validate.
/**
* Validates that the configuration is correct and that there is a valid migration specified by
* {@code migrationName}.
*
* <p>Note that, besides validating the specific migration, all the configuration will be
* validated syntactically.
*
* Returns true iff this configuration is valid.
*/
private ValidationResult validate(Options options, ConfigLoader configLoader, String migrationName) throws IOException {
Console console = options.get(GeneralOptions.class).console();
ValidationResult.Builder resultBuilder = new ValidationResult.Builder();
try {
Config config = configLoader.load(console);
resultBuilder.append(configValidator.validate(config, migrationName));
} catch (ValidationException e) {
// The validate subcommand should not throw Validation exceptions but log a result
StringBuilder error = new StringBuilder(e.getMessage()).append("\n");
Throwable cause = e.getCause();
while (cause != null) {
error.append(" CAUSED BY: ").append(cause.getMessage()).append("\n");
cause = cause.getCause();
}
resultBuilder.error(error.toString());
}
return resultBuilder.build();
}
use of com.google.copybara.config.Config in project copybara by google.
the class InfoTest method setUp.
@Before
public void setUp() throws IOException {
dummyOriginDescription = ImmutableMultimap.of("origin", "foo");
dummyDestinationDescription = ImmutableMultimap.of("dest", "bar");
console = new TestingConsole();
temp = Files.createTempDirectory("temp");
optionsBuilder = new OptionsBuilder();
optionsBuilder.setConsole(console);
optionsBuilder.setWorkdirToRealTempDir();
skylark = new SkylarkTestExecutor(optionsBuilder);
eventMonitor = new TestingEventMonitor();
optionsBuilder.general.enableEventMonitor("just testing", eventMonitor);
optionsBuilder.general.starlarkMode = StarlarkMode.STRICT.name();
migration = mock(Migration.class);
config = new Config(ImmutableMap.of("workflow", migration), temp.resolve("copy.bara.sky").toString(), ImmutableMap.of());
configWithDeps = mock(ConfigWithDependencies.class);
when(configWithDeps.getConfig()).thenAnswer(i -> config);
configInfo = "" + "core.workflow(" + " name = 'workflow'," + " origin = git.origin(url = 'https://example.com/orig', ref = 'master')," + " destination = git.destination(url = 'https://example.com/dest')," + " authoring = authoring.overwrite('Foo <foo@example.com>')" + ")\n\n" + "";
info = new InfoCmd((configPath, sourceRef) -> new ConfigLoader(skylark.createModuleSet(), skylark.createConfigFile("copy.bara.sky", configInfo), optionsBuilder.general.getStarlarkMode()) {
@Override
protected Config doLoadForRevision(Console console, Revision revision) throws ValidationException {
try {
return skylark.loadConfig(configPath);
} catch (IOException e) {
throw new AssertionError("Should not fail", e);
}
}
}, getFakeContextProvider());
}
use of com.google.copybara.config.Config in project copybara by google.
the class ReadConfigFromChangeWorkflowTest method testWriterStateMaintained.
/**
* A test that check that we can mutate the glob in iterative mode
*/
@SuppressWarnings("unchecked")
@Test
public void testWriterStateMaintained() throws Exception {
options.workflowOptions.lastRevision = "0";
String configCode = mutatingWorkflow("*");
Config cfg = skylark.loadConfig(configCode);
ConfigLoader constantConfigLoader = new ConfigLoader(skylark.createModuleSet(), skylark.createConfigFile("copy.bara.sky", configCode), options.general.getStarlarkMode()) {
@Override
protected Config doLoadForRevision(Console console, Revision revision) throws ValidationException {
try {
return skylark.loadConfig(mutatingWorkflow(revision.asString()));
} catch (IOException e) {
throw new AssertionError("Should not fail", e);
}
}
};
ReadConfigFromChangeWorkflow<?, ?> wf = new ReadConfigFromChangeWorkflow<>((Workflow) cfg.getMigration("default"), options.build(), constantConfigLoader, new ConfigValidator() {
@Override
public ValidationResult validate(Config config, String migrationName) {
return ValidationResult.EMPTY;
}
});
origin.singleFileChange(0, "base", "fileB", "b");
origin.singleFileChange(1, "one", "file1", "b");
origin.singleFileChange(2, "two", "file2", "b");
origin.singleFileChange(3, "three", "file3", "b");
wf.run(Files.createTempDirectory("workdir"), ImmutableList.of("3"));
assertThat(destination.processed).hasSize(3);
assertThat(destination.processed.get(0).getDestinationFiles().toString()).contains("file1");
assertThat(destination.processed.get(0).getWorkdir()).containsExactly("file1", "b");
assertThat(destination.processed.get(1).getDestinationFiles().toString()).contains("file2");
assertThat(destination.processed.get(1).getWorkdir()).containsExactly("file2", "b");
assertThat(destination.processed.get(2).getDestinationFiles().toString()).contains("file3");
assertThat(destination.processed.get(2).getWorkdir()).containsExactly("file3", "b");
}
Aggregations