added version tracking

This commit is contained in:
legitnull 2023-04-12 19:35:10 -06:00
parent 6eafe84f35
commit 9d9c4fa7ff
5 changed files with 86 additions and 11 deletions

View File

@ -58,10 +58,10 @@ change `main` to your specific repo's branch and you should be good to go!
- [ ] Webhook support for auto pull on push/update of the git repo
- [x] Git Branch support
- [ ] add a star/upvote/like feature for pages
- [ ] edit tracker
- [ ] Author
- [ ] last edited
- [ ] last editor/commit
- [x] edit/version tracker
- [x] Author
- [x] last edited
- [ ] last editor/commit [?] maybe working
- [ ] PGP Signed & Verification
- [ ] pgp signed intergration
- [x] comments using bitcask - generated in comments.db/

View File

@ -24,6 +24,13 @@
{{ .Content }}
</div>
<hr>
<div style="font-size: 0.3em; text-align: right; margin-bottom: 5px;">
{{- if eq .Author .LastModifier -}}
Authored: {{ .Author }} @ {{ .AuthoredDate.Format "2006/01/02" }}
{{- else -}}
Authored: {{ .Author }} @ {{ .AuthoredDate.Format "2006/01/02" }} - Modified: {{ .LastModifier }} @ {{ .LastModifiedDate.Format "2006/01/02" }}
{{- end -}}
</div>
<div class="comments">
<h2>Comments</h2>
{{ range .Comments }}

View File

@ -97,3 +97,22 @@ section h2 {
font-size: 0.8em;
color: #999;
}
/* reduce font size for authored and modified date */
div.content div[style="font-size: 0.8em;"] {
font-size: 0.6em;
}
/* add bar under authored and modified date */
div.content div[style="font-size: 0.8em;"]:after {
content: "";
display: block;
margin-top: 5px;
margin-bottom: 5px;
border-bottom: 1px solid #14ee00;
}
/* align authored and modified date to the right */
div.content div[style="font-size: 0.8em;"] {
text-align: right;
}

View File

@ -4,9 +4,11 @@ import (
//"fmt"
"os"
"time"
git "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 cloneRepository(repoURL, localPath string) error {
@ -75,3 +77,31 @@ func readFileFromRepo(localPath string, filePath string) ([]byte, error) {
return []byte(content), nil
}
func getAuthorAndLastModification(localPath, filePath string) (string, time.Time, string, time.Time, error) {
repo, err := git.PlainOpen(localPath)
if err != nil {
return "", time.Time{}, "", time.Time{}, err
}
iter, err := repo.Log(&git.LogOptions{FileName: &filePath})
if err != nil {
return "", time.Time{}, "", time.Time{}, err
}
var firstCommit *object.Commit
var lastCommit *object.Commit
err = iter.ForEach(func(c *object.Commit) error {
if firstCommit == nil {
firstCommit = c
}
lastCommit = c
return nil
})
if err != nil {
return "", time.Time{}, "", time.Time{}, err
}
return firstCommit.Author.Name, firstCommit.Author.When, lastCommit.Author.Name, lastCommit.Author.When, nil
}

View File

@ -8,6 +8,7 @@ import (
"log"
"net/http"
"path/filepath"
"time"
"github.com/prologic/bitcask"
"github.com/yuin/goldmark"
@ -16,9 +17,13 @@ import (
)
type Page struct {
Content template.HTML
Comments []Comment
Path string
Content template.HTML
Comments []Comment
Path string
Author string
AuthoredDate time.Time
LastModifier string
LastModifiedDate time.Time
}
func renderPage(w http.ResponseWriter, r *http.Request, localPath, filePath string, commentsDB *bitcask.Bitcask) error {
@ -32,7 +37,7 @@ func renderPage(w http.ResponseWriter, r *http.Request, localPath, filePath stri
ext := filepath.Ext(filePath)
switch ext {
case ".md":
renderMarkdown(w, r, content, commentsDB)
renderMarkdown(w, r, content, commentsDB, localPath, filePath) // Updated the call to include localPath and filePath
case ".html", ".css":
renderStatic(w, content, ext)
default:
@ -41,7 +46,7 @@ func renderPage(w http.ResponseWriter, r *http.Request, localPath, filePath stri
return nil
}
func renderMarkdown(w http.ResponseWriter, r *http.Request, content []byte, commentsDB *bitcask.Bitcask) {
func renderMarkdown(w http.ResponseWriter, r *http.Request, content []byte, commentsDB *bitcask.Bitcask, localPath, filePath string) {
md := goldmark.New(
goldmark.WithExtensions(
extension.GFM, // GitHub Flavored Markdown
@ -51,8 +56,14 @@ func renderMarkdown(w http.ResponseWriter, r *http.Request, content []byte, comm
),
)
author, authoredDate, lastModifier, lastModifiedDate, err := getAuthorAndLastModification(localPath, filePath)
if err != nil {
http.Error(w, "Error fetching author and last modification date", http.StatusInternalServerError)
return
}
var mdBuf bytes.Buffer
err := md.Convert(content, &mdBuf)
err = md.Convert(content, &mdBuf)
if err != nil {
http.Error(w, "Error converting Markdown", http.StatusInternalServerError)
return
@ -70,7 +81,15 @@ func renderMarkdown(w http.ResponseWriter, r *http.Request, content []byte, comm
return
}
page := &Page{Content: template.HTML(mdBuf.String()), Comments: comments, Path: r.URL.Path}
page := &Page{
Content: template.HTML(mdBuf.String()),
Comments: comments,
Path: r.URL.Path,
Author: author,
AuthoredDate: authoredDate,
LastModifier: lastModifier,
LastModifiedDate: lastModifiedDate,
}
t, err := template.New("layout").Parse(string(layout))
if err != nil {
http.Error(w, "Error parsing layout", http.StatusInternalServerError)