vbhanuchander-lang opened a new pull request, #9051:
URL: https://github.com/apache/devlake/pull/9051
### Summary
- Closes #9050
- `ConnectUserAccountsExact` compared emails by exact map lookup, so
addresses differing only in
capitalisation were never linked and the account was silently left out of
`user_accounts`.
`user_account.go` keyed the map on the raw address and looked it up with the
raw account address:
```go
emails[user.Email] = user.Id //
line 49
...
if userId, ok := emails[account.Email]; account.Email != "" && ok { //
line 79
```
The two sides come from different systems — a git config, a provider
profile, and a
hand-maintained CSV — which routinely disagree on the case of the same
address. When they do, the
subtask still reports success, so the failure is invisible: the account just
never appears in
`user_accounts`, and everything attributing through it stops counting
towards that user.
There is no second chance either. The scan is restricted to
`id NOT IN (SELECT account_id FROM user_accounts)` (line 58), so a later run
will not revisit an
account that failed to match.
### What this changes
Case is folded on both sides of the **email** comparison only.
**Name matching is deliberately untouched.** Emails are case-insensitive by
convention; personal
names and logins are not, and loosening those comparisons could manufacture
links that are simply
wrong. That felt like a separate decision rather than something to slip into
this fix.
### Test Plan
The `org` e2e fixtures gain one account, `a11`, whose email (`E6`) differs
from user `U006`'s (`e6`)
only in case, with `full_name` and `user_name` set to `zz` so neither name
fallback can match. That
isolates the email path.
Verified against a MySQL 8 instance with `E2E_DB_URL` set:
| | Result |
| --- | --- |
| Without the change | `FAIL` — `records in user_accounts count not match
expectation count,[expected(CSV):11][actual(DB):10]` |
| With the change | `ok github.com/apache/incubator-devlake/plugins/org/e2e`
|
`go test ./plugins/org/... -count=1` → e2e and impl both pass. `go vet
./plugins/org/...` is clean,
and `go build ./plugins/org/tasks/` is clean.
Two pre-existing build complaints are unrelated to this change and reproduce
identically on an
unmodified tree, which I checked rather than assumed: `plugins/org` reports
`function main is undeclared in the main package` because it builds as a Go
plugin, and
`git2go/v33` needs `pkg-config`, which is absent from my machine.
### Context
Found while investigating #8698, where a reporter's GitHub account was never
linked so only commit
activities showed in work logs. To be clear, case sensitivity is **not** the
cause of that issue — I
posted the root cause there separately (GitHub returns an empty email for
users who have not made it
public, and `users.csv` has no column for a provider login, so no branch can
match). This is a
different instance of the same silent-linkage class that surfaced while
reading the code.
🤖 AI-assisted changes — generated with Claude Code (Opus 5) and reviewed by
me before submitting.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]