GoPLS Viewer

Home|gopls/internal/proxydir/proxydir.go
1// Copyright 2020 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package proxydir provides functions for writing module data to a directory
6// in proxy format, so that it can be used as a module proxy by setting
7// GOPROXY="file://<dir>".
8package proxydir
9
10import (
11    "archive/zip"
12    "fmt"
13    "io"
14    "io/ioutil"
15    "os"
16    "path/filepath"
17    "strings"
18
19    "golang.org/x/tools/internal/testenv"
20)
21
22// WriteModuleVersion creates a directory in the proxy dir for a module.
23func WriteModuleVersion(rootDirmodulever stringfiles map[string][]byte) (rerr error) {
24    dir := filepath.Join(rootDirmodule"@v")
25    if err := os.MkdirAll(dir0755); err != nil {
26        return err
27    }
28
29    // The go command checks for versions by looking at the "list" file.  Since
30    // we are supporting multiple versions, create this file if it does not exist
31    // or append the version number to the preexisting file.
32    ferr := os.OpenFile(filepath.Join(dir"list"), os.O_APPEND|os.O_CREATE|os.O_WRONLY0644)
33    if err != nil {
34        return err
35    }
36    defer checkClose("list file"f, &rerr)
37    if _err := f.WriteString(ver + "\n"); err != nil {
38        return err
39    }
40
41    // Serve the go.mod file on the <version>.mod url, if it exists. Otherwise,
42    // serve a stub.
43    modContentsok := files["go.mod"]
44    if !ok {
45        modContents = []byte("module " + module)
46    }
47    if err := ioutil.WriteFile(filepath.Join(dirver+".mod"), modContents0644); err != nil {
48        return err
49    }
50
51    // info file, just the bare bones.
52    infoContents := []byte(fmt.Sprintf(`{"Version": "%v", "Time":"2017-12-14T13:08:43Z"}`ver))
53    if err := ioutil.WriteFile(filepath.Join(dirver+".info"), infoContents0644); err != nil {
54        return err
55    }
56
57    // zip of all the source files.
58    ferr = os.OpenFile(filepath.Join(dirver+".zip"), os.O_CREATE|os.O_WRONLY0644)
59    if err != nil {
60        return err
61    }
62    defer checkClose("zip file"f, &rerr)
63    z := zip.NewWriter(f)
64    defer checkClose("zip writer"z, &rerr)
65    for namecontents := range files {
66        zferr := z.Create(module + "@" + ver + "/" + name)
67        if err != nil {
68            return err
69        }
70        if _err := zf.Write(contents); err != nil {
71            return err
72        }
73    }
74
75    return nil
76}
77
78func checkClose(name stringcloser io.Closererr *error) {
79    if cerr := closer.Close(); cerr != nil && *err == nil {
80        *err = fmt.Errorf("closing %s: %v"namecerr)
81    }
82}
83
84// ToURL returns the file uri for a proxy directory.
85func ToURL(dir stringstring {
86    if testenv.Go1Point() >= 13 {
87        // file URLs on Windows must start with file:///. See golang.org/issue/6027.
88        path := filepath.ToSlash(dir)
89        if !strings.HasPrefix(path"/") {
90            path = "/" + path
91        }
92        return "file://" + path
93    } else {
94        // Prior to go1.13, the Go command on Windows only accepted GOPROXY file URLs
95        // of the form file://C:/path/to/proxy. This was incorrect: when parsed, "C:"
96        // is interpreted as the host. See golang.org/issue/6027. This has been
97        // fixed in go1.13, but we emit the old format for old releases.
98        return "file://" + filepath.ToSlash(dir)
99    }
100}
101
MembersX
WriteModuleVersion.module
WriteModuleVersion.RangeStmt_2008.name
os
filepath
WriteModuleVersion._
WriteModuleVersion.z
checkClose
ioutil
WriteModuleVersion.files
ToURL
WriteModuleVersion.ver
WriteModuleVersion.rerr
WriteModuleVersion.infoContents
checkClose.name
strings
WriteModuleVersion.RangeStmt_2008.contents
WriteModuleVersion.RangeStmt_2008.BlockStmt._
checkClose.cerr
ToURL.BlockStmt.path
WriteModuleVersion
WriteModuleVersion.err
WriteModuleVersion.f
zip
testenv
WriteModuleVersion.rootDir
WriteModuleVersion.RangeStmt_2008.BlockStmt.err
checkClose.closer
ToURL.dir
fmt
io
WriteModuleVersion.dir
WriteModuleVersion.RangeStmt_2008.BlockStmt.zf
checkClose.err
Members
X