message:
chore(spotless): upgrade spinnaker gradle plugin
This includes updates to google-java-format and ktlint, so requires some
formatting changes. These were made with a simple `./gradlew spotlessApply`.

diff:
@@ -75,7 +75,8 @@ class DeckPluginCache(
val newCache = releases.mapNotNull { release ->
val plugin = DeckPluginVersion(release.pluginId, release.props.version)
getOrDownload(plugin.id, plugin.version)?.let {
- path -> PluginCacheEntry(plugin, path)
+ path ->
+ PluginCacheEntry(plugin, path)
}
}

diff:
@@ -41,8 +41,10 @@ class DeckPluginConfiguration {
springStrictPluginLoaderStatusProvider: SpringStrictPluginLoaderStatusProvider,
dynamicConfigService: DynamicConfigService
): DeckPluginCache {
- val springPluginStatusProvider = SpringPluginStatusProvider(dynamicConfigService,
- "spinnaker.extensibility.deck-proxy.plugins")
+ val springPluginStatusProvider = SpringPluginStatusProvider(
+ dynamicConfigService,
+ "spinnaker.extensibility.deck-proxy.plugins"
+ )
val sources = listOf(
LatestPluginInfoReleaseSource(updateManager, "deck"),
@@ -55,7 +57,8 @@ class DeckPluginConfiguration {
springPluginStatusProvider,
AggregatePluginInfoReleaseProvider(sources, springStrictPluginLoaderStatusProvider),
registry,
- springStrictPluginLoaderStatusProvider)
+ springStrictPluginLoaderStatusProvider
+ )
}
@Bean

diff:
@@ -60,7 +60,8 @@ class DeckPluginService(
val sanitizedAssetPath = if (assetPath.startsWith("/")) assetPath.substring(1) else assetPath
val localAsset = pluginCache.getOrDownload(pluginId, pluginVersion)?.let {
- path -> path.resolve(sanitizedAssetPath).toFile()
+ path ->
+ path.resolve(sanitizedAssetPath).toFile()
}
if (localAsset == null || !localAsset.exists()) {
log.error("Unable to find requested plugin asset '$assetPath' for '$pluginId@$pluginVersion'")

diff:
@@ -53,7 +53,8 @@ class DeckPluginsController(
return ResponseEntity.ok()
.header("Content-Type", pluginAsset.contentType)
- .header("Cache-Control",
+ .header(
+ "Cache-Control",
CacheControl
.maxAge(30, TimeUnit.DAYS)
.mustRevalidate()

diff:
@@ -45,7 +45,8 @@ class PluginInfoController(
@ApiOperation(value = "Persist plugin metadata information")
@RequestMapping(
method = [RequestMethod.POST, RequestMethod.PUT],
- consumes = [MediaType.APPLICATION_JSON_VALUE])
+ consumes = [MediaType.APPLICATION_JSON_VALUE]
+ )
@ResponseStatus(value = HttpStatus.ACCEPTED)
fun persistPluginInfo(@RequestBody pluginInfo: SpinnakerPluginInfo): Map<String, Any> {
return pluginService.upsertPluginInfo(pluginInfo)
@@ -56,7 +57,8 @@ class PluginInfoController(
@RequestMapping(
value = ["/{id:.+}"],
method = [RequestMethod.DELETE],
- consumes = [MediaType.APPLICATION_JSON_VALUE])
+ consumes = [MediaType.APPLICATION_JSON_VALUE]
+ )
@ResponseStatus(value = HttpStatus.ACCEPTED)
fun deletePluginInfo(@PathVariable id: String): Map<String, Any> {
return pluginService.deletePluginInfo(id)

diff:
@@ -87,12 +87,15 @@ class PluginPublishController(
AuthenticatedRequest.propagate {
val request = Request.Builder()
.url("$front50Url/pluginBinaries/$pluginId/$pluginVersion?sha512sum=$checksum")
- .post(MultipartBody.Builder()
+ .post(
+ MultipartBody.Builder()
.addFormDataPart(
"plugin",
format("%s-%s.zip", pluginId, pluginVersion),
- RequestBody.create(MediaType.parse("application/octet-stream"), body))
- .build())
+ RequestBody.create(MediaType.parse("application/octet-stream"), body)
+ )
+ .build()
+ )
.build()
val response = okHttpClient.newCall(request).execute()

diff:
@@ -56,13 +56,17 @@ class ApiExtensionControllerTest : JUnit5Minutests {
}
test("returns expected response") {
- expectThat(subject.any(
+ expectThat(
+ subject.any(
firstApiExtension.id(), emptyMap(), mockk(relaxed = true)
- ).body).isEqualTo("This is a result from ${firstApiExtension.id()}")
+ ).body
+ ).isEqualTo("This is a result from ${firstApiExtension.id()}")
- expectThat(subject.any(
+ expectThat(
+ subject.any(
secondApiExtension.id(), emptyMap(), mockk(relaxed = true)
- ).body).isEqualTo("This is a result from ${secondApiExtension.id()}")
+ ).body
+ ).isEqualTo("This is a result from ${secondApiExtension.id()}")
}
}
}

diff:
@@ -4,7 +4,7 @@ includeProviders=basic,iap,ldap,oauth2,saml,x509
korkVersion=7.56.0
kotlinVersion=1.3.71
org.gradle.parallel=true
-spinnakerGradleVersion=8.3.0
+spinnakerGradleVersion=8.4.0
# To enable a composite reference to a project, set the
# project property `'<projectName>Composite=true'`.

original_message:
chore(spotless): upgrade spinnaker gradle plugin (#1294)

This includes updates to google-java-format and ktlint, so requires some
formatting changes. These were made with a simple `./gradlew spotlessApply`.

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>


change_type: MODIFY

diff:
@@ -20,6 +20,7 @@ import com.netflix.spinnaker.gate.api.extension.ApiExtension
import com.netflix.spinnaker.gate.api.extension.HttpRequest
import com.netflix.spinnaker.gate.api.extension.HttpResponse
import com.netflix.spinnaker.kork.plugins.api.ExtensionConfiguration
+import com.netflix.spinnaker.kork.plugins.api.PluginConfiguration
import com.netflix.spinnaker.kork.plugins.api.PluginSdks
import javax.annotation.Nonnull
import org.pf4j.Extension
@@ -65,7 +66,7 @@ class GateApiExtension(
}
}
-@ExtensionConfiguration("api-extension")
+@PluginConfiguration("api-extension")
class ApiExtensionConfigProperties {
var id: String = "test"
}

diff:
@@ -33,6 +33,8 @@ slack:
spinnaker:
extensibility:
+ framework:
+ version: v2
plugins-root-path: build/plugins
plugins:
com.netflix.gate.enabled.plugin:

diff:
@@ -23,9 +23,7 @@ import com.netflix.spinnaker.kork.exceptions.SpinnakerException
import com.netflix.spinnaker.kork.exceptions.SystemException
import com.netflix.spinnaker.kork.web.exceptions.NotFoundException
import com.squareup.okhttp.internal.http.HttpMethod
-import java.io.IOException
-import java.util.stream.Collectors
-import javax.servlet.http.HttpServletRequest
+import org.springframework.beans.factory.ObjectProvider
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
@@ -34,6 +32,9 @@ import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
+import java.io.IOException
+import java.util.stream.Collectors
+import javax.servlet.http.HttpServletRequest
/**
* A top-level [RestController] that exposes all api extensions under a common
@@ -42,10 +43,10 @@ import org.springframework.web.bind.annotation.RestController
@Alpha
@RestController
@RequestMapping("/extensions")
-class ApiExtensionController @Autowired constructor(private val apiExtensions: List<ApiExtension>) {
+class ApiExtensionController @Autowired constructor(private val apiExtensionsProvider: ObjectProvider<List<ApiExtension>>) {
init {
- val duplicateApiExtensionIds = apiExtensions
+ val duplicateApiExtensionIds = apiExtensionsProvider.getIfAvailable { ArrayList() }
.groupBy { it.id().toLowerCase() }
.filter { it.value.size > 1 }
.map { it.value }
@@ -82,7 +83,7 @@ class ApiExtensionController @Autowired constructor(private val apiExtensions: L
}
}
- val apiExtension = apiExtensions.stream()
+ val apiExtension = apiExtensionsProvider.getIfAvailable { ArrayList() }.stream()
.filter { e: ApiExtension -> e.id().equals(extension, ignoreCase = true) && e.handles(httpRequest) }
.findFirst()

diff:
@@ -24,6 +24,7 @@ import com.netflix.spinnaker.kork.web.exceptions.NotFoundException
import dev.minutest.junit.JUnit5Minutests
import dev.minutest.rootContext
import io.mockk.mockk
+import org.springframework.beans.factory.ObjectProvider
import strikt.api.expectThat
import strikt.api.expectThrows
import strikt.assertions.isEqualTo
@@ -36,13 +37,13 @@ class ApiExtensionControllerTest : JUnit5Minutests {
context("basic validation") {
test("raises SystemException when duplicate api extension identifiers are detected") {
expectThrows<SystemException> {
- ApiExtensionController(listOf(firstApiExtension, firstApiExtension))
+ ApiExtensionController(ApiExtensionsProvider(listOf(firstApiExtension, firstApiExtension)))
}
}
test("raises SystemException when duplicate api extension identifiers are detected") {
- ApiExtensionController(listOf(firstApiExtension))
- ApiExtensionController(listOf(firstApiExtension, secondApiExtension))
+ ApiExtensionController(ApiExtensionsProvider(listOf(firstApiExtension)))
+ ApiExtensionController(ApiExtensionsProvider(listOf(firstApiExtension, secondApiExtension)))
}
}
@@ -74,7 +75,7 @@ class ApiExtensionControllerTest : JUnit5Minutests {
private inner class Fixture {
val firstApiExtension = SimpleApiExtension("1")
val secondApiExtension = SimpleApiExtension("2")
- val subject = ApiExtensionController(listOf(firstApiExtension, secondApiExtension))
+ val subject = ApiExtensionController(ApiExtensionsProvider(listOf(firstApiExtension, secondApiExtension)))
}
class SimpleApiExtension(private val id: String) : ApiExtension {
@@ -90,4 +91,13 @@ class ApiExtensionControllerTest : JUnit5Minutests {
return HttpResponse.of(200, emptyMap(), "This is a result from ${id()}")
}
}
+
+ private inner class ApiExtensionsProvider(
+ private val apiExtensions: List<ApiExtension>
+ ) : ObjectProvider<List<ApiExtension>> {
+ override fun getIfUnique(): List<ApiExtension>? = apiExtensions
+ override fun getObject(vararg args: Any?): List<ApiExtension> = apiExtensions
+ override fun getObject(): List<ApiExtension> = apiExtensions
+ override fun getIfAvailable(): List<ApiExtension>? = apiExtensions
+ }
}

diff:
@@ -92,7 +92,8 @@ test {
String implementationVersion = getAttributes()["Implementation-Version"]
if (implementationVersion == null
|| implementationVersion.isEmpty()
- || implementationVersion == "undefined") {
+ || implementationVersion == "undefined"
+ || implementationVersion.endsWith("SNAPSHOT")) {
attributes(
'Implementation-Version': '1.0.0'
)

license: Apache License 2.0

repo: spinnaker/gate

original_message: feat(plugins): Gate v2 framework compatibility (#1322)


diff:
@@ -19,7 +19,6 @@ package com.netflix.spinnaker.gate.plugins
import com.netflix.spinnaker.gate.api.extension.ApiExtension
import com.netflix.spinnaker.gate.api.extension.HttpRequest
import com.netflix.spinnaker.gate.api.extension.HttpResponse
-import com.netflix.spinnaker.kork.plugins.api.ExtensionConfiguration
import com.netflix.spinnaker.kork.plugins.api.PluginConfiguration
import com.netflix.spinnaker.kork.plugins.api.PluginSdks
import javax.annotation.Nonnull
@@ -68,5 +67,5 @@ class GateApiExtension(
@PluginConfiguration("api-extension")
class ApiExtensionConfigProperties {
- var id: String = "test"
+ var id: String = ""
}

diff:
@@ -39,6 +39,8 @@ spinnaker:
plugins:
com.netflix.gate.enabled.plugin:
enabled: true
+ api-extension.config:
+ id: test
com.netflix.gate.disabled.plugin:
enabled: false
com.netflix.gate.version.not.supported.plugin:

original_message: fix(plugins): Load ApiExtension config property from service yml in gate-plugins-test (#1323)


diff:
@@ -75,6 +75,9 @@ public interface KeelService {
@POST("/delivery-configs/diff")
List<Map> diffManifest(@Body DeliveryConfig manifest);
+ @GET("/delivery-configs/schema")
+ Map<String, Object> schema();
+
@POST("/delivery-configs/validate")
@Headers("Accept: application/json")
Map validateManifest(@Body DeliveryConfig manifest);
@@ -145,9 +148,6 @@ public interface KeelService {
@Path("reference") String reference,
@Path("version") String version);
- @GET("/v3/api-docs")
- Map<String, Object> getApiDocs();
-
@GET("/installedPlugins")
List<SpinnakerPluginDescriptor> getInstalledPlugins();
}

diff:
@@ -207,6 +207,14 @@ public class ManagedController {
return keelService.diffManifest(manifest);
}
+ @ApiOperation(value = "Ad-hoc validate and diff a config manifest", response = Map.class)
+ @GetMapping(
+ path = "/delivery-configs/schema",
+ produces = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE})
+ Map<String, Object> schema() {
+ return keelService.schema();
+ }
+
@ApiOperation(
value = "List up-to {limit} current constraint states for an environment",
response = ConstraintState.class)
@@ -302,9 +310,4 @@ public class ManagedController {
@PathVariable("version") String version) {
keelService.deleteVeto(application, targetEnvironment, reference, version);
}
-
- @GetMapping(path = "/api-docs")
- Map<String, Object> getApiDocs() {
- return keelService.getApiDocs();
- }
}

change_type: DELETE

diff:
-package com.netflix.spinnaker.gate.config;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import springfox.documentation.swagger.web.InMemorySwaggerResourcesProvider;
-import springfox.documentation.swagger.web.SwaggerResource;
-import springfox.documentation.swagger.web.SwaggerResourcesProvider;
-
-@Configuration
-@ConditionalOnProperty("swagger.enabled")
-public class SwaggerEndpointsConfig {
-
- @Primary
- @Bean
- public SwaggerResourcesProvider swaggerResourcesProvider(
- InMemorySwaggerResourcesProvider defaultResourcesProvider) {
- return () -> {
- SwaggerResource keelApiDocs = new SwaggerResource();
- keelApiDocs.setName("keel");
- keelApiDocs.setSwaggerVersion("3.0");
- keelApiDocs.setLocation("/managed/api-docs");
-
- List<SwaggerResource> resources = new ArrayList<>(defaultResourcesProvider.get());
- resources.add(keelApiDocs);
- return resources;
- };
- }
-}

original_message: feat(managed): JSON schema for delivery configs (#1341)


diff:
@@ -44,6 +44,10 @@ public interface KeelService {
@GET("/resources/{name}")
Resource getResource(@Path("name") String name);
+ @GET("/resources/{name}")
+ @Headers("Accept: application/x-yaml")
+ Resource getResourceYaml(@Path("name") String name);
+
@GET("/resources/{name}/status")
String getResourceStatus(@Path("name") String name);
@@ -59,6 +63,10 @@ public interface KeelService {
@GET("/delivery-configs/{name}")
DeliveryConfig getManifest(@Path("name") String name);
+ @GET("/delivery-configs/{name}")
+ @Headers("Accept: application/x-yaml")
+ DeliveryConfig getManifestYaml(@Path("name") String name);
+
@GET("/delivery-configs/{name}/artifacts")
List<Map<String, Object>> getManifestArtifacts(@Path("name") String name);

diff:
@@ -85,6 +85,12 @@ public class ManagedController {
return keelService.getResource(resourceId);
}
+ @ApiOperation(value = "Get a resource", response = Resource.class)
+ @GetMapping(path = "/resources/{resourceId}.yml", produces = APPLICATION_YAML_VALUE)
+ Resource getResourceYaml(@PathVariable("resourceId") String resourceId) {
+ return keelService.getResourceYaml(resourceId);
+ }
+
@ApiOperation(value = "Get status of a resource", response = Map.class)
@GetMapping(path = "/resources/{resourceId}/status")
Map getResourceStatus(@PathVariable("resourceId") String resourceId) {
@@ -147,6 +153,12 @@ public class ManagedController {
return keelService.getManifest(name);
}
+ @ApiOperation(value = "Get a delivery config manifest", response = DeliveryConfig.class)
+ @GetMapping(path = "/delivery-configs/{name}.yml", produces = APPLICATION_YAML_VALUE)
+ DeliveryConfig getManifestYaml(@PathVariable("name") String name) {
+ return keelService.getManifestYaml(name);
+ }
+
@ApiOperation(
value = "Get the status of each version of each artifact in each environment",
response = List.class)

original_message: feat(managed): allow retrieval of resources in YAML format (#1342)


diff:
@@ -35,7 +35,7 @@ internal class Proxy(val config: ProxyConfig) {
*/
fun init(okHttpClientProvider: OkHttpClientProvider) : Proxy {
val okHttpClient = okHttpClientProvider.getClient(DefaultServiceEndpoint(
- "proxy__${config.id}", config.uri, config.additionalAttributes as Map<String, Any>, false
+ "proxy__${config.id}", config.uri, config.additionalAttributes, false
))
this.okHttpClient = okHttpClient

diff:
enablePublishing=false
fiatVersion=1.23.0
includeProviders=basic,iap,ldap,oauth2,saml,x509
-korkVersion=7.67.0
+korkVersion=7.68.0
kotlinVersion=1.4.0
org.gradle.parallel=true
spinnakerGradleVersion=8.5.1

original_message: chore(dependencies): kork bump and necessary fixes (#1345)


change_type: ADD

diff:
+/*
+ * Copyright 2020 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.netflix.spinnaker.gate.config;
+
+import static org.springframework.core.Ordered.HIGHEST_PRECEDENCE;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+@Configuration
+@Order(HIGHEST_PRECEDENCE + 23)
+public class ManagedDeliverySchemaEndpointConfiguration extends WebSecurityConfigurerAdapter {
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.requestMatcher(new AntPathRequestMatcher("/managed/delivery-configs/schema"))
+ .authorizeRequests()
+ .anyRequest()
+ .permitAll();
+ }
+}

original_message:
feat(managed): allow anonymous access to Keel JSON schema (#1349)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>


message: fix(build): Bump kork to 7.72.0

diff:
package com.netflix.spinnaker.gate.plugins.web.info
import com.fasterxml.jackson.databind.ObjectMapper
+import com.netflix.spinnaker.config.ErrorConfiguration
import com.netflix.spinnaker.config.PluginsAutoConfiguration
import com.netflix.spinnaker.config.okhttp3.OkHttpClientProvider
import com.netflix.spinnaker.gate.config.ServiceConfiguration
@@ -38,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.boot.test.mock.mockito.MockBean
+import org.springframework.context.annotation.Import
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.TestPropertySource
@@ -49,6 +51,7 @@ import static org.mockito.ArgumentMatchers.any
import static org.mockito.Mockito.when
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
+@Import(ErrorConfiguration)
@WebMvcTest(controllers = [PluginInfoController])
@AutoConfigureMockMvc(addFilters = false)
@ContextConfiguration(classes = [PluginsAutoConfiguration.class,PluginInfoController, GenericExceptionHandlers, SpinnakerExtensionsConfigProperties, PluginWebConfiguration, ServiceConfiguration])

diff:
@@ -18,6 +18,7 @@ package com.netflix.spinnaker.gate
import com.fasterxml.jackson.databind.ObjectMapper
import com.netflix.spectator.api.NoopRegistry
+import com.netflix.spinnaker.config.ErrorConfiguration
import com.netflix.spinnaker.fiat.shared.FiatClientConfigurationProperties
import com.netflix.spinnaker.fiat.shared.FiatStatus
import com.netflix.spinnaker.gate.config.ServiceConfiguration
@@ -27,17 +28,16 @@ import com.netflix.spinnaker.gate.services.*
import com.netflix.spinnaker.gate.services.internal.*
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.kork.dynamicconfig.SpringDynamicConfigService
-import com.netflix.spinnaker.kork.web.exceptions.GenericExceptionHandlers
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration
import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration
import org.springframework.context.ConfigurableApplicationContext
import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Import
import org.springframework.core.annotation.Order
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
-import retrofit.RestAdapter
import retrofit.RetrofitError
import retrofit.RestAdapter;
import retrofit.client.OkClient
@@ -174,6 +174,7 @@ class FunctionalSpec extends Specification {
}
@Order(10)
+ @Import(ErrorConfiguration)
@EnableAutoConfiguration(exclude = [GroovyTemplateAutoConfiguration, GsonAutoConfiguration])
private static class FunctionalConfiguration extends WebSecurityConfigurerAdapter {
@@ -272,11 +273,6 @@ class FunctionalSpec extends Specification {
)
}
- @Bean
- GenericExceptionHandlers genericExceptionHandlers() {
- new GenericExceptionHandlers()
- }
-
@Override
protected void configure(HttpSecurity http) throws Exception {
http

diff:
enablePublishing=false
fiatVersion=1.23.0
includeProviders=basic,iap,ldap,oauth2,saml,x509
-korkVersion=7.70.0
+korkVersion=7.72.0
kotlinVersion=1.4.0
org.gradle.parallel=true
spinnakerGradleVersion=8.6.0

original_message: fix(build): Bump kork to 7.72.0 (#1356)


message: chore(java11): Target Java 11

diff:
@@ -16,11 +16,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- # Install Java 8 for cross-compilation support. Setting it up before
- # Java 11 means it comes later in $PATH (because of how setup-java works)
- - uses: actions/setup-java@v1
- with:
- java-version: 8
- uses: actions/setup-java@v1
with:
java-version: 11
@@ -31,4 +26,4 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Build
- run: ./gradlew -PenableCrossCompilerPlugin=true build --stacktrace
+ run: ./gradlew build --stacktrace

diff:
@@ -10,11 +10,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- # Install Java 8 for cross-compilation support. Setting it up before
- # Java 11 means it comes later in $PATH (because of how setup-java works)
- - uses: actions/setup-java@v1
- with:
- java-version: 8
- uses: actions/setup-java@v1
with:
java-version: 11
@@ -25,4 +20,4 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Build
- run: ./gradlew -PenableCrossCompilerPlugin=true build
+ run: ./gradlew build

diff:
@@ -15,11 +15,6 @@ jobs:
steps:
- uses: actions/checkout@v2
- run: git fetch --prune --unshallow
- # Install Java 8 for cross-compilation support. Setting it up before
- # Java 11 means it comes later in $PATH (because of how setup-java works)
- - uses: actions/setup-java@v1
- with:
- java-version: 8
- uses: actions/setup-java@v1
with:
java-version: 11

diff:
FROM alpine:3.11
RUN apk add --update \
openjdk11 \
- openjdk8 \
&& rm -rf /var/cache/apk
LABEL maintainer="sig-platform@spinnaker.io"
-ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk
-ENV JDK_18 /usr/lib/jvm/java-1.8-openjdk
ENV GRADLE_USER_HOME /workspace/.gradle
ENV GRADLE_OPTS -Xmx4g
-CMD ./gradlew --no-daemon -PenableCrossCompilerPlugin=true gate-web:installDist -x test
+CMD ./gradlew --no-daemon gate-web:installDist -x test

diff:
@@ -63,7 +63,7 @@ public class ReorderPipelinesController {
private Map handlePipelineReorder(
ReorderPipelinesCommand reorderPipelinesCommand, Boolean isStrategy) {
Map<String, Integer> idsToIndices = reorderPipelinesCommand.getIdsToIndices();
- String application = reorderPipelinesCommand.getApplication();
+ var application = reorderPipelinesCommand.getApplication();
if (idsToIndices == null) {
throw new InvalidRequestException("`idsToIndices` is required field on request body");

diff:
@@ -5,6 +5,7 @@ korkVersion=7.76.3
kotlinVersion=1.4.0
org.gradle.parallel=true
spinnakerGradleVersion=8.9.0
+targetJava11=true
# To enable a composite reference to a project, set the
# project property `'<projectName>Composite=true'`.

diff:
apply plugin: "kotlin"
dependencies {
- testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
+ testImplementation "org.jetbrains.kotlin:kotlin-stdlib"
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "org.junit.platform:junit-platform-runner"
@@ -39,6 +39,6 @@ test {
compileTestKotlin {
kotlinOptions {
languageVersion = "1.4"
- jvmTarget = "1.8"
+ jvmTarget = "11"
}
}

diff:
@@ -20,14 +20,14 @@ apply plugin: "kotlin-spring"
compileKotlin {
kotlinOptions {
languageVersion = "1.4"
- jvmTarget = "1.8"
+ jvmTarget = "11"
}
}
compileTestKotlin {
kotlinOptions {
languageVersion = "1.4"
- jvmTarget = "1.8"
+ jvmTarget = "11"
}
}

original_message: chore(java11): Target Java 11 (#1372)


diff:
@@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory
* Provides Deck with means of discovering what plugins it needs to download and a standard interface for
* retrieving plugin assets.
*/
-class DeckPluginService(
+open class DeckPluginService(
private val pluginCache: DeckPluginCache,
private val registry: Registry
) {

diff:
package com.netflix.spinnaker.gate.plugins.web.installed
+import com.netflix.spinnaker.gate.plugins.deck.DeckPluginService
import com.netflix.spinnaker.gate.services.internal.ClouddriverService
import com.netflix.spinnaker.gate.services.internal.EchoService
import com.netflix.spinnaker.gate.services.internal.ExtendedFiatService
@@ -11,6 +12,7 @@ import com.netflix.spinnaker.gate.services.internal.RoscoService
import com.netflix.spinnaker.gate.services.internal.SwabbieService
import com.netflix.spinnaker.kork.plugins.SpinnakerPluginDescriptor
import com.netflix.spinnaker.kork.plugins.SpinnakerPluginManager
+import com.netflix.spinnaker.kork.plugins.update.SpinnakerUpdateManager
import io.swagger.annotations.ApiOperation
import java.util.stream.Collectors
import org.pf4j.PluginWrapper
@@ -33,7 +35,9 @@ class PluginsInstalledController(
private val orcaServiceSelector: OrcaServiceSelector,
private val roscoService: ObjectProvider<RoscoService>,
private val swabbieService: ObjectProvider<SwabbieService>,
- private val spinnakerPluginManager: SpinnakerPluginManager
+ private val spinnakerPluginManager: SpinnakerPluginManager,
+ private val spinnakerUpdateManager: SpinnakerUpdateManager,
+ private val deckPluginService: DeckPluginService
) {
@ApiOperation(value = "Get all installed Spinnaker plugins")
@@ -41,6 +45,7 @@ class PluginsInstalledController(
fun getInstalledPlugins(@RequestParam(value = "service", required = false) service: String?): Map<String, List<SpinnakerPluginDescriptor>> {
return when (service) {
clouddriver -> mutableMapOf(Pair(service, callService { clouddriverService.installedPlugins }))
+ deck -> mutableMapOf(Pair(service, deckPlugins()))
echo -> if (echoService.ifAvailable != null) mutableMapOf(Pair(service, callService { echoService.ifAvailable!!.installedPlugins })) else emptyMap()
fiat -> mutableMapOf(Pair(service, callService { fiatService.installedPlugins }))
front50 -> mutableMapOf(Pair(service, callService { front50Service.installedPlugins }))
@@ -58,6 +63,7 @@ class PluginsInstalledController(
val swabbiePair = if (swabbieService.ifAvailable != null) Pair(swabbie, callService { swabbieService.ifAvailable!!.installedPlugins }) else Pair(swabbie, emptyList())
mutableMapOf(
Pair(clouddriver, callService { clouddriverService.installedPlugins }),
+ Pair(deck, deckPlugins()),
echoPair,
Pair(fiat, callService { fiatService.installedPlugins }),
Pair(front50, callService { front50Service.installedPlugins }),
@@ -78,6 +84,38 @@ class PluginsInstalledController(
.collect(Collectors.toList())
}
+ /**
+ * Map deck plugins to PF4J plugin descriptors. Deck plugins are not PF4J runtime plugins,
+ * but the properties from the plugin info can be mapped correctly.
+ */
+ fun deckPlugins(): List<SpinnakerPluginDescriptor> {
+ val deckPlugins = deckPluginService.getPluginsManifests()
+ val plugins = spinnakerUpdateManager.plugins
+ val descriptors: MutableList<SpinnakerPluginDescriptor> = mutableListOf()
+
+ for (deckPlugin in deckPlugins) {
+ val plugin = plugins.stream()
+ .filter { it.id == deckPlugin.id }
+ .findFirst()
+ .get()
+
+ val release = plugin.getReleases().stream()
+ .filter { it.version == deckPlugin.version }
+ .findFirst()
+ .get()
+
+ descriptors.add(SpinnakerPluginDescriptor(
+ pluginId = plugin.id,
+ pluginDescription = plugin.description,
+ version = release.version,
+ requires = release.requires,
+ provider = plugin.provider
+ ))
+ }
+
+ return descriptors
+ }
+
fun callService(call: () -> List<SpinnakerPluginDescriptor>): List<SpinnakerPluginDescriptor> {
return try {
call()
@@ -92,6 +130,7 @@ class PluginsInstalledController(
companion object {
const val clouddriver: String = "clouddriver"
+ const val deck: String = "deck"
const val echo: String = "echo"
const val fiat: String = "fiat"
const val front50: String = "front50"

diff:
@@ -21,6 +21,7 @@ import com.netflix.spinnaker.config.ErrorConfiguration
import com.netflix.spinnaker.config.PluginsAutoConfiguration
import com.netflix.spinnaker.config.okhttp3.OkHttpClientProvider
import com.netflix.spinnaker.gate.config.ServiceConfiguration
+import com.netflix.spinnaker.gate.plugins.deck.DeckPluginService
import com.netflix.spinnaker.gate.plugins.web.PluginWebConfiguration
import com.netflix.spinnaker.gate.plugins.web.SpinnakerExtensionsConfigProperties
import com.netflix.spinnaker.gate.services.TaskService
@@ -104,6 +105,9 @@ class PluginInfoControllerSpec extends Specification {
@MockBean
private SwabbieService swabbieService
+ @MockBean
+ private DeckPluginService deckPluginService
+
private Map requestContent = ['name': 'test plugin', provider: 'Test Co']
def 'should load configuration bean with expected values'() {

original_message: feat(plugins): List deck plugins at /plugins/installed (#1379)


diff:
@@ -16,6 +16,7 @@ import com.netflix.spinnaker.kork.plugins.update.SpinnakerUpdateManager
import io.swagger.annotations.ApiOperation
import java.util.stream.Collectors
import org.pf4j.PluginWrapper
+import org.slf4j.LoggerFactory
import org.springframework.beans.factory.ObjectProvider
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
@@ -40,6 +41,8 @@ class PluginsInstalledController(
private val deckPluginService: DeckPluginService
) {
+ private val log by lazy { LoggerFactory.getLogger(javaClass) }
+
@ApiOperation(value = "Get all installed Spinnaker plugins")
@RequestMapping(method = [RequestMethod.GET])
fun getInstalledPlugins(@RequestParam(value = "service", required = false) service: String?): Map<String, List<SpinnakerPluginDescriptor>> {
@@ -120,11 +123,8 @@ class PluginsInstalledController(
return try {
call()
} catch (e: RetrofitError) {
- if (e.response?.status == 404) {
- emptyList()
- } else {
- throw e
- }
+ log.warn("Unable to retrieve installed plugins from '${e.response?.url}' due to '${e.response?.status}'")
+ return emptyList()
}
}

original_message: fix(plugins): Return empty installed plugins list on any retrofit error (#1424)


diff:
+/*
+ * Copyright 2021 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.netflix.spinnaker.gate.model.manageddelivery;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import lombok.Data;
+import lombok.NonNull;
+
+@Data
+public class OverrideVerificationRequest {
+ @NonNull @Nonnull String artifactReference;
+ @NonNull @Nonnull String artifactVersion;
+ @NonNull @Nonnull String status;
+ @Nullable String comment;
+}

diff:
+/*
+ * Copyright 2021 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.netflix.spinnaker.gate.model.manageddelivery;
+
+import javax.annotation.Nonnull;
+import lombok.Data;
+import lombok.NonNull;
+
+@Data
+public class RetryVerificationRequest {
+ @NonNull @Nonnull String artifactReference;
+ @NonNull @Nonnull String artifactVersion;
+}

diff:
@@ -22,7 +22,9 @@ import com.netflix.spinnaker.gate.model.manageddelivery.ConstraintStatus;
import com.netflix.spinnaker.gate.model.manageddelivery.DeliveryConfig;
import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactPin;
import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactVeto;
+import com.netflix.spinnaker.gate.model.manageddelivery.OverrideVerificationRequest;
import com.netflix.spinnaker.gate.model.manageddelivery.Resource;
+import com.netflix.spinnaker.gate.model.manageddelivery.RetryVerificationRequest;
import com.netflix.spinnaker.kork.plugins.SpinnakerPluginDescriptor;
import java.util.List;
import java.util.Map;
@@ -163,6 +165,20 @@ public interface KeelService {
@POST("/application/{application}/mark/good")
Response markGood(@Path("application") String application, @Body EnvironmentArtifactVeto veto);
+ @POST("/application/{application}/environment/{environment}/verifications/{verificationId}")
+ Response overrideVerification(
+ @Path("application") String application,
+ @Path("environment") String environment,
+ @Path("verificationId") String verificationId,
+ @Body OverrideVerificationRequest payload);
+
+ @POST("/application/{application}/environment/{environment}/verifications/{verificationId}/retry")
+ Response retryVerification(
+ @Path("application") String application,
+ @Path("environment") String environment,
+ @Path("verificationId") String verificationId,
+ @Body RetryVerificationRequest payload);
+
@GET("/installedPlugins")
List<SpinnakerPluginDescriptor> getInstalledPlugins();
}

diff:
@@ -8,7 +8,9 @@ import com.netflix.spinnaker.gate.model.manageddelivery.ConstraintStatus;
import com.netflix.spinnaker.gate.model.manageddelivery.DeliveryConfig;
import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactPin;
import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactVeto;
+import com.netflix.spinnaker.gate.model.manageddelivery.OverrideVerificationRequest;
import com.netflix.spinnaker.gate.model.manageddelivery.Resource;
+import com.netflix.spinnaker.gate.model.manageddelivery.RetryVerificationRequest;
import com.netflix.spinnaker.gate.services.NotificationService;
import com.netflix.spinnaker.gate.services.internal.KeelService;
import groovy.util.logging.Slf4j;
@@ -346,6 +348,27 @@ public class ManagedController {
keelService.markGood(application, veto);
}
+ @ApiOperation(value = "Override the status of a verification")
+ @PostMapping(path = "/{application}/environment/{environment}/verifications/{verificationId}")
+ void overrideVerification(
+ @PathVariable("application") String application,
+ @PathVariable("environment") String environment,
+ @PathVariable("verificationId") String verificationId,
+ @RequestBody OverrideVerificationRequest payload) {
+ keelService.overrideVerification(application, environment, verificationId, payload);
+ }
+
+ @ApiOperation(value = "Retry a verification")
+ @PostMapping(
+ path = "/{application}/environment/{environment}/verifications/{verificationId}/retry")
+ void retryVerification(
+ @PathVariable("application") String application,
+ @PathVariable("environment") String environment,
+ @PathVariable("verificationId") String verificationId,
+ @RequestBody RetryVerificationRequest payload) {
+ keelService.retryVerification(application, environment, verificationId, payload);
+ }
+
@PostMapping(
path = "/notifications/callbacks/{source}",
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,

original_message: feat(managed): expose override and retry verification endpoints (#1425)


diff:
@@ -23,6 +23,7 @@ import com.netflix.spectator.api.Registry
import com.netflix.spinnaker.config.okhttp3.OkHttpClientProvider
import com.netflix.spinnaker.gate.api.extension.ProxyConfigProvider
import com.netflix.spinnaker.kork.web.exceptions.InvalidRequestException
+import com.netflix.spinnaker.kork.web.interceptors.Criticality
import com.netflix.spinnaker.security.AuthenticatedRequest
import okhttp3.Request
import okhttp3.RequestBody
@@ -46,6 +47,7 @@ import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.HandlerMapping
+@Criticality(Criticality.Value.LOW)
@RestController
@RequestMapping(value = ["/proxies"])
class ProxyController(

diff:
@@ -13,6 +13,7 @@ import com.netflix.spinnaker.gate.model.manageddelivery.Resource;
import com.netflix.spinnaker.gate.model.manageddelivery.RetryVerificationRequest;
import com.netflix.spinnaker.gate.services.NotificationService;
import com.netflix.spinnaker.gate.services.internal.KeelService;
+import com.netflix.spinnaker.kork.web.interceptors.Criticality;
import groovy.util.logging.Slf4j;
import io.github.resilience4j.retry.RetryConfig;
import io.github.resilience4j.retry.RetryRegistry;
@@ -47,6 +48,7 @@ import retrofit.RetrofitError;
import retrofit.client.Header;
import retrofit.client.Response;
+@Criticality(Criticality.Value.LOW)
@RequestMapping("/managed")
@RestController
@Slf4j

original_message: chore(metrics): Set low metric criticality on ProxyController and ManagedController (#1439)


diff:
package com.netflix.spinnaker.gate.controllers;
import com.netflix.spinnaker.gate.services.CiService;
+import com.netflix.spinnaker.kork.web.interceptors.Criticality;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+@Criticality(Criticality.Value.LOW)
@RestController
@RequestMapping("/ci")
public class CiController {

original_message: chore(metrics): Set CiController metric criticality to low (#1441)


message:
Added new Generations codes
Added code for enabling the longer blue trial
Added code to lock the game's framerate. By default it's set to 59.94 FPS.

license: MIT License

original_message:
Added new Generations codes

- Added code for enabling the longer blue trial
- Added code to lock the game's framerate. By default it's set to 59.94 FPS.


message: Added code to make stomp keep horizontal velocity


message:
Added some more Sonic Generations codes
No Out of Control on Baloons
No Out of Control on JumpSprings

diff:
@@ -288,3 +288,13 @@ write8 013C1FE9 0x68
write32 013C1FEA 0x3210
write8 013C1FEE 0xE9
write32 013C1FEF 0xFF69CB70
+
+Patch "No Out of Control Baloons"
+write32 11BEBAA 0x0000B6E9
+write8 11BEBAF 0x00
+writenop 11BEBB0 2
+
+Patch "No Out of Control JumpSprings"
+write32 011BEA91 0x0001CFE9
+write16 011BEA95 0x8B00
+write8 011BEA97 0x83

original_message:
Added some more Sonic Generations codes

- No Out of Control on Baloons
- No Out of Control on JumpSprings


message: Updated "No Out of Control Balloons" Code

diff:
@@ -292,8 +292,8 @@ write32 013C1FEF 0xFF69CB70
Patch "No Out of Control Balloons"
write32 11BEBAA 0x0000B6E9
-write8 11BEBAF 0x00
-writenop 11BEBB0 2
+write8 11BEBAE 0x00
+writenop 11BEBAF 2
Patch "No Out of Control JumpSprings"
write32 011BEA91 0x0001CFE9


message: Added "Tricks don't fill the boost gauge" patch

diff:
@@ -317,3 +317,7 @@ writenop 00DF2385 1
Code "All Walls Are Wall-Jumpable"
write8 p01E5E2F0|80C 1
+
+Patch "Tricks don't fill the boost gauge"
+writenop 00E4B323 8
+writenop 00E4B353 8


message: Added "Boost Gauge Starts Empty" patch

diff:
@@ -318,6 +318,10 @@ writenop 00DF2385 1
Code "All Walls Are Wall-Jumpable"
write8 p01E5E2F0|80C 1
-Patch "Tricks don't fill the boost gauge"
+Patch "Tricks Don't Fill The Boost Gauge"
writenop 00E4B323 8
writenop 00E4B353 8
+
+Patch "Boost Gauge Starts Empty"
+write32 00E64F2F 0x90C9570F
+writenop 00E64F33 4

original_message: Added "Boost Gauge Starts Empty" patch


message: Fixed typo in pt-BR and included language file in project

diff:
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="Languages\pt-BR.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
<Page Include="Languages\pt-PT.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>


message: Adds more margin to the window when it's maximized

diff:
<ControlTemplate TargetType="{x:Type Window}">
<Grid>
<Border x:Name="OutlineBorder" BorderThickness="1" Background="Transparent" IsHitTestVisible="False" BorderBrush="#017ACC" Panel.ZIndex="2"/>
- <Grid Margin="1" Background="{TemplateBinding Background}" Loaded="Window_Loaded" Panel.ZIndex="1">
+ <Grid x:Name="WindowGrid" Margin="1" Background="{TemplateBinding Background}" Loaded="Window_Loaded" Panel.ZIndex="1">
<Grid.RowDefinitions>
<RowDefinition Height="22"/>
<RowDefinition Height="*"/>
<Trigger Property="IsActive" Value="True">
<Setter TargetName="OutlineBorder" Property="Opacity" Value="1"/>
</Trigger>
+ <Trigger Property="WindowState" Value="Maximized">
+ <Setter TargetName="WindowGrid" Property="Margin" Value="8"/>
+ </Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>


message:
Fixed image alignment on README
Also changed the link of the image to a chapter anchor link

diff:
-  Hedge Mod Manager
+
+
+
+ Hedge Mod Manager

A mod manager for Hedgehog Engine games on PC.


message: Updated Portuguese translations and about window

diff:
<system:String x:Key="MainUISave" >Guardar</system:String>
<system:String x:Key="MainUISaveAndPlay" >Guardar e Jogar</system:String>
<system:String x:Key="MainUIPlay" >Jogar</system:String>
+ <system:String x:Key="MainUIMLDownloadFail">Erro ao transferir o carregador de mods.</system:String>
<!-- Mods UI Strings -->
<system:String x:Key="ModsUIName" >Nome</system:String>

diff:
<Label Content="Base Design"/>
<Label Content="CPKREDIR"/>
<Label Content="Contributing to Forces Mod Loader"/>
- <Label Content="Cheat codes"/>
+ <Label Content="Contributing to the project"/>
<Label Content="Contributing to the project"/>
<Label Content="mod-loader-common"/>
</StackPanel>


message: Made some strings localisable and improved portuguese translations

diff:
<system:String x:Key="CommonUIOK" >OK</system:String>
<system:String x:Key="CommonUICancel" >Cancel</system:String>
<system:String x:Key="CommonUIYes" >Yes</system:String>
+ <system:String x:Key="CommonUIBlocked" >Blocked</system:String>
<system:String x:Key="CommonUINo" >No</system:String>
<system:String x:Key="CommonUIRetry" >Retry</system:String>
<system:String x:Key="CommonUIUpdate" >Update</system:String>
<system:String x:Key="StatusUINoCodeUpdatesFound" >No code updates found</system:String>
<!-- Dialog UI Strings -->
+ <system:String xml:space="preserve" x:Key="DialogUINoModsFolder">Hedge Mod Manager did not detect any mods folder.
Would you like create a mods folder?</system:String>
<system:String xml:space="preserve" x:Key="DialogUIDeleteMod">Are you sure you want to delete "{0}"?
This action cannot be undone!</system:String>
+ <system:String xml:space="preserve" x:Key="DialogUIModNewest">{0} is already up to date.</system:String>
+ <system:String xml:space="preserve" x:Key="DialogUIModUpdate">A newer version of {0} available! ({1})</system:String>
+ <system:String xml:space="preserve" x:Key="DialogUIModCancelUpdate">Are you sure you want to cancel updating?
This may corrupt {0}</system:String>
<!-- Status UI Lang Stuff Strings -->
<system:String x:Key="StatusUIUpdateCompletedSingular" >completed</system:String>
<!-- Mod Config UI Strings -->
<system:String x:Key="ModConfigUITitle">Configure {0}</system:String>
+ <!-- Mod Description UI Strings -->
+ <system:String x:Key="ModDescriptionUIAbout">About {0}</system:String>
+ <system:String x:Key="ModDescriptionUIMadeBy">Made by</system:String>
+ <system:String x:Key="ModDescriptionUIDate">on</system:String>
+
<!-- Mod Downloader Strings -->
<system:String x:Key="ModDownloaderFailed">Failed to Download Mod</system:String>
<system:String xml:space="preserve" x:Key="ModDownloaderWebError">An error has occurred during the download. Servers might be down or overloaded. Please try again later.

Details: {0}</system:String>

diff:
@@ -130,12 +130,7 @@ namespace HedgeModManager.Properties {
///}
///
///th, td {
- /// padding: 2px;
- ///}
- ///
- ///th {
- /// text-align: left;
- ///}.
+ /// padding: [rest of string was truncated]";.
/// </summary>
internal static string GBStyleSheet {
get {
@@ -217,25 +212,6 @@ namespace HedgeModManager.Properties {
}
}
- /// <summary>
- /// Looks up a localized string similar to Are you sure you want to cancel updating?
- ///This may corrupt {0}.
- /// </summary>
- internal static string STR_CANCEL_WARNING {
- get {
- return ResourceManager.GetString("STR_CANCEL_WARNING", resourceCulture);
- }
- }
-
- /// <summary>
- /// Looks up a localized string similar to {0} is already up to date..
- /// </summary>
- internal static string STR_MOD_NEWEST {
- get {
- return ResourceManager.GetString("STR_MOD_NEWEST", resourceCulture);
- }
- }
-
/// <summary>
/// Looks up a localized string similar to HedgeModManager could not detect any supported games
///in the current directory!
@@ -248,25 +224,6 @@ namespace HedgeModManager.Properties {
}
}
- /// <summary>
- /// Looks up a localized string similar to A newer version of {0} available! ({1}).
- /// </summary>
- internal static string STR_UI_MOD_UPDATE {
- get {
- return ResourceManager.GetString("STR_UI_MOD_UPDATE", resourceCulture);
- }
- }
-
- /// <summary>
- /// Looks up a localized string similar to Hedge Mod Manager did not detect any mods folder.
- ///Would you like create a mods folder?.
- /// </summary>
- internal static string STR_UI_NO_MODS {
- get {
- return ResourceManager.GetString("STR_UI_NO_MODS", resourceCulture);
- }
- }
-
/// <summary>
/// Looks up a localized string similar to https://raw.githubusercontent.com/thesupersonic16/HedgeModManager/rewrite/HedgeModManager/Resources/Codesv2/SonicForces.hmm.
/// </summary>

diff:
<data name="MemoryService" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MemoryService.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
- <data name="STR_CANCEL_WARNING" xml:space="preserve">
- <value>Are you sure you want to cancel updating?
-This may corrupt {0}</value>
- </data>
- <data name="STR_MOD_NEWEST" xml:space="preserve">
- <value>{0} is already up to date.</value>
- </data>
<data name="STR_MSG_NOGAME" xml:space="preserve">
<value>HedgeModManager could not detect any supported games
in the current directory!
Do you want run the HMM Auto Installer?</value>
- </data>
- <data name="STR_UI_MOD_UPDATE" xml:space="preserve">
- <value>A newer version of {0} available! ({1})</value>
- </data>
- <data name="STR_UI_NO_MODS" xml:space="preserve">
- <value>Hedge Mod Manager did not detect any mods folder.
-Would you like create a mods folder?</value>
</data>
<data name="URL_FML_CODES" xml:space="preserve">
<value>https://raw.githubusercontent.com/thesupersonic16/HedgeModManager/rewrite/HedgeModManager/Resources/Codesv2/SonicForces.hmm</value>

diff:
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock x:Name="TitleLbl" Text="Title" FontSize="26" Width="Auto"/>
<TextBlock FontSize="14" Width="Auto" Visibility="{Binding AuthorURL, Converter={StaticResource EmptyStringToVisibilityConverter}}">
- <Run Text="Made by"/>
+ <Run Text="{StaticResource ModDescriptionUIMadeBy}"/>
<Hyperlink NavigateUri="{Binding AuthorURL}" Click="Hyperlink_OnClick">
<Run Text="{Binding Author}" Foreground="{DynamicResource HMM.Window.HeaderAccentBrush}"/>
</Hyperlink>
- <Run Text="on"/>
+ <Run Text="{StaticResource ModDescriptionUIDate}"/>
<Run Text="{Binding Date}"/>
</TextBlock>
<TextBlock FontSize="14" Width="Auto" Visibility="{Binding AuthorURL, Converter={StaticResource InverseEmptyStringToVisibilityConverter}}">
- <Run Text="Made by"/>
+ <Run Text="{StaticResource ModDescriptionUIMadeBy}"/>
<Run Text="{Binding Author}"/>
- <Run Text="on"/>
+ <Run Text="{StaticResource ModDescriptionUIDate}"/>
<Run Text="{Binding Date}"/>
</TextBlock>
</StackPanel>

diff:
@@ -25,7 +25,7 @@ namespace HedgeModManager
{
DataContext = mod;
InitializeComponent();
- Title = $"About {mod.Title}";
+ Title = string.Format(Lang.Localise("ModDescriptionUIAbout"), mod.Title);
TitleLbl.Text = $"{mod.Title}";
if (!string.IsNullOrEmpty(mod.Version))
{

diff:
@@ -16,9 +16,9 @@ namespace HedgeModManager
{
var server = (string)value;
if (string.IsNullOrEmpty(server))
- return "No";
+ return Lang.Localise("CommonUINo");
- return HedgeApp.NetworkConfiguration.IsServerBlocked(server) ? "Blocked" : "Yes";
+ return HedgeApp.NetworkConfiguration.IsServerBlocked(server) ? Lang.Localise("CommonUIBlocked") : Lang.Localise("CommonUIYes");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

diff:
@@ -104,7 +104,7 @@ namespace HedgeModManager
if (!Directory.Exists(HedgeApp.ModsDbPath))
{
Application.Current?.MainWindow?.Hide();
- var box = new HedgeMessageBox("No Mods Found", Properties.Resources.STR_UI_NO_MODS);
+ var box = new HedgeMessageBox("No Mods Found", Localise("DialogUINoModsFolder"));
box.AddButton("Yes", () =>
{
@@ -322,14 +322,14 @@ namespace HedgeModManager
{
if (showUpdatedDialog)
{
- var box = new HedgeMessageBox(string.Empty, string.Format(HMMResources.STR_MOD_NEWEST, mod.Title));
+ var box = new HedgeMessageBox(string.Empty, string.Format(Localise("DialogUIModNewest"), mod.Title));
box.AddButton(Localise("CommonUIOK"), () => box.Close());
box.ShowDialog();
}
return;
}
- var dialog = new HedgeMessageBox(string.Format(HMMResources.STR_UI_MOD_UPDATE, mod.Title, update.VersionString)
+ var dialog = new HedgeMessageBox(string.Format(Localise("DialogUIModUpdate"), mod.Title, update.VersionString)
, update.ChangeLog, type: InputType.MarkDown);
dialog.AddButton(Localise("CommonUIUpdate"), () =>

diff:
@@ -143,7 +143,7 @@ namespace HedgeModManager.UI
}
e.Cancel = true;
- WarningDialog = new HedgeMessageBox("Hedge Mod Manager", string.Format(HMMResources.STR_CANCEL_WARNING, UpdateInfo.Mod.Title));
+ WarningDialog = new HedgeMessageBox("Hedge Mod Manager", string.Format(Lang.Localise("DialogUIModCancelUpdate"), UpdateInfo.Mod.Title));
WarningDialog.AddButton("Yes", () =>
{


message: Centered tab text vertically and updated portuguese translations

diff:
<ControlTemplate TargetType="{x:Type TabItem}">
<Border BorderBrush="Transparent" Width="{TemplateBinding Width}"
Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
- <TextBlock Text="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}"/>
+ <TextBlock Text="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">


message: Stop using false and true in UI

diff:
@@ -30,6 +30,21 @@ namespace HedgeModManager
}
}
+ [ValueConversion(typeof(bool), typeof(string))]
+ public class ModSupportsSaveConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var supportsSave = (bool)value;
+ return supportsSave ? Lang.Localise("CommonUIYes") : Lang.Localise("CommonUINo");
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+ }
+
[ValueConversion(typeof(string), typeof(Visibility))]
public class EmptyStringToVisibilityConverter : IValueConverter
{

diff:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<local:ModUpdateStatusConverter x:Key="ModUpdateStatusConverter"/>
+ <local:ModSupportsSaveConverter x:Key="ModSupportsSaveConverter"/>
<ContextMenu x:Key="ModContextMenu">
<MenuItem Header="{DynamicResource ModsUIModDescription}" Click="UI_Description_Click" InputGestureText="(Ctrl+D)"/>
<MenuItem Header="{DynamicResource ModsUIModFavorite}" Click="UI_Favorite_Click" InputGestureText="(Alt+F)"/>
</GridViewColumn>
<GridViewColumn Header="{DynamicResource ModsUIVersion}" Width="60" DisplayMemberBinding="{Binding Version}"/>
<GridViewColumn Header="{DynamicResource ModsUIAuthor}" Width="89" DisplayMemberBinding="{Binding Author}"/>
- <GridViewColumn Header="{DynamicResource ModsUISupportSave}" Width="105" DisplayMemberBinding="{Binding SupportsSave}"/>
+ <GridViewColumn Header="{DynamicResource ModsUISupportSave}" Width="105" DisplayMemberBinding="{Binding SupportsSave, Converter={StaticResource ModSupportsSaveConverter}}"/>
<GridViewColumn Header="{DynamicResource ModsUIHasUpdate}" Width="70" DisplayMemberBinding="{Binding UpdateServer, Converter={StaticResource ModUpdateStatusConverter}}"/>
</GridView>
</ListView.View>

original_message: Stop using false and true in UI


message: Renamed boolean to 'yes' and 'no' converter

diff:
@@ -31,7 +31,7 @@ namespace HedgeModManager
}
[ValueConversion(typeof(bool), typeof(string))]
- public class ModSupportsSaveConverter : IValueConverter
+ public class BoolToYesNoConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{

diff:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<local:ModUpdateStatusConverter x:Key="ModUpdateStatusConverter"/>
- <local:ModSupportsSaveConverter x:Key="ModSupportsSaveConverter"/>
+ <local:BoolToYesNoConverter x:Key="BoolToYesNoConverter"/>
<ContextMenu x:Key="ModContextMenu">
<MenuItem Header="{DynamicResource ModsUIModDescription}" Click="UI_Description_Click" InputGestureText="(Ctrl+D)"/>
<MenuItem Header="{DynamicResource ModsUIModFavorite}" Click="UI_Favorite_Click" InputGestureText="(Alt+F)"/>
</GridViewColumn>
<GridViewColumn Header="{DynamicResource ModsUIVersion}" Width="60" DisplayMemberBinding="{Binding Version}"/>
<GridViewColumn Header="{DynamicResource ModsUIAuthor}" Width="89" DisplayMemberBinding="{Binding Author}"/>
- <GridViewColumn Header="{DynamicResource ModsUISupportSave}" Width="105" DisplayMemberBinding="{Binding SupportsSave, Converter={StaticResource ModSupportsSaveConverter}}"/>
+ <GridViewColumn Header="{DynamicResource ModsUISupportSave}" Width="105" DisplayMemberBinding="{Binding SupportsSave, Converter={StaticResource BoolToYesNoConverter}}"/>
<GridViewColumn Header="{DynamicResource ModsUIHasUpdate}" Width="70" DisplayMemberBinding="{Binding UpdateServer, Converter={StaticResource ModUpdateStatusConverter}}"/>
</GridView>
</ListView.View>


diff:
@@ -18,8 +18,12 @@ A mod manager for Hedgehog Engine games on PC.
- Sonic Origins ([Steam](https://store.steampowered.com/app/1794960/Sonic_Origins/), [Epic Games Store](https://store.epicgames.com/en-US/p/sonic-origins))
## So how do I use this?
+### Windows
It's simple, just grab the [latest version from GitHub](https://github.com/thesupersonic16/HedgeModManager/releases/latest) (or grab the latest compile from [GitHub Actions](https://nightly.link/thesupersonic16/HedgeModManager/workflows/build/rewrite/HedgeModManager-Release.zip)) then extract all the files anywhere and run `HedgeModManager.exe`.
+### Linux/Steam Deck
+In case you want to use HedgeModManager on Linux/Steam Deck, the setup process is a bit more involved. Check out [this guide](https://github.com/thesupersonic16/HedgeModManager/wiki/Running-on-Linux-(Wine)) on the wiki.
+
## How do I install mods?
There are multiple ways of installing mods, one of the easy ways of installing mods is by dragging its zip/7z/rar/folder into the mod list along with also being able to drag and drop multiple files and/or folders.

original_message: Add Linux/Steam Deck tutorial to the readme (#480)


message: Remove UsdBuildPostProcess

diff:
-fileFormatVersion: 2
-guid: 69d8cc1cb47042c48ba6888e6675cce5
-folderAsset: yes
-timeCreated: 1527033015
-licenseType: Pro
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-fileFormatVersion: 2
-guid: ca99e7d6c442d954fad4b9bf1098cc06
-timeCreated: 1521838717
-licenseType: Pro
-MonoImporter:
- externalObjects: {}
- serializedVersion: 2
- defaultReferences: []
- executionOrder: 0
- icon: {instanceID: 0}
- userData:
- assetBundleName:
- assetBundleVariant:

repo: unity-technologies/usd-unity-sdk

original_message: Remove UsdBuildPostProcess


message: Commit asmdefs and package.json

diff:
+{
+ "name": "Unity.Formats.USD.Editor",
+ "references": [
+ "Unity.Formats.USD.Runtime",
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": []
+}

diff:
+{
+ "name": "Unity.Formats.USD.Examples.Editor",
+ "references": [
+ "Unity.Formats.USD.Examples.Runtime",
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": []
+}

diff:
+{
+ "name": "Unity.Formats.USD.Examples.Runtime",
+ "references": [
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": []
+}

diff:
+{
+ "name": "Unity.Formats.USD.Runtime",
+ "references": [
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": []
+}

diff:
+{
+ "dependencies": {
+ "com.unity.timeline" : "1.0.0"
+ },
+ "description": "Blah USD.",
+ "displayName": "USD",
+ "keywords": [
+ "usd",
+ ],
+ "name": "com.unity.formats.usd",
+ "repoPackagePath": "build/install/com.unity.formats.alembic",
+ "repository": {
+ "type": "git",
+ "revision": "02da3f2a1167bc44b6124596b9dc58cbfd9b511c",
+ "url": "ssh://git@github.com/unity3d-jp/AlembicForUnity.git"
+ },
+ "unity": "2018.3",
+ "unityRelease": "4f1",
+ "version": "1.0.0-preview.19"
+}

original_message: Commit asmdefs and package.json


message: First compiling version. Moved InitUSD from examples and updated asmdefs references.

diff:
{
"name": "Unity.Formats.USD.Examples.Editor",
"references": [
+ "Unity.Formats.USD.Runtime",
"Unity.Formats.USD.Examples.Runtime"
],
"includePlatforms": [

diff:
{
"name": "Unity.Formats.USD.Examples.Runtime",
"references": [
+ "Unity.Formats.USD.Runtime"
],
"includePlatforms": [
"Editor"

change_type: RENAME

diff:
fileFormatVersion: 2
guid: f8fae6d567ef41447a2b5881d690daa9
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
'': Any
second:
enabled: 0
@@ -26,85 +26,73 @@ PluginImporter:
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 0
- data:
- first:
+ - first:
Any:
second:
enabled: 0
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: 6e217cb8049e9074198b08b024e26cc6
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
'': Any
second:
enabled: 0
@@ -26,85 +26,73 @@ PluginImporter:
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 0
- data:
- first:
+ - first:
Any:
second:
enabled: 0
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: dc5987c4c62586845a47936498291bc1
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
Any:
second:
enabled: 1
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 0
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: 37bd96a962a604944a8b7e966afed4f5
-timeCreated: 1526175246
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
Any:
second:
enabled: 1
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 0
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: ad6672fbdc360274cbf5331a49b7e4af
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
Any:
second:
enabled: 1
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 0
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: ece75a9069a4c0048bb66ea06340455f
folderAsset: yes
-timeCreated: 1533493668
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
Any:
second:
enabled: 1
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 0
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: 57bfcaa14d75b0c43991f2555a61d822
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
'': Any
second:
enabled: 0
@@ -26,85 +26,73 @@ PluginImporter:
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 0
- data:
- first:
+ - first:
Any:
second:
enabled: 0
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
fileFormatVersion: 2
guid: f30cbc169f57ee144aecb535c94062a8
-timeCreated: 1526175247
-licenseType: Pro
PluginImporter:
+ externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
+ defineConstraints: []
isPreloaded: 0
isOverridable: 0
+ isExplicitlyReferenced: 0
platformData:
- data:
- first:
+ - first:
'': Any
second:
enabled: 0
@@ -26,85 +26,73 @@ PluginImporter:
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 0
- data:
- first:
+ - first:
Any:
second:
enabled: 0
settings: {}
- data:
- first:
+ - first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
- data:
- first:
+ - first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
- data:
- first:
+ - first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Linux64
second:
enabled: 1
settings:
- CPU: x86_64
- data:
- first:
+ CPU: AnyCPU
+ - first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
- data:
- first:
+ - first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: x86_64
- data:
- first:
+ - first:
Standalone: Win
second:
enabled: 1
settings:
CPU: None
- data:
- first:
+ - first:
Standalone: Win64
second:
enabled: 1

diff:
using System;
using System.Collections.Generic;
using pxr;
+using Unity.Collections;
using UnityEngine;
#if !UNITY_2017 && !UNITY_2018
using Unity.Collections;

diff:
{
"name": "Unity.Formats.USD.Runtime",
"references": [
+ "Unity.Timeline"
],
"includePlatforms": [
"Editor"


message: Fix InitUSD so it finds plugins.

diff:
@@ -49,20 +49,21 @@ namespace USD.NET.Examples {
// USD has several auxillary C++ plugin discovery files which must be discoverable at run-time
// We store those libs in Support/ThirdParty/Usd and then set a magic environment variable to let
// USD's libPlug know where to look to find them.
- private static void SetupUsdPath() {
- var supPath = UnityEngine.Application.dataPath.Replace("\\", "/");
+ private static void SetupUsdPath()
+ {
+ var supPath = System.IO.Path.GetFullPath("Packages/com.unity.formats.usd/Runtime/Plugins");
#if (UNITY_EDITOR_WIN)
- supPath += @"/UsdUnitySdk/Plugins/x86_64/share/";
+ supPath += @"/x86_64/share/";
#elif (UNITY_EDITOR_OSX)
- supPath += @"/UsdUnitySdk/Plugins/x86_64/UsdCs.bundle/Contents/Resources/share/";
+ supPath += @"/x86_64/UsdCs.bundle/Contents/Resources/share/";
#elif (UNITY_STANDALONE_WIN)
- supPath += @"/Plugins/share/";
+ supPath += @"/share/";
#elif (UNITY_STANDALONE_OSX)
- supPath += @"/Plugins/UsdCs.bundle/Contents/Resources/share/";
+ supPath += @"/UsdCs.bundle/Contents/Resources/share/";
#endif
- SetupUsdSysPath();
+ //SetupUsdSysPath();
Debug.LogFormat("Registering plugins: {0}", supPath);
pxr.PlugRegistry.GetInstance().RegisterPlugins(supPath);

original_message: Fix InitUSD so it finds plugins.


message: Change asmdefs

diff:
"references": [
"Unity.Formats.USD.Runtime"
],
+ "optionalUnityReferences": [],
"includePlatforms": [
- "Editor"
+ "Editor",
+ "macOSStandalone",
+ "WindowsStandalone64"
],
- "excludePlatforms": []
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": []
}
\ No newline at end of file

diff:
"references": [
"Unity.Timeline"
],
+ "optionalUnityReferences": [],
"includePlatforms": [
- "Editor"
+ "Editor",
+ "macOSStandalone",
+ "WindowsStandalone64"
],
- "excludePlatforms": []
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": []
}
\ No newline at end of file

original_message: Change asmdefs


message: Fix up package.json

diff:
"dependencies": {
"com.unity.timeline" : "1.0.0"
},
- "description": "Blah USD.",
+ "description": "The USD package provides an API to manipulate Universal Scene Description (.usd) files. USD is a 3D Scene format that scales well to large scenes and contains assets of different types (geometry, images, etc).",
"displayName": "USD",
"keywords": [
"usd"
],
"name": "com.unity.formats.usd",
- "repoPackagePath": "build/install/com.unity.formats.alembic",
+ "repoPackagePath": "package/com.unity.formats.usd",
"repository": {
"type": "git",
- "revision": "02da3f2a1167bc44b6124596b9dc58cbfd9b511c",
- "url": "ssh://git@github.com/unity3d-jp/AlembicForUnity.git"
+ "url": "ssh://git@github.com:Unity-Technologies/usd-unity-sdk.git"
},
"unity": "2018.3",
"unityRelease": "4f1",

original_message: Fix up package.json


message: Remove dead code that sets the PATH variable.

diff:
@@ -63,28 +63,8 @@ namespace USD.NET.Examples {
supPath += @"/UsdCs.bundle/Contents/Resources/share/";
#endif
- //SetupUsdSysPath();
-
Debug.LogFormat("Registering plugins: {0}", supPath);
pxr.PlugRegistry.GetInstance().RegisterPlugins(supPath);
}
-
- /// Adds the USD plugin paths to the system path.
- private static void SetupUsdSysPath() {
- var pathVar = "PATH";
- var target = System.EnvironmentVariableTarget.Process;
- var pathvar = System.Environment.GetEnvironmentVariable(pathVar, target);
-#if (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN)
- var supPath = UnityEngine.Application.dataPath + @"\Plugins;";
- supPath += UnityEngine.Application.dataPath + @"\UsdUnitySdk\Plugins\x86_64;";
-#elif (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
- var supPath = UnityEngine.Application.dataPath + @"\Plugins;";
- supPath += UnityEngine.Application.dataPath + @"\UsdUnitySdk\Plugins\x86_64/Contents/Resources/share;";
-#endif
- var value = pathvar + @";" + supPath;
- Debug.LogFormat("Adding to sys path: {0}", supPath);
- System.Environment.SetEnvironmentVariable(pathVar, value, target);
}
}
\ No newline at end of file
-
-}
\ No newline at end of file


message: Fix asmdefs formatting.

diff:
fileFormatVersion: 2
-guid: c1a5cf5747ab74ad7bcc82fcdb862098
+guid: 650de2f7c4d28489991d63b301bb7511
AssemblyDefinitionImporter:
externalObjects: {}
userData:

diff:
fileFormatVersion: 2
-guid: 1708f699bb6694a9dab08a38a198b905
+guid: 23f5434d63b3b43309cf427185da96fe
AssemblyDefinitionImporter:
externalObjects: {}
userData:

original_message: Fix asmdefs formatting.


message: Add a test project that refers to the USD package

old_path: .gitignore

new_path: .gitignore

diff:
@@ -51,18 +51,10 @@ packages.config
# OSX
.DS_Store
-unity-assetpackage/Assets/Tmp/
-
-unity-assetpackage/Assets/Tmp\.meta
-
-unity-assetpackage/Assembly-CSharp-Editor\.csproj
-
-unity-assetpackage/Assembly-CSharp-firstpass\.csproj
-
-unity-assetpackage/Assembly-CSharp\.csproj
-
-unity-assetpackage/unity-assetpackage\.csproj
-
-unity-assetpackage/unity-assetpackage\.Editor\.csproj
+TestProject/Library
+TestProject/ProjectSettings
+TestProject/Temp
+Testproject/*.sln
+Testproject/*.csproj
inst-dbg/

diff:
+{
+ "dependencies": {
+ "com.unity.ads": "2.0.8",
+ "com.unity.analytics": "3.2.2",
+ "com.unity.collab-proxy": "1.2.15",
+ "com.unity.formats.usd": "file:../../package/com.unity.formats.usd/",
+ "com.unity.package-manager-ui": "2.0.3",
+ "com.unity.purchasing": "2.0.3",
+ "com.unity.textmeshpro": "1.3.0",
+ "com.unity.modules.ai": "1.0.0",
+ "com.unity.modules.animation": "1.0.0",
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.cloth": "1.0.0",
+ "com.unity.modules.director": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.particlesystem": "1.0.0",
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.physics2d": "1.0.0",
+ "com.unity.modules.screencapture": "1.0.0",
+ "com.unity.modules.terrain": "1.0.0",
+ "com.unity.modules.terrainphysics": "1.0.0",
+ "com.unity.modules.tilemap": "1.0.0",
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.uielements": "1.0.0",
+ "com.unity.modules.umbra": "1.0.0",
+ "com.unity.modules.unityanalytics": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequestaudio": "1.0.0",
+ "com.unity.modules.unitywebrequesttexture": "1.0.0",
+ "com.unity.modules.unitywebrequestwww": "1.0.0",
+ "com.unity.modules.vehicles": "1.0.0",
+ "com.unity.modules.video": "1.0.0",
+ "com.unity.modules.vr": "1.0.0",
+ "com.unity.modules.wind": "1.0.0",
+ "com.unity.modules.xr": "1.0.0"
+ }
+}


message: Copy over the package description & keywords. Initial package version is 1.0.0-preview1

diff:
"dependencies": {
"com.unity.timeline" : "1.0.0"
},
- "description": "The USD package provides an API to manipulate Universal Scene Description (.usd) files. USD is a 3D Scene format that scales well to large scenes and contains assets of different types (geometry, images, etc).",
+ "description": "The Unity USD package contains a set of libraries designed to support the use of Pixar's Universal Scene Description (USD) in Unity. The goal of this package is to make it maximally easy to integrate USD using native Unity & C# data types with a familiar serialization paradigm and little prior knowledge of USD. USD enables round-trip asset workflows between digital content creation tools like Maya, 3ds Max, Houdini, Katana, Nuke, Modo, Sketchup, Substance Designer, and Substance Painter. \n\nUnlike other asset file formats, Universal Scene Description is designed to support an entire asset pipeline and to enable teams to work in parallel using asset references and overrides. \n\nThis package includes ready-to-use binaries and examples to allow anyone to easily jump-in (see Examples folder).",
"displayName": "USD",
"keywords": [
- "usd"
+ "usd",
+ "alembic",
+ "universal",
+ "scene",
+ "description",
+ "import",
+ "export",
+ "asset",
+ "model",
+ "animation",
+ "assembly",
+ "geometry",
+ "shading",
+ "usdz",
+ "pipeline"
],
"name": "com.unity.formats.usd",
"repoPackagePath": "package/com.unity.formats.usd",
},
"unity": "2018.3",
"unityRelease": "4f1",
- "version": "0.0.1-preview.1"
+ "version": "1.0.0-preview.1"
}


message: Fix empty/null string

diff:
@@ -42,7 +42,7 @@ namespace Unity.Formats.USD {
/// </summary>
public string usdFullPath
{
- get { return Path.GetFullPath(m_usdFile); }
+ get { return string.IsNullOrEmpty(m_usdFile) ? string.Empty : (Path.GetFullPath(m_usdFile)); }
set { m_usdFile = value; }
}

original_message: Fix empty/null string


message: Create HelloUsd

diff:
},
"unity": "2018.3",
"unityRelease": "4f1",
- "version": "1.0.0-preview.1"
+ "version": "1.0.0-preview.1",
+ "samples":[
+ {
+ "displayName" : "HelloUsd",
+ "description" : "Some Description",
+ "path" : "Samples~/HelloUsd"
+ }
+ ]
}

original_message: Create HelloUsd


message: Create ExportMesh

diff:
"displayName" : "HelloUsd",
"description" : "Some Description",
"path" : "Samples~/HelloUsd"
+ },
+ {
+ "displayName" : "ExportMesh",
+ "description" : "Some Description",
+ "path" : "Samples~/ExportMesh"
}
+
]
}

original_message: Create ExportMesh


message: Create ImportMesh

diff:
"displayName" : "ImportMaterials",
"description" : "Some Description",
"path" : "Samples~/ImportMaterials"
+ },
+ {
+ "displayName" : "ImportMesh",
+ "description" : "Some Description",
+ "path" : "Samples~/ImportMesh"
}
]

original_message: Create ImportMesh


message: Create UsdTimelinePlayable

diff:
"displayName" : "ImportMesh",
"description" : "Some Description",
"path" : "Samples~/ImportMesh"
+ },
+ {
+ "displayName" : "UsdTimelinePlayable",
+ "description" : "Some Description",
+ "path" : "Samples~/UsdTimelinePlayable"
}
]

original_message: Create UsdTimelinePlayable


message: Remove empty Folders

diff:
-fileFormatVersion: 2
-guid: 2e0429eff41811e43a406c2fd12a802b
-folderAsset: yes
-timeCreated: 1509315134
-licenseType: Pro
-DefaultImporter:
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-fileFormatVersion: 2
-guid: 0c8dacb2be9f9423182c46b976a02ce6
-folderAsset: yes
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-fileFormatVersion: 2
-guid: 6ea3392b8326545d18966e3b3f9d80dd
-folderAsset: yes
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-fileFormatVersion: 2
-guid: 0d529eb1f975b4ae1a0a8ee99bd3d3dc
-folderAsset: yes
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-{
- "name": "Unity.Formats.USD.Examples.Editor",
- "references": [
- "Unity.Formats.USD.Runtime",
- "Unity.Formats.USD.Examples.Runtime"
- ],
- "includePlatforms": [
- "Editor"
- ],
- "excludePlatforms": []
-}

diff:
-fileFormatVersion: 2
-guid: 650de2f7c4d28489991d63b301bb7511
-AssemblyDefinitionImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-fileFormatVersion: 2
-guid: ef5186ed19a2e422bb591a61d04fac15
-folderAsset: yes
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

diff:
-{
- "name": "Unity.Formats.USD.Examples.Runtime",
- "references": [
- "Unity.Formats.USD.Runtime"
- ],
- "optionalUnityReferences": [],
- "includePlatforms": [
- "Editor",
- "macOSStandalone",
- "WindowsStandalone64"
- ],
- "excludePlatforms": [],
- "allowUnsafeCode": false,
- "overrideReferences": false,
- "precompiledReferences": [],
- "autoReferenced": true,
- "defineConstraints": []
-}
\ No newline at end of file

diff:
-fileFormatVersion: 2
-guid: 23f5434d63b3b43309cf427185da96fe
-AssemblyDefinitionImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:

original_message: Remove empty Folders


message: Better description for HelloUsd

diff:
"samples":[
{
"displayName" : "HelloUsd",
- "description" : "Some Description",
+ "description" : "A sample showing how to write custom data to USDs",
"path" : "Samples~/HelloUsd"
},
{

original_message: Better description for HelloUsd


message: ExportMesh writes file to Assets/testRecording.usd

diff:
@@ -9,17 +9,17 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 337831424, guid: 6a10b2909283487f913b00d94cd3faf5, type: 3}
+ m_Script: {fileID: 11500000, guid: bfda56da833e2384a9677cd3c976a436, type: 3}
m_Name: ExportMeshExampleTimeline
m_EditorClassIdentifier:
- m_NextId: 0
+ m_Version: 0
m_Tracks:
- {fileID: 114384900094690320}
m_FixedDuration: 0
m_EditorSettings:
m_Framerate: 30
m_DurationMode: 0
- m_Version: 0
+ m_MarkerTrack: {fileID: 0}
--- !u!114 &114384900094690320
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -32,14 +32,17 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fdb3781f83309f84dab54c78806353c0, type: 3}
m_Name: Usd Recorder Track
m_EditorClassIdentifier:
+ m_Version: 3
+ m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
- m_AnimClip: {fileID: 0}
+ m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips:
- - m_Start: 0
+ - m_Version: 1
+ m_Start: 0
m_ClipIn: 0
m_Asset: {fileID: 114727924261217814}
m_Duration: 6.999999999999
@@ -107,8 +110,8 @@ MonoBehaviour:
m_PostExtrapolationTime: 0
m_PreExtrapolationTime: 0
m_DisplayName: UsdRecorderClip
- m_Version: 1
- m_Version: 2
+ m_Markers:
+ m_Objects: []
--- !u!114 &114727924261217814
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -127,4 +130,4 @@ MonoBehaviour:
m_exportMaterials: 1
m_convertHandedness: 1
m_activePolicy: 0
- m_usdFile: Assets/UsdUnitySdk/Examples/ExportMesh/testRecording.usd
+ m_usdFile: Assets/testRecording.usd

diff:
"samples":[
{
"displayName" : "HelloUsd",
- "description" : "A sample showing how to write custom data to USDs",
+ "description" : "A sample showing how to write custom data to USDs.",
"path" : "Samples~/HelloUsd"
},
{
"displayName" : "ExportMesh",
- "description" : "Some Description",
+ "description" : "A sample showing how to record a scene to a USD file.",
"path" : "Samples~/ExportMesh"
},
{


message: Fix ImportMaterials

diff:
@@ -241,7 +241,7 @@ namespace Unity.Formats.USD.Examples {
var detailNormalMapPath = "/Model/Materials/SimpleMat/DetailNormalMap";
var detailMaskPath = "/Model/Materials/SimpleMat/DetailMask";
- var textureFilePath = @"Assets/UsdUnitySdk/Examples/ImportMaterials/Textures/";
+ var textureFilePath = @"Assets/Samples/USD/1.0.0-preview.1/ImportMaterials/Textures/";
var cube = new CubeSample();
cube.size = 7;

diff:
},
{
"displayName" : "ImportMaterials",
- "description" : "Some Description",
+ "description" : "A sample showing how to import materials from a USD into Unity.",
"path" : "Samples~/ImportMaterials"
},
{

original_message: Fix ImportMaterials


message: Fix ImportMesh

diff:
@@ -38,7 +38,7 @@ RenderSettings:
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
- m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.49641287, b: 0.5748173, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
@@ -54,7 +54,7 @@ LightmapSettings:
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
- serializedVersion: 10
+ serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
@@ -62,6 +62,7 @@ LightmapSettings:
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
@@ -76,10 +77,16 @@ LightmapSettings:
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 500
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
- m_PVRFilteringMode: 1
+ m_PVREnvironmentMIS: 0
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
@@ -87,7 +94,8 @@ LightmapSettings:
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
- m_ShowResolutionOverlay: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1
--- !u!196 &4
@@ -168,9 +176,10 @@ Camera:
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
- m_GateFitMode: 2
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
@@ -237,12 +246,13 @@ Light:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 563394375}
m_Enabled: 1
- serializedVersion: 8
+ serializedVersion: 9
m_Type: 1
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
+ m_InnerSpotAngle: 21.802082
m_CookieSize: 10
m_Shadows:
m_Type: 2
@@ -252,6 +262,24 @@ Light:
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
@@ -259,12 +287,15 @@ Light:
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
+ m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &563394377
@@ -342,7 +373,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c6b9422ac107eb345ba17ec50a29caf4, type: 3}
m_Name:
m_EditorClassIdentifier:
- m_usdFile: UsdUnitySdk/Examples/ExportMesh/testRecording.usd
+ m_usdFile: Samples/USD/1.0.0-preview.1/ImportMesh/mesh.usd
m_material: {fileID: 2100000, guid: 5a4399f9b4f4d774dbc7921697839d7e, type: 2}
m_usdTime: 0
m_changeHandedness: 0

diff:
},
{
"displayName" : "ImportMesh",
- "description" : "Some Description",
+ "description" : "A sample showing how to import a scene from USD into Unity.",
"path" : "Samples~/ImportMesh"
},
{

original_message: Fix ImportMesh


message: Create empty placeholder for tests and add a dummy test

diff:
+fileFormatVersion: 2
+guid: 3cca72866bddf40b8a7c1f200fe1bf44
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:

diff:
+{
+ "createSeparatePackage": true
+}

diff:
+fileFormatVersion: 2
+guid: 83e48fa9eeb714ec58e966eac56290ba
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:

diff:
+using System.Collections;
+using UnityEngine.TestTools;
+
+namespace Unity.Formats.USD.Tests
+{
+ public class RuntimeTests
+ {
+ [UnityTest]
+ public IEnumerator DummyTest()
+ {
+ yield return null;
+ }
+ }
+}
\ No newline at end of file

diff:
+fileFormatVersion: 2
+guid: 9acf37ef0937b4b0387de27932362435
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:

diff:
+{
+ "name": "Unity.Formats.USD.Tests",
+ "references": [
+ "Unity.Formats.USD.Runtime"
+ ],
+ "optionalUnityReferences": [
+ "TestAssemblies"
+ ],
+ "includePlatforms": [
+ "Editor",
+ "LinuxStandalone64",
+ "macOSStandalone",
+ "WindowsStandalone64"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false
+}

diff:
+fileFormatVersion: 2
+guid: e0bc64a4d994c45c1af4e32e2d1b6d1f
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:


message: Add yamato config yml

diff:
+editors:
+ - version: 2018.3
+platforms:
+ - name: win
+ type: Unity::VM
+ image: package-ci/win10:latest
+ flavor: m1.large
+ - name: mac
+ type: Unity::VM::osx
+ image: buildfarm/mac:stable
+ flavor: m1.mac
+---
+{% for editor in editors %}
+{% for platform in platforms %}
+{{ platform.name }}_{{ editor.version }}:
+ name : Build and Test version {{ editor.version }} on {{ platform.name }}
+ agent:
+ type: {{ platform.type }}
+ image: {{ platform.image }}
+ flavor: {{ platform.flavor}}
+ commands:
+ - npm install upm-ci-utils -g --registry https://api.bintray.com/npm/unity/unity-npm
+ - upm-ci package pack --package-path package/com.unity.formats.usd
+ - upm-ci package test --unity-version {{ editor.version }} --package-path package/com.unity.formats.usd
+ triggers:
+ branches:
+ only:
+ - "/.*/"
+ except:
+ - master
+ artifacts:
+ logs.zip:
+ paths:
+ - "upm-ci~/logs/**/*"
+ - "upm-ci~/test-results/**/*"
+ artifacts.zip:
+ paths:
+ - "upm-ci~/packages/**/*"
+ - "upm-ci~/templates/**/*"
+{% endfor %}
+{% endfor %}
+
+run_preview_verified_staging:
+ name: Preview and Verified Packages to Staging
+ agent:
+ type: Unity::VM
+ image: package-ci/win10:latest
+ flavor: m1.large
+ name: Runner
+ commands:
+ # Install ci tools dependencies
+ - git clone --single-branch --branch feat/PAI-434-template-test git@gitlab.cds.internal.unity3d.com:upm-packages/project-templates/upm-template-utils.git
+ - npm install upm-template-utils
+ - node upm-template-utils/index.js template publish
+ triggers:
+ tags:
+ only:
+ - /^(v|V)[0-9].[0-9].[0-9]/
+ artifacts:
+ logs.zip:
+ paths:
+ - "upm-ci~/logs/**/*"
+ - "upm-ci~/test-results/**/*"
+ Package.zip:
+ paths:
+ - "upm-ci~/package/*.tgz"
+ dependencies:
+ {% for editor in editors %}
+ {% for platform in platforms %}
+ - .yamato/upm-ci.yml#{{ platform.name }}_{{ editor.version }}
+ {% endfor %}
+ {% endfor %}

original_message: Add yamato config yml


message: Add Dummy editor tests

diff:
+using NUnit.Framework;
+
+namespace Unity.Formats.USD.Tests
+{
+ public class EditorTests
+ {
+ [Test]
+ public void DummyTest()
+ {
+ }
+ }
+}
\ No newline at end of file

diff:
+fileFormatVersion: 2
+guid: 06f7436471c41426785f7e04518a9c90
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:

diff:
+{
+ "name": "Unity.Formats.USD.Tests.Editor",
+ "references": [
+ "Unity.Formats.USD.Runtime"
+ ],
+ "optionalUnityReferences": [
+ "TestAssemblies"
+ ],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false
+}

diff:
+fileFormatVersion: 2
+guid: e50fcb8f70e44487fae2be8974997e9c
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:

original_message: Add Dummy editor tests


message: New yamato file

diff:
editors:
- - version: 2018.3
+ - version: trunk
platforms:
- name: win
type: Unity::VM
@@ -21,7 +21,7 @@ platforms:
commands:
- npm install upm-ci-utils -g --registry https://api.bintray.com/npm/unity/unity-npm
- upm-ci package pack --package-path package/com.unity.formats.usd
- - upm-ci package test --unity-version {{ editor.version }} --package-path package/com.unity.formats.usd
+ - upm-ci package test --package-path package/com.unity.formats.usd --unity-version {{ editor.version }}
triggers:
branches:
only:
@@ -31,12 +31,7 @@ platforms:
artifacts:
logs.zip:
paths:
- - "upm-ci~/logs/**/*"
- "upm-ci~/test-results/**/*"
- artifacts.zip:
- paths:
- - "upm-ci~/packages/**/*"
- - "upm-ci~/templates/**/*"
{% endfor %}
{% endfor %}
@@ -48,25 +43,21 @@ run_preview_verified_staging:
flavor: m1.large
name: Runner
commands:
- # Install ci tools dependencies
- - git clone --single-branch --branch feat/PAI-434-template-test git@gitlab.cds.internal.unity3d.com:upm-packages/project-templates/upm-template-utils.git
- - npm install upm-template-utils
- - node upm-template-utils/index.js template publish
+ - npm install upm-ci-utils -g --registry https://api.bintray.com/npm/unity/unity-npm
+ - upm-ci package pack
+ - upm-ci package publish --registry staging
triggers:
tags:
only:
- /^(v|V)[0-9].[0-9].[0-9]/
artifacts:
- logs.zip:
- paths:
- - "upm-ci~/logs/**/*"
- - "upm-ci~/test-results/**/*"
- Package.zip:
+ artifacts.zip:
paths:
- - "upm-ci~/package/*.tgz"
+ - "upm-ci~/packages/*.tgz"
dependencies:
{% for editor in editors %}
{% for platform in platforms %}
- .yamato/upm-ci.yml#{{ platform.name }}_{{ editor.version }}
{% endfor %}
{% endfor %}
+

original_message: New yamato file


message: Add an actual test.

diff:
+using System;
using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using NUnit.Framework;
+using UnityEngine;
+using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
+using USD.NET;
+using Scene = USD.NET.Scene;
namespace Unity.Formats.USD.Tests
{
- public class RuntimeTests
+ public class SanityTest
{
- [UnityTest]
- public IEnumerator DummyTest()
+ List<string> filesToDelete = new List<string>();
+ class MyCustomData : SampleBase
{
- yield return null;
+ public string aString;
+ public int[] anArrayOfInts;
+ public Bounds aBoundingBox;
+ }
+
+ [SetUp]
+ public void SetUp()
+ {
+ InitUsd.Initialize();
+ }
+
+ [Test]
+ public void CanWriteCustomData()
+ {
+ string usdFile = System.IO.Path.Combine(UnityEngine.Application.dataPath, "sceneFile.usda");
+ filesToDelete.Add(usdFile);
+ // Populate Values.
+ var value = new MyCustomData();
+ value.aString = "IT'S ALIIIIIIIIIIIIIVE!";
+ value.anArrayOfInts = new int[] { 1, 2, 3, 4 };
+ value.aBoundingBox = new UnityEngine.Bounds();
+
+ // Writing the value.
+ var scene = Scene.Create(usdFile);
+ scene.Time = 1.0;
+ scene.Write("/someValue", value);
+ Debug.Log(scene.Stage.GetRootLayer().ExportToString());
+ scene.Save();
+ scene.Close();
+
+ Assert.IsTrue(File.Exists(usdFile));
+
+ // Reading the value.
+ Debug.Log(usdFile);
+ var newValue = new MyCustomData();
+ scene = Scene.Open(usdFile);
+ scene.Time = 1.0;
+ scene.Read("/someValue", newValue);
+
+ Assert.AreEqual(value.aString, newValue.aString);
+
+ scene.Close();
+ }
+
+ [TearDown]
+ public void TearDown()
+ {
+ foreach (var file in filesToDelete)
+ {
+ try
+ {
+ File.Delete(file);
+ }
+ catch (Exception e)
+ {
+ }
+ }
}
}
}
\ No newline at end of file

original_message: Add an actual test.


message: Test against trunk. Tests are included in the package.

diff:
editors:
- - version: 2018.3
+ - version: trunk
platforms:
- name: win
type: Unity::VM

diff:
{
- "createSeparatePackage": true
+ "createSeparatePackage": false
}