Re: [PATCH] [GSOC] ref-filter: solve bugs caused by enumeration
- From
ZheNing Hu <adlternative@gmail.com>
- Date
- May 6, 2021, 05:02 UTC
- Message-ID
- <CAOLTT8SmvRaohV+v2C9eFXyc8O+di5PfZJeWNinmm8X=Ckdveg@mail.gmail.com>
- In-Reply-To
- <xmqqfsz01vc2.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> 于2021年5月6日周四 上午9:53写道:
Show 29 quoted lines
> > "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > From: ZheNing Hu <adlternative@gmail.com> > > > > Johannes Schindelin seems to have introduced a bug in > > cc72385f(for-each-ref: let upstream/push optionally > > report the remote name), it use `atom->u.remote_ref.option` > > which is a member of enumeration in the judgment statement. > > Sorry but I am not sure if our readers would understand what "a > member of enumeration in the judgment statement" is (I certainly do > not), and even more importantly, "bugs caused by enumeration" on the > title does not hint much about what problem the patch is trying to > solve. > > > When we use other members in the enumeration `used_atom.u`, > > and it happened to fill in `remote_ref.push`, this judgment > > may still be established and produces errors. So replace the > > judgment statement with `starts_with(name, "push")` to fix > > the error. > > And this paragraph does not enlighten all that much, unfortunately. > > Is it that a check refers to one member of a union without making > sure that member is the one in effect in the union? I am most > puzzled by the mention of "enumeration" when there does not appear > to be any enum involved. >
Sorry, I didn't make it clear. I re-describe the problem first, and then modify the commit messages.
Suppose we are dealing with "%(notes)", the name member of our `used_atom` item at this time is "notes", and its member union `u` uses a `struct notes_option`, we fill some values in `used_atom.u.notes_option`,
When we traverse in `used_atom` array in `populate_value()` and previous judgement like "if (starts_with(name, "refname"))" will failed, because we are dealing with atom "notes", but in judgement "else if (atom->u.remote_ref.push)", The value we fill in `used_atom.u.notes_option` just makes `used_atom.u.remote_ref.push` non-zero. This leads us into the wrong case.
Is this clearer?
Thanks. -- ZheNing Hu