Salome HOME
Merge branch 'master' of https://codev-tuleap.cea.fr/plugins/git/spns/SAT
[tools/sat.git] / doc / build / html / _modules / src / product.html
1
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
8     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9     <title>src.product &#8212; salomeTools 5.0.0dev documentation</title>
10     <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
11     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
12     <script type="text/javascript" src="../../_static/documentation_options.js"></script>
13     <script type="text/javascript" src="../../_static/jquery.js"></script>
14     <script type="text/javascript" src="../../_static/underscore.js"></script>
15     <script type="text/javascript" src="../../_static/doctools.js"></script>
16     <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
17     <link rel="index" title="Index" href="../../genindex.html" />
18     <link rel="search" title="Search" href="../../search.html" />
19    
20   <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
21   
22   
23   <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
24
25   </head><body>
26   
27
28     <div class="document">
29       <div class="documentwrapper">
30         <div class="bodywrapper">
31           <div class="body" role="main">
32             
33   <h1>Source code for src.product</h1><div class="highlight"><pre>
34 <span></span><span class="ch">#!/usr/bin/env python</span>
35 <span class="c1">#-*- coding:utf-8 -*-</span>
36 <span class="c1">#  Copyright (C) 2010-2012  CEA/DEN</span>
37 <span class="c1">#</span>
38 <span class="c1">#  This library is free software; you can redistribute it and/or</span>
39 <span class="c1">#  modify it under the terms of the GNU Lesser General Public</span>
40 <span class="c1">#  License as published by the Free Software Foundation; either</span>
41 <span class="c1">#  version 2.1 of the License.</span>
42 <span class="c1">#</span>
43 <span class="c1">#  This library is distributed in the hope that it will be useful,</span>
44 <span class="c1">#  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
45 <span class="c1">#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
46 <span class="c1">#  Lesser General Public License for more details.</span>
47 <span class="c1">#</span>
48 <span class="c1">#  You should have received a copy of the GNU Lesser General Public</span>
49 <span class="c1">#  License along with this library; if not, write to the Free Software</span>
50 <span class="c1">#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA</span>
51
52 <span class="sd">&quot;&quot;&quot;\</span>
53 <span class="sd">In this file are implemented the methods </span>
54 <span class="sd">relative to the product notion of salomeTools</span>
55 <span class="sd">&quot;&quot;&quot;</span>
56
57 <span class="kn">import</span> <span class="nn">os</span>
58 <span class="kn">import</span> <span class="nn">re</span>
59
60 <span class="kn">import</span> <span class="nn">src</span>
61 <span class="kn">import</span> <span class="nn">src.debug</span> <span class="k">as</span> <span class="nn">DBG</span>
62
63 <span class="n">AVAILABLE_VCS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;git&#39;</span><span class="p">,</span> <span class="s1">&#39;svn&#39;</span><span class="p">,</span> <span class="s1">&#39;cvs&#39;</span><span class="p">]</span>
64 <span class="n">config_expression</span> <span class="o">=</span> <span class="s2">&quot;^config-\d+$&quot;</span>
65 <span class="n">VERSION_DELIMITER</span> <span class="o">=</span> <span class="s2">&quot;_to_&quot;</span>
66
67 <div class="viewcode-block" id="get_product_config"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_product_config">[docs]</a><span class="k">def</span> <span class="nf">get_product_config</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">product_name</span><span class="p">,</span> <span class="n">with_install_dir</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
68     <span class="sd">&quot;&quot;&quot;Get the specific configuration of a product from the global configuration</span>
69 <span class="sd">    </span>
70 <span class="sd">    :param config Config: The global configuration</span>
71 <span class="sd">    :param product_name str: The name of the product</span>
72 <span class="sd">    :param with_install_dir boolean: If false, do not provide an install </span>
73 <span class="sd">                                     directory (at false only for internal use </span>
74 <span class="sd">                                     of the function check_config_exists)</span>
75 <span class="sd">    :return: the specific configuration of the product</span>
76 <span class="sd">    :rtype: Config</span>
77 <span class="sd">    &quot;&quot;&quot;</span>
78     
79     <span class="c1"># Get the version of the product from the application definition</span>
80     <span class="n">version</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">products</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span>
81     <span class="c1"># if no version, then take the default one defined in the application</span>
82     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">version</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span> 
83         <span class="n">version</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">tag</span>      
84     
85     <span class="c1"># Define debug and dev modes</span>
86     <span class="c1"># Get the tag if a dictionary is given in APPLICATION.products for the</span>
87     <span class="c1"># current product </span>
88     <span class="n">debug</span> <span class="o">=</span> <span class="s1">&#39;no&#39;</span>
89     <span class="n">dev</span> <span class="o">=</span> <span class="s1">&#39;no&#39;</span>
90     <span class="n">base</span> <span class="o">=</span> <span class="s1">&#39;maybe&#39;</span>
91     <span class="n">section</span> <span class="o">=</span> <span class="kc">None</span>
92     <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">version</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Mapping</span><span class="p">):</span>
93         <span class="n">dic_version</span> <span class="o">=</span> <span class="n">version</span>
94         <span class="c1"># Get the version/tag</span>
95         <span class="k">if</span> <span class="ow">not</span> <span class="s1">&#39;tag&#39;</span> <span class="ow">in</span> <span class="n">dic_version</span><span class="p">:</span>
96             <span class="n">version</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">tag</span>
97         <span class="k">else</span><span class="p">:</span>
98             <span class="n">version</span> <span class="o">=</span> <span class="n">dic_version</span><span class="o">.</span><span class="n">tag</span>
99         
100         <span class="c1"># Get the debug if any</span>
101         <span class="k">if</span> <span class="s1">&#39;debug&#39;</span> <span class="ow">in</span> <span class="n">dic_version</span><span class="p">:</span>
102             <span class="n">debug</span> <span class="o">=</span> <span class="n">dic_version</span><span class="o">.</span><span class="n">debug</span>
103         
104         <span class="c1"># Get the dev if any</span>
105         <span class="k">if</span> <span class="s1">&#39;dev&#39;</span> <span class="ow">in</span> <span class="n">dic_version</span><span class="p">:</span>
106             <span class="n">dev</span> <span class="o">=</span> <span class="n">dic_version</span><span class="o">.</span><span class="n">dev</span>
107         
108         <span class="c1"># Get the base if any</span>
109         <span class="k">if</span> <span class="s1">&#39;base&#39;</span> <span class="ow">in</span> <span class="n">dic_version</span><span class="p">:</span>
110             <span class="n">base</span> <span class="o">=</span> <span class="n">dic_version</span><span class="o">.</span><span class="n">base</span>
111
112         <span class="c1"># Get the section if any</span>
113         <span class="k">if</span> <span class="s1">&#39;section&#39;</span> <span class="ow">in</span> <span class="n">dic_version</span><span class="p">:</span>
114             <span class="n">section</span> <span class="o">=</span> <span class="n">dic_version</span><span class="o">.</span><span class="n">section</span>
115     
116     <span class="n">vv</span> <span class="o">=</span> <span class="n">version</span>
117     <span class="c1"># substitute some character with _ in order to get the correct definition</span>
118     <span class="c1"># in config.PRODUCTS. This is done because the pyconf tool does not handle</span>
119     <span class="c1"># the . and - characters </span>
120     <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="s2">&quot;.-&quot;</span><span class="p">:</span> <span class="n">vv</span> <span class="o">=</span> <span class="n">vv</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="p">)</span>
121     
122     <span class="n">prod_info</span> <span class="o">=</span> <span class="kc">None</span>
123     <span class="k">if</span> <span class="n">product_name</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">:</span>
124         <span class="c1"># Search for the product description in the configuration</span>
125         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">get_product_section</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">product_name</span><span class="p">,</span> <span class="n">vv</span><span class="p">,</span> <span class="n">section</span><span class="p">)</span>
126         
127         <span class="c1"># merge opt_depend in depend</span>
128         <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="s1">&#39;opt_depend&#39;</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="p">:</span>
129             <span class="k">for</span> <span class="n">depend</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">opt_depend</span><span class="p">:</span>
130                 <span class="k">if</span> <span class="n">depend</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">products</span><span class="p">:</span>
131                     <span class="n">prod_info</span><span class="o">.</span><span class="n">depend</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">depend</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
132         
133         <span class="c1"># In case of a product get with a vcs, </span>
134         <span class="c1"># put the tag (equal to the version)</span>
135         <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="ow">in</span> <span class="n">AVAILABLE_VCS</span><span class="p">:</span>
136             
137             <span class="k">if</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">==</span> <span class="s1">&#39;git&#39;</span><span class="p">:</span>
138                 <span class="n">prod_info</span><span class="o">.</span><span class="n">git_info</span><span class="o">.</span><span class="n">tag</span> <span class="o">=</span> <span class="n">version</span>
139             
140             <span class="k">if</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">==</span> <span class="s1">&#39;svn&#39;</span><span class="p">:</span>
141                 <span class="n">prod_info</span><span class="o">.</span><span class="n">svn_info</span><span class="o">.</span><span class="n">tag</span> <span class="o">=</span> <span class="n">version</span>
142             
143             <span class="k">if</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">==</span> <span class="s1">&#39;cvs&#39;</span><span class="p">:</span>
144                 <span class="n">prod_info</span><span class="o">.</span><span class="n">cvs_info</span><span class="o">.</span><span class="n">tag</span> <span class="o">=</span> <span class="n">version</span>
145         
146         <span class="c1"># In case of a fixed product, </span>
147         <span class="c1"># define the install_dir (equal to the version)</span>
148         <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">version</span><span class="p">):</span>
149             <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span> <span class="o">=</span> <span class="n">version</span>
150             <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">=</span> <span class="s2">&quot;fixed&quot;</span>
151         
152         <span class="c1"># Check if the product is defined as native in the application</span>
153         <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
154             <span class="k">if</span> <span class="n">version</span> <span class="o">==</span> <span class="s2">&quot;native&quot;</span><span class="p">:</span>
155                 <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">=</span> <span class="s2">&quot;native&quot;</span>
156             <span class="k">elif</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">==</span> <span class="s2">&quot;native&quot;</span><span class="p">:</span>
157                 <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;The product </span><span class="si">%(prod)s</span><span class="s2"> has version </span><span class="si">%(ver)s</span><span class="s2"> but is &quot;</span>
158                         <span class="s2">&quot;declared as native in its definition&quot;</span> <span class="o">%</span>
159                         <span class="p">{</span> <span class="s1">&#39;prod&#39;</span><span class="p">:</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;ver&#39;</span><span class="p">:</span> <span class="n">version</span><span class="p">})</span>
160                 <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
161
162     <span class="c1"># If there is no definition but the product is declared as native,</span>
163     <span class="c1"># construct a new definition containing only the get_source key</span>
164     <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">version</span> <span class="o">==</span> <span class="s2">&quot;native&quot;</span><span class="p">:</span>
165         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Config</span><span class="p">()</span>
166         <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">product_name</span>
167         <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">=</span> <span class="s2">&quot;native&quot;</span>
168
169     <span class="c1"># If there is no definition but the product is fixed,</span>
170     <span class="c1"># construct a new definition containing only the product name</span>
171     <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">version</span><span class="p">):</span>
172         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Config</span><span class="p">()</span>
173         <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">product_name</span>
174         <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">=</span> <span class="s2">&quot;fixed&quot;</span>
175         <span class="n">prod_info</span><span class="o">.</span><span class="n">addMapping</span><span class="p">(</span><span class="s2">&quot;environ&quot;</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Mapping</span><span class="p">(</span><span class="n">prod_info</span><span class="p">),</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
176
177
178     <span class="c1"># If prod_info is still None, it means that there is no product definition</span>
179     <span class="c1"># in the config. The user has to provide it.</span>
180     <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
181         <span class="n">prod_pyconf_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span><span class="n">product_name</span> <span class="o">+</span> <span class="s2">&quot;.pyconf&quot;</span><span class="p">,</span>
182                                                   <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">PRODUCTPATH</span><span class="p">)</span>
183         <span class="k">if</span> <span class="ow">not</span> <span class="n">prod_pyconf_path</span><span class="p">:</span>
184             <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
185 <span class="s2">No definition found for the product </span><span class="si">%(1)s</span><span class="s2">.</span>
186 <span class="s2">Please create a </span><span class="si">%(2)s</span><span class="s2">.pyconf file somewhere in:</span>
187 <span class="si">%(3)s</span><span class="s2">&quot;&quot;&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
188   <span class="s2">&quot;1&quot;</span><span class="p">:</span> <span class="n">product_name</span><span class="p">,</span> 
189   <span class="s2">&quot;2&quot;</span><span class="p">:</span> <span class="n">product_name</span><span class="p">,</span>
190   <span class="s2">&quot;3&quot;</span><span class="p">:</span> <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">PRODUCTPATH</span> <span class="p">}</span>
191         <span class="k">else</span><span class="p">:</span>
192             <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
193 <span class="s2">No definition corresponding to the version </span><span class="si">%(1)s</span><span class="s2"> was found in the file:</span>
194 <span class="s2">  </span><span class="si">%(2)s</span><span class="s2">.</span>
195 <span class="s2">Please add a section in it.&quot;&quot;&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;1&quot;</span> <span class="p">:</span> <span class="n">vv</span><span class="p">,</span> <span class="s2">&quot;2&quot;</span> <span class="p">:</span> <span class="n">prod_pyconf_path</span><span class="p">}</span>
196         <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
197     
198     <span class="c1"># Set the debug, dev and version keys</span>
199     <span class="n">prod_info</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="n">debug</span>
200     <span class="n">prod_info</span><span class="o">.</span><span class="n">dev</span> <span class="o">=</span> <span class="n">dev</span>
201     <span class="n">prod_info</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">version</span>
202     
203     <span class="c1"># Set the archive_info if the product is get in archive mode</span>
204     <span class="k">if</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">get_source</span> <span class="o">==</span> <span class="s2">&quot;archive&quot;</span><span class="p">:</span>
205         <span class="k">if</span> <span class="ow">not</span> <span class="s2">&quot;archive_info&quot;</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="p">:</span>
206             <span class="n">prod_info</span><span class="o">.</span><span class="n">addMapping</span><span class="p">(</span><span class="s2">&quot;archive_info&quot;</span><span class="p">,</span>
207                                  <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Mapping</span><span class="p">(</span><span class="n">prod_info</span><span class="p">),</span>
208                                  <span class="s2">&quot;&quot;</span><span class="p">)</span>
209         <span class="k">if</span> <span class="s2">&quot;archive_name&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="p">:</span> 
210             <span class="n">arch_name</span> <span class="o">=</span> <span class="n">product_name</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="n">version</span> <span class="o">+</span> <span class="s2">&quot;.tar.gz&quot;</span>
211             <span class="n">arch_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span><span class="n">arch_name</span><span class="p">,</span>
212                                                <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">ARCHIVEPATH</span><span class="p">)</span>
213             <span class="k">if</span> <span class="ow">not</span> <span class="n">arch_path</span><span class="p">:</span>
214                 <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Archive </span><span class="si">%(1)s</span><span class="s2"> for </span><span class="si">%(2)s</span><span class="s2"> not found in config.PATHS.ARCHIVEPATH&quot;</span><span class="p">)</span> <span class="o">%</span> \
215                        <span class="p">{</span><span class="s2">&quot;1&quot;</span> <span class="p">:</span> <span class="n">arch_name</span><span class="p">,</span> <span class="s2">&quot;2&quot;</span> <span class="p">:</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
216                 <span class="n">DBG</span><span class="o">.</span><span class="n">tofix</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">ARCHIVEPATH</span><span class="p">)</span>
217                 <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span> <span class="o">=</span> <span class="n">arch_name</span> <span class="c1">#without path</span>
218                 <span class="c1"># raise src.SatException(msg) #may be a warning, continue #8646</span>
219             <span class="k">else</span><span class="p">:</span>
220                 <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span> <span class="o">=</span> <span class="n">arch_path</span>
221         <span class="k">else</span><span class="p">:</span>
222             <span class="k">if</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span><span class="p">)</span> <span class="o">==</span> 
223                                         <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span><span class="p">):</span>
224                 <span class="n">arch_name</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span>
225                 <span class="n">arch_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span>
226                                             <span class="n">arch_name</span><span class="p">,</span>
227                                             <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">ARCHIVEPATH</span><span class="p">)</span>
228                 <span class="k">if</span> <span class="ow">not</span> <span class="n">arch_path</span><span class="p">:</span>
229                     <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Archive </span><span class="si">%(1)s</span><span class="s2"> for </span><span class="si">%(2)s</span><span class="s2"> not found in config.PATHS.ARCHIVEPATH&quot;</span><span class="p">)</span> <span class="o">%</span> \
230                            <span class="p">{</span><span class="s2">&quot;1&quot;</span> <span class="p">:</span> <span class="n">arch_name</span><span class="p">,</span> <span class="s2">&quot;2&quot;</span> <span class="p">:</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">}</span>
231                     <span class="n">DBG</span><span class="o">.</span><span class="n">tofix</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">ARCHIVEPATH</span><span class="p">)</span> <span class="c1">#avoid 2 messages in compile</span>
232                     <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span> <span class="o">=</span> <span class="n">arch_name</span> <span class="c1">#without path</span>
233                     <span class="c1"># raise src.SatException(msg) #may be a warning, continue #8646</span>
234                 <span class="n">prod_info</span><span class="o">.</span><span class="n">archive_info</span><span class="o">.</span><span class="n">archive_name</span> <span class="o">=</span> <span class="n">arch_path</span>
235         
236     <span class="c1"># If the product compiles with a script, check the script existence</span>
237     <span class="c1"># and if it is executable</span>
238     <span class="k">if</span> <span class="n">product_has_script</span><span class="p">(</span><span class="n">prod_info</span><span class="p">):</span>
239         <span class="c1"># Check the compil_script key existence</span>
240         <span class="k">if</span> <span class="s2">&quot;compil_script&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="p">:</span>
241             <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
242 <span class="s2">No compilation script found for the product </span><span class="si">%s</span><span class="s2">.</span>
243 <span class="s2">Please provide a &#39;compil_script&#39; key in its definition.&quot;&quot;&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">product_name</span>
244             <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
245         
246         <span class="c1"># Get the path of the script</span>
247         <span class="n">script</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span>
248         <span class="n">script_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">script</span><span class="p">)</span>
249         <span class="k">if</span> <span class="n">script</span> <span class="o">==</span> <span class="n">script_name</span><span class="p">:</span>
250             <span class="c1"># Only a name is given. Search in the default directory</span>
251             <span class="n">script_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span><span class="n">script_name</span><span class="p">,</span>
252                                                  <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">PRODUCTPATH</span><span class="p">,</span>
253                                                  <span class="s2">&quot;compil_scripts&quot;</span><span class="p">)</span>
254             <span class="k">if</span> <span class="ow">not</span> <span class="n">script_path</span><span class="p">:</span>
255                 <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span>
256                     <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Compilation script not found: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">script_name</span><span class="p">)</span>
257             <span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span> <span class="o">=</span> <span class="n">script_path</span>
258             <span class="k">if</span> <span class="n">src</span><span class="o">.</span><span class="n">architecture</span><span class="o">.</span><span class="n">is_windows</span><span class="p">():</span>
259                 <span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span><span class="p">[:</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="s2">&quot;.sh&quot;</span><span class="p">)]</span> <span class="o">+</span> <span class="s2">&quot;.bat&quot;</span>
260        
261         <span class="c1"># Check that the script is executable</span>
262         <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
263             <span class="c1">#raise src.SatException(</span>
264             <span class="c1">#        _(&quot;Compilation script cannot be executed: %s&quot;) % </span>
265             <span class="c1">#        prod_info.compil_script)</span>
266             <span class="n">DBG</span><span class="o">.</span><span class="n">tofix</span><span class="p">(</span><span class="s2">&quot;Compilation script cannot be executed:&quot;</span><span class="p">,</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">compil_script</span><span class="p">)</span>
267     
268     <span class="c1"># Get the full paths of all the patches</span>
269     <span class="k">if</span> <span class="n">product_has_patches</span><span class="p">(</span><span class="n">prod_info</span><span class="p">):</span>
270         <span class="n">patches</span> <span class="o">=</span> <span class="p">[]</span>
271         <span class="k">try</span><span class="p">:</span>
272           <span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">patches</span><span class="p">:</span>
273               <span class="n">patch_path</span> <span class="o">=</span> <span class="n">patch</span>
274               <span class="c1"># If only a filename, then search for the patch in the PRODUCTPATH</span>
275               <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">patch_path</span><span class="p">)</span> <span class="o">==</span> <span class="n">patch_path</span><span class="p">:</span>
276                   <span class="c1"># Search in the PRODUCTPATH/patches</span>
277                   <span class="n">patch_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span><span class="n">patch</span><span class="p">,</span>
278                                                       <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">PRODUCTPATH</span><span class="p">,</span>
279                                                       <span class="s2">&quot;patches&quot;</span><span class="p">)</span>
280                   <span class="k">if</span> <span class="ow">not</span> <span class="n">patch_path</span><span class="p">:</span>
281                       <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Patch </span><span class="si">%(patch_name)s</span><span class="s2"> for </span><span class="si">%(prod_name)s</span><span class="s2"> not found:&quot;</span>
282                               <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;patch_name&quot;</span> <span class="p">:</span> <span class="n">patch</span><span class="p">,</span>
283                                        <span class="s2">&quot;prod_name&quot;</span> <span class="p">:</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">})</span> 
284                       <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
285               <span class="n">patches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">patch_path</span><span class="p">)</span>
286         <span class="k">except</span><span class="p">:</span>
287           <span class="n">DBG</span><span class="o">.</span><span class="n">tofix</span><span class="p">(</span><span class="s2">&quot;problem in prod_info.patches&quot;</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">)</span>
288         <span class="n">prod_info</span><span class="o">.</span><span class="n">patches</span> <span class="o">=</span> <span class="n">patches</span>
289
290     <span class="c1"># Get the full paths of the environment scripts</span>
291     <span class="k">if</span> <span class="n">product_has_env_script</span><span class="p">(</span><span class="n">prod_info</span><span class="p">):</span>
292         <span class="n">env_script_path</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">env_script</span>
293         <span class="c1"># If only a filename, then search for the environment script </span>
294         <span class="c1"># in the PRODUCTPATH/env_scripts</span>
295         <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">env_script_path</span><span class="p">)</span> <span class="o">==</span> <span class="n">env_script_path</span><span class="p">:</span>
296             <span class="c1"># Search in the PRODUCTPATH/env_scripts</span>
297             <span class="n">env_script_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">find_file_in_lpath</span><span class="p">(</span>
298                                             <span class="n">prod_info</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">env_script</span><span class="p">,</span>
299                                             <span class="n">config</span><span class="o">.</span><span class="n">PATHS</span><span class="o">.</span><span class="n">PRODUCTPATH</span><span class="p">,</span>
300                                             <span class="s2">&quot;env_scripts&quot;</span><span class="p">)</span>
301             <span class="k">if</span> <span class="ow">not</span> <span class="n">env_script_path</span><span class="p">:</span>
302                 <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Environment script </span><span class="si">%(env_name)s</span><span class="s2"> for </span><span class="si">%(prod_name)s</span><span class="s2"> not &quot;</span>
303                         <span class="s2">&quot;found.</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;env_name&quot;</span> <span class="p">:</span> <span class="n">env_script_path</span><span class="p">,</span>
304                                        <span class="s2">&quot;prod_name&quot;</span> <span class="p">:</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">})</span> 
305                 <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
306
307         <span class="n">prod_info</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">env_script</span> <span class="o">=</span> <span class="n">env_script_path</span>
308     
309     <span class="k">if</span> <span class="n">with_install_dir</span><span class="p">:</span> 
310         <span class="c1"># The variable with_install_dir is at false only for internal use </span>
311         <span class="c1"># of the function get_install_dir</span>
312         
313         <span class="c1"># Save the install_dir key if there is any</span>
314         <span class="k">if</span> <span class="s2">&quot;install_dir&quot;</span> <span class="ow">in</span> <span class="n">prod_info</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s2">&quot;install_dir_save&quot;</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="p">:</span>
315             <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir_save</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span>
316         
317         <span class="c1"># if it is not the first time the install_dir is computed, it means</span>
318         <span class="c1"># that install_dir_save exists and it has to be taken into account.</span>
319         <span class="k">if</span> <span class="s2">&quot;install_dir_save&quot;</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="p">:</span>
320             <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir_save</span>
321         
322         <span class="c1"># Set the install_dir key</span>
323         <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span> <span class="o">=</span> <span class="n">get_install_dir</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">version</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">)</span>
324                 
325     <span class="k">return</span> <span class="n">prod_info</span></div>
326
327 <div class="viewcode-block" id="get_product_section"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_product_section">[docs]</a><span class="k">def</span> <span class="nf">get_product_section</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">product_name</span><span class="p">,</span> <span class="n">version</span><span class="p">,</span> <span class="n">section</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
328     <span class="sd">&quot;&quot;&quot;Get the product description from the configuration</span>
329 <span class="sd">    </span>
330 <span class="sd">    :param config Config: The global configuration</span>
331 <span class="sd">    :param product_name str: The product name</span>
332 <span class="sd">    :param version str: The version of the product</span>
333 <span class="sd">    :param section str: The searched section (if not None, the section is </span>
334 <span class="sd">                        explicitly given</span>
335 <span class="sd">    :return: The product description</span>
336 <span class="sd">    :rtype: Config</span>
337 <span class="sd">    &quot;&quot;&quot;</span>
338
339     <span class="c1"># if section is not None, try to get the corresponding section</span>
340     <span class="k">if</span> <span class="n">section</span><span class="p">:</span>
341         <span class="k">if</span> <span class="n">section</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]:</span>
342             <span class="k">return</span> <span class="kc">None</span>
343         <span class="c1"># returns specific information for the given version</span>
344         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">][</span><span class="n">section</span><span class="p">]</span>
345         <span class="n">prod_info</span><span class="o">.</span><span class="n">section</span> <span class="o">=</span> <span class="n">section</span>
346         <span class="n">prod_info</span><span class="o">.</span><span class="n">from_file</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">from_file</span>
347         <span class="k">return</span> <span class="n">prod_info</span>
348
349     <span class="c1"># If it exists, get the information of the product_version</span>
350     <span class="k">if</span> <span class="s2">&quot;version_&quot;</span> <span class="o">+</span> <span class="n">version</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]:</span>
351         <span class="c1"># returns specific information for the given version</span>
352         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">][</span><span class="s2">&quot;version_&quot;</span> <span class="o">+</span> <span class="n">version</span><span class="p">]</span>
353         <span class="n">prod_info</span><span class="o">.</span><span class="n">section</span> <span class="o">=</span> <span class="s2">&quot;version_&quot;</span> <span class="o">+</span> <span class="n">version</span>
354         <span class="n">prod_info</span><span class="o">.</span><span class="n">from_file</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">from_file</span>
355         <span class="k">return</span> <span class="n">prod_info</span>
356     
357     <span class="c1"># Else, check if there is a description for multiple versions</span>
358     <span class="n">l_section_name</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
359     <span class="n">l_section_ranges</span> <span class="o">=</span> <span class="p">[</span><span class="n">section_name</span> <span class="k">for</span> <span class="n">section_name</span> <span class="ow">in</span> <span class="n">l_section_name</span> 
360                         <span class="k">if</span> <span class="n">VERSION_DELIMITER</span> <span class="ow">in</span> <span class="n">section_name</span><span class="p">]</span>
361     <span class="k">for</span> <span class="n">section_range</span> <span class="ow">in</span> <span class="n">l_section_ranges</span><span class="p">:</span>
362         <span class="n">minimum</span><span class="p">,</span> <span class="n">maximum</span> <span class="o">=</span> <span class="n">section_range</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">VERSION_DELIMITER</span><span class="p">)</span>
363         <span class="k">if</span> <span class="p">(</span><span class="n">src</span><span class="o">.</span><span class="n">only_numbers</span><span class="p">(</span><span class="n">version</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">src</span><span class="o">.</span><span class="n">only_numbers</span><span class="p">(</span><span class="n">minimum</span><span class="p">)</span>
364                     <span class="ow">and</span> <span class="n">src</span><span class="o">.</span><span class="n">only_numbers</span><span class="p">(</span><span class="n">version</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">src</span><span class="o">.</span><span class="n">only_numbers</span><span class="p">(</span><span class="n">maximum</span><span class="p">)):</span>
365             <span class="c1"># returns specific information for the versions</span>
366             <span class="n">prod_info</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">][</span><span class="n">section_range</span><span class="p">]</span>
367             <span class="n">prod_info</span><span class="o">.</span><span class="n">section</span> <span class="o">=</span> <span class="n">section_range</span>
368             <span class="n">prod_info</span><span class="o">.</span><span class="n">from_file</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">from_file</span>
369             <span class="k">return</span> <span class="n">prod_info</span>
370     
371     <span class="c1"># Else, get the standard informations</span>
372     <span class="k">if</span> <span class="s2">&quot;default&quot;</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]:</span>
373         <span class="c1"># returns the generic information (given version not found)</span>
374         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">default</span>
375         <span class="n">prod_info</span><span class="o">.</span><span class="n">section</span> <span class="o">=</span> <span class="s2">&quot;default&quot;</span>
376         <span class="n">prod_info</span><span class="o">.</span><span class="n">from_file</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">PRODUCTS</span><span class="p">[</span><span class="n">product_name</span><span class="p">]</span><span class="o">.</span><span class="n">from_file</span>
377         <span class="k">return</span> <span class="n">prod_info</span>
378     
379     <span class="c1"># if noting was found, return None</span>
380     <span class="k">return</span> <span class="kc">None</span></div>
381     
382 <div class="viewcode-block" id="get_install_dir"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_install_dir">[docs]</a><span class="k">def</span> <span class="nf">get_install_dir</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">version</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">):</span>
383     <span class="sd">&quot;&quot;&quot;Compute the installation directory of a given product </span>
384 <span class="sd">    </span>
385 <span class="sd">    :param config Config: The global configuration</span>
386 <span class="sd">    :param base str: This corresponds to the value given by user in its </span>
387 <span class="sd">                     application.pyconf for the specific product. If &quot;yes&quot;, the</span>
388 <span class="sd">                     user wants the product to be in base. If &quot;no&quot;, he wants the</span>
389 <span class="sd">                     product to be in the application workdir</span>
390 <span class="sd">    :param version str: The version of the product</span>
391 <span class="sd">    :param product_info Config: The configuration specific to </span>
392 <span class="sd">                               the product</span>
393 <span class="sd">    </span>
394 <span class="sd">    :return: The path of the product installation</span>
395 <span class="sd">    :rtype: str</span>
396 <span class="sd">    &quot;&quot;&quot;</span>
397     <span class="n">install_dir</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
398     <span class="n">in_base</span> <span class="o">=</span> <span class="kc">False</span>
399     <span class="k">if</span> <span class="p">((</span><span class="s2">&quot;install_dir&quot;</span> <span class="ow">in</span> <span class="n">prod_info</span> <span class="ow">and</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span> <span class="o">==</span> <span class="s2">&quot;base&quot;</span><span class="p">)</span> 
400                                                             <span class="ow">or</span> <span class="n">base</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">):</span>
401         <span class="n">in_base</span> <span class="o">=</span> <span class="kc">True</span>
402     <span class="k">if</span> <span class="p">(</span><span class="n">base</span> <span class="o">==</span> <span class="s2">&quot;no&quot;</span> <span class="ow">or</span> <span class="p">(</span><span class="s2">&quot;no_base&quot;</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span> 
403                          <span class="ow">and</span> <span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">no_base</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)):</span>
404         <span class="n">in_base</span> <span class="o">=</span> <span class="kc">False</span>
405     
406     <span class="k">if</span> <span class="n">in_base</span><span class="p">:</span>
407         <span class="n">install_dir</span> <span class="o">=</span> <span class="n">get_base_install_dir</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">,</span> <span class="n">version</span><span class="p">)</span>
408     <span class="k">else</span><span class="p">:</span>
409         <span class="k">if</span> <span class="s2">&quot;install_dir&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">prod_info</span> <span class="ow">or</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span> <span class="o">==</span> <span class="s2">&quot;base&quot;</span><span class="p">:</span>
410             <span class="c1"># Set it to the default value (in application directory)</span>
411             <span class="n">install_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">APPLICATION</span><span class="o">.</span><span class="n">workdir</span><span class="p">,</span>
412                                                 <span class="s2">&quot;INSTALL&quot;</span><span class="p">,</span>
413                                                 <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
414         <span class="k">else</span><span class="p">:</span>
415             <span class="n">install_dir</span> <span class="o">=</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">install_dir</span>
416
417     <span class="k">return</span> <span class="n">install_dir</span></div>
418
419 <div class="viewcode-block" id="get_base_install_dir"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_base_install_dir">[docs]</a><span class="k">def</span> <span class="nf">get_base_install_dir</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">,</span> <span class="n">version</span><span class="p">):</span>
420     <span class="sd">&quot;&quot;&quot;Compute the installation directory of a product in base </span>
421 <span class="sd">    </span>
422 <span class="sd">    :param config Config: The global configuration</span>
423 <span class="sd">    :param product_info Config: The configuration specific to </span>
424 <span class="sd">                               the product</span>
425 <span class="sd">    :param version str: The version of the product    </span>
426 <span class="sd">    :return: The path of the product installation</span>
427 <span class="sd">    :rtype: str</span>
428 <span class="sd">    &quot;&quot;&quot;</span>    
429     <span class="n">base_path</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">config</span><span class="p">)</span> 
430     <span class="n">prod_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">base_path</span><span class="p">,</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="n">version</span><span class="p">)</span>
431     <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">):</span>
432         <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">,</span> <span class="s2">&quot;config-1&quot;</span><span class="p">)</span>
433     
434     <span class="n">exists</span><span class="p">,</span> <span class="n">install_dir</span> <span class="o">=</span> <span class="n">check_config_exists</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_dir</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">)</span>
435     <span class="k">if</span> <span class="n">exists</span><span class="p">:</span>
436         <span class="k">return</span> <span class="n">install_dir</span>
437     
438     <span class="c1"># Find the first config-&lt;i&gt; directory that is available in the product</span>
439     <span class="c1"># directory</span>
440     <span class="n">found</span> <span class="o">=</span> <span class="kc">False</span> 
441     <span class="n">label</span> <span class="o">=</span> <span class="mi">1</span>
442     <span class="k">while</span> <span class="ow">not</span> <span class="n">found</span><span class="p">:</span>
443         <span class="n">install_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">,</span> <span class="s2">&quot;config-</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">label</span><span class="p">)</span>
444         <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">install_dir</span><span class="p">):</span>
445             <span class="n">label</span><span class="o">+=</span><span class="mi">1</span>
446         <span class="k">else</span><span class="p">:</span>
447             <span class="n">found</span> <span class="o">=</span> <span class="kc">True</span>
448             
449     <span class="k">return</span> <span class="n">install_dir</span></div>
450
451 <div class="viewcode-block" id="check_config_exists"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.check_config_exists">[docs]</a><span class="k">def</span> <span class="nf">check_config_exists</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_dir</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">):</span>
452     <span class="sd">&quot;&quot;&quot;\</span>
453 <span class="sd">    Verify that the installation directory of a product in a base exists</span>
454 <span class="sd">    Check all the config-&lt;i&gt; directory and verify the sat-config.pyconf file</span>
455 <span class="sd">    that is in it </span>
456 <span class="sd">    </span>
457 <span class="sd">    :param config Config: The global configuration</span>
458 <span class="sd">    :param prod_dir str: The product installation directory path </span>
459 <span class="sd">                         (without config-&lt;i&gt;)</span>
460 <span class="sd">    :param product_info Config: The configuration specific to </span>
461 <span class="sd">                               the product</span>
462 <span class="sd">    :return: True or false is the installation is found or not </span>
463 <span class="sd">             and if it is found, the path of the found installation</span>
464 <span class="sd">    :rtype: (boolean, str)</span>
465 <span class="sd">    &quot;&quot;&quot;</span>   
466     <span class="c1"># check if the directories or files of the directory corresponds to the </span>
467     <span class="c1"># directory installation of the product</span>
468     <span class="n">l_dir_and_files</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">)</span>
469     <span class="k">for</span> <span class="n">dir_or_file</span> <span class="ow">in</span> <span class="n">l_dir_and_files</span><span class="p">:</span>
470         <span class="n">oExpr</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">config_expression</span><span class="p">)</span>
471         <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">oExpr</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">dir_or_file</span><span class="p">)):</span>
472             <span class="c1"># not config-&lt;i&gt;, not interesting</span>
473             <span class="k">continue</span>
474         <span class="c1"># check if there is the file sat-config.pyconf file in the installation</span>
475         <span class="c1"># directory    </span>
476         <span class="n">config_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">,</span> <span class="n">dir_or_file</span><span class="p">,</span> <span class="n">src</span><span class="o">.</span><span class="n">CONFIG_FILENAME</span><span class="p">)</span>
477         <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">config_file</span><span class="p">):</span>
478             <span class="k">continue</span>
479         
480         <span class="c1"># If there is no dependency, it is the right path</span>
481         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">prod_info</span><span class="o">.</span><span class="n">depend</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
482             <span class="n">compile_cfg</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Config</span><span class="p">(</span><span class="n">config_file</span><span class="p">)</span>
483             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">compile_cfg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
484                 <span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">,</span> <span class="n">dir_or_file</span><span class="p">)</span>
485             <span class="k">continue</span>
486         
487         <span class="c1"># check if there is the config described in the file corresponds the </span>
488         <span class="c1"># dependencies of the product</span>
489         <span class="n">config_corresponds</span> <span class="o">=</span> <span class="kc">True</span>    
490         <span class="n">compile_cfg</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">pyconf</span><span class="o">.</span><span class="n">Config</span><span class="p">(</span><span class="n">config_file</span><span class="p">)</span>
491         <span class="k">for</span> <span class="n">prod_dep</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">depend</span><span class="p">:</span>
492             <span class="c1"># if the dependency is not in the config, </span>
493             <span class="c1"># the config does not correspond</span>
494             <span class="k">if</span> <span class="n">prod_dep</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">compile_cfg</span><span class="p">:</span>
495                 <span class="n">config_corresponds</span> <span class="o">=</span> <span class="kc">False</span>
496                 <span class="k">break</span>
497             <span class="k">else</span><span class="p">:</span>
498                 <span class="n">prod_dep_info</span> <span class="o">=</span> <span class="n">get_product_config</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_dep</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
499                 <span class="c1"># If the version of the dependency does not correspond, </span>
500                 <span class="c1"># the config does not correspond</span>
501                 <span class="k">if</span> <span class="n">prod_dep_info</span><span class="o">.</span><span class="n">version</span> <span class="o">!=</span> <span class="n">compile_cfg</span><span class="p">[</span><span class="n">prod_dep</span><span class="p">]:</span>
502                     <span class="n">config_corresponds</span> <span class="o">=</span> <span class="kc">False</span>
503                     <span class="k">break</span>
504         
505         <span class="k">for</span> <span class="n">prod_name</span> <span class="ow">in</span> <span class="n">compile_cfg</span><span class="p">:</span>
506             <span class="k">if</span> <span class="n">prod_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">prod_info</span><span class="o">.</span><span class="n">depend</span><span class="p">:</span>
507                 <span class="n">config_corresponds</span> <span class="o">=</span> <span class="kc">False</span>
508                 <span class="k">break</span>
509         
510         <span class="k">if</span> <span class="n">config_corresponds</span><span class="p">:</span>
511             <span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prod_dir</span><span class="p">,</span> <span class="n">dir_or_file</span><span class="p">)</span>
512     
513     <span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">None</span></div>
514             
515             
516     
517 <div class="viewcode-block" id="get_products_infos"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_products_infos">[docs]</a><span class="k">def</span> <span class="nf">get_products_infos</span><span class="p">(</span><span class="n">lproducts</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
518     <span class="sd">&quot;&quot;&quot;Get the specific configuration of a list of products</span>
519 <span class="sd">    </span>
520 <span class="sd">    :param lproducts List: The list of product names</span>
521 <span class="sd">    :param config Config: The global configuration</span>
522 <span class="sd">    :return: the list of tuples </span>
523 <span class="sd">             (product name, specific configuration of the product)</span>
524 <span class="sd">    :rtype: [(str, Config)]</span>
525 <span class="sd">    &quot;&quot;&quot;</span>
526     <span class="n">products_infos</span> <span class="o">=</span> <span class="p">[]</span>
527     <span class="c1"># Loop on product names</span>
528     <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="n">lproducts</span><span class="p">:</span>       
529         <span class="c1"># Get the specific configuration of the product</span>
530         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">get_product_config</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod</span><span class="p">)</span>
531         <span class="k">if</span> <span class="n">prod_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
532             <span class="n">products_infos</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prod</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">))</span>
533         <span class="k">else</span><span class="p">:</span>
534             <span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;The </span><span class="si">%s</span><span class="s2"> product has no definition &quot;</span>
535                     <span class="s2">&quot;in the configuration.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="n">prod</span>
536             <span class="k">raise</span> <span class="n">src</span><span class="o">.</span><span class="n">SatException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
537     <span class="k">return</span> <span class="n">products_infos</span></div>
538
539 <div class="viewcode-block" id="get_product_dependencies"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_product_dependencies">[docs]</a><span class="k">def</span> <span class="nf">get_product_dependencies</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">product_info</span><span class="p">):</span>
540     <span class="sd">&quot;&quot;&quot;\</span>
541 <span class="sd">    Get recursively the list of products that are </span>
542 <span class="sd">    in the product_info dependencies</span>
543 <span class="sd">    </span>
544 <span class="sd">    :param config Config: The global configuration</span>
545 <span class="sd">    :param product_info Config: The configuration specific to </span>
546 <span class="sd">                               the product</span>
547 <span class="sd">    :return: the list of products in dependence</span>
548 <span class="sd">    :rtype: list</span>
549 <span class="sd">    &quot;&quot;&quot;</span>
550     <span class="k">if</span> <span class="s2">&quot;depend&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">or</span> <span class="n">product_info</span><span class="o">.</span><span class="n">depend</span> <span class="o">==</span> <span class="p">[]:</span>
551         <span class="k">return</span> <span class="p">[]</span>
552     <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
553     <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">depend</span><span class="p">:</span>
554         <span class="k">if</span> <span class="n">prod</span> <span class="o">==</span> <span class="n">product_info</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
555             <span class="k">continue</span>
556         <span class="k">if</span> <span class="n">prod</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">res</span><span class="p">:</span>
557             <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">prod</span><span class="p">)</span>
558         <span class="n">prod_info</span> <span class="o">=</span> <span class="n">get_product_config</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod</span><span class="p">)</span>
559         <span class="n">dep_prod</span> <span class="o">=</span> <span class="n">get_product_dependencies</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">prod_info</span><span class="p">)</span>
560         <span class="k">for</span> <span class="n">prod_in_dep</span> <span class="ow">in</span> <span class="n">dep_prod</span><span class="p">:</span>
561             <span class="k">if</span> <span class="n">prod_in_dep</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">res</span><span class="p">:</span>
562                 <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">prod_in_dep</span><span class="p">)</span>
563     <span class="k">return</span> <span class="n">res</span></div>
564
565 <div class="viewcode-block" id="check_installation"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.check_installation">[docs]</a><span class="k">def</span> <span class="nf">check_installation</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
566     <span class="sd">&quot;&quot;&quot;\</span>
567 <span class="sd">    Verify if a product is well installed. Checks install directory presence</span>
568 <span class="sd">    and some additional files if it is defined in the config </span>
569 <span class="sd">    </span>
570 <span class="sd">    :param product_info Config: The configuration specific to </span>
571 <span class="sd">                               the product</span>
572 <span class="sd">    :return: True if it is well installed</span>
573 <span class="sd">    :rtype: boolean</span>
574 <span class="sd">    &quot;&quot;&quot;</span>
575     <span class="k">if</span> <span class="ow">not</span> <span class="n">product_compiles</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
576         <span class="k">return</span> <span class="kc">True</span>
577     <span class="n">install_dir</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">install_dir</span>
578     <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">install_dir</span><span class="p">):</span>
579         <span class="k">return</span> <span class="kc">False</span>
580     <span class="k">if</span> <span class="p">(</span><span class="s2">&quot;present_files&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span> 
581         <span class="s2">&quot;install&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">present_files</span><span class="p">):</span>
582         <span class="k">for</span> <span class="n">file_relative_path</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">present_files</span><span class="o">.</span><span class="n">install</span><span class="p">:</span>
583             <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">install_dir</span><span class="p">,</span> <span class="n">file_relative_path</span><span class="p">)</span>
584             <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
585                 <span class="k">return</span> <span class="kc">False</span>
586     <span class="k">return</span> <span class="kc">True</span></div>
587
588 <div class="viewcode-block" id="check_source"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.check_source">[docs]</a><span class="k">def</span> <span class="nf">check_source</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
589     <span class="sd">&quot;&quot;&quot;Verify if a sources of product is preset. Checks source directory presence</span>
590 <span class="sd">    </span>
591 <span class="sd">    :param product_info Config: The configuration specific to </span>
592 <span class="sd">                               the product</span>
593 <span class="sd">    :return: True if it is well installed</span>
594 <span class="sd">    :rtype: boolean</span>
595 <span class="sd">    &quot;&quot;&quot;</span>
596     <span class="n">DBG</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;check_source product_info&quot;</span><span class="p">,</span> <span class="n">product_info</span><span class="p">)</span>
597     <span class="n">source_dir</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">source_dir</span>
598     <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">source_dir</span><span class="p">):</span>
599         <span class="k">return</span> <span class="kc">False</span>
600     <span class="k">if</span> <span class="p">(</span><span class="s2">&quot;present_files&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span> 
601         <span class="s2">&quot;source&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">present_files</span><span class="p">):</span>
602         <span class="k">for</span> <span class="n">file_relative_path</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">present_files</span><span class="o">.</span><span class="n">source</span><span class="p">:</span>
603             <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">source_dir</span><span class="p">,</span> <span class="n">file_relative_path</span><span class="p">)</span>
604             <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
605                 <span class="k">return</span> <span class="kc">False</span>
606     <span class="k">return</span> <span class="kc">True</span></div>
607
608 <div class="viewcode-block" id="product_is_sample"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_sample">[docs]</a><span class="k">def</span> <span class="nf">product_is_sample</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
609     <span class="sd">&quot;&quot;&quot;Know if a product has the sample type</span>
610 <span class="sd">    </span>
611 <span class="sd">    :param product_info Config: The configuration specific to </span>
612 <span class="sd">                               the product</span>
613 <span class="sd">    :return: True if the product has the sample type, else False</span>
614 <span class="sd">    :rtype: boolean</span>
615 <span class="sd">    &quot;&quot;&quot;</span>
616     <span class="k">if</span> <span class="s1">&#39;type&#39;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="p">:</span>
617         <span class="n">ptype</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">type</span>
618         <span class="k">return</span> <span class="n">ptype</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;sample&#39;</span>
619     <span class="k">else</span><span class="p">:</span>
620         <span class="k">return</span> <span class="kc">False</span></div>
621
622 <div class="viewcode-block" id="product_is_salome"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_salome">[docs]</a><span class="k">def</span> <span class="nf">product_is_salome</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
623     <span class="sd">&quot;&quot;&quot;Know if a product is a SALOME module</span>
624 <span class="sd">    </span>
625 <span class="sd">    :param product_info Config: The configuration specific to </span>
626 <span class="sd">                               the product</span>
627 <span class="sd">    :return: True if the product is a SALOME module, else False</span>
628 <span class="sd">    :rtype: boolean</span>
629 <span class="sd">    &quot;&quot;&quot;</span>
630     <span class="k">return</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
631             <span class="s2">&quot;is_SALOME_module&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
632             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">is_SALOME_module</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)</span></div>
633
634 <div class="viewcode-block" id="product_is_fixed"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_fixed">[docs]</a><span class="k">def</span> <span class="nf">product_is_fixed</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
635     <span class="sd">&quot;&quot;&quot;Know if a product is fixed</span>
636 <span class="sd">    </span>
637 <span class="sd">    :param product_info Config: The configuration specific to </span>
638 <span class="sd">                               the product</span>
639 <span class="sd">    :return: True if the product is fixed, else False</span>
640 <span class="sd">    :rtype: boolean</span>
641 <span class="sd">    &quot;&quot;&quot;</span>
642     <span class="n">get_src</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">get_source</span>
643     <span class="k">return</span> <span class="n">get_src</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;fixed&#39;</span></div>
644
645 <div class="viewcode-block" id="product_is_native"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_native">[docs]</a><span class="k">def</span> <span class="nf">product_is_native</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
646     <span class="sd">&quot;&quot;&quot;Know if a product is native</span>
647 <span class="sd">    </span>
648 <span class="sd">    :param product_info Config: The configuration specific to </span>
649 <span class="sd">                               the product</span>
650 <span class="sd">    :return: True if the product is native, else False</span>
651 <span class="sd">    :rtype: boolean</span>
652 <span class="sd">    &quot;&quot;&quot;</span>
653     <span class="n">get_src</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">get_source</span>
654     <span class="k">return</span> <span class="n">get_src</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;native&#39;</span></div>
655
656 <div class="viewcode-block" id="product_is_dev"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_dev">[docs]</a><span class="k">def</span> <span class="nf">product_is_dev</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
657     <span class="sd">&quot;&quot;&quot;Know if a product is in dev mode</span>
658 <span class="sd">    </span>
659 <span class="sd">    :param product_info Config: The configuration specific to </span>
660 <span class="sd">                               the product</span>
661 <span class="sd">    :return: True if the product is in dev mode, else False</span>
662 <span class="sd">    :rtype: boolean</span>
663 <span class="sd">    &quot;&quot;&quot;</span>
664     <span class="n">dev</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">dev</span>
665     <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="n">dev</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;yes&#39;</span><span class="p">)</span>
666     <span class="n">DBG</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;product_is_dev </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">product_info</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
667     <span class="c1"># if product_info.name == &quot;XDATA&quot;: return True #test #10569</span>
668     <span class="k">return</span> <span class="n">res</span></div>
669
670 <div class="viewcode-block" id="product_is_debug"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_debug">[docs]</a><span class="k">def</span> <span class="nf">product_is_debug</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
671     <span class="sd">&quot;&quot;&quot;Know if a product is in debug mode</span>
672 <span class="sd">    </span>
673 <span class="sd">    :param product_info Config: The configuration specific to </span>
674 <span class="sd">                               the product</span>
675 <span class="sd">    :return: True if the product is in debug mode, else False</span>
676 <span class="sd">    :rtype: boolean</span>
677 <span class="sd">    &quot;&quot;&quot;</span>
678     <span class="n">debug</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">debug</span>
679     <span class="k">return</span> <span class="n">debug</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;yes&#39;</span></div>
680
681 <div class="viewcode-block" id="product_is_autotools"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_autotools">[docs]</a><span class="k">def</span> <span class="nf">product_is_autotools</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
682     <span class="sd">&quot;&quot;&quot;Know if a product is compiled using the autotools</span>
683 <span class="sd">    </span>
684 <span class="sd">    :param product_info Config: The configuration specific to </span>
685 <span class="sd">                               the product</span>
686 <span class="sd">    :return: True if the product is autotools, else False</span>
687 <span class="sd">    :rtype: boolean</span>
688 <span class="sd">    &quot;&quot;&quot;</span>
689     <span class="n">build_src</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">build_source</span>
690     <span class="k">return</span> <span class="n">build_src</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;autotools&#39;</span></div>
691
692 <div class="viewcode-block" id="product_is_cmake"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_cmake">[docs]</a><span class="k">def</span> <span class="nf">product_is_cmake</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
693     <span class="sd">&quot;&quot;&quot;Know if a product is compiled using the cmake</span>
694 <span class="sd">    </span>
695 <span class="sd">    :param product_info Config: The configuration specific to </span>
696 <span class="sd">                               the product</span>
697 <span class="sd">    :return: True if the product is cmake, else False</span>
698 <span class="sd">    :rtype: boolean</span>
699 <span class="sd">    &quot;&quot;&quot;</span>
700     <span class="n">build_src</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">build_source</span>
701     <span class="k">return</span> <span class="n">build_src</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;cmake&#39;</span></div>
702
703 <div class="viewcode-block" id="product_is_vcs"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_vcs">[docs]</a><span class="k">def</span> <span class="nf">product_is_vcs</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
704     <span class="sd">&quot;&quot;&quot;Know if a product is download using git, svn or cvs (not archive)</span>
705 <span class="sd">    </span>
706 <span class="sd">    :param product_info Config: The configuration specific to </span>
707 <span class="sd">                               the product</span>
708 <span class="sd">    :return: True if the product is vcs, else False</span>
709 <span class="sd">    :rtype: boolean</span>
710 <span class="sd">    &quot;&quot;&quot;</span>
711     <span class="k">return</span> <span class="n">product_info</span><span class="o">.</span><span class="n">get_source</span> <span class="ow">in</span> <span class="n">AVAILABLE_VCS</span></div>
712
713 <div class="viewcode-block" id="product_is_smesh_plugin"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_smesh_plugin">[docs]</a><span class="k">def</span> <span class="nf">product_is_smesh_plugin</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
714     <span class="sd">&quot;&quot;&quot;Know if a product is a SMESH plugin</span>
715 <span class="sd">    </span>
716 <span class="sd">    :param product_info Config: The configuration specific to </span>
717 <span class="sd">                               the product</span>
718 <span class="sd">    :return: True if the product is a SMESH plugin, else False</span>
719 <span class="sd">    :rtype: boolean</span>
720 <span class="sd">    &quot;&quot;&quot;</span>
721     <span class="k">return</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
722             <span class="s2">&quot;smesh_plugin&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
723             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">smesh_plugin</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)</span></div>
724
725 <div class="viewcode-block" id="product_is_cpp"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_cpp">[docs]</a><span class="k">def</span> <span class="nf">product_is_cpp</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
726     <span class="sd">&quot;&quot;&quot;Know if a product is cpp</span>
727 <span class="sd">    </span>
728 <span class="sd">    :param product_info Config: The configuration specific to </span>
729 <span class="sd">                               the product</span>
730 <span class="sd">    :return: True if the product is a cpp, else False</span>
731 <span class="sd">    :rtype: boolean</span>
732 <span class="sd">    &quot;&quot;&quot;</span>
733     <span class="k">return</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
734             <span class="s2">&quot;cpp&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
735             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">cpp</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)</span></div>
736
737 <div class="viewcode-block" id="product_compiles"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_compiles">[docs]</a><span class="k">def</span> <span class="nf">product_compiles</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
738     <span class="sd">&quot;&quot;&quot;\</span>
739 <span class="sd">    Know if a product compiles or not </span>
740 <span class="sd">    (some products do not have a compilation procedure)</span>
741 <span class="sd">    </span>
742 <span class="sd">    :param product_info Config: The configuration specific to </span>
743 <span class="sd">                               the product</span>
744 <span class="sd">    :return: True if the product compiles, else False</span>
745 <span class="sd">    :rtype: boolean</span>
746 <span class="sd">    &quot;&quot;&quot;</span>
747     <span class="k">return</span> <span class="ow">not</span><span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
748             <span class="s2">&quot;compilation&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
749             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">compilation</span> <span class="o">==</span> <span class="s2">&quot;no&quot;</span><span class="p">)</span></div>
750
751 <div class="viewcode-block" id="product_has_script"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_has_script">[docs]</a><span class="k">def</span> <span class="nf">product_has_script</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
752     <span class="sd">&quot;&quot;&quot;Know if a product has a compilation script</span>
753 <span class="sd">    </span>
754 <span class="sd">    :param product_info Config: The configuration specific to </span>
755 <span class="sd">                               the product</span>
756 <span class="sd">    :return: True if the product it has a compilation script, else False</span>
757 <span class="sd">    :rtype: boolean</span>
758 <span class="sd">    &quot;&quot;&quot;</span>
759     <span class="k">if</span> <span class="s2">&quot;build_source&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">product_info</span><span class="p">:</span>
760         <span class="c1"># Native case</span>
761         <span class="k">return</span> <span class="kc">False</span>
762     <span class="n">build_src</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">build_source</span>
763     <span class="k">return</span> <span class="n">build_src</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;script&#39;</span></div>
764
765 <div class="viewcode-block" id="product_has_env_script"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_has_env_script">[docs]</a><span class="k">def</span> <span class="nf">product_has_env_script</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
766     <span class="sd">&quot;&quot;&quot;Know if a product has an environment script</span>
767 <span class="sd">    </span>
768 <span class="sd">    :param product_info Config: The configuration specific to </span>
769 <span class="sd">                               the product</span>
770 <span class="sd">    :return: True if the product it has an environment script, else False</span>
771 <span class="sd">    :rtype: boolean</span>
772 <span class="sd">    &quot;&quot;&quot;</span>
773     <span class="k">return</span> <span class="s2">&quot;environ&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span> <span class="s2">&quot;env_script&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">environ</span></div>
774
775 <div class="viewcode-block" id="product_has_patches"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_has_patches">[docs]</a><span class="k">def</span> <span class="nf">product_has_patches</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
776     <span class="sd">&quot;&quot;&quot;Know if a product has one or more patches</span>
777 <span class="sd">    </span>
778 <span class="sd">    :param product_info Config: The configuration specific to </span>
779 <span class="sd">                               the product</span>
780 <span class="sd">    :return: True if the product has one or more patches</span>
781 <span class="sd">    :rtype: boolean</span>
782 <span class="sd">    &quot;&quot;&quot;</span>   
783     <span class="n">res</span> <span class="o">=</span> <span class="p">(</span> <span class="s2">&quot;patches&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">product_info</span><span class="o">.</span><span class="n">patches</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span>
784     <span class="n">DBG</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;product_has_patches </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">product_info</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
785     <span class="c1"># if product_info.name == &quot;XDATA&quot;: return True #test #10569</span>
786     <span class="k">return</span> <span class="n">res</span></div>
787
788 <div class="viewcode-block" id="product_has_logo"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_has_logo">[docs]</a><span class="k">def</span> <span class="nf">product_has_logo</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
789     <span class="sd">&quot;&quot;&quot;Know if a product has a logo (YACSGEN generate)</span>
790 <span class="sd">    </span>
791 <span class="sd">    :param product_info Config: The configuration specific to </span>
792 <span class="sd">                               the product</span>
793 <span class="sd">    :return: The path of the logo if the product has a logo, else False</span>
794 <span class="sd">    :rtype: Str</span>
795 <span class="sd">    &quot;&quot;&quot;</span>
796     <span class="k">if</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
797             <span class="s2">&quot;logo&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="p">):</span>
798         <span class="k">return</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">logo</span>
799     <span class="k">else</span><span class="p">:</span>
800         <span class="k">return</span> <span class="kc">False</span></div>
801
802 <div class="viewcode-block" id="product_has_salome_gui"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_has_salome_gui">[docs]</a><span class="k">def</span> <span class="nf">product_has_salome_gui</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
803     <span class="sd">&quot;&quot;&quot;Know if a product has a SALOME gui</span>
804 <span class="sd">    </span>
805 <span class="sd">    :param product_info Config: The configuration specific to </span>
806 <span class="sd">                               the product</span>
807 <span class="sd">    :return: True if the product has a SALOME gui, else False</span>
808 <span class="sd">    :rtype: Boolean</span>
809 <span class="sd">    &quot;&quot;&quot;</span>
810     <span class="k">return</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
811             <span class="s2">&quot;has_salome_gui&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
812             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">has_salome_gui</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)</span></div>
813
814 <div class="viewcode-block" id="product_is_mpi"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_mpi">[docs]</a><span class="k">def</span> <span class="nf">product_is_mpi</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
815     <span class="sd">&quot;&quot;&quot;Know if a product has openmpi in its dependencies</span>
816 <span class="sd">    </span>
817 <span class="sd">    :param product_info Config: The configuration specific to </span>
818 <span class="sd">                               the product</span>
819 <span class="sd">    :return: True if the product has openmpi inits dependencies</span>
820 <span class="sd">    :rtype: boolean</span>
821 <span class="sd">    &quot;&quot;&quot;</span>
822     <span class="k">return</span> <span class="s2">&quot;openmpi&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">depend</span></div>
823
824 <div class="viewcode-block" id="product_is_generated"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.product_is_generated">[docs]</a><span class="k">def</span> <span class="nf">product_is_generated</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
825     <span class="sd">&quot;&quot;&quot;Know if a product is generated (YACSGEN)</span>
826 <span class="sd">    </span>
827 <span class="sd">    :param product_info Config: The configuration specific to </span>
828 <span class="sd">                               the product</span>
829 <span class="sd">    :return: True if the product is generated</span>
830 <span class="sd">    :rtype: boolean</span>
831 <span class="sd">    &quot;&quot;&quot;</span>
832     <span class="k">return</span> <span class="p">(</span><span class="s2">&quot;properties&quot;</span> <span class="ow">in</span> <span class="n">product_info</span> <span class="ow">and</span>
833             <span class="s2">&quot;generate&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span> <span class="ow">and</span>
834             <span class="n">product_info</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">generate</span> <span class="o">==</span> <span class="s2">&quot;yes&quot;</span><span class="p">)</span></div>
835
836 <div class="viewcode-block" id="get_product_components"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.product.get_product_components">[docs]</a><span class="k">def</span> <span class="nf">get_product_components</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
837     <span class="sd">&quot;&quot;&quot;Get the component list to generate with the product</span>
838 <span class="sd">    </span>
839 <span class="sd">    :param product_info Config: The configuration specific to </span>
840 <span class="sd">                               the product</span>
841 <span class="sd">    :return: The list of names of the components</span>
842 <span class="sd">    :rtype: List</span>
843 <span class="sd">    </span>
844 <span class="sd">    &quot;&quot;&quot;</span>
845     <span class="k">if</span> <span class="ow">not</span> <span class="n">product_is_generated</span><span class="p">(</span><span class="n">product_info</span><span class="p">):</span>
846         <span class="k">return</span> <span class="p">[]</span>
847     
848     <span class="n">compo_list</span> <span class="o">=</span> <span class="p">[]</span>
849     <span class="k">if</span> <span class="s2">&quot;component_name&quot;</span> <span class="ow">in</span> <span class="n">product_info</span><span class="p">:</span>
850         <span class="n">compo_list</span> <span class="o">=</span> <span class="n">product_info</span><span class="o">.</span><span class="n">component_name</span>
851     
852         <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">compo_list</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
853             <span class="n">compo_list</span> <span class="o">=</span> <span class="p">[</span> <span class="n">compo_list</span> <span class="p">]</span>
854
855     <span class="k">return</span> <span class="n">compo_list</span></div>
856 </pre></div>
857
858           </div>
859         </div>
860       </div>
861       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
862         <div class="sphinxsidebarwrapper">
863             <p class="logo"><a href="../../index.html">
864               <img class="logo" src="../../_static/sat_v5.0.png" alt="Logo"/>
865             </a></p><div class="relations">
866 <h3>Related Topics</h3>
867 <ul>
868   <li><a href="../../index.html">Documentation overview</a><ul>
869   <li><a href="../index.html">Module code</a><ul>
870   </ul></li>
871   </ul></li>
872 </ul>
873 </div>
874 <div id="searchbox" style="display: none" role="search">
875   <h3>Quick search</h3>
876     <div class="searchformwrapper">
877     <form class="search" action="../../search.html" method="get">
878       <input type="text" name="q" />
879       <input type="submit" value="Go" />
880       <input type="hidden" name="check_keywords" value="yes" />
881       <input type="hidden" name="area" value="default" />
882     </form>
883     </div>
884 </div>
885 <script type="text/javascript">$('#searchbox').show(0);</script>
886         </div>
887       </div>
888       <div class="clearer"></div>
889     </div>
890     <div class="footer">
891       &copy;2018, CEA.
892       
893       |
894       Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.3</a>
895       &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a>
896       
897     </div>
898
899     
900
901     
902   </body>
903 </html>