Skip to content
This repository was archived by the owner on Apr 28, 2020. It is now read-only.

Commit 079ed4b

Browse files
author
Nathan Potter
committed
fixup! Use fixuid for mapping host uid:gid to docker uid:gid
1 parent 984d699 commit 079ed4b

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

internal/codeserver/download.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package codeserver
2+
3+
import (
4+
"archive/tar"
5+
"compress/gzip"
6+
"context"
7+
"io"
8+
"path/filepath"
9+
"strings"
10+
11+
"github.com/google/go-github/v24/github"
12+
"golang.org/x/xerrors"
13+
)
14+
15+
// DownloadURL gets a URL for the latest version of code-server.
16+
func DownloadURL(ctx context.Context) (string, error) {
17+
client := github.NewClient(nil)
18+
rel, _, err := client.Repositories.GetLatestRelease(ctx, "cdr", "code-server")
19+
if err != nil {
20+
return "", xerrors.Errorf("failed to get latest code-server release: %w", err)
21+
}
22+
for _, v := range rel.Assets {
23+
// TODO: fix this jank.
24+
if strings.Index(*v.Name, "linux") < 0 {
25+
continue
26+
}
27+
return *v.BrowserDownloadURL, nil
28+
}
29+
return "", xerrors.New("no released found for platform")
30+
}
31+
32+
// Extract takes a code-server release tar and writes out the main binary to bin.
33+
func Extract(ctx context.Context, tarFi io.Reader) (io.Reader, error) {
34+
grd, err := gzip.NewReader(tarFi)
35+
if err != nil {
36+
return nil, xerrors.Errorf("failed to create gzip decoder: %w", err)
37+
}
38+
defer grd.Close()
39+
40+
rd := tar.NewReader(grd)
41+
for {
42+
hdr, err := rd.Next()
43+
if err != nil {
44+
if err == io.EOF {
45+
return nil, xerrors.New("code-server not found")
46+
}
47+
return nil, err
48+
}
49+
if filepath.Base(hdr.Name) == "code-server" {
50+
return rd, nil
51+
}
52+
}
53+
}

internal/codeserver/download_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package codeserver
2+
3+
import (
4+
"context"
5+
"io"
6+
"io/ioutil"
7+
"net/http"
8+
"os"
9+
"os/exec"
10+
"testing"
11+
"time"
12+
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func TestDownloadURL_Extract(t *testing.T) {
17+
t.Parallel()
18+
19+
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2)
20+
defer cancel()
21+
22+
url, err := DownloadURL(ctx)
23+
require.NoError(t, err)
24+
25+
resp, err := http.Get(url)
26+
require.NoError(t, err)
27+
defer resp.Body.Close()
28+
29+
binRd, err := Extract(ctx, resp.Body)
30+
require.NoError(t, err)
31+
32+
if testing.Short() {
33+
t.Skipf("downloading code-server can take a while")
34+
}
35+
36+
tmpfi, err := ioutil.TempFile("", "codeserver")
37+
require.NoError(t, err)
38+
defer os.Remove(tmpfi.Name())
39+
40+
_, err = io.Copy(tmpfi, binRd)
41+
require.NoError(t, err)
42+
43+
err = os.Chmod(tmpfi.Name(), 0750)
44+
require.NoError(t, err)
45+
46+
err = tmpfi.Close()
47+
require.NoError(t, err)
48+
49+
_, err = exec.Command(tmpfi.Name(), "--help").CombinedOutput()
50+
require.NoError(t, err)
51+
}

0 commit comments

Comments
 (0)