74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
|
package web
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"path"
|
||
|
"time"
|
||
|
|
||
|
"github.com/dustin/go-humanize"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"github.com/go-git/go-git/v5"
|
||
|
"github.com/go-git/go-git/v5/plumbing"
|
||
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||
|
)
|
||
|
|
||
|
func (web *Web) mapVersions(c *gin.Context) {
|
||
|
userId := c.Param("userId")
|
||
|
mapId := c.Param("mapId")
|
||
|
|
||
|
repoDir := path.Join(web.config.Repos, userId, mapId)
|
||
|
repo, _ := git.PlainOpen(repoDir)
|
||
|
|
||
|
type Revision struct {
|
||
|
Date time.Time
|
||
|
HumanDate string
|
||
|
Summary string
|
||
|
Hash string
|
||
|
HasParent bool
|
||
|
}
|
||
|
|
||
|
versions := make([]Revision, 0)
|
||
|
logIter, _ := repo.Log(&git.LogOptions{})
|
||
|
for {
|
||
|
commit, err := logIter.Next()
|
||
|
if err == io.EOF {
|
||
|
break
|
||
|
}
|
||
|
|
||
|
stats, _ := commit.Stats()
|
||
|
_, err = commit.Parent(0)
|
||
|
hasParent := !errors.Is(err, object.ErrParentNotFound)
|
||
|
|
||
|
versions = append(versions, Revision{
|
||
|
Date: commit.Author.When,
|
||
|
HumanDate: humanize.Time(commit.Author.When),
|
||
|
Summary: stats.String(),
|
||
|
Hash: commit.Hash.String(),
|
||
|
HasParent: hasParent,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
c.HTML(http.StatusOK, "map-version.html", gin.H{
|
||
|
"LoggedIn": isLoggedIn(c),
|
||
|
"Versions": versions,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (web *Web) mapPatch(c *gin.Context) {
|
||
|
userId := c.Param("userId")
|
||
|
mapId := c.Param("mapId")
|
||
|
hash := c.Param("hash")
|
||
|
|
||
|
repoDir := path.Join(web.config.Repos, userId, mapId)
|
||
|
repo, _ := git.PlainOpen(repoDir)
|
||
|
|
||
|
hashObj := plumbing.NewHash(hash)
|
||
|
commit, _ := repo.CommitObject(hashObj)
|
||
|
parent, _ := commit.Parent(0)
|
||
|
patch, _ := commit.Patch(parent)
|
||
|
|
||
|
c.String(http.StatusOK, "text/plain", patch.String())
|
||
|
}
|