From 6e9d40a5287ea66c67cc5462a85d522b88c84179 Mon Sep 17 00:00:00 2001 From: Chulwoo Shin Date: Wed, 15 Mar 2017 16:29:01 +0900 Subject: [PATCH] [TIC-Web] support recommends tag - support dependency analysis for recommends tag - add selection of file dep Change-Id: I889625d5e0954d53f06aabca7c0cbc45d17beff7 Signed-off-by: Chulwoo Shin --- public/src/js/page/package.js | 93 +++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/public/src/js/page/package.js b/public/src/js/page/package.js index c380cdf..aeb95c1 100644 --- a/public/src/js/page/package.js +++ b/public/src/js/page/package.js @@ -418,7 +418,32 @@ define([ } } - function _select_rpm(capability, require) { + function _select_files(fileList, require) { + if (!fileList || !require){ + return null; + } + var selectpkg = null; + // 1. sort in ascending order + fileList.sort(); + // 2-1. Choose the selected rpm + for (var fname of fileList) { + var fileInfo = pkgInfo[fname]; + if (fileInfo.checked || selected[fileInfo.id] >= 1) { + return fileInfo; + } + } + // 2-2. Choose the rpm (it does not conflitcs) + for (var fname of fileList) { + var fileInfo = pkgInfo[fname]; + var checkConflict = _checkConflicts(fileInfo); + if (checkConflict.result === false) { + return fileInfo; + } + } + return pkgInfo[fileList[0]]; + } + + function _select_rpm(capability, require, recommend) { var provideList = []; // 1. Choose the rpm included in version from provides if (require.ver) { @@ -448,29 +473,48 @@ define([ // 2. Select one of the rpms by priority // 2-1. Choose the default rpm or the selected rpm - // TODO: default profile rpm should be selected - var selectPkg = null; - _.forEach(provideList, function(provide) { + for (var provide of provideList) { var tmpInfo = pkgInfo[provide.name]; if (tmpInfo.checked || selected[tmpInfo.id] >= 1) { - selectPkg = tmpInfo; - return false; + return tmpInfo; + } + } + // 2-2. Choose the rpm of default profile + // TODO: should be supported + + // 2-3. Choose recommends pkg (pkg-name or capability) + if (recommend) { + for (var provide of provideList) { + var provide_info = pkgInfo[provide.name]; + for (var reco of recommend) { + // 2-3-1. select a pkg that is named + if (reco.name == provide_info.name) { + return provide_info; + } + // 2-3-2. select a pkg that provides + for (var cap of provide_info['provides']) { + if (reco.name == cap.name) { + return provide_info; + } + } + } } - }); - if (selectPkg) { - return selectPkg; } - - logger.info('[_select_rpm] capability name : ' + provideList[0].data.name + ' (' + provideList.length + ')'); - var maxVersion = null; - // 2-2. Select the latest version of rpm - _.forEach(provideList, function(provide) { + // 2-4. Select the latest version of rpm + _.forEach (provideList, function(provide) { var checkConflict = _checkConflicts(pkgInfo[provide.name]); if (checkConflict.result === false) { if (maxVersion) { var ret = _comapre_ver(maxVersion.data, provide.data) - if (ret === -1) { + // version equals + if (ret === 0) { + // string compare + if (maxVersion.name > provide.name) { + maxVersion = provide; + } + } else if (ret === -1) { + // greater than maxVersion maxVersion = provide; } } else { @@ -595,21 +639,30 @@ define([ _addConflicts(node); // installation dependency analysis of package - // TODO: recommends - _.forEach(['requires'], function(depTag) { + _.forEach(['requires', 'recommends'], function(depTag) { if (_.has(node, depTag)) { _.forEach(node[depTag], function(require) { var choose = null; - if (_.has(provides, require.name)) { var capList = provides[require.name]; - choose = _select_rpm(capList, require); + if (depTag == 'requires') { + choose = _select_rpm(capList, require, node['recommends']); + } else { + choose = _select_rpm(capList, require); + } } else if (_.has(files, require.name)) { - choose = pkgInfo[files[require.name][0]]; + choose = _select_files(files[require.name], require); } else if (_.has(pkgInfo, require.name)) { choose = pkgInfo[require.name]; } + if (depTag == 'recommends') { + if (!choose || (_checkConflicts(choose)).result === true) { + logger.info(require.name + ' recommended by ' + node.name + ' is ignored for selection (Conflict)'); + return; // continue + } + } + if (choose) { if (selected[choose.id] === -1) { var result = _analyzeDep(choose); -- 2.7.4