File: find_dangling.go

package info (click to toggle)
aptly 1.6.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 49,928 kB
  • sloc: python: 10,398; sh: 252; makefile: 184
file content (45 lines) | stat: -rw-r--r-- 974 bytes parent folder | download | duplicates (2)
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
package deb

import (
	"errors"
	"fmt"

	"github.com/aptly-dev/aptly/database"
)

// FindDanglingReferences finds references that exist in the given PackageRefList, but not in the given PackageCollection.
// It returns all such references, so they can be removed from the database.
func FindDanglingReferences(reflist *PackageRefList, packages *PackageCollection) (dangling *PackageRefList, err error) {
	dangling = &PackageRefList{}

	err = reflist.ForEach(func(key []byte) error {
		ok, err := isDangling(packages, key)
		if err != nil {
			return err
		}

		if ok {
			dangling.Refs = append(dangling.Refs, key)
		}

		return nil
	})
	if err != nil {
		return nil, err
	}

	return dangling, nil
}

func isDangling(packages *PackageCollection, key []byte) (bool, error) {
	_, err := packages.ByKey(key)
	if errors.Is(err, database.ErrNotFound) {
		return true, nil
	}

	if err != nil {
		return false, fmt.Errorf("get reference %q: %w", key, err)
	}

	return false, nil
}