diff --git a/internal/virtual/ansible_merger.go b/internal/virtual/ansible_merger.go index 181387d..a16d624 100644 --- a/internal/virtual/ansible_merger.go +++ b/internal/virtual/ansible_merger.go @@ -160,9 +160,12 @@ func (e *Engine) ansibleMember(ctx context.Context, member, ns, name string) (*A } m.Found = true m.Refs = append(m.Refs, doc.Data...) - if remote.RepoType == models.RepoTypeLocal || len(doc.Data) == 0 || len(m.Refs) >= doc.Meta.Count { + if remote.RepoType == models.RepoTypeLocal || len(m.Refs) >= doc.Meta.Count { return m, nil } + if len(doc.Data) == 0 { + return nil, fmt.Errorf("%s/%s: empty page after %d of %d versions", member, path, len(m.Refs), doc.Meta.Count) + } } return nil, fmt.Errorf("%s: more than %d pages of %s.%s versions", member, maxAnsibleMemberPages, ns, name) } diff --git a/internal/virtual/ansible_merger_test.go b/internal/virtual/ansible_merger_test.go index 4365f5b..96c7695 100644 --- a/internal/virtual/ansible_merger_test.go +++ b/internal/virtual/ansible_merger_test.go @@ -139,6 +139,18 @@ func TestAnsibleVersionsFailsClosed(t *testing.T) { } } +func TestAnsibleVersionsShortRemote(t *testing.T) { + e := ansibleEngine(func(_ models.Remote, path string) ([]byte, error) { + if strings.Contains(path, "offset=") { + return json.Marshal(map[string]any{"meta": map[string]int{"count": 3}, "data": []any{}}) + } + return galaxyPages([]string{"3.0.0", "2.0.0", "1.0.0"}, path) + }) + if _, err := e.AnsibleVersions(context.Background(), ansibleVirt("galaxy"), "a", "b"); err == nil || errors.Is(err, ErrNotFound) { + t.Fatalf("empty page before count: want a non-404 error, got %v", err) + } +} + func TestAnsibleVersionRoutesViaVirtual(t *testing.T) { detail := func(dl string) []byte { b, _ := json.Marshal(map[string]any{"version": "1.0.0", "download_url": dl, "artifact": map[string]string{"sha256": "ab"}})