summaryrefslogtreecommitdiff
path: root/internal/showcase/metadata.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/showcase/metadata.go')
-rw-r--r--internal/showcase/metadata.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/internal/showcase/metadata.go b/internal/showcase/metadata.go
index 13caf9f..9627910 100644
--- a/internal/showcase/metadata.go
+++ b/internal/showcase/metadata.go
@@ -28,6 +28,8 @@ type RepoMetadata struct {
LastCommitDate string
License string
AvgCommitAge float64 // Average age of last 42 commits in days
+ LatestTag string // Latest version tag (empty if no tags)
+ HasReleases bool // Whether the project has any releases/tags
}
// extractRepoMetadata extracts metadata from a repository
@@ -86,6 +88,14 @@ func extractRepoMetadata(repoPath string) (*RepoMetadata, error) {
}
metadata.AvgCommitAge = avgAge
+ // Get latest tag and check for releases
+ latestTag, hasReleases, err := getLatestTag(repoPath)
+ if err != nil {
+ fmt.Printf("Warning: Failed to get latest tag: %v\n", err)
+ }
+ metadata.LatestTag = latestTag
+ metadata.HasReleases = hasReleases
+
return metadata, nil
}
@@ -268,4 +278,28 @@ func getAverageCommitAge(repoPath string, commitCount int) (float64, error) {
}
return totalAge / float64(validCommits), nil
+}
+
+// getLatestTag returns the latest git tag and whether the repo has any releases
+func getLatestTag(repoPath string) (string, bool, error) {
+ // First try to get tags sorted by version
+ cmd := exec.Command("git", "-C", repoPath, "tag", "-l", "--sort=-version:refname")
+ output, err := cmd.Output()
+ if err != nil {
+ // Fallback to describe
+ cmd = exec.Command("git", "-C", repoPath, "describe", "--tags", "--abbrev=0")
+ output, err = cmd.Output()
+ if err != nil {
+ // No tags at all
+ return "", false, nil
+ }
+ }
+
+ tags := strings.Split(strings.TrimSpace(string(output)), "\n")
+ if len(tags) == 0 || tags[0] == "" {
+ return "", false, nil
+ }
+
+ // Return the latest tag
+ return tags[0], true, nil
} \ No newline at end of file