blob: 82b4e914b7e6c5a9555388b0081789807dd6b868 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package frontend
import (
"context"
"fmt"
"path"
"sort"
"strings"
"golang.org/x/pkgsite/internal"
"golang.org/x/pkgsite/internal/derrors"
"golang.org/x/pkgsite/internal/godoc"
"golang.org/x/pkgsite/internal/godoc/dochtml"
"golang.org/x/pkgsite/internal/log"
"golang.org/x/pkgsite/internal/middleware/stats"
"golang.org/x/pkgsite/internal/stdlib"
)
func renderDocParts(ctx context.Context, u *internal.Unit, docPkg *godoc.Package,
nameToVersion map[string]string, bc internal.BuildContext) (_ *dochtml.Parts, err error) {
defer derrors.Wrap(&err, "renderDocParts")
defer stats.Elapsed(ctx, "renderDocParts")()
modInfo := &godoc.ModuleInfo{
ModulePath: u.ModulePath,
ResolvedVersion: u.Version,
ModulePackages: nil, // will be provided by docPkg
}
var innerPath string
if u.ModulePath == stdlib.ModulePath {
innerPath = u.Path
} else if u.Path != u.ModulePath {
innerPath = u.Path[len(u.ModulePath)+1:]
}
return docPkg.Render(ctx, innerPath, u.SourceInfo, modInfo, nameToVersion, bc)
}
// sourceFiles returns the .go files for a package.
func sourceFiles(u *internal.Unit, docPkg *godoc.Package) []*File {
var files []*File
for _, f := range docPkg.Files {
if strings.HasSuffix(f.Name, "_test.go") {
continue
}
files = append(files, &File{
Name: f.Name,
URL: u.SourceInfo.FileURL(path.Join(internal.Suffix(u.Path, u.ModulePath), f.Name)),
})
}
sort.Slice(files, func(i, j int) bool { return files[i].Name < files[j].Name })
return files
}
// fileSource returns the original filepath in the module zip where the given
// filePath can be found. For std, the corresponding URL in
// go.google.source.com/go is returned.
func fileSource(modulePath, version, filePath string) string {
if modulePath != stdlib.ModulePath {
return fmt.Sprintf("%s@%s/%s", modulePath, version, filePath)
}
root := strings.TrimPrefix(stdlib.GoRepoURL, "https://")
tag, err := stdlib.TagForVersion(version)
if err != nil {
// This should never happen unless there is a bug in
// stdlib.TagForVersion. In which case, fallback to the default
// zipFilePath.
log.Errorf(context.TODO(), "fileSource: %v", err)
return fmt.Sprintf("%s/+/refs/heads/master/%s", root, filePath)
}
return fmt.Sprintf("%s/+/refs/tags/%s/%s", root, tag, filePath)
}