WatchConfig.UpsertEntry silently deletes existing contexts when re-upserting a watched file

Đang mở Phù hợp với người mới
#610 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
82/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
go
Lĩnh vực
cli

Hướng nghiên cứu

Lỗi nằm ở UpsertEntry trong pkg/config/localconfig.go, nơi danh sách context hiện có bị ghi đè bởi entry chỉ có một context. Hãy bắt đầu bằng cách đọc hàm đó và đoạn tái hiện lỗi trong issue, sau đó thêm trong pkg/config một test thực hiện upsert một entry khi đã có sẵn một context và kiểm tra rằng tất cả các context trước đó vẫn được giữ lại. Hoàn thành khi danh sách context sau khi gộp giữ được mọi context mà không trùng lặp, và entry.Context rỗng không còn gây panic nữa.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Describe the bug

When a file is being watched across multiple contexts (e.g. ["dev", "staging"]), re-running microcks import --watch <file> on an existing context—or calling WatchConfig.UpsertEntry with a context already present—silently deletes all other contexts associated with that file from .config/microcks/watch.

In pkg/config/localconfig.go:

func (w *WatchConfig) UpsertEntry(entry WatchEntry) {
    for i, e := range w.Entries {
        if e.FilePath == entry.FilePath {
            contexts := w.Entries[i].Context
            if !slices.Contains(contexts, entry.Context[0]) {
                entry.Context = append(entry.Context, contexts...)
            }
            w.Entries[i] = entry
            return
        }
    }
    w.Entries = append(w.Entries, entry)
}

If entry.Context[0] is already in contexts, the if !slices.Contains(...) check evaluates to false and does nothing. Because entry.Context only contains the single context from the current invocation, w.Entries[i] = entry replaces the existing context slice with only entry.Context, wiping out all other contexts.

Additionally:

  • If entry.Context is empty, accessing entry.Context[0] unconditionally panics with runtime error: index out of range [0] with length 0.
  • If entry.Context contains multiple items, only index 0 is ever evaluated.
Expected behavior

WatchConfig.UpsertEntry should preserve all existing contexts for a file while adding any new context without duplicates. Re-importing or updating a watched file from one context must not delete other contexts that are monitoring the same file.

Actual behavior

When re-upserting a file with an already existing context, all other contexts previously attached to the entry are discarded, leaving only the single re-upserted context in the watch configuration.

How to Reproduce?
Reproducer
package main

import (
    "fmt"
    "github.com/microcks/microcks-cli/pkg/config"
)

func main() {
    cfg := config.WatchConfig{
        Entries: []config.WatchEntry{
            {FilePath: "api.yaml", Context: []string{"dev"}},
        },
    }

    // 1. Add "staging" -> Entry has ["staging", "dev"]
    cfg.UpsertEntry(config.WatchEntry{FilePath: "api.yaml", Context: []string{"staging"}})
    fmt.Printf("After adding staging: %v\n", cfg.Entries[0].Context)

    // 2. Re-import / re-upsert from "staging"
    cfg.UpsertEntry(config.WatchEntry{FilePath: "api.yaml", Context: []string{"staging"}, MainArtifact: true})
    fmt.Printf("After re-upserting staging: %v\n", cfg.Entries[0].Context)

    // Output: [staging] --> "dev" context was deleted!
}
Steps to Reproduce via CLI
  1. Register a file in watch mode across two contexts (dev and staging).
  2. Run microcks import --watch <file> again while on the staging context.
  3. Check the watch configuration file: <file> now only lists staging, and dev has been deleted.
Microcks version or git rev

master

Install method (docker-compose, helm chart, operator, docker-desktop extension,...)

No response

Additional information

I would be happy to submit a PR with unit test coverage if the team agrees!

Ngôn ngữ chính
Go
Star
59
Fork
74
Merge trung bình
4 ngày 5 giờ
Pull request đã merge (30 ngày)
15

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của microcks/microcks-cli

Tất cả issue của microcks/microcks-cli

Issue tương tự

Thêm issue về Go

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.