diff --git a/README.md b/README.md index 6ef7720..d025ac5 100644 --- a/README.md +++ b/README.md @@ -137,8 +137,6 @@ mayu ingest --ecosystem Go --update mayu ingest --all # Import all ecosystems with custom parallelism mayu ingest --all --concurrency 5 --store-workers 8 -# Bulk import from single top-level all.zip (~1.3GB, all ecosystems at once) -mayu ingest --all --bulk # Import NVD CVE data directly from NVD JSON Feed 2.0 mayu ingest --source nvd --native # Import only a specific year's NVD data @@ -244,7 +242,6 @@ Import vulnerability data from OSV into the local database. |------|-------------|---------| | `--ecosystem` | Ecosystem to import (e.g., Go, PyPI, npm) | — | | `--all` | Import all ecosystems (dynamically fetched from GCS) | `false` | -| `--bulk` | Use top-level all.zip for bulk import (with `--all`) | `false` | | `--update` | Perform delta update instead of full import | `false` | | `--backfill` | Backfill historical data (with `--source epss`) | `false` | | `--from` | Start date for backfill (YYYY-MM-DD) | `2023-03-07` (EPSS v3) | diff --git a/README_ja.md b/README_ja.md index 5a3be9f..37436d0 100644 --- a/README_ja.md +++ b/README_ja.md @@ -138,8 +138,6 @@ mayu ingest --ecosystem Go --update mayu ingest --all # 並列度を指定して全エコシステムをインポート mayu ingest --all --concurrency 5 --store-workers 8 -# トップレベル all.zip (~1.3GB) から一括インポート(全エコシステムを1ファイルで) -mayu ingest --all --bulk # NVD JSON Feed 2.0 から直接 CVE データをインポート mayu ingest --source nvd --native # 特定の年度のみインポート @@ -245,7 +243,6 @@ OSV から脆弱性データをローカルデータベースにインポート |--------|------|-----------| | `--ecosystem` | インポートするエコシステム(例: Go, PyPI, npm) | — | | `--all` | 全エコシステムをインポート(GCS から動的取得) | `false` | -| `--bulk` | トップレベル all.zip で一括インポート(`--all` と併用) | `false` | | `--update` | フルインポートの代わりに差分更新を実行 | `false` | | `--backfill` | ヒストリカルデータをバックフィル(`--source epss` と併用) | `false` | | `--from` | バックフィルの開始日(YYYY-MM-DD) | `2023-03-07`(EPSS v3) | diff --git a/cmd/mayu/ingest.go b/cmd/mayu/ingest.go index 5783748..e53d749 100644 --- a/cmd/mayu/ingest.go +++ b/cmd/mayu/ingest.go @@ -26,7 +26,6 @@ func runIngest(args []string, cfg *config.Config) error { ecosystem := fs.String("ecosystem", "", "Ecosystem to import (e.g., Go, PyPI, npm)") source := fs.String("source", "", "Import from source (nvd, debian, mitre, epss, kev, ghsa)") all := fs.Bool("all", false, "Import all ecosystems") - bulk := fs.Bool("bulk", false, "Use top-level all.zip for bulk import (with --all)") update := fs.Bool("update", false, "Perform delta update instead of full import") backfill := fs.Bool("backfill", false, "Backfill historical data (with --source epss)") fromDate := fs.String("from", "", "Start date for backfill (YYYY-MM-DD, default: 2023-03-07 for EPSS v3)") @@ -51,7 +50,6 @@ func runIngest(args []string, cfg *config.Config) error { fmt.Println(" mayu ingest --ecosystem Go") fmt.Println(" mayu ingest --ecosystem Go --update") fmt.Println(" mayu ingest --all") - fmt.Println(" mayu ingest --all --bulk # Download single all.zip (~1.3GB) for all ecosystems") fmt.Println(" mayu ingest --source nvd") fmt.Println(" mayu ingest --source nvd --native # Import directly from NVD JSON Feed 2.0") fmt.Println(" mayu ingest --source nvd --native --year 2024 # Import only 2024 NVD data") @@ -469,21 +467,6 @@ func runIngest(args []string, cfg *config.Config) error { return nil } - // Handle --all --bulk: download the single top-level all.zip (~1.3GB) - if *all && *bulk { - fmt.Println("\n=== Bulk import from top-level all.zip ===") - stats, err := ing.BulkImportAll(ctx) - if err != nil { - if ctx.Err() != nil { - fmt.Fprintf(os.Stderr, "\nImport interrupted.\n") - return nil - } - return fmt.Errorf("bulk import: %w", err) - } - printStats(stats) - return nil - } - // Determine ecosystems to import ecosystems, err := resolveEcosystems(ctx, f, *all, *ecosystem) if err != nil { diff --git a/internal/fetcher/fetcher.go b/internal/fetcher/fetcher.go index c34f481..2673f2b 100644 --- a/internal/fetcher/fetcher.go +++ b/internal/fetcher/fetcher.go @@ -33,7 +33,7 @@ const ( // DefaultHTTPTimeout is the default timeout for HTTP requests. DefaultHTTPTimeout = 5 * time.Minute - // LargeFileHTTPTimeout is the timeout for large file downloads (e.g., top-level all.zip ~1.3GB). + // LargeFileHTTPTimeout is the timeout for large file downloads (e.g., MITRE cvelistV5 zip). LargeFileHTTPTimeout = 60 * time.Minute // MaxResponseSize is the maximum allowed HTTP response body size (2 GB). diff --git a/internal/fetcher/fetcher_test.go b/internal/fetcher/fetcher_test.go index 822a9d2..16d6e3a 100644 --- a/internal/fetcher/fetcher_test.go +++ b/internal/fetcher/fetcher_test.go @@ -632,98 +632,3 @@ func TestDownloadToTempFile(t *testing.T) { t.Errorf("file permissions = %o, want 0600", perm) } } - -func TestStreamTopLevelAllZip(t *testing.T) { - // The top-level all.zip contains files with paths like "ecosystem/vuln_id.json" - vulnJSON1 := `{"id":"GO-2024-0001","modified":"2024-01-01T00:00:00Z","summary":"Test vuln 1"}` - vulnJSON2 := `{"id":"PYSEC-2024-0001","modified":"2024-02-01T00:00:00Z","summary":"Test vuln 2"}` - - zipData := createTestZip(t, map[string]string{ - "Go/GO-2024-0001.json": vulnJSON1, - "PyPI/PYSEC-2024-0001.json": vulnJSON2, - "README.md": "not a json file", - }) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case "/all.zip": - w.Header().Set("Content-Type", "application/zip") - _, _ = w.Write(zipData) - default: - http.NotFound(w, r) - } - })) - defer server.Close() - - f := New(WithBaseURL(server.URL)) - - entries, errCh, totalCount, err := f.StreamTopLevelAllZip(context.Background()) - if err != nil { - t.Fatalf("StreamTopLevelAllZip failed: %v", err) - } - - // Verify total count matches expected JSON files - if totalCount != 2 { - t.Errorf("expected totalCount=2, got %d", totalCount) - } - - // Collect all entries - results := make(map[string]string) - for entry := range entries { - results[entry.Name] = string(entry.Data) - } - - // Check for streaming errors - if streamErr := <-errCh; streamErr != nil { - t.Fatalf("stream error: %v", streamErr) - } - - // Verify results - should extract vuln_id from "ecosystem/vuln_id.json" - if len(results) != 2 { - t.Fatalf("expected 2 results, got %d: %v", len(results), results) - } - if results["GO-2024-0001"] != vulnJSON1 { - t.Errorf("GO-2024-0001 content mismatch: got %q", results["GO-2024-0001"]) - } - if results["PYSEC-2024-0001"] != vulnJSON2 { - t.Errorf("PYSEC-2024-0001 content mismatch: got %q", results["PYSEC-2024-0001"]) - } -} - -func TestStreamTopLevelAllZip_ContextCancellation(t *testing.T) { - vulnJSON := `{"id":"GO-2024-0001","modified":"2024-01-01T00:00:00Z"}` - zipData := createTestZip(t, map[string]string{ - "Go/GO-2024-0001.json": vulnJSON, - "Go/GO-2024-0002.json": vulnJSON, - "PyPI/PYSEC-2024-01.json": vulnJSON, - }) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/zip") - _, _ = w.Write(zipData) - })) - defer server.Close() - - f := New(WithBaseURL(server.URL)) - - ctx, cancel := context.WithCancel(context.Background()) - - entries, errCh, _, err := f.StreamTopLevelAllZip(ctx) - if err != nil { - t.Fatalf("StreamTopLevelAllZip failed: %v", err) - } - - // Read one entry then cancel - <-entries - cancel() - - // Drain remaining - for range entries { - } - - // Should get context cancellation error (or nil if finished) - streamErr := <-errCh - if streamErr != nil && streamErr != context.Canceled { - t.Fatalf("unexpected error: %v", streamErr) - } -} diff --git a/internal/fetcher/stream.go b/internal/fetcher/stream.go index 4bef113..11cd3d9 100644 --- a/internal/fetcher/stream.go +++ b/internal/fetcher/stream.go @@ -115,104 +115,6 @@ func (f *Fetcher) StreamAllZip(ctx context.Context, ecosystem string) (<-chan Zi return entries, errCh, jsonCount, nil } -// StreamTopLevelAllZip downloads the top-level all.zip (which contains -// vulnerabilities from ALL ecosystems, ~1.3GB) to a temporary file and -// streams entries through a channel. Each entry's filename in the zip has -// the format "ecosystem/vuln_id.json". -// -// This uses a longer timeout appropriate for large file downloads. -// The temporary file is automatically cleaned up when streaming completes. -func (f *Fetcher) StreamTopLevelAllZip(ctx context.Context) (<-chan ZipEntry, <-chan error, int, error) { - u := fmt.Sprintf("%s/all.zip", f.baseURL) - - // Use a longer timeout for the large download. - // Create a dedicated client to avoid mutating the shared httpClient (thread-safety). - largeClient := &http.Client{ - Timeout: LargeFileHTTPTimeout, - Transport: f.httpClient.Transport, - } - tmpFile, fileSize, err := f.downloadToTempFileWith(ctx, u, largeClient, MaxResponseSize) - if err != nil { - return nil, nil, 0, fmt.Errorf("download top-level all.zip: %w", err) - } - - // Open zip reader from the temporary file. - reader, err := zip.NewReader(tmpFile, fileSize) - if err != nil { - _ = tmpFile.Close() - _ = os.Remove(tmpFile.Name()) - return nil, nil, 0, fmt.Errorf("open zip: %w", err) - } - - // Check entry count limit. - jsonCount := 0 - for _, file := range reader.File { - if strings.HasSuffix(file.Name, ".json") { - jsonCount++ - } - } - if jsonCount > MaxZipEntries { - _ = tmpFile.Close() - _ = os.Remove(tmpFile.Name()) - return nil, nil, 0, fmt.Errorf("zip contains %d entries, exceeding maximum of %d", jsonCount, MaxZipEntries) - } - - entries := make(chan ZipEntry, 100) - errCh := make(chan error, 1) - - go func() { - defer close(entries) - defer close(errCh) - defer func() { - _ = tmpFile.Close() - _ = os.Remove(tmpFile.Name()) - }() - - var totalSize int64 - - for _, file := range reader.File { - if !strings.HasSuffix(file.Name, ".json") { - continue - } - - select { - case <-ctx.Done(): - errCh <- ctx.Err() - return - default: - } - - content, err := readZipFile(file) - if err != nil { - errCh <- fmt.Errorf("read %s: %w", file.Name, err) - return - } - - totalSize += int64(len(content)) - if totalSize > MaxZipTotalSize { - errCh <- fmt.Errorf("zip total extracted size exceeds maximum of %d bytes", MaxZipTotalSize) - return - } - - // For top-level all.zip, the filename is "ecosystem/vuln_id.json" - // Extract just the vuln_id part. - name := strings.TrimSuffix(file.Name, ".json") - if idx := strings.LastIndex(name, "/"); idx >= 0 { - name = name[idx+1:] - } - - select { - case entries <- ZipEntry{Name: name, Data: content}: - case <-ctx.Done(): - errCh <- ctx.Err() - return - } - } - }() - - return entries, errCh, jsonCount, nil -} - // downloadToTempFile downloads the URL content directly to a temporary file, // avoiding loading the entire response into memory. It returns the open file // (seeked to beginning) and its size. diff --git a/internal/ingest/ingest.go b/internal/ingest/ingest.go index aaf1046..eadf84a 100644 --- a/internal/ingest/ingest.go +++ b/internal/ingest/ingest.go @@ -414,94 +414,6 @@ func (ing *Ingester) DeltaImport(ctx context.Context, ecosystem string) (*Stats, return stats, nil } -// BulkImportAll performs a bulk import from the top-level all.zip, which -// contains vulnerabilities from all ecosystems in a single archive (~1.3GB). -// This is more efficient than importing each ecosystem separately when doing -// a complete fresh import. -func (ing *Ingester) BulkImportAll(ctx context.Context) (*Stats, error) { - start := time.Now() - stats := &Stats{ - Ecosystem: "all", - IsFullSync: true, - } - - // Start job recording - recorder := ing.startJob(ctx, "osv-bulk", map[string]interface{}{ - "bulk": true, - }) - defer func() { - if recorder != nil { - status := "success" - var jobErr error - if stats.Errors > 0 && stats.Inserted > 0 { - status = "partial" - } else if stats.Inserted == 0 && stats.Errors > 0 { - status = "failed" - } - if ctx.Err() != nil { - status = "failed" - jobErr = ctx.Err() - } - recorder.Finish(ctx, status, stats.Total, stats.Inserted, stats.Errors, jobErr) - } - }() - - // Phase 1: Download the top-level all.zip. - ing.progress(Progress{Phase: "download", Message: "Downloading top-level all.zip (~1.3GB)... this may take a while."}) - - entries, errCh, totalEntries, err := ing.fetcher.StreamTopLevelAllZip(ctx) - if err != nil { - return nil, fmt.Errorf("fetch top-level all.zip: %w", err) - } - - // Phase 2+3: Parallel parse and store with multiple workers. - ing.progress(Progress{Phase: "store", Message: fmt.Sprintf("Processing %d entries...", totalEntries)}) - - inserted, processed, parseErrors, err := ing.streamParseAndStore(ctx, entries, errCh, totalEntries) - if err != nil { - return nil, err - } - - stats.Inserted = inserted - stats.Total = processed + parseErrors - stats.Errors = parseErrors - stats.Skipped = parseErrors - - // Update sync state for "all". - now := time.Now().UTC().Format(time.RFC3339) - syncState := &store.SyncState{ - Source: "all", - LastModifiedAt: now, - RecordCount: int64(stats.Inserted), - } - if err := ing.store.UpdateSyncState(ctx, syncState); err != nil { - ing.logger.Printf("warning: failed to update sync state: %v", err) - } - - // Update sync state for each ecosystem so that subsequent delta updates - // (--all --update) can use the bulk import timestamp as baseline. - ecosystems, listErr := ing.fetcher.ListEcosystems(ctx) - if listErr != nil { - ing.logger.Printf("warning: failed to list ecosystems for sync state update: %v", listErr) - } else { - for _, eco := range ecosystems { - ecoState := &store.SyncState{ - Source: eco, - LastModifiedAt: now, - RecordCount: 0, // Exact per-ecosystem count unknown; will be corrected on next full/delta import. - } - if err := ing.store.UpdateSyncState(ctx, ecoState); err != nil { - ing.logger.Printf("warning: failed to update sync state for %s: %v", eco, err) - } - } - } - - stats.Duration = time.Since(start) - ing.progress(Progress{Phase: "store", Current: stats.Inserted, Total: stats.Total, Message: fmt.Sprintf("Done: %d inserted in %s", stats.Inserted, stats.Duration.Round(time.Millisecond))}) - - return stats, nil -} - // storeBatches splits a slice of vulnerabilities into batches and stores them // using parallel workers. Returns the total count inserted. func (ing *Ingester) storeBatches(ctx context.Context, vulns []*model.Vulnerability) (int, error) { @@ -531,8 +443,8 @@ func (ing *Ingester) storeBatches(ctx context.Context, vulns []*model.Vulnerabil } // streamParseAndStore reads ZipEntry values from a channel, parses them, and -// stores them in parallel batches. This is the shared pipeline used by both -// FullImport and BulkImportAll. +// stores them in parallel batches. This is the shared pipeline used by +// FullImport. // // It returns (inserted, processed, errors, err). func (ing *Ingester) streamParseAndStore(ctx context.Context, entries <-chan fetcher.ZipEntry, errCh <-chan error, total int) (inserted int, processed int, parseErrors int, err error) { diff --git a/internal/ingest/ingest_test.go b/internal/ingest/ingest_test.go index b263778..3bd15c4 100644 --- a/internal/ingest/ingest_test.go +++ b/internal/ingest/ingest_test.go @@ -292,167 +292,3 @@ func TestDeltaImport_NoSyncState_FallsBackToFull(t *testing.T) { t.Errorf("Inserted = %d, want 1", stats.Inserted) } } - -func TestBulkImportAll(t *testing.T) { - // Read real test data - data1, err := os.ReadFile("../../testdata/GO-2024-2687.json") - if err != nil { - t.Fatalf("read test data: %v", err) - } - data2, err := os.ReadFile("../../testdata/GO-2023-1840.json") - if err != nil { - t.Fatalf("read test data: %v", err) - } - - // Create zip with ecosystem-prefixed paths (top-level all.zip format) - zipData := createTestZip(t, map[string]string{ - "Go/GO-2024-2687.json": string(data1), - "Go/GO-2023-1840.json": string(data2), - }) - - // ecosystems.txt content - ecosystemsTxt := "Go\nnpm\nPyPI\n" - - // Mock HTTP server - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case "/all.zip": - w.Write(zipData) - case "/ecosystems.txt": - w.Write([]byte(ecosystemsTxt)) - default: - http.NotFound(w, r) - } - })) - defer server.Close() - - // Setup - s := setupTestStore(t) - f := fetcher.New(fetcher.WithBaseURL(server.URL)) - p := parser.New() - ing := New(f, p, s, WithBatchSize(10)) - - // Execute bulk import - ctx := context.Background() - stats, err := ing.BulkImportAll(ctx) - if err != nil { - t.Fatalf("BulkImportAll failed: %v", err) - } - - // Verify stats - if stats.Ecosystem != "all" { - t.Errorf("Ecosystem = %q, want %q", stats.Ecosystem, "all") - } - if stats.Total != 2 { - t.Errorf("Total = %d, want 2", stats.Total) - } - if stats.Inserted != 2 { - t.Errorf("Inserted = %d, want 2", stats.Inserted) - } - if !stats.IsFullSync { - t.Error("IsFullSync should be true") - } - - // Verify "all" sync state was updated - allState, err := s.GetSyncState(ctx, "all") - if err != nil { - t.Fatalf("GetSyncState(all) failed: %v", err) - } - if allState == nil { - t.Fatal("sync state for 'all' is nil") - } - if allState.RecordCount != 2 { - t.Errorf("RecordCount(all) = %d, want 2", allState.RecordCount) - } - - // Verify each ecosystem's sync state was also updated - for _, eco := range []string{"Go", "npm", "PyPI"} { - ecoState, err := s.GetSyncState(ctx, eco) - if err != nil { - t.Fatalf("GetSyncState(%s) failed: %v", eco, err) - } - if ecoState == nil { - t.Errorf("sync state for %q is nil, want non-nil", eco) - continue - } - if ecoState.LastModifiedAt != allState.LastModifiedAt { - t.Errorf("LastModifiedAt(%s) = %s, want %s (same as 'all')", eco, ecoState.LastModifiedAt, allState.LastModifiedAt) - } - if ecoState.RecordCount != 0 { - t.Errorf("RecordCount(%s) = %d, want 0", eco, ecoState.RecordCount) - } - } - - // Verify data is in DB - vuln, err := s.GetByID(ctx, "GO-2024-2687") - if err != nil { - t.Fatalf("GetByID failed: %v", err) - } - if vuln == nil { - t.Fatal("GO-2024-2687 not found in DB") - } -} - -func TestBulkImportAll_EcosystemsListFailed_StillSucceeds(t *testing.T) { - // Read real test data - data1, err := os.ReadFile("../../testdata/GO-2024-2687.json") - if err != nil { - t.Fatalf("read test data: %v", err) - } - - // Create zip - zipData := createTestZip(t, map[string]string{ - "Go/GO-2024-2687.json": string(data1), - }) - - // Mock HTTP server — ecosystems.txt returns 500 - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case "/all.zip": - w.Write(zipData) - case "/ecosystems.txt": - w.WriteHeader(http.StatusInternalServerError) - default: - http.NotFound(w, r) - } - })) - defer server.Close() - - // Setup - s := setupTestStore(t) - f := fetcher.New(fetcher.WithBaseURL(server.URL)) - p := parser.New() - ing := New(f, p, s, WithBatchSize(10)) - - // Execute bulk import — should succeed even if ecosystems.txt fails - ctx := context.Background() - stats, err := ing.BulkImportAll(ctx) - if err != nil { - t.Fatalf("BulkImportAll failed: %v", err) - } - - // "all" sync state should be updated - allState, err := s.GetSyncState(ctx, "all") - if err != nil { - t.Fatalf("GetSyncState(all) failed: %v", err) - } - if allState == nil { - t.Fatal("sync state for 'all' is nil") - } - if allState.RecordCount != 1 { - t.Errorf("RecordCount(all) = %d, want 1", allState.RecordCount) - } - - // Per-ecosystem sync states should NOT exist (ecosystems.txt failed) - goState, err := s.GetSyncState(ctx, "Go") - if err != nil { - t.Fatalf("GetSyncState(Go) failed: %v", err) - } - if goState != nil { - t.Error("sync state for 'Go' should be nil when ecosystems.txt fails") - } - - if stats.Inserted != 1 { - t.Errorf("Inserted = %d, want 1", stats.Inserted) - } -} diff --git a/internal/server/ingest.go b/internal/server/ingest.go index c2e8f36..4190648 100644 --- a/internal/server/ingest.go +++ b/internal/server/ingest.go @@ -46,19 +46,18 @@ var allowedIngestTypes = map[string]bool{ "ecosystem": true, "ecosystem_update": true, "all": true, - "all_bulk": true, - "nvd": true, - "nvd_update": true, - "nvd_converted": true, - "mitre": true, - "mitre_update": true, - "epss": true, - "epss_update": true, - "epss_backfill": true, - "kev": true, - "kev_update": true, - "debian": true, - "ghsa": true, + "nvd": true, + "nvd_update": true, + "nvd_converted": true, + "mitre": true, + "mitre_update": true, + "epss": true, + "epss_update": true, + "epss_backfill": true, + "kev": true, + "kev_update": true, + "debian": true, + "ghsa": true, } // ecosystemNameRe validates ecosystem names to prevent path traversal. @@ -217,8 +216,6 @@ func (s *Server) runIngestJob(runner *ingestRunner, job *store.IngestJob, req in stats, ingestErr = ing.DeltaImport(ctx, req.Ecosystem) case "all": stats, ingestErr = s.ingestAll(ctx, ing, progressFn) - case "all_bulk": - stats, ingestErr = ing.BulkImportAll(ctx) case "nvd": stats, ingestErr = ing.ImportNVDNative(ctx) case "nvd_update": @@ -510,7 +507,7 @@ func (s *Server) ingestGHSA(ctx context.Context, repo string, progressFn func(in // ingestTypeToSource maps ingest type strings to source names for job records. func ingestTypeToSource(t string) string { switch t { - case "ecosystem", "ecosystem_update", "all", "all_bulk": + case "ecosystem", "ecosystem_update", "all": return "osv" case "nvd", "nvd_update", "nvd_converted": return "nvd" diff --git a/internal/server/openapi.yaml b/internal/server/openapi.yaml index f9a8bab..39aee51 100644 --- a/internal/server/openapi.yaml +++ b/internal/server/openapi.yaml @@ -735,7 +735,6 @@ components: - ecosystem - ecosystem_update - all - - all_bulk - nvd - nvd_update - nvd_converted diff --git a/ui/src/app/models/ingest.model.ts b/ui/src/app/models/ingest.model.ts index 3064a34..9c449e2 100644 --- a/ui/src/app/models/ingest.model.ts +++ b/ui/src/app/models/ingest.model.ts @@ -1,6 +1,6 @@ export type IngestType = | 'ecosystem' | 'ecosystem_update' - | 'all' | 'all_bulk' + | 'all' | 'nvd' | 'nvd_update' | 'nvd_converted' | 'mitre' | 'mitre_update' | 'epss' | 'epss_update' | 'epss_backfill' diff --git a/ui/src/app/pages/ingest/ingest.component.ts b/ui/src/app/pages/ingest/ingest.component.ts index 67e1e44..926df63 100644 --- a/ui/src/app/pages/ingest/ingest.component.ts +++ b/ui/src/app/pages/ingest/ingest.component.ts @@ -217,7 +217,6 @@ export class IngestComponent implements OnInit, OnDestroy { { value: 'ecosystem', label: $localize`:@@ingest.option.ecosystem:Ecosystem (Full)`, needsEcosystem: true, needsRepo: false, needsDates: false }, { value: 'ecosystem_update', label: $localize`:@@ingest.option.ecosystemUpdate:Ecosystem (Delta Update)`, needsEcosystem: true, needsRepo: false, needsDates: false }, { value: 'all', label: $localize`:@@ingest.option.all:All Ecosystems`, needsEcosystem: false, needsRepo: false, needsDates: false }, - { value: 'all_bulk', label: $localize`:@@ingest.option.allBulk:All Ecosystems (Bulk)`, needsEcosystem: false, needsRepo: false, needsDates: false }, { value: 'nvd', label: $localize`:@@ingest.option.nvd:NVD`, needsEcosystem: false, needsRepo: false, needsDates: false }, { value: 'nvd_update', label: $localize`:@@ingest.option.nvdUpdate:NVD (Delta Update)`, needsEcosystem: false, needsRepo: false, needsDates: false }, { value: 'nvd_converted', label: $localize`:@@ingest.option.nvdConverted:NVD (Converted)`, needsEcosystem: false, needsRepo: false, needsDates: false }, diff --git a/ui/src/locale/messages.ja.xlf b/ui/src/locale/messages.ja.xlf index 1ca30a2..de69c3c 100644 --- a/ui/src/locale/messages.ja.xlf +++ b/ui/src/locale/messages.ja.xlf @@ -406,10 +406,6 @@ All Ecosystems 全エコシステム - - All Ecosystems (Bulk) - 全エコシステム(一括) - NVD NVD diff --git a/ui/src/locale/messages.xlf b/ui/src/locale/messages.xlf index 250b93f..42a192b 100644 --- a/ui/src/locale/messages.xlf +++ b/ui/src/locale/messages.xlf @@ -366,13 +366,6 @@ 219 - - All Ecosystems (Bulk) - - src/app/pages/ingest/ingest.component.ts - 220 - - NVD