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