Skip to content
Open
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
de6ac46
Show mocked diff in a tree view
MrRishabhJain Feb 28, 2025
9ca6204
refactored data provider
MrRishabhJain Mar 1, 2025
ce9b048
Download from pac
MrRishabhJain Mar 4, 2025
a7a129f
enhance diff logic
MrRishabhJain Mar 5, 2025
bfb1a25
refactor
MrRishabhJain Mar 5, 2025
21a681a
find model version
MrRishabhJain Apr 22, 2025
fc4a1fd
Added generate/import/export for diff reports
MrRishabhJain Apr 22, 2025
c7f6c6e
Refactor
MrRishabhJain Apr 22, 2025
841dee8
removed file type logic
MrRishabhJain Apr 23, 2025
03b2d1e
Added clear view functionality
MrRishabhJain Apr 23, 2025
55930d0
Added dropdown to org picker
MrRishabhJain Apr 23, 2025
404d68b
Fix report import file type parsing
MrRishabhJain Apr 23, 2025
58ddb31
Improved md report ensuring there is no cx data
MrRishabhJain Apr 23, 2025
ab0f6c7
refactor
MrRishabhJain Apr 25, 2025
de9ae55
fixed md report preview issue
MrRishabhJain Apr 25, 2025
e49e232
Merge branch 'main' into users/rishjain/metadata_diff_v1
Sep 2, 2025
1cf95b0
Add compareWithlocal to context menu
Sep 2, 2025
864d204
Add websiteId as a param
Sep 2, 2025
255081d
Handle expanded DM names
Sep 2, 2025
0b4af76
Fix for Edm sites
Sep 2, 2025
3094ee7
Show compare with local comand for inactive websites
Sep 3, 2025
f6a338c
Show diff in actions hub
Sep 4, 2025
fbf0d2b
move to bottom of AH
Sep 4, 2025
bbad960
Moved icons to context menu
Sep 4, 2025
75a749e
Hide trigger flow in menu
Sep 4, 2025
844e638
Added re-sync option
Sep 4, 2025
a07189b
Generate HTML report in place of markdown
Sep 4, 2025
6a87d47
Updated messages
Sep 4, 2025
45d7085
Tweaks to metadata diff header
Sep 4, 2025
848f52f
Added view and discard local changes
Sep 4, 2025
c4031a7
reset diff view on env change
Sep 4, 2025
c8be021
Added compare with env to power pages context menu
Sep 4, 2025
be611a6
Changed label and error handling
Oct 8, 2025
e61913f
add ecs flag back
Oct 8, 2025
27114db
Potential fix for code scanning alert no. 54: Incomplete HTML attribu…
MrRishabhJain Oct 8, 2025
ceede43
Merge branch 'main' into users/rishjain/metadata_diff_v2
MrRishabhJain Oct 8, 2025
3ed1437
indents
Oct 8, 2025
6769e3e
remove empty file
Oct 8, 2025
8eba4a7
Update src/client/power-pages/metadata-diff/MetadataDiffCommands.ts
MrRishabhJain Oct 8, 2025
1096f7a
Merge branch 'main' into users/rishjain/metadata_diff_v2
Oct 8, 2025
3b35876
fixed merge issue
Oct 8, 2025
a45c46b
Merge branch 'main' into users/rishjain/metadata_diff_v2
MrRishabhJain Oct 9, 2025
52dfca9
updated regex
Oct 9, 2025
bf32468
fix bug in regex
Oct 12, 2025
28f2c9d
using existing pages download
Oct 13, 2025
0e473dd
Add metadata comparison and localization strings for website management
Oct 13, 2025
7dbb62b
Refactor metadata diff handling by creating MetadataDiffGroupTreeItem…
Oct 13, 2025
c4a4498
Update regex examples and model version extraction logic in MetadataD…
Oct 14, 2025
02bcb08
Remove unused lastEnvironmentId tracking and related environment chan…
Oct 14, 2025
c7db9d4
Refactor metadata diff labels to use constants for improved localizat…
Oct 14, 2025
4dfb407
Ensure metadata diff provider builds diff list before evaluating data…
Oct 14, 2025
5133a47
Refactor metadata diff command registrations to use fully qualified c…
Oct 14, 2025
18dabea
Improve localization support by using l10n for warning messages in me…
Oct 14, 2025
29ffd19
Refactor MetadataDiffDesktop methods for improved readability and mai…
Oct 14, 2025
157a62f
Enhance telemetry logging in MetadataDiffDesktop and improve localiza…
Oct 15, 2025
d66244d
Add telemetry logging for metadata diff command executions
Oct 15, 2025
15a9f86
Fixed discard changes logic
Oct 15, 2025
5af4399
Merge branch 'main' into users/rishjain/metadata_diff_v2
Oct 16, 2025
59dd92c
Merge branch 'main' into users/rishjain/metadata_diff_v2
Nov 5, 2025
6c33ecb
Remove DiscardLogic test file
Nov 5, 2025
218ae63
Fix in import report command
Nov 13, 2025
7838c3f
Utilizing pac context for fetching current org
Nov 17, 2025
11390e9
Ported other refrences to pac context too.
Nov 17, 2025
8bea88c
Fix: Update organization URL reference in metadata diff command regis…
Nov 17, 2025
5b0b747
Merge branch 'main' into users/rishjain/metadata_diff_v2
priyanshu92 Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions loc/translations-export/vscode-powerplatform.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -1095,6 +1095,15 @@ The fifth line should be '[TRANSLATION HERE](command:powerplatform-walkthrough.s
<trans-unit id="powerpages.copilotPanel.clearConversation.title">
<source xml:lang="en">Clear Conversation</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.actionsHub.compareWithLocal.title">
<source xml:lang="en">Compare with Local</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.metadataDiff.login">
<source xml:lang="en">Compare your Power Pages website against a Power Pages environment to view any differences. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).
[Get Started](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow)</source>
<note>This is a Markdown formatted string, and the formatting must persist across translations.
The second line should be '[TRANSLATION HERE](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow).', keeping brackets and the text in the parentheses unmodified</note>
</trans-unit>
<trans-unit id="powerpages.copilotPanel.title">
<source xml:lang="en">Copilot In Power Pages</source>
</trans-unit>
Expand Down Expand Up @@ -1228,6 +1237,9 @@ The second line should be '[TRANSLATION HERE](command:powerplatform-walkthrough.
<trans-unit id="microsoft-powerplatform-portals.navigation-loop.powerPagesFileExplorer.title">
<source xml:lang="en">POWER PAGES ACTIONS</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.metadataDiff.title">
<source xml:lang="en">POWER PAGES METADATA COMPARATOR</source>
</trans-unit>
<trans-unit id="power-platform-activitybar.title">
<source xml:lang="en">Power Platform</source>
</trans-unit>
Expand Down
120 changes: 120 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@
"when": "!virtualWorkspace && pacCLI.authPanel.interactiveLoginSupported",
"enablement": "microsoft.powerplatform.environment.initialized && !microsoft.powerplatform.pages.actionsHub.loadingWebsites"
},
{
"view": "microsoft.powerplatform.pages.metadataDiff",
"contents": "%microsoft.powerplatform.pages.metadataDiff.login%",
"when": "!virtualWorkspace && pacCLI.authPanel.interactiveLoginSupported"
},
{
"view": "microsoft.powerplatform.pages.actionsHub",
"contents": "%pacCLI.authPanel.welcome.whenInteractiveNotSupported%",
Expand Down Expand Up @@ -474,6 +479,10 @@
"command": "microsoft.powerplatform.pages.actionsHub.siteDetails",
"title": "%microsoft.powerplatform.pages.actionsHub.siteDetails.title%"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"title": "%microsoft.powerplatform.pages.actionsHub.compareWithLocal.title%"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite",
"title": "%microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite.title%"
Expand All @@ -491,6 +500,54 @@
"category": "Power Pages",
"title": "%microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening.title%",
"when": "microsoft.powerplatform.pages.codeQlScanEnabled"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"title": "Compare with Environment",
"category": "Power Pages Metadata Diff",
"icon": "$(cloud-download)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.generateReport",
"title": "Generate HTML Report",
"category": "Power Pages Metadata Diff",
"icon": "$(markdown)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.resync",
"title": "Re-sync",
"category": "Power Pages Metadata Diff",
"icon": "$(refresh)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.clearView",
"title": "Clear View",
"category": "Power Pages Metadata Diff",
"icon": "$(clear-all)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"title": "Export Comparison View",
"category": "Power Pages Metadata Diff",
Comment on lines +509 to +535
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of these should be localized.

"icon": "$(save-as)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"title": "Import Comparison View",
"category": "Power Pages Metadata Diff",
"icon": "$(folder-opened)"
},
{
"command": "metadataDiff.openComparison",
"title": "Open Comparison",
"category": "Power Pages Metadata Diff",
"icon": "$(diff)"
},
{
"command": "metadataDiff.discardLocalChanges",
"title": "Discard Local Changes",
"category": "Power Pages Metadata Diff",
"icon": "$(discard)"
}
],
"configuration": {
Expand Down Expand Up @@ -767,6 +824,10 @@
"command": "microsoft-powerapps-portals.webfile",
"group": "1_powerpages@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"group": "1_powerpages@6"
},
{
"command": "microsoft-powerapps-portals.webtemplate",
"group": "1_powerpages@3"
Expand Down Expand Up @@ -985,6 +1046,10 @@
"command": "microsoft.powerplatform.pages.actionsHub.siteDetails",
"when": "never"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"when": "never"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite",
"when": "never"
Expand Down Expand Up @@ -1036,6 +1101,56 @@
"when": "!virtualWorkspace && view == pacCLI.authPanel",
"group": "inline"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.generateReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@1"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@2"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.resync",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@3"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.clearView",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@4"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@6"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffItem && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffItem && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@6"
},
{
"command": "metadataDiff.openComparison",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffFileModified && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiffFile@1"
},
{
"command": "metadataDiff.discardLocalChanges",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffFileModified && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiffFile@2"
},
{
"command": "pacCLI.authPanel.nameAuthProfile",
"when": "!virtualWorkspace && view == pacCLI.authPanel"
Expand Down Expand Up @@ -1173,6 +1288,11 @@
"command": "microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == currentActiveSite && microsoft.powerplatform.pages.codeQlScanEnabled",
"group": "siteAction@7"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"when": "view == microsoft.powerplatform.pages.actionsHub && (viewItem == currentActiveSite || viewItem == nonCurrentActiveSite || viewItem == inactiveSite)",
"group": "siteAction@9"
}
]
},
Expand Down
11 changes: 10 additions & 1 deletion package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
"microsoft.powerplatform.pages.actionsHub.switchEnvironment.title": "Change Environment",
"microsoft.powerplatform.pages.actionsHub.showEnvironmentDetails.title": "Show Environment Details",
"microsoft.powerplatform.pages.actionsHub.openSitesInStudio.title": "Open in Power Pages Studio",
"microsoft.powerplatform.pages.actionsHub.compareWithLocal.title": "Compare with Local",
"microsoft.powerplatform.pages.actionsHub.activeSite.previewSite.title": "Preview",
"microsoft.powerplatform.pages.actionsHub.login":{
"message": "Login and connect to a Power Pages environment to use Power Pages actions. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).\n[Login](command:microsoft.powerplatform.pages.actionsHub.newAuthProfile)",
Expand All @@ -116,5 +117,13 @@
"microsoft.powerplatform.pages.actionsHub.activeSite.openInStudio.title": "Open in Power Pages Studio",
"microsoft.powerplatform.pages.actionsHub.inactiveSite.reactivateSite.title": "Reactivate Site",
"microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening.title": "Run CodeQL Screening",
"microsoft.powerplatform.pages.actionsHub.configuration.downloadSite.description": "The folder where site will be downloaded when using Power Pages Actions. Leave this empty to ask for a folder every time you download a site."
"microsoft.powerplatform.pages.actionsHub.configuration.downloadSite.description": "The folder where site will be downloaded when using Power Pages Actions. Leave this empty to ask for a folder every time you download a site.",
"microsoft.powerplatform.pages.metadataDiff.title": "POWER PAGES METADATA COMPARATOR",
"microsoft.powerplatform.pages.metadataDiff.login":{
"message": "Compare your Power Pages website against a Power Pages environment to view any differences. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).\n[Get Started](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow)",
"comment": [
"This is a Markdown formatted string, and the formatting must persist across translations.",
"The second line should be '[TRANSLATION HERE](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow).', keeping brackets and the text in the parentheses unmodified"
]
}
}
3 changes: 3 additions & 0 deletions src/client/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import { PROVIDER_ID } from "../common/services/Constants";
import { activateServerApiAutocomplete } from "../common/intellisense";
import { EnableServerLogicChanges } from "../common/ecs-features/ecsFeatureGates";
import { setServerApiTelemetryContext } from "../common/intellisense/ServerApiTelemetryContext";
import { MetadataDiffDesktop } from "./power-pages/metadata-diff/MetadataDiffDesktop";

let client: LanguageClient;
let _context: vscode.ExtensionContext;
Expand Down Expand Up @@ -311,6 +312,8 @@ export async function activate(
const workspaceFolderWatcher = vscode.workspace.onDidChangeWorkspaceFolders(handleWorkspaceFolderChange);
_context.subscriptions.push(workspaceFolderWatcher);

MetadataDiffDesktop.initialize(context, pacTerminal)

if (shouldEnableDebugger()) {
activateDebugger(context);
}
Expand Down
8 changes: 8 additions & 0 deletions src/client/pac/PacTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ export type OrgListOutput = {

export type PacOrgListOutput = PacOutputWithResultList<OrgListOutput>;

export type PagesList = {
FriendlyName: string,
WebsiteId: string,
ModelVersion: string
}

export type PacPagesListOutput = PacOutputWithResultList<PagesList>;

export type ActiveOrgOutput = {
OrgId: string,
UniqueName: string,
Expand Down
10 changes: 9 additions & 1 deletion src/client/pac/PacWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import * as readline from "readline";
import * as fs from "fs-extra";
import { ChildProcessWithoutNullStreams, spawn } from "child_process";
import { BlockingQueue } from "../../common/utilities/BlockingQueue";
import { PacOutput, PacAdminListOutput, PacAuthListOutput, PacSolutionListOutput, PacOrgListOutput, PacOrgWhoOutput, PacAuthWhoOutput } from "./PacTypes";
import { PacOutput, PacAdminListOutput, PacAuthListOutput, PacSolutionListOutput, PacOrgListOutput, PacOrgWhoOutput, PacAuthWhoOutput, PacPagesListOutput} from "./PacTypes";
import { v4 } from "uuid";
import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper";

Expand Down Expand Up @@ -229,6 +229,14 @@ export class PacWrapper {
// The next operation will create a new process
}

public async pagesDownload(path: string, websiteId: string, modelVersion: string): Promise<PacOutput> {
return this.executeCommandAndParseResults<PacOutput>(new PacArguments("pages", "download", "-p", path, "-id", websiteId, "-mv", modelVersion));
}

public async pagesList(): Promise<PacPagesListOutput> {
return this.executeCommandAndParseResults<PacPagesListOutput>(new PacArguments("pages", "list", "--verbose"));
}

public exit(): void {
this.pacInterop.exit();
}
Expand Down
28 changes: 28 additions & 0 deletions src/client/power-pages/actions-hub/ActionsHubCommandHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,34 @@ export const showSiteDetails = async (siteTreeItem: SiteTreeItem) => {
}
}

export const compareWithLocal = async (siteTreeItem: SiteTreeItem) => {
const siteInfo = siteTreeItem.siteInfo;

traceInfo(
Constants.EventNames.ACTIONS_HUB_COMPARE_WITH_LOCAL_CALLED,
{
methodName: compareWithLocal.name,
siteId: siteInfo.websiteId,
dataModelVersion: siteInfo.dataModelVersion
}
);

try {
// Execute the compare with local command with specific website ID
await vscode.commands.executeCommand('microsoft.powerplatform.pages.metadataDiff.triggerFlowWithSite', siteInfo.websiteId);
} catch (error) {
traceError(
Constants.EventNames.ACTIONS_HUB_COMPARE_WITH_LOCAL_FAILED,
error as Error,
{
methodName: compareWithLocal.name,
siteId: siteInfo.websiteId,
dataModelVersion: siteInfo.dataModelVersion
}
);
}
}

const getDownloadFolderOptions = () => {
const options = [
{
Expand Down
Loading
Loading