{"action":"created","issue":{"url":"https://api.github.com/repos/loot/loot-api/issues/22","repository_url":"https://api.github.com/repos/loot/loot-api","labels_url":"https://api.github.com/repos/loot/loot-api/issues/22/labels{/name}","comments_url":"https://api.github.com/repos/loot/loot-api/issues/22/comments","events_url":"https://api.github.com/repos/loot/loot-api/issues/22/events","html_url":"https://github.com/loot/loot-api/issues/22","id":316157862,"number":22,"title":"Avoid adding group metadata for plugins that load after other plugins that are in groups","user":{"login":"WrinklyNinja","id":2430738,"avatar_url":"https://avatars0.githubusercontent.com/u/2430738?v=4","gravatar_id":"","url":"https://api.github.com/users/WrinklyNinja","html_url":"https://github.com/WrinklyNinja","followers_url":"https://api.github.com/users/WrinklyNinja/followers","following_url":"https://api.github.com/users/WrinklyNinja/following{/other_user}","gists_url":"https://api.github.com/users/WrinklyNinja/gists{/gist_id}","starred_url":"https://api.github.com/users/WrinklyNinja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WrinklyNinja/subscriptions","organizations_url":"https://api.github.com/users/WrinklyNinja/orgs","repos_url":"https://api.github.com/users/WrinklyNinja/repos","events_url":"https://api.github.com/users/WrinklyNinja/events{/privacy}","received_events_url":"https://api.github.com/users/WrinklyNinja/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":{"login":"WrinklyNinja","id":2430738,"avatar_url":"https://avatars0.githubusercontent.com/u/2430738?v=4","gravatar_id":"","url":"https://api.github.com/users/WrinklyNinja","html_url":"https://github.com/WrinklyNinja","followers_url":"https://api.github.com/users/WrinklyNinja/followers","following_url":"https://api.github.com/users/WrinklyNinja/following{/other_user}","gists_url":"https://api.github.com/users/WrinklyNinja/gists{/gist_id}","starred_url":"https://api.github.com/users/WrinklyNinja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WrinklyNinja/subscriptions","organizations_url":"https://api.github.com/users/WrinklyNinja/orgs","repos_url":"https://api.github.com/users/WrinklyNinja/repos","events_url":"https://api.github.com/users/WrinklyNinja/events{/privacy}","received_events_url":"https://api.github.com/users/WrinklyNinja/received_events","type":"User","site_admin":false},"assignees":[{"login":"WrinklyNinja","id":2430738,"avatar_url":"https://avatars0.githubusercontent.com/u/2430738?v=4","gravatar_id":"","url":"https://api.github.com/users/WrinklyNinja","html_url":"https://github.com/WrinklyNinja","followers_url":"https://api.github.com/users/WrinklyNinja/followers","following_url":"https://api.github.com/users/WrinklyNinja/following{/other_user}","gists_url":"https://api.github.com/users/WrinklyNinja/gists{/gist_id}","starred_url":"https://api.github.com/users/WrinklyNinja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WrinklyNinja/subscriptions","organizations_url":"https://api.github.com/users/WrinklyNinja/orgs","repos_url":"https://api.github.com/users/WrinklyNinja/repos","events_url":"https://api.github.com/users/WrinklyNinja/events{/privacy}","received_events_url":"https://api.github.com/users/WrinklyNinja/received_events","type":"User","site_admin":false}],"milestone":null,"comments":1,"created_at":"2018-04-20T07:31:29Z","updated_at":"2018-04-21T10:06:47Z","closed_at":null,"author_association":"OWNER","body":"Consider the situation with plugins `A.esp`, `B.esp`, `C.esp` and `A - B patch.esp`, where:\r\n\r\n- `A` and `A - B patch.esp` are in the `default` group.\r\n- `C.esp` is in the `mid` group.\r\n- `B.esp` is in the `late` group.\r\n- The `mid` group loads after the `default` group.\r\n- The `late` group loads after the `mid` group.\r\n- `A - B patch.esp` has `B.esp` as a master.\r\n\r\nThis causes a cycle that LOOT won't break because the group metadata is valid in group-isolation (i.e. with no other group metadata applied).\r\n\r\nThe intuitive solution is to ignore `A - B patch.esp`'s group because it has higher-priority metadata causing it to load after a later group, but that is basically the same as priority inheritance was, and in practice that was generally confusing and unintuitive. You can end up with a chain of inherited groups/priorities (say something had metadata to load after the patch) that cause the resulting derived metadata to bear little resemblance to the input metadata.\r\n\r\nThere may be a better way to generally implement the intuitive solution, or it may be better just to decide that `A - B patch.esp` needs to have metadata adding it to the `late` group (or any group that `mid` doesn't load after)."},"comment":{"url":"https://api.github.com/repos/loot/loot-api/issues/comments/383282834","html_url":"https://github.com/loot/loot-api/issues/22#issuecomment-383282834","issue_url":"https://api.github.com/repos/loot/loot-api/issues/22","id":383282834,"user":{"login":"WrinklyNinja","id":2430738,"avatar_url":"https://avatars0.githubusercontent.com/u/2430738?v=4","gravatar_id":"","url":"https://api.github.com/users/WrinklyNinja","html_url":"https://github.com/WrinklyNinja","followers_url":"https://api.github.com/users/WrinklyNinja/followers","following_url":"https://api.github.com/users/WrinklyNinja/following{/other_user}","gists_url":"https://api.github.com/users/WrinklyNinja/gists{/gist_id}","starred_url":"https://api.github.com/users/WrinklyNinja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WrinklyNinja/subscriptions","organizations_url":"https://api.github.com/users/WrinklyNinja/orgs","repos_url":"https://api.github.com/users/WrinklyNinja/repos","events_url":"https://api.github.com/users/WrinklyNinja/events{/privacy}","received_events_url":"https://api.github.com/users/WrinklyNinja/received_events","type":"User","site_admin":false},"created_at":"2018-04-21T10:06:47Z","updated_at":"2018-04-21T10:06:47Z","author_association":"OWNER","body":"Yes, that's a case of this issue.\r\n\r\nI suppose the main problem is around plugins having a default group and the constraints that imposes. Inheritance could be restricted to plugins in the default group, on the grounds that other groups are explicit and so should cause errors. However, that's adding a special case and it's possible to explicitly put a plugin in the default group too, e.g. if overriding a plugin's group in user metadata, which may result in unexpected inheritance. Though in that case another group that has the same group relations as the default group could be created and used for such plugins...\r\n\r\nThough perhaps the fact I'm having to think hard about this indicates any code solution will probably end up being too complex to be practical for users... I think for now I'm going to go with just requiring metadata changes to resolve the cycles, that will help gather data on how big a problem this is.\r\n\r\n@CptMcSplody If you're adding plugin metadata to resolve a cycle like this, could you include a comment saying what cycle it's there to resolve, e.g. ```# Resolves cycle `Alternate Start - Live Another Life.esp, Immersive Citizens - AI Overhaul.esp, TheChoiceIsYours.esp, MLU.esp, imp_helm_legend.esp`.```."}}
{"actor":{"display_login":"WrinklyNinja"}}