feat(git): UpdateServerInfo on push

Ayman Bagabas created

git update-server-info generates the repository's refs needed for the
git http server

Change summary

internal/config/config.go | 13 ++++++-------
internal/config/git.go    |  9 +++++++++
internal/git/git.go       |  7 +++++++
3 files changed, 22 insertions(+), 7 deletions(-)

Detailed changes

internal/config/config.go 🔗

@@ -2,6 +2,7 @@ package config
 
 import (
 	"bytes"
+	"log"
 	"strings"
 	"sync"
 	"text/template"
@@ -130,6 +131,10 @@ func (cfg *Config) Reload() error {
 	}
 	for _, r := range cfg.Source.AllRepos() {
 		name := r.Name()
+		err = r.UpdateServerInfo()
+		if err != nil {
+			log.Printf("error updating server info for %s: %s", name, err)
+		}
 		pat := "README*"
 		rp := ""
 		for _, rr := range cfg.Repos {
@@ -186,7 +191,7 @@ func (cfg *Config) createDefaultConfigRepo(yaml string) error {
 	if err != nil {
 		return err
 	}
-	r, err := rs.GetRepo(cn)
+	_, err = rs.GetRepo(cn)
 	if err == git.ErrMissingRepo {
 		cr, err := rs.InitRepo(cn, true)
 		if err != nil {
@@ -234,12 +239,6 @@ func (cfg *Config) createDefaultConfigRepo(yaml string) error {
 		if err != nil {
 			return err
 		}
-		cmd := exec.Command("git", "update-server-info")
-		cmd.Dir = filepath.Join(rs.Path, cn)
-		err = cmd.Run()
-		if err != nil {
-			return err
-		}
 	} else if err != nil {
 		return err
 	}

internal/config/git.go 🔗

@@ -18,6 +18,15 @@ func (cfg *Config) Push(repo string, pk ssh.PublicKey) {
 		if cfg.Cfg.Callbacks != nil {
 			cfg.Cfg.Callbacks.Push(repo)
 		}
+		r, err := cfg.Source.GetRepo(repo)
+		if err != nil {
+			log.Printf("error getting repo after push: %s", err)
+			return
+		}
+		err = r.UpdateServerInfo()
+		if err != nil {
+			log.Printf("error updating server info after push: %s", err)
+		}
 	}()
 }
 

internal/git/git.go 🔗

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"log"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"sort"
 	"sync"
@@ -385,3 +386,9 @@ func (r *Repo) LatestTree(path string) (*object.Tree, error) {
 	return r.Tree(r.head, path)
 }
 
+// UpdateServerInfo updates the server info for the repository.
+func (r *Repo) UpdateServerInfo() error {
+	cmd := exec.Command("git", "update-server-info")
+	cmd.Dir = r.path
+	return cmd.Run()
+}