Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 3 additions & 1 deletion bin/ember-cli-update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,9 +13,11 @@ const argv = require('yargs')
const from = argv['from'];
const to = argv['to'];
const ignoreConflicts = argv['ignore-conflicts'];
const packageJsonOnly = argv['package-json-only'];

emberCliUpdate({
from,
to,
ignoreConflicts
ignoreConflicts,
packageJsonOnly
});
4 changes: 4 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,11 @@
"dependencies": {
"debug": "^3.0.0",
"git-diff-apply": "^0.2.0",
"got": "^7.1.0",
"rfc6902": "^1.3.0",
"semver": "^5.4.1",
"sort-package-json": "^1.7.0",
"three-way-merger": "^0.2.0",
"yargs": "^8.0.2"
},
"devDependencies": {
Expand Down
5 changes: 5 additions & 0 deletions src/args.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,5 +12,10 @@ module.exports = {
type: 'boolean',
default: false,
description: 'Handle merge conflicts yourself'
},
'package-json-only': {
type: 'boolean',
default: false,
description: 'Attempt to automatically merge package.json changes'
}
};
76 changes: 76 additions & 0 deletions src/auto-merge-package-json.js
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
'use strict';

const fs = require('fs');
const got = require('got');
const sortPackageJson = require('sort-package-json');
const ThreeWayMerger = require('three-way-merger');
const rfc6902 = require('rfc6902');

function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}

function applyDependencyOperations(operations, source) {
operations.add.forEach((dep) => source[dep.name] = dep.version);
operations.remove.forEach((dep) => delete source[dep.name]);
operations.change.forEach((dep) => source[dep.name] = dep.version);
}

function mergeDependencyChanges(source, ours, theirs) {
let mergeOperations = ThreeWayMerger.merge({ source, ours, theirs });

// get a fresh copy so we don't mutate the passed in arg
let result = clone(ours);

applyDependencyOperations(mergeOperations.dependencies, result.dependencies);
applyDependencyOperations(mergeOperations.devDependencies, result.devDependencies);

return result;
}

function deleteDeps(input) {
delete input.dependencies;
delete input.devDependencies;
}

function mergeNonDependencyChanges(_source, _ours, _theirs) {
let source = clone(_source);
let ours = clone(_ours);
let theirs = clone(_theirs);

deleteDeps(source);
deleteDeps(ours);
deleteDeps(theirs);

let fromSourceToOurs = rfc6902.createPatch(source, ours);

rfc6902.applyPatch(theirs, fromSourceToOurs);

return theirs;
}

module.exports = function autoMergePackageJson(projectType, from, to) {
let projectKeyword = projectType === 'app' ? 'new' : 'addon';
let remoteUrl = `https://rawgit.com/ember-cli/ember-${projectKeyword}-output`;

return Promise.all([
got(`${remoteUrl}/${from}/package.json`, { json: true }),
got(`${remoteUrl}/${to}/package.json`, { json: true }),
])
.then((results) => {
let fromPackageJson = results[0].body;
let toPackageJson = results[1].body;
let currentPackageJson = JSON.parse(fs.readFileSync('package.json', { encoding: 'utf-8' }));

let mergedDependenciesPackageJson = mergeDependencyChanges(fromPackageJson, currentPackageJson, toPackageJson);
let mergedOtherPackageJson = mergeNonDependencyChanges(fromPackageJson, currentPackageJson, toPackageJson);

let finalMergedPackageJson = mergedOtherPackageJson;
finalMergedPackageJson.dependencies = mergedDependenciesPackageJson.dependencies;
finalMergedPackageJson.devDependencies = mergedDependenciesPackageJson.devDependencies;

let sortedPackageJson = sortPackageJson(finalMergedPackageJson);

fs.writeFileSync('package.json', JSON.stringify(sortedPackageJson, null, 2) + '\n', { encoding: 'utf-8' });
});
}
6 changes: 6 additions & 0 deletions src/index.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ module.exports = function emberCliUpdate(options) {
let from = options.from;
let to = options.to;
let ignoreConflicts = options.ignoreConflicts;
let packageJsonOnly = options.packageJsonOnly;

let versions = JSON.parse(
run('npm info ember-cli versions --json')
Expand All@@ -31,6 +32,11 @@ module.exports = function emberCliUpdate(options) {

let remoteUrl = `https://github.com/ember-cli/ember-${projectKeyword}-output`;

if (packageJsonOnly) {
const autoMergePackageJson = require('./auto-merge-package-json');
return autoMergePackageJson(projectType, startTag, endTag);
}

return gitDiffApply({
remoteUrl,
startTag,
Expand Down