diff --git a/pages/commit.go b/pages/commit.go new file mode 100644 index 0000000..689ff6e --- /dev/null +++ b/pages/commit.go @@ -0,0 +1,114 @@ +package pages + +import ( + "bufio" + "bytes" + "context" + htmlfmt "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/lexers" + "github.com/alecthomas/chroma/v2/styles" + "github.com/carlmjohnson/requests" + "github.com/gocolly/colly" + "github.com/gofiber/fiber/v2" + "html/template" + "log" + "net/http" + "os" + "strings" +) + +type Commit struct { + CommitName string + CommitDesc string + CommitHashShortened string + CommitDate string + Commiter []string + CommitToBranch string + PreviousCommit string + Additions int64 + Deletions int64 + ChangedFiles int64 +} + +func HandleCommit(c *fiber.Ctx) error { + var commitArray []Commit + + resp, statusErr := http.Get("https://github.com/" + c.Params("user") + "/" + c.Params("repo") + "/commit/" + c.Params("commit") + "/") + if statusErr != nil { + log.Println(statusErr) + } + if resp.StatusCode == 404 { + // I need a better way to do this + return c.Status(404).Render("error", fiber.Map{ + "title": "Error", + "error": "Commit" + c.Params("commit") + "not found", + }) + } + var file string + url := "https://github.com/" + c.Params("user") + "/" + c.Params("repo") + "/commit/" + c.Params("commit") + ".patch" + err := requests. + URL(url). + ToString(&file). + Fetch(context.Background()) + if err != nil { + return c.Status(404).Render("error", fiber.Map{ + "error": err, + }) + } + lexer := lexers.Match("something.diff") + if lexer == nil { + lexer = lexers.Fallback + } + formatter := htmlfmt.New( + htmlfmt.WithClasses(true), + htmlfmt.WithLineNumbers(true), + htmlfmt.PreventSurroundingPre(false), + ) + + buf := bytes.Buffer{} + writer := bufio.NewWriter(&buf) + style := styles.Get("native") + tokens, err := lexer.Tokenise(nil, file) + if err != nil { + return c.Status(500).Render("error", fiber.Map{ + "error": err, + }) + } + formatter.Format(writer, style, tokens) + + cssbuf := bytes.Buffer{} + cssw := bufio.NewWriter(&cssbuf) + formatter.WriteCSS(cssw, style) + writer.Flush() + cssw.Flush() + + // Scraping + Scrape := Commit{} + UserAgent, ok := os.LookupEnv("GOTHUB_USER_AGENT") + if !ok { + UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" + } + + sc := colly.NewCollector(colly.AllowedDomains("github.com"), colly.UserAgent(UserAgent)) + sc.OnHTML("div.commit", func(e *colly.HTMLElement) { + Scrape.CommitName = e.ChildText("div.commit-title") + Scrape.CommitDesc = e.ChildText("div.commit-desc pre") + Scrape.CommitHashShortened = e.ChildText("div.text-lg-right span.m-0 span.sha") + Scrape.PreviousCommit = e.ChildText("div.text-lg-right span.ml-0 a.sha") + Scrape.CommitDate = e.ChildText("div.flex-self-start relative-time") + Scrape.CommitToBranch = e.ChildText("ul.branches-list li.branch a") + e.ForEach("div.flex-self-start .commit-author", func(i int, el *colly.HTMLElement) { + Scrape.Commiter = append(Scrape.Commiter, strings.TrimPrefix(el.Attr("title"), "View all commits by ")) + }) + }) + sc.Visit("https://github.com/" + c.Params("user") + "/" + c.Params("repo") + "/commit/" + c.Params("commit") + "/") + // Add scrape-based info to commitArray + commitArray = append(commitArray, Scrape) + + return c.Render("commit", fiber.Map{ + "title": "Commit " + c.Params("commit") + " | " + c.Params("user") + "/" + c.Params("repo"), + "commit": commitArray, + "file": template.HTML(buf.String()), + "css": template.CSS(cssbuf.String()), + }) +} diff --git a/serve/serve.go b/serve/serve.go index cd5be1c..f914774 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -109,6 +109,7 @@ func Serve() { app.Get("/:user/:repo/blob/:branch/+", pages.FileView) app.Get("/:user/:repo/tree/:branch/+", pages.DirView) app.Get("/:user/:repo/tree/:branch", pages.HandleRepo) + app.Get("/:user/:repo/commit/:commit", pages.HandleCommit) app.Get("/download/:user/:repo/:branch", func(c *fiber.Ctx) error { utils.ProxyRequest(c, "https://github.com/"+c.Params("user")+"/"+c.Params("repo")+"/archive/"+c.Params("branch")+".zip") return nil diff --git a/views/commit.html b/views/commit.html new file mode 100644 index 0000000..64dff67 --- /dev/null +++ b/views/commit.html @@ -0,0 +1,30 @@ +{{ template "header" .}} + +
+ + {{ if .commit }} {{ range $key, $value := .commit}} +
+

{{.CommitHashShortened}} | {{.CommitName}}

+
+
+ {{.CommitName}}
{{.CommitDesc}}
{{.CommitHashShortened}} {{.CommitDate}} {{.Commiter}} {{.CommitToBranch}} {{.PreviousCommit}} + Members: {{range .Commiter}} + @{{.}} + {{ end }} +
+ {{end}} + {{ .file}} + + {{ else }} +

Directory not found

+

That directory doesn't exist.

+ {{ end }} +
+{{ template "footer" .}}