[TIC-Web] support recommends tag 26/119026/1
authorChulwoo Shin <cw1.shin@samsung.com>
Wed, 15 Mar 2017 07:29:01 +0000 (16:29 +0900)
committerChulwoo Shin <cw1.shin@samsung.com>
Wed, 15 Mar 2017 07:29:01 +0000 (16:29 +0900)
- support dependency analysis for recommends tag
- add selection of file dep

Change-Id: I889625d5e0954d53f06aabca7c0cbc45d17beff7
Signed-off-by: Chulwoo Shin <cw1.shin@samsung.com>
public/src/js/page/package.js

index c380cdf..aeb95c1 100644 (file)
@@ -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);