From fcc4f4dc5d71fff311d72d672f297defec4980e1 Mon Sep 17 00:00:00 2001 From: Aman Kumar Date: Fri, 9 May 2025 12:30:12 +0530 Subject: [PATCH 1/3] fix: Merge failures occurring when using different strategies (overwrite with compare, merge base, merge compare) --- package-lock.json | 6 +- packages/contentstack-branches/README.md | 2 +- packages/contentstack-branches/package.json | 2 +- .../src/branch/merge-handler.ts | 120 ++++++++++++++---- .../src/utils/branch-diff-utility.ts | 9 +- packages/contentstack/README.md | 4 +- packages/contentstack/package.json | 4 +- pnpm-lock.yaml | 2 +- 8 files changed, 108 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index e072ebd8ac..0ec0169c1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25179,13 +25179,13 @@ }, "packages/contentstack": { "name": "@contentstack/cli", - "version": "1.40.3", + "version": "1.40.4", "license": "MIT", "dependencies": { "@contentstack/cli-audit": "~1.12.1", "@contentstack/cli-auth": "~1.4.0", "@contentstack/cli-cm-bootstrap": "~1.14.0", - "@contentstack/cli-cm-branches": "~1.4.1", + "@contentstack/cli-cm-branches": "~1.4.2", "@contentstack/cli-cm-bulk-publish": "~1.8.0", "@contentstack/cli-cm-clone": "~1.14.0", "@contentstack/cli-cm-export": "~1.16.1", @@ -25552,7 +25552,7 @@ }, "packages/contentstack-branches": { "name": "@contentstack/cli-cm-branches", - "version": "1.4.1", + "version": "1.4.2", "license": "MIT", "dependencies": { "@contentstack/cli-command": "~1.5.0", diff --git a/packages/contentstack-branches/README.md b/packages/contentstack-branches/README.md index 671db3d4d7..36bb6a640c 100755 --- a/packages/contentstack-branches/README.md +++ b/packages/contentstack-branches/README.md @@ -37,7 +37,7 @@ $ npm install -g @contentstack/cli-cm-branches $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-branches/1.4.1 darwin-arm64 node-v22.14.0 +@contentstack/cli-cm-branches/1.4.2 darwin-arm64 node-v22.14.0 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-branches/package.json b/packages/contentstack-branches/package.json index 942a9e7e84..74fee10591 100644 --- a/packages/contentstack-branches/package.json +++ b/packages/contentstack-branches/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-cm-branches", "description": "Contentstack CLI plugin to do branches operations", - "version": "1.4.1", + "version": "1.4.2", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { diff --git a/packages/contentstack-branches/src/branch/merge-handler.ts b/packages/contentstack-branches/src/branch/merge-handler.ts index 47e41e5414..67d0f0369d 100644 --- a/packages/contentstack-branches/src/branch/merge-handler.ts +++ b/packages/contentstack-branches/src/branch/merge-handler.ts @@ -108,15 +108,13 @@ export default class MergeHandler { deleted: [], }; const selectedItems = await selectCustomPreferences(module, this.branchCompareData[module]); - if (!selectedItems.length) { - cliux.print(chalk.red('No items were selected')); - process.exit(1); + if (selectedItems?.length) { + forEach(selectedItems, (item) => { + this.mergeSettings.mergeContent[module][item.status].push(item.value); + this.mergeSettings.itemMergeStrategies.push(item.value); + }); + this.mergeSettings.strategy = 'ignore'; } - forEach(selectedItems, (item) => { - this.mergeSettings.mergeContent[module][item.status].push(item.value); - this.mergeSettings.itemMergeStrategies.push(item.value); - }); - this.mergeSettings.strategy = 'ignore'; } } else if (this.strategy === 'merge_prefer_base') { if (this.strategySubOption === 'new') { @@ -137,12 +135,25 @@ export default class MergeHandler { } else if (this.strategy === 'overwrite_with_compare') { this.mergeSettings.strategy = 'overwrite_with_compare'; } - if (this.checkEmptySelection()) { - cliux.print(chalk.red('No items selected')); - } else { - await this.displayMergeSummary(); - } + const { allEmpty, moduleStatus } = this.checkEmptySelection(); + const strategyName = this.mergeSettings.strategy; + + if (allEmpty) { + cliux.print(chalk.red(`No items selected according to the '${strategyName}' strategy.`)); + process.exit(1); + } + + for (const [type, { exists, empty }] of Object.entries(moduleStatus)) { + if (exists && empty) { + const readable = type === 'contentType' ? 'Content Types' : 'Global fields'; + cliux.print('\n') + cliux.print(chalk.yellow(`Note: No ${readable} selected according to the '${strategyName}' strategy.`)); + } + } + + this.displayMergeSummary(); + if (!this.executeOption) { const executionResponse = await selectMergeExecution(); if (executionResponse === 'previous') { @@ -160,17 +171,71 @@ export default class MergeHandler { } } - checkEmptySelection() { - for (let module in this.branchCompareData) { - if (this.mergeSettings.mergeContent[module]?.modified?.length - || this.mergeSettings.mergeContent[module]?.added?.length - || this.mergeSettings.mergeContent[module]?.deleted?.length) { - return false; + /** + * Checks whether the selection of modules in the compare branch data is empty. + * + * This method evaluates the branch compare data and determines if there are any changes + * (added, modified, or deleted) in the modules based on the merge strategy defined in the + * merge settings. It categorizes the status of each module as either existing and empty or + * not empty. + * + * @returns An object containing: + * - `allEmpty`: A boolean indicating whether all modules are either non-existent or empty. + * - `moduleStatus`: A record mapping module types (`contentType` and `globalField`) to their + * respective statuses, which include: + * - `exists`: A boolean indicating whether the module exists in the branch comparison data. + * - `empty`: A boolean indicating whether the module has no changes (added, modified, or deleted). + */ + checkEmptySelection(): { + allEmpty: boolean; + moduleStatus: Record; + } { + const strategy = this.mergeSettings.strategy; + + const useMergeContent = new Set(['custom_preferences', 'ignore']); + const modifiedOnlyStrategies = new Set(['merge_modified_only_prefer_base', 'merge_modified_only_prefer_compare']); + const addedOnlyStrategies = new Set(['merge_new_only']); + + const moduleStatus: Record = { + contentType: { exists: false, empty: true }, + globalField: { exists: false, empty: true }, + }; + + for (const module in this.branchCompareData) { + const content = useMergeContent.has(strategy) + ? this.mergeSettings.mergeContent[module] + : this.branchCompareData[module]; + + if (!content) continue; + + const isGlobalField = module === 'global_fields'; + const type = isGlobalField ? 'globalField' : 'contentType'; + moduleStatus[type].exists = true; + + let hasChanges = false; + if (modifiedOnlyStrategies.has(strategy)) { + hasChanges = Array.isArray(content.modified) && content.modified.length > 0; + } else if (addedOnlyStrategies.has(strategy)) { + hasChanges = Array.isArray(content.added) && content.added.length > 0; + } else { + hasChanges = + (Array.isArray(content.modified) && content.modified.length > 0) || + (Array.isArray(content.added) && content.added.length > 0) || + (Array.isArray(content.deleted) && content.deleted.length > 0); + } + + if (hasChanges) { + moduleStatus[type].empty = false; } } - return true; + + const allEmpty = Object.values(moduleStatus).every( + (status) => !status.exists || status.empty + ); + + return { allEmpty, moduleStatus }; } - + displayMergeSummary() { if (this.mergeSettings.strategy !== 'ignore') { for (let module in this.branchCompareData) { @@ -269,10 +334,10 @@ export default class MergeHandler { }; const mergePreferencesMap = { - 'existing_new': 'merge_existing_new', - 'new': 'merge_new', - 'existing': 'merge_existing', - 'ask_preference': 'custom', + existing_new: 'merge_existing_new', + new: 'merge_new', + existing: 'merge_existing', + ask_preference: 'custom', }; const selectedMergePreference = mergePreferencesMap[mergePreference]; @@ -301,7 +366,10 @@ export default class MergeHandler { if (scriptFolderPath !== undefined) { cliux.success(`\nSuccess! We have generated entry migration files in the folder ${scriptFolderPath}`); - cliux.print('\nWARNING!!! Migration is not intended to be run more than once. Migrated(entries/assets) will be duplicated if run more than once', { color: 'yellow' }); + cliux.print( + '\nWARNING!!! Migration is not intended to be run more than once. Migrated(entries/assets) will be duplicated if run more than once', + { color: 'yellow' }, + ); let migrationCommand: string; if (os.platform() === 'win32') { diff --git a/packages/contentstack-branches/src/utils/branch-diff-utility.ts b/packages/contentstack-branches/src/utils/branch-diff-utility.ts index d177d526c0..658e827dfc 100644 --- a/packages/contentstack-branches/src/utils/branch-diff-utility.ts +++ b/packages/contentstack-branches/src/utils/branch-diff-utility.ts @@ -79,24 +79,23 @@ async function branchCompareSDK(payload: BranchDiffPayload, skip?: number, limit const module = payload.module || 'all'; switch (module) { - case 'content_types' || 'content_type': + case 'content_types': + case 'content_type': return await branchQuery .contentTypes(queryParams) .then((data) => data) .catch((err) => handleErrorMsg(err, payload.spinner)); - break; - case 'global_fields' || 'global_field': + case 'global_fields': + case 'global_field': return await branchQuery .globalFields(queryParams) .then((data) => data) .catch((err) => handleErrorMsg(err, payload.spinner)); - break; case 'all': return await branchQuery .all(queryParams) .then((data) => data) .catch((err) => handleErrorMsg(err, payload.spinner)); - break; default: handleErrorMsg({ errorMessage: 'Invalid module!' }, payload.spinner); } diff --git a/packages/contentstack/README.md b/packages/contentstack/README.md index fd92a3ea18..2e738bed09 100644 --- a/packages/contentstack/README.md +++ b/packages/contentstack/README.md @@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli $ csdx COMMAND running command... $ csdx (--version|-v) -@contentstack/cli/1.40.2 darwin-arm64 node-v22.14.0 +@contentstack/cli/1.40.4 darwin-arm64 node-v22.14.0 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -3776,7 +3776,7 @@ USAGE $ csdx launch:functions [-p ] [-d ] FLAGS - -d, --data-dir= [default: /Users/aman.kumar/Documents/datasync-repo/cli/packages/contentstack] Current working + -d, --data-dir= [default: /Users/aman.kumar/Documents/cli-repos/cli/packages/contentstack] Current working directory -p, --port= [default: 3000] Port number diff --git a/packages/contentstack/package.json b/packages/contentstack/package.json index 2a401bbfc7..c78fb23445 100755 --- a/packages/contentstack/package.json +++ b/packages/contentstack/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli", "description": "Command-line tool (CLI) to interact with Contentstack", - "version": "1.40.3", + "version": "1.40.4", "author": "Contentstack", "bin": { "csdx": "./bin/run.js" @@ -25,7 +25,7 @@ "@contentstack/cli-audit": "~1.12.1", "@contentstack/cli-auth": "~1.4.0", "@contentstack/cli-cm-bootstrap": "~1.14.0", - "@contentstack/cli-cm-branches": "~1.4.1", + "@contentstack/cli-cm-branches": "~1.4.2", "@contentstack/cli-cm-bulk-publish": "~1.8.0", "@contentstack/cli-cm-clone": "~1.14.0", "@contentstack/cli-cm-export": "~1.16.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfdb4fb7c3..96e522b353 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: '@contentstack/cli-audit': ~1.12.1 '@contentstack/cli-auth': ~1.4.0 '@contentstack/cli-cm-bootstrap': ~1.14.0 - '@contentstack/cli-cm-branches': ~1.4.1 + '@contentstack/cli-cm-branches': ~1.4.2 '@contentstack/cli-cm-bulk-publish': ~1.8.0 '@contentstack/cli-cm-clone': ~1.14.0 '@contentstack/cli-cm-export': ~1.16.1 From fe197585f3a89aecbf44e6207c1bf295bcb2135f Mon Sep 17 00:00:00 2001 From: Aman Kumar Date: Fri, 9 May 2025 13:18:28 +0530 Subject: [PATCH 2/3] updated tailsmanrc --- .talismanrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.talismanrc b/.talismanrc index fa3a63d66c..5b1bdbf709 100644 --- a/.talismanrc +++ b/.talismanrc @@ -115,5 +115,5 @@ fileignoreconfig: - filename: pnpm-lock.yaml checksum: fc379207a835de8d851caa256837e2a50e0278c43e0251372f2a5292bee41fac - filename: package-lock.json - checksum: da059d11bf1083833509cd963761d0d0916da7cf90943100735bf0ddc22e498f + checksum: 0cb373716595912a75e9fd356e7a90a67eb1d2de712c454701231e2d5dd3caf7 version: "" From 409864cb356c2ebef66f5a58be17e62a81382b7f Mon Sep 17 00:00:00 2001 From: Aman Kumar Date: Fri, 9 May 2025 16:40:31 +0530 Subject: [PATCH 3/3] fix:command not defined issue --- package-lock.json | 4 ++-- packages/contentstack-migration/README.md | 2 +- packages/contentstack-migration/package.json | 2 +- packages/contentstack-migration/src/utils/modules.js | 2 +- packages/contentstack/package.json | 2 +- pnpm-lock.yaml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d82ceaa4fd..d9e499eb89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25634,7 +25634,7 @@ "@contentstack/cli-command": "~1.5.0", "@contentstack/cli-config": "~1.12.0", "@contentstack/cli-launch": "^1.8.0", - "@contentstack/cli-migration": "~1.7.1", + "@contentstack/cli-migration": "~1.7.2", "@contentstack/cli-utilities": "~1.11.0", "@contentstack/cli-variants": "~1.2.1", "@contentstack/management": "~1.20.3", @@ -26977,7 +26977,7 @@ }, "packages/contentstack-migration": { "name": "@contentstack/cli-migration", - "version": "1.7.1", + "version": "1.7.2", "license": "MIT", "dependencies": { "@contentstack/cli-command": "~1.5.0", diff --git a/packages/contentstack-migration/README.md b/packages/contentstack-migration/README.md index f6fb61279c..9ab1ebe0b9 100644 --- a/packages/contentstack-migration/README.md +++ b/packages/contentstack-migration/README.md @@ -21,7 +21,7 @@ $ npm install -g @contentstack/cli-migration $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-migration/1.7.0 darwin-arm64 node-v23.11.0 +@contentstack/cli-migration/1.7.2 darwin-arm64 node-v22.14.0 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-migration/package.json b/packages/contentstack-migration/package.json index fb7f39a020..8f99e21fef 100644 --- a/packages/contentstack-migration/package.json +++ b/packages/contentstack-migration/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-migration", - "version": "1.7.1", + "version": "1.7.2", "author": "@contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { diff --git a/packages/contentstack-migration/src/utils/modules.js b/packages/contentstack-migration/src/utils/modules.js index 90b6058ae1..6af8df0212 100644 --- a/packages/contentstack-migration/src/utils/modules.js +++ b/packages/contentstack-migration/src/utils/modules.js @@ -72,7 +72,7 @@ function executeShellCommand(pkg, directory = '') { try { const result = spawnSync(`npm`, ['i', pkg], { stdio: 'inherit', cwd: directory, shell: false }); if (result?.error) throw result.error; - console.log(`Command executed successfully: ${command}`); + console.log(`Command executed successfully`); } catch (error) { console.error(`Command execution failed. Error: ${error?.message}`); } diff --git a/packages/contentstack/package.json b/packages/contentstack/package.json index c78fb23445..04528f7dc9 100755 --- a/packages/contentstack/package.json +++ b/packages/contentstack/package.json @@ -37,7 +37,7 @@ "@contentstack/cli-command": "~1.5.0", "@contentstack/cli-config": "~1.12.0", "@contentstack/cli-launch": "^1.8.0", - "@contentstack/cli-migration": "~1.7.1", + "@contentstack/cli-migration": "~1.7.2", "@contentstack/cli-utilities": "~1.11.0", "@contentstack/cli-variants": "~1.2.1", "@contentstack/management": "~1.20.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96e522b353..ea7bd5cb59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,7 +27,7 @@ importers: '@contentstack/cli-command': ~1.5.0 '@contentstack/cli-config': ~1.12.0 '@contentstack/cli-launch': ^1.8.0 - '@contentstack/cli-migration': ~1.7.1 + '@contentstack/cli-migration': ~1.7.2 '@contentstack/cli-utilities': ~1.11.0 '@contentstack/cli-variants': ~1.2.1 '@contentstack/management': ~1.20.3