}
}
- 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) {
// 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 {
_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);