mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-28 19:54:35 +00:00
Move the tool as a dependency for static checks migration. Fixes #8187 Signed-off-by: Bin Liu <bin@hyper.sh> Signed-off-by: Chelsea Mafrica <chelsea.e.mafrica@intel.com> Signed-off-by: Gabriela Cervantes <gabriela.cervantes.tellez@intel.com> Signed-off-by: Ganesh Maharaj Mahalingam <ganesh.mahalingam@intel.com> Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com> Signed-off-by: Julio Montes <julio.montes@intel.com>
123 lines
2.3 KiB
Go
123 lines
2.3 KiB
Go
//
|
|
// Copyright (c) 2019 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package main
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// newLink creates a new Link.
|
|
func newLink(doc *Doc, address, description string) (Link, error) {
|
|
l := Link{
|
|
Doc: doc,
|
|
Address: address,
|
|
Description: description,
|
|
}
|
|
|
|
err := l.categorise()
|
|
if err != nil {
|
|
return Link{}, err
|
|
}
|
|
|
|
return l, nil
|
|
}
|
|
|
|
// categorise determines the type of Link.
|
|
func (l *Link) categorise() error {
|
|
address := l.Address
|
|
|
|
// markdown file extension with optional link name ("#...")
|
|
const re = `\.md#*.*$`
|
|
|
|
pattern := regexp.MustCompile(re)
|
|
|
|
matched := pattern.MatchString(address)
|
|
|
|
if strings.HasPrefix(address, "http:") {
|
|
l.Type = urlLink
|
|
} else if strings.HasPrefix(address, "https:") {
|
|
l.Type = urlLink
|
|
} else if strings.HasPrefix(address, "mailto:") {
|
|
l.Type = mailLink
|
|
} else if strings.HasPrefix(address, anchorPrefix) {
|
|
l.Type = internalLink
|
|
|
|
// Remove the prefix to make a valid link address
|
|
address = strings.TrimPrefix(address, anchorPrefix)
|
|
l.Address = address
|
|
} else if matched {
|
|
l.Type = externalLink
|
|
|
|
file, _, err := splitLink(address)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
file, err = l.Doc.linkAddrToPath(file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
l.ResolvedPath = file
|
|
} else {
|
|
isREADME, err := l.handleImplicitREADME()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !isREADME {
|
|
// Link must be an external file, but not a markdown file.
|
|
l.Type = externalFile
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// handleImplicitREADME determines if the specified link is an implicit link
|
|
// to a README document.
|
|
func (l *Link) handleImplicitREADME() (isREADME bool, err error) {
|
|
const readme = "README.md"
|
|
|
|
address := l.Address
|
|
if address == "" {
|
|
return false, errors.New("need link address")
|
|
}
|
|
|
|
file, err := l.Doc.linkAddrToPath(address)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
// The resolved path should exist as this is a local file.
|
|
st, err := os.Stat(file)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if !st.IsDir() {
|
|
return false, nil
|
|
}
|
|
|
|
// The file is a directory so try appending the implicit README file
|
|
// and see if that exists.
|
|
resolvedPath := filepath.Join(file, readme)
|
|
|
|
success := fileExists(resolvedPath)
|
|
|
|
if success {
|
|
l.Type = externalLink
|
|
l.ResolvedPath = resolvedPath
|
|
}
|
|
|
|
return success, nil
|
|
}
|