jsonnet-bundler/spec/v1/deps/dependencies.go
Frederic Branczyk 671f2568c4
Use base of absolute path for local dependencies
This allows using local paths like "..", which previously messed up
environments.
2020-05-06 18:02:44 +02:00

111 lines
2.3 KiB
Go

// Copyright 2018 jsonnet-bundler authors
//
// 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 deps
import (
"os"
"path/filepath"
)
type Dependency struct {
Source Source `json:"source"`
Version string `json:"version"`
Sum string `json:"sum,omitempty"`
Single bool `json:"single,omitempty"`
// older schema used to have `name`. We still need that data for
// `LegacyName`
LegacyNameCompat string `json:"name,omitempty"`
}
func Parse(dir, uri string) *Dependency {
if uri == "" {
return nil
}
if d := parseGit(uri); d != nil {
return d
}
return parseLocal(dir, uri)
}
func (d Dependency) Name() string {
return d.Source.Name()
}
func (d Dependency) LegacyName() string {
if d.LegacyNameCompat != "" {
return d.LegacyNameCompat
}
return d.Source.LegacyName()
}
type Source struct {
GitSource *Git `json:"git,omitempty"`
LocalSource *Local `json:"local,omitempty"`
}
func (s Source) Name() string {
switch {
case s.GitSource != nil:
return s.GitSource.Name()
case s.LocalSource != nil:
return s.LegacyName()
default:
return ""
}
}
func (s Source) LegacyName() string {
switch {
case s.GitSource != nil:
return s.GitSource.LegacyName()
case s.LocalSource != nil:
p, err := filepath.Abs(s.LocalSource.Directory)
if err != nil {
panic("unable to create absolute path from local source directory: " + err.Error())
}
return filepath.Base(p)
default:
return ""
}
}
type Local struct {
Directory string `json:"directory"`
}
func parseLocal(dir, p string) *Dependency {
clean := filepath.Clean(p)
abs := filepath.Join(dir, clean)
info, err := os.Stat(abs)
if err != nil {
return nil
}
if !info.IsDir() {
return nil
}
return &Dependency{
Source: Source{
LocalSource: &Local{
Directory: clean,
},
},
Version: "",
}
}