1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  | 
package main
import (
	"fmt"
	"sort"
	git "go.wit.com/lib/libgit2"
	"go.wit.com/log"
)
func showtags(repo *git.Repository) {
	// Map: commit OID -> list of tags pointing to it
	tagMap := make(map[string][]string)
	// Walk through all tag names
	tags, err := repo.NewReferenceIteratorGlob("refs/tags/*")
	if err != nil {
		log.Fatalf("Failed to iterate tags: %v", err)
	}
	for {
		ref, err := tags.Next()
		if err != nil {
			break // Done iterating
		}
		name := ref.Shorthand()
		target, err := repo.RevparseSingle(ref.Name())
		if err != nil {
			log.Printf("Skipping unresolved tag: %s", name)
			continue
		}
		commitOID := target.Id().String()
		tagMap[commitOID] = append(tagMap[commitOID], name)
		log.Info("tag:", commitOID, name, target)
	}
	// Identify and delete duplicate tags
	for commit, tagList := range tagMap {
		if len(tagList) > 1 {
			sort.Strings(tagList)
			fmt.Printf("Commit %s has duplicates: %v\n", commit, tagList)
			// Keep the first tag, delete the rest
			for _, tag := range tagList[1:] {
				refname := "refs/tags/" + tag
				log.Info(refname)
				/*
					if err := repo.References.Remove(refname); err != nil {
						log.Printf("Failed to delete tag %s: %v", tag, err)
					} else {
						fmt.Printf("Deleted tag: %s\n", tag)
					}
				*/
			}
		}
	}
}
func printCommitsForTag(repo *git.Repository, tagName string) error {
	// Resolve tag reference
	ref, err := repo.References.Lookup("refs/tags/" + tagName)
	if err != nil {
		return fmt.Errorf("failed to find tag %s: %w", tagName, err)
	}
	// Resolve to commit object (may be annotated tag or direct commit)
	obj, err := ref.Peel(git.ObjectCommit)
	if err != nil {
		return fmt.Errorf("failed to peel tag %s to commit: %w", tagName, err)
	}
	start, err := obj.AsCommit()
	if err != nil {
		return fmt.Errorf("peeled object is not a commit: %w", err)
	}
	// Walk the history
	walker, err := repo.Walk()
	if err != nil {
		return fmt.Errorf("failed to create walker: %w", err)
	}
	if err := walker.Push(start.Id()); err != nil {
		return fmt.Errorf("failed to push start commit: %w", err)
	}
	fmt.Printf("Commits for tag %s:\n", tagName)
	err = walker.Iterate(func(c *git.Commit) bool {
		fmt.Printf("%s %s\n", c.Id().String(), c.Summary())
		return true
	})
	if err != nil {
		return fmt.Errorf("error during walk: %w", err)
	}
	return nil
}
  |