Skip to content

Commit

Permalink
Merge pull request #3 from luissimas/bugfix/restore-repository-head
Browse files Browse the repository at this point in the history
Bugfix/restore repository head
  • Loading branch information
luissimas committed Jun 17, 2024
2 parents 463098d + 8de5869 commit 6749d1b
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 10 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Prometheus exporter that collects statistics from your second brain.
- [X] Make InfluxDB parameters configurable
- [X] Major refactor
- [X] Backfill data using git
- [ ] Support private repositories (Maybe with Github's PAT?)
- [X] Support private repositories (Maybe with Github's PAT?)
- [ ] Handle InfluxDB async write errors (https://github.com/influxdata/influxdb-client-go?tab=readme-ov-file#reading-async-errors)
- [ ] Grafana dashboard
- [ ] Docker compose example
Expand Down
3 changes: 3 additions & 0 deletions cmd/zettelkasten-exporter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ func main() {

// Periodic collection loop
for {
slog.Info("Starting metrics collection")
start := time.Now()
err = zet.Ensure()
if err != nil {
slog.Error("Error ensuring that zettelkasten is ready", slog.Any("error", err))
Expand All @@ -61,5 +63,6 @@ func main() {
os.Exit(1)
}
time.Sleep(cfg.CollectionInterval)
slog.Info("Collected metrics", slog.Duration("duration", time.Since(start)))
}
}
10 changes: 7 additions & 3 deletions internal/collector/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func NewCollector(ignorePatterns []string, storage storage.Storage) Collector {
}

func (c *Collector) CollectMetrics(root fs.FS, collectionTime time.Time) error {
slog.Info("Collecting metrics")
slog.Debug("Collecting metrics", slog.Time("collection_time", collectionTime))
start := time.Now()
collected, err := c.collectMetrics(root)
if err != nil {
Expand All @@ -41,7 +41,7 @@ func (c *Collector) CollectMetrics(root fs.FS, collectionTime time.Time) error {
for name, metric := range collected.Notes {
c.storage.WriteMetric(name, metric, collectionTime)
}
slog.Info("Collected metrics", slog.Duration("duration", time.Since(start)))
slog.Debug("Collected metrics", slog.Duration("duration", time.Since(start)))

return nil
}
Expand All @@ -65,9 +65,13 @@ func (c *Collector) collectMetrics(root fs.FS) (metrics.Metrics, error) {
}

f, err := root.Open(path)
if err != nil {
slog.Error("Error opening file", slog.Any("error", err), slog.String("path", path))
return nil
}
content, err := io.ReadAll(f)
if err != nil {
slog.Error("Error reading file", slog.Any("error", err))
slog.Error("Error reading file", slog.Any("error", err), slog.String("path", path))
return nil
}
metrics := CollectNoteMetrics(content)
Expand Down
38 changes: 32 additions & 6 deletions internal/zettelkasten/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,14 @@ func (g GitZettelkasten) Ensure() error {
slog.Error("Unexpected error when getting git repository remote revision", slog.Any("error", err))
return err
}

w.Reset(&git.ResetOptions{Commit: *rev})
err = w.Reset(&git.ResetOptions{
Commit: *rev,
Mode: git.HardReset,
})
if err != nil {
slog.Error("Unexpected error when reseting git repository", slog.Any("error", err))
return err
}

slog.Info("Pulling from repository", slog.String("url", g.URL), slog.String("branch", g.Branch))
start := time.Now()
Expand All @@ -85,6 +91,12 @@ func (g GitZettelkasten) WalkHistory(walkFunc WalkFunc) error {
slog.Error("Unexpected error when opening git repository", slog.Any("error", err), slog.String("path", g.RootPath))
return err
}
originalHead, err := repo.Head()
if err != nil {
slog.Error("Unexpected error when getting git repository head", slog.Any("error", err))
return err
}
originalHash := originalHead.Hash()
w, err := repo.Worktree()
if err != nil {
slog.Error("Unexpected error when getting git repository worktree", slog.Any("error", err))
Expand All @@ -93,15 +105,30 @@ func (g GitZettelkasten) WalkHistory(walkFunc WalkFunc) error {
log, err := repo.Log(&git.LogOptions{Order: git.LogOrderCommitterTime})
err = log.ForEach(func(c *object.Commit) error {
slog.Debug("Walking commit", slog.String("sha", c.Hash.String()), slog.String("message", c.Message), slog.Time("date", c.Committer.When))
w.Reset(&git.ResetOptions{Commit: c.Hash, Mode: git.HardReset})
err = w.Reset(&git.ResetOptions{
Commit: c.Hash,
Mode: git.HardReset,
})
if err != nil {
slog.Error("Unexpected error when reseting git repository", slog.Any("error", err))
return err
}
err := walkFunc(g.GetRoot(), c.Committer.When)
if err != nil {
slog.Error("Error when walking commit", slog.String("hash", c.Hash.String()), slog.Any("error", err))
return err
}
return nil
})
return err
err = w.Reset(&git.ResetOptions{
Commit: *&originalHash,
Mode: git.HardReset,
})
if err != nil {
slog.Error("Unexpected error when reseting git repository", slog.Any("error", err))
return err
}
return nil
}

func cloneRepository(url, branch, target, token string) (*git.Repository, error) {
Expand Down Expand Up @@ -147,7 +174,6 @@ func forcePullRepository(repo *git.Repository, token string) error {

if errors.Is(err, git.NoErrAlreadyUpToDate) {
slog.Info("Already up to date with remote repository, no changes pulled")
return nil
} else if err != nil {
slog.Error("Unexpected error when fetching from git repository", slog.Any("error", err))
return err
Expand Down Expand Up @@ -176,7 +202,7 @@ func forcePullRepository(repo *git.Repository, token string) error {
Mode: git.HardReset,
})
if err != nil {
slog.Error("Unexpected error when reseting from git repository", slog.Any("error", err))
slog.Error("Unexpected error when reseting git repository", slog.Any("error", err))
return err
}
return nil
Expand Down

0 comments on commit 6749d1b

Please sign in to comment.