From e28e7ff55be4142fa79a9d922201a451afb74fc5 Mon Sep 17 00:00:00 2001 From: sh0rez Date: Fri, 28 Feb 2020 23:01:26 +0100 Subject: [PATCH] fix(spec): properly translate v0 into v1 --- pkg/jsonnetfile/jsonnetfile.go | 36 +++------- pkg/jsonnetfile/jsonnetfile_test.go | 104 ++++++++++++++-------------- spec/v0/spec.go | 2 + spec/v1/v0.go | 36 ++++++++++ 4 files changed, 99 insertions(+), 79 deletions(-) create mode 100644 spec/v1/v0.go diff --git a/pkg/jsonnetfile/jsonnetfile.go b/pkg/jsonnetfile/jsonnetfile.go index a576b5e..136bfb2 100644 --- a/pkg/jsonnetfile/jsonnetfile.go +++ b/pkg/jsonnetfile/jsonnetfile.go @@ -23,7 +23,6 @@ import ( v0 "github.com/jsonnet-bundler/jsonnet-bundler/spec/v0" v1 "github.com/jsonnet-bundler/jsonnet-bundler/spec/v1" - depsv1 "github.com/jsonnet-bundler/jsonnet-bundler/spec/v1/deps" ) const ( @@ -63,39 +62,20 @@ func Unmarshal(bytes []byte) (v1.JsonnetFile, error) { return m, err } - if versions.Version > v1.Version { - return m, ErrUpdateJB - } - - if versions.Version == v1.Version { - if err := json.Unmarshal(bytes, &m); err != nil { - return m, errors.Wrap(err, "failed to unmarshal v1 file") - } - - return m, nil - } else { + switch versions.Version { + case v0.Version: var mv0 v0.JsonnetFile if err := json.Unmarshal(bytes, &mv0); err != nil { return m, errors.Wrap(err, "failed to unmarshal jsonnetfile") } - - for name, dep := range mv0.Dependencies { - var d depsv1.Dependency - if dep.Source.GitSource != nil { - d = *depsv1.Parse("", dep.Source.GitSource.Remote) - d.Source.GitSource.Subdir = dep.Source.GitSource.Subdir - } - if dep.Source.LocalSource != nil { - d = *depsv1.Parse(dep.Source.LocalSource.Directory, dep.Source.GitSource.Remote) - } - - d.Sum = dep.Sum - d.Version = dep.Version - - m.Dependencies[name] = d + return v1.FromV0(mv0) + case v1.Version: + if err := json.Unmarshal(bytes, &m); err != nil { + return m, errors.Wrap(err, "failed to unmarshal v1 file") } - return m, nil + default: + return m, ErrUpdateJB } } diff --git a/pkg/jsonnetfile/jsonnetfile_test.go b/pkg/jsonnetfile/jsonnetfile_test.go index ad1afcf..8596ddc 100644 --- a/pkg/jsonnetfile/jsonnetfile_test.go +++ b/pkg/jsonnetfile/jsonnetfile_test.go @@ -31,58 +31,60 @@ const notExist = "/this/does/not/exist" const v0JSON = `{ "dependencies": [ - { - "name": "grafana-builder", - "source": { - "git": { - "remote": "https://github.com/grafana/jsonnet-libs", - "subdir": "grafana-builder" - } - }, - "version": "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", - "sum": "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=" - }, - { - "name": "prometheus-mixin", - "source": { - "git": { - "remote": "https://github.com/prometheus/prometheus", - "subdir": "documentation/prometheus-mixin" - } - }, - "version": "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", - "sum": "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=" - } + { + "name": "grafana-builder", + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs", + "subdir": "grafana-builder" + } + }, + "version": "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", + "sum": "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=" + }, + { + "name": "prometheus-mixin", + "source": { + "git": { + "remote": "https://github.com/prometheus/prometheus", + "subdir": "documentation/prometheus-mixin" + } + }, + "version": "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", + "sum": "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=" + } ] }` var v0Jsonnetfile = v1.JsonnetFile{ Dependencies: map[string]deps.Dependency{ - "grafana-builder": { + "github.com/grafana/jsonnet-libs/grafana-builder": { Source: deps.Source{ GitSource: &deps.Git{ Scheme: deps.GitSchemeHTTPS, Host: "github.com", User: "grafana", Repo: "jsonnet-libs", - Subdir: "grafana-builder", + Subdir: "/grafana-builder", }, }, - Version: "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", - Sum: "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=", + Version: "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", + Sum: "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=", + LegacyNameCompat: "grafana-builder", }, - "prometheus-mixin": { + "github.com/prometheus/prometheus/documentation/prometheus-mixin": { Source: deps.Source{ GitSource: &deps.Git{ Scheme: deps.GitSchemeHTTPS, Host: "github.com", User: "prometheus", Repo: "prometheus", - Subdir: "documentation/prometheus-mixin", + Subdir: "/documentation/prometheus-mixin", }, }, - Version: "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", - Sum: "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=", + Version: "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", + Sum: "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=", + LegacyNameCompat: "prometheus-mixin", }, }, LegacyImports: true, @@ -91,27 +93,27 @@ var v0Jsonnetfile = v1.JsonnetFile{ const v1JSON = `{ "version": 1, "dependencies": [ - { - "source": { - "git": { - "remote": "https://github.com/grafana/jsonnet-libs", - "subdir": "grafana-builder" - } - }, - "version": "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", - "sum": "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=" - }, - { - "name": "prometheus", - "source": { - "git": { - "remote": "https://github.com/prometheus/prometheus", - "subdir": "documentation/prometheus-mixin" - } - }, - "version": "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", - "sum": "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=" - } + { + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs", + "subdir": "grafana-builder" + } + }, + "version": "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", + "sum": "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=" + }, + { + "name": "prometheus", + "source": { + "git": { + "remote": "https://github.com/prometheus/prometheus", + "subdir": "documentation/prometheus-mixin" + } + }, + "version": "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", + "sum": "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=" + } ], "legacyImports": false }` diff --git a/spec/v0/spec.go b/spec/v0/spec.go index 6d1bf2c..f58a8e2 100644 --- a/spec/v0/spec.go +++ b/spec/v0/spec.go @@ -19,6 +19,8 @@ import ( "sort" ) +const Version = 0 + // JsonnetFile is the structure of a `.json` file describing a set of jsonnet // dependencies. It is used for both, the jsonnetFile and the lockFile. type JsonnetFile struct { diff --git a/spec/v1/v0.go b/spec/v1/v0.go new file mode 100644 index 0000000..315096c --- /dev/null +++ b/spec/v1/v0.go @@ -0,0 +1,36 @@ +package spec + +import ( + "path/filepath" + + v0 "github.com/jsonnet-bundler/jsonnet-bundler/spec/v0" + "github.com/jsonnet-bundler/jsonnet-bundler/spec/v1/deps" +) + +func FromV0(mv0 v0.JsonnetFile) (JsonnetFile, error) { + m := New() + m.LegacyImports = true + + for name, old := range mv0.Dependencies { + var d deps.Dependency + + switch { + case old.Source.GitSource != nil: + d = *deps.Parse("", old.Source.GitSource.Remote) + + subdir := filepath.Clean("/" + old.Source.GitSource.Subdir) + d.Source.GitSource.Subdir = subdir + + case old.Source.LocalSource != nil: + d = *deps.Parse("", old.Source.LocalSource.Directory) + } + + d.Sum = old.Sum + d.Version = old.Version + d.LegacyNameCompat = name + + m.Dependencies[d.Name()] = d + } + + return m, nil +}