|
3 | 3 | GitHubTrackerSettings, |
4 | 4 | DEFAULT_SETTINGS, |
5 | 5 | DEFAULT_REPOSITORY_TRACKING, |
| 6 | + SettingsProfile, |
| 7 | + DEFAULT_REPOSITORY_PROFILE, |
| 8 | + DEFAULT_PROJECT_PROFILE, |
6 | 9 | } from "./types"; |
7 | 10 | import { GitHubClient } from "./github-client"; |
8 | 11 | import { FileManager } from "./file-manager"; |
@@ -505,19 +508,188 @@ export default class GitHubTrackerPlugin extends Plugin { |
505 | 508 | this.settings.globalDefaults = Object.assign({}, DEFAULT_SETTINGS.globalDefaults); |
506 | 509 | } |
507 | 510 |
|
| 511 | + // === Profile Migration === |
| 512 | + if (!this.settings.profiles || this.settings.profiles.length === 0) { |
| 513 | + this.settings.profiles = []; |
| 514 | + |
| 515 | + // Create "Default Profile" from existing globalDefaults |
| 516 | + const defaultProfile: SettingsProfile = { |
| 517 | + id: "default", |
| 518 | + name: "Default Profile", |
| 519 | + type: "repository", |
| 520 | + issueUpdateMode: this.settings.globalDefaults.issueUpdateMode, |
| 521 | + allowDeleteIssue: this.settings.globalDefaults.allowDeleteIssue, |
| 522 | + issueFolder: this.settings.globalDefaults.issueFolder, |
| 523 | + issueNoteTemplate: this.settings.globalDefaults.issueNoteTemplate, |
| 524 | + issueContentTemplate: this.settings.globalDefaults.issueContentTemplate, |
| 525 | + useCustomIssueContentTemplate: this.settings.globalDefaults.useCustomIssueContentTemplate, |
| 526 | + includeIssueComments: this.settings.globalDefaults.includeIssueComments, |
| 527 | + pullRequestUpdateMode: this.settings.globalDefaults.pullRequestUpdateMode, |
| 528 | + allowDeletePullRequest: this.settings.globalDefaults.allowDeletePullRequest, |
| 529 | + pullRequestFolder: this.settings.globalDefaults.pullRequestFolder, |
| 530 | + pullRequestNoteTemplate: this.settings.globalDefaults.pullRequestNoteTemplate, |
| 531 | + pullRequestContentTemplate: this.settings.globalDefaults.pullRequestContentTemplate, |
| 532 | + useCustomPullRequestContentTemplate: this.settings.globalDefaults.useCustomPullRequestContentTemplate, |
| 533 | + includePullRequestComments: this.settings.globalDefaults.includePullRequestComments, |
| 534 | + includeClosedIssues: this.settings.globalDefaults.includeClosedIssues, |
| 535 | + includeClosedPullRequests: this.settings.globalDefaults.includeClosedPullRequests, |
| 536 | + }; |
| 537 | + this.settings.profiles.push(defaultProfile); |
| 538 | + |
| 539 | + // Create "Default Project Profile" |
| 540 | + this.settings.profiles.push({ ...DEFAULT_PROJECT_PROFILE }); |
| 541 | + |
| 542 | + // Migrate repositories |
| 543 | + this.settings.repositories = this.settings.repositories.map(repo => { |
| 544 | + const merged = Object.assign({}, DEFAULT_REPOSITORY_TRACKING, repo); |
| 545 | + |
| 546 | + if ((repo as any).ignoreGlobalSettings) { |
| 547 | + // Repo had custom settings - create a dedicated profile |
| 548 | + const customProfileId = `migrated-${repo.repository.replace(/\//g, '-')}-${Date.now()}`; |
| 549 | + const customProfile: SettingsProfile = { |
| 550 | + id: customProfileId, |
| 551 | + name: `${repo.repository} (migrated)`, |
| 552 | + type: "repository", |
| 553 | + issueUpdateMode: merged.issueUpdateMode, |
| 554 | + allowDeleteIssue: merged.allowDeleteIssue, |
| 555 | + issueFolder: merged.issueFolder, |
| 556 | + issueNoteTemplate: merged.issueNoteTemplate, |
| 557 | + issueContentTemplate: merged.issueContentTemplate, |
| 558 | + useCustomIssueContentTemplate: merged.useCustomIssueContentTemplate, |
| 559 | + includeIssueComments: merged.includeIssueComments, |
| 560 | + pullRequestUpdateMode: merged.pullRequestUpdateMode, |
| 561 | + allowDeletePullRequest: merged.allowDeletePullRequest, |
| 562 | + pullRequestFolder: merged.pullRequestFolder, |
| 563 | + pullRequestNoteTemplate: merged.pullRequestNoteTemplate, |
| 564 | + pullRequestContentTemplate: merged.pullRequestContentTemplate, |
| 565 | + useCustomPullRequestContentTemplate: merged.useCustomPullRequestContentTemplate, |
| 566 | + includePullRequestComments: merged.includePullRequestComments, |
| 567 | + includeClosedIssues: merged.includeClosedIssues, |
| 568 | + includeClosedPullRequests: merged.includeClosedPullRequests, |
| 569 | + }; |
| 570 | + this.settings.profiles.push(customProfile); |
| 571 | + merged.profileId = customProfileId; |
| 572 | + } else { |
| 573 | + merged.profileId = "default"; |
| 574 | + } |
| 575 | + |
| 576 | + // Clean up deprecated field |
| 577 | + delete (merged as any).ignoreGlobalSettings; |
| 578 | + |
| 579 | + return merged; |
| 580 | + }); |
| 581 | + |
| 582 | + // Save migrated settings |
| 583 | + await this.saveData(this.settings); |
| 584 | + } |
| 585 | + |
| 586 | + // Migrate repos that still have old per-repo settings into their own profiles |
| 587 | + const defaultProfile = this.settings.profiles.find(p => p.id === "default") ?? DEFAULT_REPOSITORY_PROFILE; |
| 588 | + let needsSave = false; |
| 589 | + this.settings.repositories = this.settings.repositories.map(repo => { |
| 590 | + // Skip repos that already have a non-default profile assigned |
| 591 | + if (repo.profileId && repo.profileId !== "default") { |
| 592 | + delete (repo as any).ignoreGlobalSettings; |
| 593 | + return repo; |
| 594 | + } |
| 595 | + |
| 596 | + const merged = Object.assign({}, DEFAULT_REPOSITORY_TRACKING, repo); |
| 597 | + |
| 598 | + // Check if repo has values that differ from the default profile |
| 599 | + const hasDiff = ( |
| 600 | + merged.issueUpdateMode !== (defaultProfile.issueUpdateMode ?? "none") || |
| 601 | + merged.allowDeleteIssue !== (defaultProfile.allowDeleteIssue ?? true) || |
| 602 | + merged.issueFolder !== (defaultProfile.issueFolder ?? "GitHub") || |
| 603 | + merged.issueNoteTemplate !== (defaultProfile.issueNoteTemplate ?? "Issue - {number}") || |
| 604 | + (merged.issueContentTemplate || "") !== (defaultProfile.issueContentTemplate ?? "") || |
| 605 | + merged.includeIssueComments !== (defaultProfile.includeIssueComments ?? true) || |
| 606 | + merged.includeClosedIssues !== (defaultProfile.includeClosedIssues ?? false) || |
| 607 | + merged.pullRequestUpdateMode !== (defaultProfile.pullRequestUpdateMode ?? "none") || |
| 608 | + merged.allowDeletePullRequest !== (defaultProfile.allowDeletePullRequest ?? true) || |
| 609 | + merged.pullRequestFolder !== (defaultProfile.pullRequestFolder ?? "GitHub Pull Requests") || |
| 610 | + merged.pullRequestNoteTemplate !== (defaultProfile.pullRequestNoteTemplate ?? "PR - {number}") || |
| 611 | + (merged.pullRequestContentTemplate || "") !== (defaultProfile.pullRequestContentTemplate ?? "") || |
| 612 | + merged.includePullRequestComments !== (defaultProfile.includePullRequestComments ?? true) || |
| 613 | + merged.includeClosedPullRequests !== (defaultProfile.includeClosedPullRequests ?? false) || |
| 614 | + (merged.includeSubIssues ?? false) !== (defaultProfile.includeSubIssues ?? false) |
| 615 | + ); |
| 616 | + |
| 617 | + if (hasDiff) { |
| 618 | + // Repo has custom values - create a dedicated profile |
| 619 | + const customProfileId = `migrated-${repo.repository.replace(/\//g, '-')}-${Date.now()}`; |
| 620 | + const customProfile: SettingsProfile = { |
| 621 | + id: customProfileId, |
| 622 | + name: `${repo.repository}`, |
| 623 | + type: "repository", |
| 624 | + issueUpdateMode: merged.issueUpdateMode, |
| 625 | + allowDeleteIssue: merged.allowDeleteIssue, |
| 626 | + issueFolder: merged.issueFolder, |
| 627 | + issueNoteTemplate: merged.issueNoteTemplate, |
| 628 | + issueContentTemplate: merged.issueContentTemplate, |
| 629 | + useCustomIssueContentTemplate: merged.useCustomIssueContentTemplate, |
| 630 | + includeIssueComments: merged.includeIssueComments, |
| 631 | + pullRequestUpdateMode: merged.pullRequestUpdateMode, |
| 632 | + allowDeletePullRequest: merged.allowDeletePullRequest, |
| 633 | + pullRequestFolder: merged.pullRequestFolder, |
| 634 | + pullRequestNoteTemplate: merged.pullRequestNoteTemplate, |
| 635 | + pullRequestContentTemplate: merged.pullRequestContentTemplate, |
| 636 | + useCustomPullRequestContentTemplate: merged.useCustomPullRequestContentTemplate, |
| 637 | + includePullRequestComments: merged.includePullRequestComments, |
| 638 | + includeClosedIssues: merged.includeClosedIssues, |
| 639 | + includeClosedPullRequests: merged.includeClosedPullRequests, |
| 640 | + includeSubIssues: merged.includeSubIssues ?? false, |
| 641 | + }; |
| 642 | + this.settings.profiles.push(customProfile); |
| 643 | + repo.profileId = customProfileId; |
| 644 | + needsSave = true; |
| 645 | + } else { |
| 646 | + repo.profileId = "default"; |
| 647 | + } |
| 648 | + |
| 649 | + delete (repo as any).ignoreGlobalSettings; |
| 650 | + return repo; |
| 651 | + }); |
| 652 | + if (needsSave) { |
| 653 | + await this.saveData(this.settings); |
| 654 | + } |
| 655 | + |
508 | 656 | // Migrate existing repositories to include new custom folder properties |
509 | 657 | // Defaults first, then override with saved values |
510 | 658 | this.settings.repositories = this.settings.repositories.map(repo => { |
511 | 659 | const merged = Object.assign({}, DEFAULT_REPOSITORY_TRACKING, repo); |
512 | 660 | // Ensure critical fields are never undefined |
513 | 661 | if (!merged.issueFolder) merged.issueFolder = DEFAULT_REPOSITORY_TRACKING.issueFolder; |
514 | 662 | if (!merged.pullRequestFolder) merged.pullRequestFolder = DEFAULT_REPOSITORY_TRACKING.pullRequestFolder; |
| 663 | + if (!merged.profileId) merged.profileId = "default"; |
515 | 664 | return merged; |
516 | 665 | }); |
517 | 666 |
|
518 | 667 | } |
519 | 668 |
|
520 | 669 | async saveSettings() { |
| 670 | + // Sync "default" profile back to globalDefaults for backward compatibility |
| 671 | + const defaultProfile = this.settings.profiles.find(p => p.id === "default"); |
| 672 | + if (defaultProfile) { |
| 673 | + this.settings.globalDefaults = { |
| 674 | + issueUpdateMode: defaultProfile.issueUpdateMode ?? "none", |
| 675 | + allowDeleteIssue: defaultProfile.allowDeleteIssue ?? true, |
| 676 | + issueFolder: defaultProfile.issueFolder ?? "GitHub", |
| 677 | + issueNoteTemplate: defaultProfile.issueNoteTemplate ?? "Issue - {number}", |
| 678 | + issueContentTemplate: defaultProfile.issueContentTemplate ?? "", |
| 679 | + useCustomIssueContentTemplate: defaultProfile.useCustomIssueContentTemplate ?? false, |
| 680 | + includeIssueComments: defaultProfile.includeIssueComments ?? true, |
| 681 | + pullRequestUpdateMode: defaultProfile.pullRequestUpdateMode ?? "none", |
| 682 | + allowDeletePullRequest: defaultProfile.allowDeletePullRequest ?? true, |
| 683 | + pullRequestFolder: defaultProfile.pullRequestFolder ?? "GitHub Pull Requests", |
| 684 | + pullRequestNoteTemplate: defaultProfile.pullRequestNoteTemplate ?? "PR - {number}", |
| 685 | + pullRequestContentTemplate: defaultProfile.pullRequestContentTemplate ?? "", |
| 686 | + useCustomPullRequestContentTemplate: defaultProfile.useCustomPullRequestContentTemplate ?? false, |
| 687 | + includePullRequestComments: defaultProfile.includePullRequestComments ?? true, |
| 688 | + includeClosedIssues: defaultProfile.includeClosedIssues ?? false, |
| 689 | + includeClosedPullRequests: defaultProfile.includeClosedPullRequests ?? false, |
| 690 | + }; |
| 691 | + } |
| 692 | + |
521 | 693 | await this.saveData(this.settings); |
522 | 694 | const token = this.getGitHubToken(); |
523 | 695 | if (token) { |
|
0 commit comments