From 4e3e7c3cb5fabfa9f5bd150f54b6eba1d2cd2f29 Mon Sep 17 00:00:00 2001 From: Lukas Krejci Date: Wed, 27 Mar 2019 13:09:54 +0100 Subject: [PATCH] Support `refspec` in the devfile to specify what should be checked out after a clone. Signed-off-by: Lukas Krejci --- .../model/workspace/config/SourceStorage.java | 6 +++++ .../server/convert/ProjectConverter.java | 27 +++++++++++++++---- .../src/main/resources/schema/devfile.json | 5 ++++ .../server/convert/ProjectConverterTest.java | 20 +++++++++----- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/SourceStorage.java b/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/SourceStorage.java index b49d5659e9..f71be47a7c 100644 --- a/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/SourceStorage.java +++ b/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/SourceStorage.java @@ -16,6 +16,12 @@ import java.util.Map; /** @author gazarenkov */ public interface SourceStorage { + /** + * The key with this name in the parameters designates the exact revision the source corresponds + * to. This can be a branch, tag, commit id or anything the particular VCS type understands. + */ + String REFSPEC_PARAMETER_NAME = "refspec"; + String getType(); String getLocation(); diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/ProjectConverter.java b/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/ProjectConverter.java index 386b647742..2f53bb249e 100644 --- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/ProjectConverter.java +++ b/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/ProjectConverter.java @@ -11,6 +11,9 @@ */ package org.eclipse.che.api.devfile.server.convert; +import static org.eclipse.che.api.core.model.workspace.config.SourceStorage.REFSPEC_PARAMETER_NAME; + +import com.google.common.base.Strings; import org.eclipse.che.api.devfile.model.Project; import org.eclipse.che.api.devfile.model.Source; import org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl; @@ -31,10 +34,13 @@ public class ProjectConverter { * @return created devfile project based on the specified workspace project */ public Project toDevfileProject(ProjectConfigImpl projectConfig) { + String refspec = projectConfig.getSource().getParameters().get(REFSPEC_PARAMETER_NAME); Source source = new Source() .withType(projectConfig.getSource().getType()) - .withLocation(projectConfig.getSource().getLocation()); + .withLocation(projectConfig.getSource().getLocation()) + .withRefspec(refspec); + return new Project().withName(projectConfig.getName()).withSource(source); } @@ -49,10 +55,21 @@ public class ProjectConverter { projectConfig.setName(devProject.getName()); projectConfig.setPath("/" + projectConfig.getName()); - SourceStorageImpl sourceStorage = new SourceStorageImpl(); - sourceStorage.setType(devProject.getSource().getType()); - sourceStorage.setLocation(devProject.getSource().getLocation()); - projectConfig.setSource(sourceStorage); + projectConfig.setSource(toSourceStorage(devProject.getSource())); return projectConfig; } + + private SourceStorageImpl toSourceStorage(Source source) { + SourceStorageImpl sourceStorage = new SourceStorageImpl(); + + sourceStorage.setType(source.getType()); + sourceStorage.setLocation(source.getLocation()); + String refspec = source.getRefspec(); + + if (!Strings.isNullOrEmpty(refspec)) { + sourceStorage.getParameters().put(REFSPEC_PARAMETER_NAME, refspec); + } + + return sourceStorage; + } } diff --git a/wsmaster/che-core-api-devfile/src/main/resources/schema/devfile.json b/wsmaster/che-core-api-devfile/src/main/resources/schema/devfile.json index b1771cc5b7..c1b458ab10 100644 --- a/wsmaster/che-core-api-devfile/src/main/resources/schema/devfile.json +++ b/wsmaster/che-core-api-devfile/src/main/resources/schema/devfile.json @@ -91,6 +91,11 @@ "examples": [ "git@github.com:spring-projects/spring-petclinic.git" ] + }, + "refspec": { + "type": "string", + "description": "The name of the refspec to check out after the clone. This can be a branch, tag, commit id or anything the particular source type understands.", + "examples": [ "master", "feature-42", "304df5a" ] } } } diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/ProjectConverterTest.java b/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/ProjectConverterTest.java index 30fa6c7cc5..9ead1654af 100644 --- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/ProjectConverterTest.java +++ b/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/ProjectConverterTest.java @@ -11,8 +11,10 @@ */ package org.eclipse.che.api.devfile.server.convert; +import static org.eclipse.che.api.core.model.workspace.config.SourceStorage.REFSPEC_PARAMETER_NAME; import static org.testng.Assert.assertEquals; +import com.google.common.collect.ImmutableMap; import org.eclipse.che.api.devfile.model.Project; import org.eclipse.che.api.devfile.model.Source; import org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl; @@ -36,7 +38,10 @@ public class ProjectConverterTest { new Project() .withName("myProject") .withSource( - new Source().withLocation("https://github.com/eclipse/che.git").withType("git")); + new Source() + .withLocation("https://github.com/eclipse/che.git") + .withType("git") + .withRefspec("master")); ProjectConfigImpl workspaceProject = projectConverter.toWorkspaceProject(devfileProject); @@ -45,23 +50,26 @@ public class ProjectConverterTest { SourceStorageImpl source = workspaceProject.getSource(); assertEquals(source.getType(), "git"); assertEquals(source.getLocation(), "https://github.com/eclipse/che.git"); + assertEquals(source.getParameters().get(REFSPEC_PARAMETER_NAME), "master"); } @Test public void testConvertingProjectConfigToDevfileProject() { - ProjectConfigImpl workpsaceProject = new ProjectConfigImpl(); - workpsaceProject.setName("myProject"); - workpsaceProject.setPath("/ignored"); + ProjectConfigImpl workspaceProject = new ProjectConfigImpl(); + workspaceProject.setName("myProject"); + workspaceProject.setPath("/ignored"); SourceStorageImpl sourceStorage = new SourceStorageImpl(); sourceStorage.setType("git"); sourceStorage.setLocation("https://github.com/eclipse/che.git"); - workpsaceProject.setSource(sourceStorage); + sourceStorage.setParameters(ImmutableMap.of(REFSPEC_PARAMETER_NAME, "master")); + workspaceProject.setSource(sourceStorage); - Project devfileProject = projectConverter.toDevfileProject(workpsaceProject); + Project devfileProject = projectConverter.toDevfileProject(workspaceProject); assertEquals(devfileProject.getName(), "myProject"); Source source = devfileProject.getSource(); assertEquals(source.getType(), "git"); assertEquals(source.getLocation(), "https://github.com/eclipse/che.git"); + assertEquals(source.getRefspec(), "master"); } }