diff --git a/_layouts/redirect.html b/_layouts/redirect.html
index 190ded29..7400cbc7 100644
--- a/_layouts/redirect.html
+++ b/_layouts/redirect.html
@@ -7,4 +7,9 @@
Redirecting…
Click here if you are not redirected.
+
+{% if page.hash.sha1 %}
+- SHA1: {{ page.hash.sha1 }}
+{% endif %}
+
diff --git a/_scripts/vim_jp-redirects-update/main.go b/_scripts/vim_jp-redirects-update/main.go
index ae1f5fbc..03cc9233 100644
--- a/_scripts/vim_jp-redirects-update/main.go
+++ b/_scripts/vim_jp-redirects-update/main.go
@@ -1,9 +1,13 @@
package main
import (
+ "crypto/sha1"
+ "encoding/hex"
"fmt"
+ "io"
"io/ioutil"
"log"
+ "net/http"
"os"
"regexp"
"sync"
@@ -18,6 +22,8 @@ var pageTmpl = template.Must(template.New("page").Parse(`---
title: {{.Title}}
redirect_to:
- {{.RedirectURL}}
+hash:
+ sha1: {{.Sha1Hash}}
layout: redirect
---
`))
@@ -42,6 +48,7 @@ type githubRelease struct {
type tmplData struct {
Title string
RedirectURL string
+ Sha1Hash string
}
func loadData(name string) ([]redirect, error) {
@@ -77,10 +84,14 @@ func fetchRedirect(d redirect) (*github.Asset, error) {
return nil, nil
}
-func updateRedirect(d redirect, a *github.Asset) error {
+func updateRedirect(d redirect, a *github.Asset, bin io.ReadCloser) error {
if a.State != "uploaded" {
return fmt.Errorf("not uploaded yet: %s", d.Path)
}
+ sha1hash, err := calcSha1Hash(bin)
+ if err != nil {
+ return err
+ }
name := d.Path + ".html"
f, err := os.Create(name)
if err != nil {
@@ -90,6 +101,7 @@ func updateRedirect(d redirect, a *github.Asset) error {
err = pageTmpl.Execute(f, tmplData{
Title: d.Title,
RedirectURL: a.DownloadURL,
+ Sha1Hash: sha1hash,
})
if err != nil {
return nil
@@ -97,6 +109,15 @@ func updateRedirect(d redirect, a *github.Asset) error {
return nil
}
+func calcSha1Hash(r io.ReadCloser) (string, error) {
+ w := sha1.New()
+ if _, err := io.Copy(w, r); err != nil {
+ return "", err
+ }
+ hash := hex.EncodeToString(w.Sum(nil))
+ return hash, nil
+}
+
func processRedirect(d redirect) {
a, err := fetchRedirect(d)
if err != nil {
@@ -106,13 +127,27 @@ func processRedirect(d redirect) {
if a == nil {
return
}
- err = updateRedirect(d, a)
+ bin, err := fetchReleaseBinary(a)
+ if err != nil {
+ log.Printf("fetch release hash failed for %s: %s", d.Path, err)
+ return
+ }
+ defer bin.Close()
+ err = updateRedirect(d, a, bin)
if err != nil {
log.Printf("update failed for %s: %s", d.Path, err)
return
}
}
+func fetchReleaseBinary(a *github.Asset) (io.ReadCloser, error) {
+ resp, err := http.DefaultClient.Get(a.DownloadURL)
+ if err != nil {
+ return nil, err
+ }
+ return resp.Body, nil
+}
+
func main() {
if v, ok := os.LookupEnv("GITHUB_USERNAME"); ok {
github.DefaultClient.Username = v