releases.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: Apache-2.0
 4
 5package main
 6
 7import (
 8	"encoding/csv"
 9	"log"
10	"os"
11)
12
13func getReleases(p project) (project, error) {
14	var err error
15	switch p.Forge {
16	case "github", "gitea", "forgejo":
17		p, err = getRSSReleases(p)
18	// case "gitlab":
19	// 	// TODO: maybe use GitLab's API?
20	default:
21		p, err = getGitReleases(p)
22	}
23	return p, err
24}
25
26func track(name, url, forge, release string) {
27	projectExists := false
28	for i := range m.Projects {
29		if m.Projects[i].URL == url {
30			projectExists = true
31			m.Projects[i].Running = release
32		}
33	}
34
35	if !projectExists {
36		m.Projects = append(m.Projects, project{
37			URL:     url,
38			Name:    name,
39			Forge:   forge,
40			Running: release,
41		})
42	}
43
44	manualRefresh <- struct{}{}
45
46	writeCSV()
47}
48
49func untrack(url string) {
50	for i := range m.Projects {
51		if m.Projects[i].URL == url {
52			m.Projects = append(m.Projects[:i], m.Projects[i+1:]...)
53			break
54		}
55	}
56
57	manualRefresh <- struct{}{}
58
59	writeCSV()
60	err := removeRepo(url)
61	if err != nil {
62		log.Println(err)
63	}
64}
65
66func writeCSV() {
67	file, err := os.OpenFile(config.CSVLocation, os.O_RDWR|os.O_CREATE, 0o600)
68	if err != nil {
69		log.Fatalln(err)
70	}
71	defer file.Close()
72
73	writer := csv.NewWriter(file)
74
75	if err := writer.Write([]string{"url", "name", "forge", "running"}); err != nil {
76		log.Fatalln(err)
77	}
78	for _, project := range m.Projects {
79		if err := writer.Write([]string{project.URL, project.Name, project.Forge, project.Running}); err != nil {
80			log.Fatalln(err)
81		}
82	}
83
84	writer.Flush()
85}