1package controllers
2
3import (
4	"fmt"
5	"log"
6	"os"
7	"path/filepath"
8
9	ent "repodiff/entities"
10	"repodiff/mappers"
11	"repodiff/persistence/filesystem"
12	"repodiff/repositories"
13	"repodiff/utils"
14)
15
16func GenerateCommitReport(appConfig ent.ApplicationConfig) error {
17	for _, target := range appConfig.DiffTargets {
18		if err := generateCommitReport(appConfig, target); err != nil {
19			return err
20		}
21	}
22	return nil
23}
24
25func generateCommitReport(appConfig ent.ApplicationConfig, target ent.DiffTarget) error {
26	log.Printf("Generating commit report for (upstream) %s vs (downstream) %s\n", target.Upstream.Branch, target.Downstream.Branch)
27	sourceRepo, err := repositories.NewSourceRepository()
28	if err != nil {
29		return err
30	}
31	mappedTarget, err := sourceRepo.DiffTargetToMapped(target)
32	if err != nil {
33		return err
34	}
35	// TODO export the commitRepository type in order to add the possibility of helpers
36	commitRepo, err := repositories.NewCommitRepository(mappedTarget)
37	if err != nil {
38		return err
39	}
40
41	commitRows, err := commitRepo.GetMostRecentCommits()
42	if err != nil {
43		return err
44	}
45
46	dir := filepath.Join(appConfig.OutputDirectory, "reports")
47	fname := filepath.Join(dir, filenameForTarget(target))
48	os.MkdirAll(dir, os.ModePerm)
49	log.Printf("Writing to file %s\n", fname)
50
51	if err := filesystem.WriteCSVToFile(
52		mappers.CommitCSVHeader(),
53		mappers.CommitEntitiesToCSVRows(commitRows),
54		fname,
55	); err != nil {
56		return err
57	}
58	return nil
59}
60
61func filenameForTarget(target ent.DiffTarget) string {
62	return fmt.Sprintf(
63		"%s_upstream-%s_vs_downstream-%s.csv",
64		utils.TimestampToDate(
65			utils.TimestampSeconds(),
66		),
67		target.Upstream.Branch,
68		target.Downstream.Branch,
69	)
70
71}
72