mirror of
https://github.com/thomiceli/opengist.git
synced 2024-12-23 04:52:40 +00:00
Run git gc for repositories (#90)
This commit is contained in:
parent
a7b346d8df
commit
ffafde2b3e
4 changed files with 68 additions and 0 deletions
|
@ -2,6 +2,7 @@ package git
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/thomiceli/opengist/internal/config"
|
"github.com/thomiceli/opengist/internal/config"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
@ -263,6 +264,47 @@ func RPC(user string, gist string, service string) ([]byte, error) {
|
||||||
return stdout, err
|
return stdout, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GcRepos() error {
|
||||||
|
subdirs, err := os.ReadDir(filepath.Join(config.GetHomeDir(), "repos"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, subdir := range subdirs {
|
||||||
|
if !subdir.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
subRoot := filepath.Join(config.GetHomeDir(), "repos", subdir.Name())
|
||||||
|
|
||||||
|
gitRepos, err := os.ReadDir(subRoot)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Err(err).Msg("Cannot read directory")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, repo := range gitRepos {
|
||||||
|
if !repo.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
repoPath := filepath.Join(subRoot, repo.Name())
|
||||||
|
|
||||||
|
log.Info().Msg("Running git gc for repository " + repoPath)
|
||||||
|
|
||||||
|
cmd := exec.Command("git", "gc")
|
||||||
|
cmd.Dir = repoPath
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Err(err).Msg("Cannot run git gc for repository " + repoPath)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func GetGitVersion() (string, error) {
|
func GetGitVersion() (string, error) {
|
||||||
cmd := exec.Command("git", "--version")
|
cmd := exec.Command("git", "--version")
|
||||||
stdout, err := cmd.Output()
|
stdout, err := cmd.Output()
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
var (
|
var (
|
||||||
syncReposFromFS = false
|
syncReposFromFS = false
|
||||||
syncReposFromDB = false
|
syncReposFromDB = false
|
||||||
|
gitGcRepos = false
|
||||||
)
|
)
|
||||||
|
|
||||||
func adminIndex(ctx echo.Context) error {
|
func adminIndex(ctx echo.Context) error {
|
||||||
|
@ -51,6 +52,7 @@ func adminIndex(ctx echo.Context) error {
|
||||||
|
|
||||||
setData(ctx, "syncReposFromFS", syncReposFromFS)
|
setData(ctx, "syncReposFromFS", syncReposFromFS)
|
||||||
setData(ctx, "syncReposFromDB", syncReposFromDB)
|
setData(ctx, "syncReposFromDB", syncReposFromDB)
|
||||||
|
setData(ctx, "gitGcRepos", gitGcRepos)
|
||||||
return html(ctx, "admin_index.html")
|
return html(ctx, "admin_index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,6 +187,23 @@ func adminSyncReposFromDB(ctx echo.Context) error {
|
||||||
return redirect(ctx, "/admin-panel")
|
return redirect(ctx, "/admin-panel")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func adminGcRepos(ctx echo.Context) error {
|
||||||
|
addFlash(ctx, "Garbage collecting repositories...", "success")
|
||||||
|
go func() {
|
||||||
|
if gitGcRepos {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gitGcRepos = true
|
||||||
|
if err := git.GcRepos(); err != nil {
|
||||||
|
log.Error().Err(err).Msg("Error garbage collecting repositories")
|
||||||
|
gitGcRepos = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gitGcRepos = false
|
||||||
|
}()
|
||||||
|
return redirect(ctx, "/admin-panel")
|
||||||
|
}
|
||||||
|
|
||||||
func adminConfig(ctx echo.Context) error {
|
func adminConfig(ctx echo.Context) error {
|
||||||
setData(ctx, "title", "Configuration")
|
setData(ctx, "title", "Configuration")
|
||||||
setData(ctx, "htmlTitle", "Configuration - Admin panel")
|
setData(ctx, "htmlTitle", "Configuration - Admin panel")
|
||||||
|
|
|
@ -204,6 +204,7 @@ func Start() {
|
||||||
g2.POST("/gists/:gist/delete", adminGistDelete)
|
g2.POST("/gists/:gist/delete", adminGistDelete)
|
||||||
g2.POST("/sync-fs", adminSyncReposFromFS)
|
g2.POST("/sync-fs", adminSyncReposFromFS)
|
||||||
g2.POST("/sync-db", adminSyncReposFromDB)
|
g2.POST("/sync-db", adminSyncReposFromDB)
|
||||||
|
g2.POST("/gc-repos", adminGcRepos)
|
||||||
g2.GET("/configuration", adminConfig)
|
g2.GET("/configuration", adminConfig)
|
||||||
g2.PUT("/set-config", adminSetConfig)
|
g2.PUT("/set-config", adminSetConfig)
|
||||||
}
|
}
|
||||||
|
|
6
templates/pages/admin_index.html
vendored
6
templates/pages/admin_index.html
vendored
|
@ -68,6 +68,12 @@
|
||||||
Synchronize gists from database
|
Synchronize gists from database
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
<form action="/admin-panel/gc-repos" method="POST">
|
||||||
|
{{ .csrfHtml }}
|
||||||
|
<button type="submit" {{ if .gitGcRepos }}disabled="disabled"{{ end }} class="whitespace-nowrap text-slate-700 dark:text-slate-300{{ if .gitGcRepos }} text-slate-500 cursor-not-allowed {{ end }}rounded border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 px-2.5 py-2 text-xs font-medium text-gray-700 dark:text-white shadow-sm hover:bg-gray-100 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500 leading-3">
|
||||||
|
Garbage collect git repositories
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue