Link to source using go-source meta tag.

Package documentation pages link identifiers and file names to source
code hosted on version control services known to Godoc.org. This CL adds
a mechanism for vanity path package authors to specify links to source
code hosted on services not known to Godoc.org.

Source code links are specified using the go-source meta tag. The
go-source meta tag is similar to the vanity path go-import meta tag and
is specified in the same resource as the go-import meta tag.

The structure of the go-source meta tag is:

    <meta name="go-source" content="prefix home directory file">

The prefix field is the import path corresponding to the repository root.

The home field is the URL of the repository's home page.

The directory field is a URL template for a page listing the files in the
package. The following substitutions are made in the directory template:

    {dir} - The import path with prefix and leading "/" trimmed.
    {/dir} - If {dir} is not the empty string, then {/dir} is replaced by "/" +
             {dir}. Otherwise, {/dir} is replaced with the empty string.

The file field is a URL template for a link to a line in a source file. The
following substitutions are made in the file template:

    {file} - The name of the file
    {line} - The decimal line number.

The meta tag content attribute must contain four fields. Use "_" to fallback to
Godoc.org's defaults for home, directory and file.

Here's an example of the go-import and go-source meta tags for the
gopkg.in/yaml.v2 package:

    <meta name="go-import"
        content="gopkg.in/yaml.v2 git https://gopkg.in/yaml.v2">
    <meta name="go-source"
        content="gopkg.in/yaml.v2 _ https://github.com/go-yaml/yaml/tree/v2{/dir} https://github.com/go-yaml/yaml/blob/v2{/dir}/{file}#L{line}">

To improve the readability and maintainability of the code, change parseMeta()
return structs instead of a map[string]string. Also, move some of the
validation logic in parseMeta() to getDynamic().

Add tests for getDynamic().

See https://github.com/niemeyer/gopkg/pull/31 for the corresponding
change to gopkg.in.
2 files changed