Drush: commands/make/generate.make.inc Source File

  1. 7.x doxygen/html/generate_8make_8inc_source.html
  2. master doxygen/html/generate_8make_8inc_source.html
Go to the documentation of this file.
1 <?php
2 /**
3  * @file
4  * Functions for the generate makefile command.
5  */
6 
7 include_once DRUSH_DRUPAL_CORE . '/includes/install.inc';
8 include_once drupal_get_path('module', 'system') . '/system.install';
9 include_once 'generate.contents.make.inc';
10 
11 /**
12  * Drush callback; generate makefile from the current build.
13  */
14 function drush_make_generate($file = NULL) {
15  $version_options = _drush_make_generate_get_version_options();
16  $all_extensions = drush_get_extensions();
17  list($projects, $libraries) = _drush_make_generate_projects($all_extensions, $version_options);
18  $core = drush_drupal_major_version() . '.x';
19  $contents = make_generate_makefile_contents($projects, $libraries, $core);
20 
21  // Write or print our makefile.
22  make_generate_print($contents, $file);
23 }
24 
25 /**
26  * Create the $version_options array from the --include-versions and
27  * --exclude-versions command line options.
28  */
30  // What projects should we pin the versions for?
31  // Check the command-line options for details.
32  foreach (array("include", "exclude") as $option) {
33  $version_options[$option] = drush_get_option("$option-versions");
34  if ($version_options[$option] !== TRUE) {
35  $version_options[$option] = array_filter(explode(",", $version_options[$option]));
36  }
37  }
38  return $version_options;
39 }
40 
41 /**
42  * Generate the $projects makefile array for the current site.
43  */
44 function _drush_make_generate_projects($all_extensions, $version_options) {
45  $release_info = drush_get_engine('release_info');
46 
47  $projects = array();
48  $project_libraries = array();
49 
50  $system_requirements = system_requirements('runtime');
51  // Update xml expects the drupal version to be expressed as "7.x" or "8.x"
52  // We used to check $system_requirements['drupal']['value'], but this now
53  // contains values such as "7.10-dev".
54  $drupal_major_version = drush_drupal_major_version() . '.x';
55  $core_project = strtolower($system_requirements['drupal']['title']);
56  $projects[$core_project] = array('_type' => 'core');
57  if ($core_project != 'drupal') {
58  $projects[$core_project]['custom_download'] = TRUE;
59  $projects[$core_project]['type'] = 'core';
60  }
61  else {
62  // Drupal core - we can determine the version if required.
63  if (_drush_generate_track_version("drupal", $version_options)) {
64  $projects[$core_project]["version"] = drush_drupal_version();
65  }
66  }
67 
68  $install_profile = drush_drupal_major_version() >= 7 ? drupal_get_profile() : variable_get('install_profile', '');
69  if (!in_array($install_profile, array('default', 'standard', 'minimal', 'testing')) && $install_profile != '') {
70  $projects[$install_profile]['type']
71  = $projects[$install_profile]['_type'] = 'profile';
72  $request = array(
73  'name' => $install_profile,
74  'drupal_version' => $drupal_major_version,
75  );
76  if (!$release_info->checkProject($request, 'profile')) {
77  $projects[$install_profile]['custom_download'] = TRUE;
78  }
79  }
80 
81  // Iterate installed projects to build $projects array.
82  $extensions = $all_extensions;
83  $project_info = drush_get_projects($extensions);
84  foreach ($project_info as $name => $project) {
85  // Discard the extensions within this project. At the end $extensions will
86  // contain only extensions part of custom projects (not from drupal.org or
87  // other update service).
88  foreach ($project['extensions'] as $ext) {
89  unset($extensions[$ext]);
90  }
91  if ($name == 'drupal') {
92  continue;
93  }
94  $type = $project['type'];
95  // Discard projects with all modules disabled.
96  if (($type == 'module') && (!$project['status'])) {
97  continue;
98  }
99  $projects[$name] = array('_type' => $type);
100  // Check the project is on drupal.org or its own update service.
101  $request = array(
102  'name' => $name,
103  'drupal_version' => $drupal_major_version,
104  );
105  if (isset($project['status url'])) {
106  $request['status url'] = $project['status url'];
107  $projects[$name]['location'] = $project['status url'];
108  }
109  if (!$release_info->checkProject($request, $type)) {
110  // It is not a project on drupal.org neither an external update service.
111  $projects[$name]['type'] = $type;
112  $projects[$name]['custom_download'] = TRUE;
113  }
114  // Add 'subdir' if the project is installed in a non-default location.
115  if (isset($project['path'])) {
116  $projects[$name] += _drush_generate_makefile_check_path($project);
117  }
118  // Add version number if this project's version is to be tracked.
119  if (_drush_generate_track_version($name, $version_options) && $project["version"]) {
120  $version = preg_replace("/^" . drush_get_drupal_core_compatibility() . "-/", "", $project["version"]);
121  // Strip out MINOR+GIT_COMMIT strings for dev releases.
122  if (substr($version, -4) == '-dev' && strpos($version, '+')) {
123  $version = substr($version, 0, strrpos($version, '.')) . '.x-dev';
124  }
125  $projects[$name]['version'] = $version;
126  }
127  foreach ($project['extensions'] as $extension_name) {
128  _drush_make_generate_add_patch_files($projects[$name], _drush_extension_get_path($all_extensions[$extension_name]));
129  }
130  }
131 
132  // Add a project for each unknown extension.
133  foreach ($extensions as $name => $extension) {
134  list($project_name, $project_data) = _drush_generate_custom_project($name, $extension, $version_options);
135  $projects[$project_name] = $project_data;
136  }
137 
138  // Add libraries.
139  if (function_exists('libraries_get_libraries')) {
140  $libraries = libraries_get_libraries();
141  foreach ($libraries as $library_name => $library_path) {
142  $path = explode('/', $library_path);
143  $project_libraries[$library_name] = array(
144  'directory_name' => $path[(count($path) - 1)],
145  'custom_download' => TRUE,
146  'type' => 'library',
147  '_type' => 'librarie', // For plural.
148  );
149  }
150  }
151  return array($projects, $project_libraries);
152 }
153 
154 /**
155  * Record any patches that were applied to this project
156  * per information stored in PATCHES.txt.
157  */
158 function _drush_make_generate_add_patch_files(&$project, $location) {
159  $patchfile = DRUPAL_ROOT . '/' . $location . '/PATCHES.txt';
160  if (is_file($patchfile)) {
161  foreach (file($patchfile) as $line) {
162  if (substr($line, 0, 2) == '- ') {
163  $project['patch'][] = trim(substr($line, 2));
164  }
165  }
166  }
167 }
168 
169 /**
170  * Create a project record for an extension not downloaded from drupal.org
171  */
172 function _drush_generate_custom_project($name, $extension, $version_options) {
173  $project['_type'] = drush_extension_get_type($extension);
174  $project['type'] = drush_extension_get_type($extension);
175  $location = drush_extension_get_path($extension);
176  // To start off, we will presume that our custom extension is
177  // stored in a folder named after its project, and there are
178  // no subfolders between the .info file and the project root.
179  $project_name = basename($location);
180  drush_shell_cd_and_exec($location, 'git rev-parse --git-dir 2> ' . drush_bit_bucket());
181  $output = drush_shell_exec_output();
182  if (!empty($output)) {
183  $git_dir = $output[0];
184  // Find the actual base of the git repository.
185  $repo_root = $git_dir == ".git" ? $location : dirname($git_dir);
186  // If the repository root is at the drupal root or some parent
187  // of the drupal root, or some other location that could not
188  // pausibly be a project, then there is nothing we can do.
189  // (We can't tell Drush make to download some sub-part of a repo,
190  // can we?)
191  if ($repo_project_name = _drush_generate_validate_repo_location($repo_root)) {
192  $project_name = $repo_project_name;
193  drush_shell_cd_and_exec($repo_root, 'git remote show origin');
194  $output = drush_shell_exec_output();
195  foreach ($output as $line) {
196  if (strpos($line, "Fetch URL:") !== FALSE) {
197  $url = preg_replace('/ *Fetch URL: */', '', $line);
198  if (!empty($url)) {
199  // We use the unconventional-looking keys
200  // `download][type` and `download][url` so that
201  // we can produce output that appears to be two-dimensional
202  // arrays from a single-dimensional array.
203  $project['download][type'] = 'git';
204  $project['download][url'] = $url;
205 
206  // Fill in the branch as well.
207  drush_shell_cd_and_exec($repo_root, 'git branch');
208  $output = drush_shell_exec_output();
209  foreach ($output as $line) {
210  if ($line{0} == '*') {
211  $branch = substr($line, 2);
212  if ($branch != "master") {
213  $project['download][branch'] = $branch;
214  }
215  }
216  }
217 
218  // Put in the commit hash.
219  drush_shell_cd_and_exec($repo_root, 'git log');
220  $output = drush_shell_exec_output();
221  if (substr($output[0], 0, 7) == "commit ") {
222  $revision = substr($output[0], 7);
223  if (_drush_generate_track_version($project_name, $version_options)) {
224  $project['download][revision'] = $revision;
225  }
226  }
227 
228  // Add patch files, if any.
229  _drush_make_generate_add_patch_files($project, $repo_root);
230  }
231  }
232  }
233  }
234  }
235  // If we could not figure out where the extension came from, then give up and
236  // flag it as a "custom" download.
237  if (!isset($project['download][type'])) {
238  $project['custom_download'] = TRUE;
239  }
240  return array($project_name, $project);
241 }
242 
243 /**
244  * If the user has checked in the Drupal root, or the 'sites/all/modules'
245  * folder into a git repository, then we do not want to confuse that location
246  * with a "project".
247  */
249  $project_name = basename($repo_root);
250  // The Drupal root, or any folder immediately inside the Drupal
251  // root cannot be a project location.
252  if ((strlen(DRUPAL_ROOT) >= strlen($repo_root)) || (dirname($repo_root) == DRUPAL_ROOT)) {
253  return NULL;
254  }
255  // Also exclude sites/* and sites/*/{modules,themes} and profile/* and
256  // profile/*/{modules,themes}.
257  return $project_name;
258 }
259 
260 /**
261  * Helper function to determine if a given project is to have its version
262  * tracked.
263  */
264 function _drush_generate_track_version($project, $version_options) {
265  // A. If --exclude-versions has been specified:
266  // A.a. if it's a boolean, check the --include-versions option.
267  if ($version_options["exclude"] === TRUE) {
268  // A.a.1 if --include-versions has been specified, ensure it's an array.
269  if (is_array($version_options["include"])) {
270  return in_array($project, $version_options["include"]);
271  }
272  // A.a.2 If no include array, then we're excluding versions for ALL
273  // projects.
274  return FALSE;
275  }
276  // A.b. if --exclude-versions is an array with items, check this project is in
277  // it: if so, then return FALSE.
278  elseif (is_array($version_options["exclude"]) && count($version_options["exclude"])) {
279  return !in_array($project, $version_options["exclude"]);
280  }
281 
282  // B. If by now no --exclude-versions, but --include-versions is an array,
283  // examine it for this project.
284  if (is_array($version_options["include"]) && count($version_options["include"])) {
285  return in_array($project, $version_options["include"]);
286  }
287 
288  // If none of the above conditions match, include version number by default.
289  return TRUE;
290 }
291 
292 /**
293  * Helper function to check for a non-default installation location.
294  */
296  $info = array();
297  $type = $project['type'];
298  $path = dirname($project['path']);
299  // Check to see if the path is in a subdir sites/all/modules or
300  // profiles/profilename/modules
301  if (preg_match('@^sites/[a-zA-Z0-9_]*/' . $type . 's/..*@', $path) || preg_match('@^sites/[a-zA-Z0-9_]*/' . $type . 's/..*@', $path)) {
302  $subdir = preg_replace(array('@^[a-zA-Z0-9_]*/[a-zA-Z0-9_]*/' . $type . 's/*@', "@/$name" . '$@'), '', $path);
303  if (!empty($subdir)) {
304  $info['subdir'] = $subdir;
305  }
306  }
307  return $info;
308 }

File

doxygen/html/generate_8make_8inc_source.html
View source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>Drush: commands/make/generate.make.inc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Drush
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_71080c12e208a9908650860bfe2a57f6.html">make</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">generate.make.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="generate_8make_8inc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;&lt;?php<span class="comment"></span></div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> * @file</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Functions for the generate makefile command.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;include_once DRUSH_DRUPAL_CORE . <span class="stringliteral">&#39;/includes/install.inc&#39;</span>;</div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;include_once drupal_get_path(<span class="stringliteral">&#39;module&#39;</span>, <span class="stringliteral">&#39;system&#39;</span>) . <span class="stringliteral">&#39;/system.install&#39;</span>;</div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;include_once <span class="stringliteral">&#39;generate.contents.make.inc&#39;</span>;</div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * Drush callback; generate makefile from the current build.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#affbdb849f1d2299740a4ea789ef29bfb">   14</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#affbdb849f1d2299740a4ea789ef29bfb">drush_make_generate</a>($file = NULL) {</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;  $version_options = <a class="code" href="generate_8make_8inc.html#a7bcbdc0585c922d0e1e5953920f877f4">_drush_make_generate_get_version_options</a>();</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;  $all_extensions = <a class="code" href="includes_2environment_8inc.html#a2f6ea049bc3f5361815aafe6f44a535d">drush_get_extensions</a>();</div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;  list($projects, $libraries) = <a class="code" href="generate_8make_8inc.html#aa4ffaa2643ef640c4768f3635bba29a1">_drush_make_generate_projects</a>($all_extensions, $version_options);</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;  $core = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() . <span class="stringliteral">&#39;.x&#39;</span>;</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;  $contents = <a class="code" href="generate_8contents_8make_8inc.html#a033fd5bb6d4c1d71983a6a264b939ab6">make_generate_makefile_contents</a>($projects, $libraries, $core);</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;  <span class="comment">// Write or print our makefile.</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;  <a class="code" href="generate_8contents_8make_8inc.html#a9278fc4dc378fb42d217a56646d6d6d9">make_generate_print</a>($contents, $file);</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;}</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * Create the $version_options array from the --include-versions and</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * --exclude-versions command line options.</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#a7bcbdc0585c922d0e1e5953920f877f4">   29</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#a7bcbdc0585c922d0e1e5953920f877f4">_drush_make_generate_get_version_options</a>() {</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  <span class="comment">// What projects should we pin the versions for?</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;  <span class="comment">// Check the command-line options for details.</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;  <span class="keywordflow">foreach</span> (array(<span class="stringliteral">&quot;include&quot;</span>, <span class="stringliteral">&quot;exclude&quot;</span>) as $option) {</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    $version_options[$option] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&quot;$option-versions&quot;</span>);</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keywordflow">if</span> ($version_options[$option] !== TRUE) {</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;      $version_options[$option] = array_filter(explode(<span class="stringliteral">&quot;,&quot;</span>, $version_options[$option]));</div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    }</div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;  }</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;  <span class="keywordflow">return</span> $version_options;</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;}</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"> * Generate the $projects makefile array for the current site.</span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#aa4ffaa2643ef640c4768f3635bba29a1">   44</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#aa4ffaa2643ef640c4768f3635bba29a1">_drush_make_generate_projects</a>($all_extensions, $version_options) {</div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;  $release_info = <a class="code" href="engines_8inc.html#a34ff5c6bb43688e04d0647eddf48d553">drush_get_engine</a>(<span class="stringliteral">&#39;release_info&#39;</span>);</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;  $projects = array();</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;  $project_libraries = array();</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;  $system_requirements = system_requirements(<span class="stringliteral">&#39;runtime&#39;</span>);</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;  <span class="comment">// Update xml expects the drupal version to be expressed as &quot;7.x&quot; or &quot;8.x&quot;</span></div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  <span class="comment">// We used to check $system_requirements[&#39;drupal&#39;][&#39;value&#39;], but this now</span></div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;  <span class="comment">// contains values such as &quot;7.10-dev&quot;.</span></div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  $drupal_major_version = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() . <span class="stringliteral">&#39;.x&#39;</span>;</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;  $core_project = strtolower($system_requirements[<span class="stringliteral">&#39;drupal&#39;</span>][<span class="stringliteral">&#39;title&#39;</span>]);</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;  $projects[$core_project] = array(<span class="stringliteral">&#39;_type&#39;</span> =&gt; <span class="stringliteral">&#39;core&#39;</span>);</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;  <span class="keywordflow">if</span> ($core_project != <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    $projects[$core_project][<span class="stringliteral">&#39;custom_download&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    $projects[$core_project][<span class="stringliteral">&#39;type&#39;</span>] = <span class="stringliteral">&#39;core&#39;</span>;</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;  }</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;    <span class="comment">// Drupal core - we can determine the version if required.</span></div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="generate_8make_8inc.html#a464e16976fa3f1a90063036e6646bfcc">_drush_generate_track_version</a>(<span class="stringliteral">&quot;drupal&quot;</span>, $version_options)) {</div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;      $projects[$core_project][<span class="stringliteral">&quot;version&quot;</span>] = <a class="code" href="drupal_8inc.html#a203e989fd043d054d774954e2b2dff21">drush_drupal_version</a>();</div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    }</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;  }</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;  $install_profile = <a class="code" href="drupal_8inc.html#ad2ccab77d4bc8e7355186f26cd328ac0">drush_drupal_major_version</a>() &gt;= 7 ? drupal_get_profile() : variable_get(<span class="stringliteral">&#39;install_profile&#39;</span>, <span class="stringliteral">&#39;&#39;</span>);</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;  <span class="keywordflow">if</span> (!in_array($install_profile, array(<span class="stringliteral">&#39;default&#39;</span>, <span class="stringliteral">&#39;standard&#39;</span>, <span class="stringliteral">&#39;minimal&#39;</span>, <span class="stringliteral">&#39;testing&#39;</span>)) &amp;&amp; $install_profile != <span class="stringliteral">&#39;&#39;</span>) {</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    $projects[$install_profile][<span class="stringliteral">&#39;type&#39;</span>]</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;      = $projects[$install_profile][<span class="stringliteral">&#39;_type&#39;</span>] = <span class="stringliteral">&#39;profile&#39;</span>;</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    $request = array(</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;      <span class="stringliteral">&#39;name&#39;</span> =&gt; $install_profile,</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;      <span class="stringliteral">&#39;drupal_version&#39;</span> =&gt; $drupal_major_version,</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    );</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="keywordflow">if</span> (!$release_info-&gt;checkProject($request, <span class="stringliteral">&#39;profile&#39;</span>)) {</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;      $projects[$install_profile][<span class="stringliteral">&#39;custom_download&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;    }</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;  }</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;  <span class="comment">// Iterate installed projects to build $projects array.</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;  $extensions = $all_extensions;</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  $project_info = <a class="code" href="group__extensions.html#gadf92772f6521fbc75a53ccec7e5e007e">drush_get_projects</a>($extensions);</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;  <span class="keywordflow">foreach</span> ($project_info as $name =&gt; $project) {</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    <span class="comment">// Discard the extensions within this project. At the end $extensions will</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="comment">// contain only extensions part of custom projects (not from drupal.org or</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    <span class="comment">// other update service).</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    <span class="keywordflow">foreach</span> ($project[<span class="stringliteral">&#39;extensions&#39;</span>] as $ext) {</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;      unset($extensions[$ext]);</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    }</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    <span class="keywordflow">if</span> ($name == <span class="stringliteral">&#39;drupal&#39;</span>) {</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;    }</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    $type = $project[<span class="stringliteral">&#39;type&#39;</span>];</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="comment">// Discard projects with all modules disabled.</span></div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keywordflow">if</span> (($type == <span class="stringliteral">&#39;module&#39;</span>) &amp;&amp; (!$project[<span class="stringliteral">&#39;status&#39;</span>])) {</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;      <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    }</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    $projects[$name] = array(<span class="stringliteral">&#39;_type&#39;</span> =&gt; $type);</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="comment">// Check the project is on drupal.org or its own update service.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    $request = array(</div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;      <span class="stringliteral">&#39;name&#39;</span> =&gt; $name,</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;      <span class="stringliteral">&#39;drupal_version&#39;</span> =&gt; $drupal_major_version,</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    );</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    <span class="keywordflow">if</span> (isset($project[<span class="stringliteral">&#39;status url&#39;</span>])) {</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;      $request[<span class="stringliteral">&#39;status url&#39;</span>] = $project[<span class="stringliteral">&#39;status url&#39;</span>];</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;      $projects[$name][<span class="stringliteral">&#39;location&#39;</span>] = $project[<span class="stringliteral">&#39;status url&#39;</span>];</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    }</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordflow">if</span> (!$release_info-&gt;checkProject($request, $type)) {</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;      <span class="comment">// It is not a project on drupal.org neither an external update service.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;      $projects[$name][<span class="stringliteral">&#39;type&#39;</span>] = $type;</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;      $projects[$name][<span class="stringliteral">&#39;custom_download&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    }</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;    <span class="comment">// Add &#39;subdir&#39; if the project is installed in a non-default location.</span></div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    <span class="keywordflow">if</span> (isset($project[<span class="stringliteral">&#39;path&#39;</span>])) {</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;      $projects[$name] += <a class="code" href="generate_8make_8inc.html#a017a9b9924374777ca099b87a599e822">_drush_generate_makefile_check_path</a>($project);</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;    }</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    <span class="comment">// Add version number if this project&#39;s version is to be tracked.</span></div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="generate_8make_8inc.html#a464e16976fa3f1a90063036e6646bfcc">_drush_generate_track_version</a>($name, $version_options) &amp;&amp; $project[<span class="stringliteral">&quot;version&quot;</span>]) {</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;      $version = preg_replace(<span class="stringliteral">&quot;/^&quot;</span> . <a class="code" href="includes_2environment_8inc.html#a02b3e67cdaf5abc38c32b207ba2aee60">drush_get_drupal_core_compatibility</a>() . <span class="stringliteral">&quot;-/&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, $project[<span class="stringliteral">&quot;version&quot;</span>]);</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;      <span class="comment">// Strip out MINOR+GIT_COMMIT strings for dev releases.</span></div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;      <span class="keywordflow">if</span> (substr($version, -4) == <span class="stringliteral">&#39;-dev&#39;</span> &amp;&amp; strpos($version, <span class="charliteral">&#39;+&#39;</span>)) {</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        $version = substr($version, 0, strrpos($version, <span class="charliteral">&#39;.&#39;</span>)) . <span class="stringliteral">&#39;.x-dev&#39;</span>;</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;      }</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;      $projects[$name][<span class="stringliteral">&#39;version&#39;</span>] = $version;</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    }</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    <span class="keywordflow">foreach</span> ($project[<span class="stringliteral">&#39;extensions&#39;</span>] as $extension_name) {</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;      <a class="code" href="generate_8make_8inc.html#a4d28b99ba3b0c35775dbef2a6347ca15">_drush_make_generate_add_patch_files</a>($projects[$name], <a class="code" href="commands_2core_2drupal_2environment_8inc.html#a3a2d23907fbfa722e287ccadd5fe49ae">_drush_extension_get_path</a>($all_extensions[$extension_name]));</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    }</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  }</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;  <span class="comment">// Add a project for each unknown extension.</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;  <span class="keywordflow">foreach</span> ($extensions as $name =&gt; $extension) {</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    list($project_name, $project_data) = <a class="code" href="generate_8make_8inc.html#afbe1b490c8c2f78c3ec0634b1903782f">_drush_generate_custom_project</a>($name, $extension, $version_options);</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    $projects[$project_name] = $project_data;</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;  }</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;  <span class="comment">// Add libraries.</span></div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;  <span class="keywordflow">if</span> (function_exists(<span class="stringliteral">&#39;libraries_get_libraries&#39;</span>)) {</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    $libraries = libraries_get_libraries();</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <span class="keywordflow">foreach</span> ($libraries as $library_name =&gt; $library_path) {</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;      $path = explode(<span class="charliteral">&#39;/&#39;</span>, $library_path);</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;      $project_libraries[$library_name] = array(</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        <span class="stringliteral">&#39;directory_name&#39;</span> =&gt; $path[(count($path) - 1)],</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        <span class="stringliteral">&#39;custom_download&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        <span class="stringliteral">&#39;type&#39;</span> =&gt; <span class="stringliteral">&#39;library&#39;</span>,</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        <span class="stringliteral">&#39;_type&#39;</span> =&gt; <span class="stringliteral">&#39;librarie&#39;</span>, <span class="comment">// For plural.</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;      );</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    }</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;  }</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;  <span class="keywordflow">return</span> array($projects, $project_libraries);</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;}</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="comment"> * Record any patches that were applied to this project</span></div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment"> * per information stored in PATCHES.txt.</span></div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#a4d28b99ba3b0c35775dbef2a6347ca15">  158</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#a4d28b99ba3b0c35775dbef2a6347ca15">_drush_make_generate_add_patch_files</a>(&amp;$project, $location) {</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;  $patchfile = DRUPAL_ROOT . <span class="charliteral">&#39;/&#39;</span> . $location . <span class="stringliteral">&#39;/PATCHES.txt&#39;</span>;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;  <span class="keywordflow">if</span> (is_file($patchfile)) {</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    <span class="keywordflow">foreach</span> (file($patchfile) as $line) {</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;      <span class="keywordflow">if</span> (substr($line, 0, 2) == <span class="stringliteral">&#39;- &#39;</span>) {</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;        $project[<span class="stringliteral">&#39;patch&#39;</span>][] = trim(substr($line, 2));</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;      }</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    }</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;  }</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;}</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="comment"> * Create a project record for an extension not downloaded from drupal.org</span></div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#afbe1b490c8c2f78c3ec0634b1903782f">  172</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#afbe1b490c8c2f78c3ec0634b1903782f">_drush_generate_custom_project</a>($name, $extension, $version_options) {</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  $project[<span class="stringliteral">&#39;_type&#39;</span>] = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension);</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;  $project[<span class="stringliteral">&#39;type&#39;</span>] = <a class="code" href="includes_2environment_8inc.html#a5536e4ffcf1cdf1f176e15a3aed81af7">drush_extension_get_type</a>($extension);</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;  $location = <a class="code" href="includes_2environment_8inc.html#a62a951f395505ed28ea3f0a5a108419c">drush_extension_get_path</a>($extension);</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;  <span class="comment">// To start off, we will presume that our custom extension is</span></div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;  <span class="comment">// stored in a folder named after its project, and there are</span></div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;  <span class="comment">// no subfolders between the .info file and the project root.</span></div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;  $project_name = basename($location);</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;  <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($location, <span class="stringliteral">&#39;git rev-parse --git-dir 2&gt; &#39;</span> . <a class="code" href="includes_2environment_8inc.html#a3615cd67d601c69c9106c5edf3c4d424">drush_bit_bucket</a>());</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;  $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;  <span class="keywordflow">if</span> (!empty($output)) {</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    $git_dir = $output[0];</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="comment">// Find the actual base of the git repository.</span></div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    $repo_root = $git_dir == <span class="stringliteral">&quot;.git&quot;</span> ? $location : dirname($git_dir);</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="comment">// If the repository root is at the drupal root or some parent</span></div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    <span class="comment">// of the drupal root, or some other location that could not</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;    <span class="comment">// pausibly be a project, then there is nothing we can do.</span></div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="comment">// (We can&#39;t tell Drush make to download some sub-part of a repo,</span></div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;    <span class="comment">// can we?)</span></div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    <span class="keywordflow">if</span> ($repo_project_name = <a class="code" href="generate_8make_8inc.html#ab6b04407be68ad93806db661805b8e2f">_drush_generate_validate_repo_location</a>($repo_root)) {</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;      $project_name = $repo_project_name;</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;      <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($repo_root, <span class="stringliteral">&#39;git remote show origin&#39;</span>);</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;      $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;      <span class="keywordflow">foreach</span> ($output as $line) {</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="keywordflow">if</span> (strpos($line, <span class="stringliteral">&quot;Fetch URL:&quot;</span>) !== FALSE) {</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;          $url = preg_replace(<span class="stringliteral">&#39;/ *Fetch URL: */&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $line);</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;          <span class="keywordflow">if</span> (!empty($url)) {</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;            <span class="comment">// We use the unconventional-looking keys</span></div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;            <span class="comment">// `download][type` and `download][url` so that</span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;            <span class="comment">// we can produce output that appears to be two-dimensional</span></div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;            <span class="comment">// arrays from a single-dimensional array.</span></div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;            $project[<span class="stringliteral">&#39;download][type&#39;</span>] = <span class="stringliteral">&#39;git&#39;</span>;</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;            $project[<span class="stringliteral">&#39;download][url&#39;</span>] = $url;</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;            <span class="comment">// Fill in the branch as well.</span></div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;            <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($repo_root, <span class="stringliteral">&#39;git branch&#39;</span>);</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;            $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;            <span class="keywordflow">foreach</span> ($output as $line) {</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;              <span class="keywordflow">if</span> ($line{0} == <span class="charliteral">&#39;*&#39;</span>) {</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;                $branch = substr($line, 2);</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;                <span class="keywordflow">if</span> ($branch != <span class="stringliteral">&quot;master&quot;</span>) {</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;                  $project[<span class="stringliteral">&#39;download][branch&#39;</span>] = $branch;</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;                }</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;              }</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;            }</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;            <span class="comment">// Put in the commit hash.</span></div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;            <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($repo_root, <span class="stringliteral">&#39;git log&#39;</span>);</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;            $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;            <span class="keywordflow">if</span> (substr($output[0], 0, 7) == <span class="stringliteral">&quot;commit &quot;</span>) {</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;              $revision = substr($output[0], 7);</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;              <span class="keywordflow">if</span> (<a class="code" href="generate_8make_8inc.html#a464e16976fa3f1a90063036e6646bfcc">_drush_generate_track_version</a>($project_name, $version_options)) {</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;                $project[<span class="stringliteral">&#39;download][revision&#39;</span>] = $revision;</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;              }</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;            }</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;            <span class="comment">// Add patch files, if any.</span></div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;            <a class="code" href="generate_8make_8inc.html#a4d28b99ba3b0c35775dbef2a6347ca15">_drush_make_generate_add_patch_files</a>($project, $repo_root);</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;          }</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        }</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;      }</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    }</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;  }</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;  <span class="comment">// If we could not figure out where the extension came from, then give up and</span></div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;  <span class="comment">// flag it as a &quot;custom&quot; download.</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;  <span class="keywordflow">if</span> (!isset($project[<span class="stringliteral">&#39;download][type&#39;</span>])) {</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    $project[<span class="stringliteral">&#39;custom_download&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;  }</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;  <span class="keywordflow">return</span> array($project_name, $project);</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;}</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="comment"> * If the user has checked in the Drupal root, or the &#39;sites/all/modules&#39;</span></div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="comment"> * folder into a git repository, then we do not want to confuse that location</span></div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="comment"> * with a &quot;project&quot;.</span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#ab6b04407be68ad93806db661805b8e2f">  248</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#ab6b04407be68ad93806db661805b8e2f">_drush_generate_validate_repo_location</a>($repo_root) {</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;  $project_name = basename($repo_root);</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;  <span class="comment">// The Drupal root, or any folder immediately inside the Drupal</span></div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;  <span class="comment">// root cannot be a project location.</span></div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  <span class="keywordflow">if</span> ((strlen(DRUPAL_ROOT) &gt;= strlen($repo_root)) || (dirname($repo_root) == DRUPAL_ROOT)) {</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;    <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;  }</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;  <span class="comment">// Also exclude sites/* and sites/*/{modules,themes} and profile/* and</span></div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;  <span class="comment">// profile/*/{modules,themes}.</span></div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;  <span class="keywordflow">return</span> $project_name;</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;}</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment"> * Helper function to determine if a given project is to have its version</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;<span class="comment"> * tracked.</span></div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#a464e16976fa3f1a90063036e6646bfcc">  264</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#a464e16976fa3f1a90063036e6646bfcc">_drush_generate_track_version</a>($project, $version_options) {</div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;  <span class="comment">// A. If --exclude-versions has been specified:</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;  <span class="comment">// A.a. if it&#39;s a boolean, check the --include-versions option.</span></div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;  <span class="keywordflow">if</span> ($version_options[<span class="stringliteral">&quot;exclude&quot;</span>] === TRUE) {</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;    <span class="comment">// A.a.1 if --include-versions has been specified, ensure it&#39;s an array.</span></div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    <span class="keywordflow">if</span> (is_array($version_options[<span class="stringliteral">&quot;include&quot;</span>])) {</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;      <span class="keywordflow">return</span> in_array($project, $version_options[<span class="stringliteral">&quot;include&quot;</span>]);</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;    }</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    <span class="comment">// A.a.2 If no include array, then we&#39;re excluding versions for ALL</span></div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="comment">// projects.</span></div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;  }</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;  <span class="comment">// A.b. if --exclude-versions is an array with items, check this project is in</span></div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="comment">// it: if so, then return FALSE.</span></div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;  elseif (is_array($version_options[<span class="stringliteral">&quot;exclude&quot;</span>]) &amp;&amp; count($version_options[<span class="stringliteral">&quot;exclude&quot;</span>])) {</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;    <span class="keywordflow">return</span> !in_array($project, $version_options[<span class="stringliteral">&quot;exclude&quot;</span>]);</div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;  }</div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;</div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;  <span class="comment">// B. If by now no --exclude-versions, but --include-versions is an array,</span></div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;  <span class="comment">// examine it for this project.</span></div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;  <span class="keywordflow">if</span> (is_array($version_options[<span class="stringliteral">&quot;include&quot;</span>]) &amp;&amp; count($version_options[<span class="stringliteral">&quot;include&quot;</span>])) {</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    <span class="keywordflow">return</span> in_array($project, $version_options[<span class="stringliteral">&quot;include&quot;</span>]);</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;  }</div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  <span class="comment">// If none of the above conditions match, include version number by default.</span></div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;}</div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;<span class="comment"> * Helper function to check for a non-default installation location.</span></div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00295"></a><span class="lineno"><a class="code" href="generate_8make_8inc.html#a017a9b9924374777ca099b87a599e822">  295</a></span>&#160;<span class="keyword">function</span> <a class="code" href="generate_8make_8inc.html#a017a9b9924374777ca099b87a599e822">_drush_generate_makefile_check_path</a>($project) {</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;  $info = array();</div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;  $type = $project[<span class="stringliteral">&#39;type&#39;</span>];</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;  $path = dirname($project[<span class="stringliteral">&#39;path&#39;</span>]);</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;  <span class="comment">// Check to see if the path is in a subdir sites/all/modules or</span></div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;  <span class="comment">// profiles/profilename/modules</span></div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;  <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;@^sites/[a-zA-Z0-9_]*/&#39;</span> . $type . <span class="stringliteral">&#39;s/..*@&#39;</span>, $path) || preg_match(<span class="stringliteral">&#39;@^sites/[a-zA-Z0-9_]*/&#39;</span> . $type . <span class="stringliteral">&#39;s/..*@&#39;</span>, $path)) {</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    $subdir = preg_replace(array(<span class="stringliteral">&#39;@^[a-zA-Z0-9_]*/[a-zA-Z0-9_]*/&#39;</span> . $type . <span class="stringliteral">&#39;s/*@&#39;</span>, <span class="stringliteral">&quot;@/$name&quot;</span> . <span class="stringliteral">&#39;$@&#39;</span>), <span class="stringliteral">&#39;&#39;</span>, $path);</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <span class="keywordflow">if</span> (!empty($subdir)) {</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;      $info[<span class="stringliteral">&#39;subdir&#39;</span>] = $subdir;</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    }</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;  }</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;  <span class="keywordflow">return</span> $info;</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Nov 2 2016 07:28:55 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>