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

  1. 7.x doxygen/html/make_8download_8inc_source.html
  2. master doxygen/html/make_8download_8inc_source.html
Go to the documentation of this file.
1 <?php
2 /**
3  * @file
4  * Download-specific functions for Drush Make.
5  */
6 
7 /**
8  * Downloads the given package to the destination directory.
9  *
10  * @return mixed
11  * The destination path on success, FALSE on failure.
12  */
13 function make_download_factory($name, $type, $download, $download_location) {
14  $function = 'make_download_' . $download['type'];
15  if (function_exists($function)) {
16  return $function($name, $type, $download, $download_location);
17  }
18  else {
19  return FALSE;
20  }
21 }
22 
23 /**
24  * Download project using drush's pm-download command.
25  */
26 function make_download_pm($name, $type, $download, $download_location) {
27  $full_project_version = $name . '-' . $download['full_version'];
28 
29  $options = array(
30  'destination' => dirname($download_location),
31  'yes' => TRUE,
32  'package-handler' => 'wget',
33  'source' => $download['status url'],
34  // This is only relevant for profiles, but we always want the variant to
35  // be 'profile-only' so we don't end up with extra copies of core.
36  'variant' => $type == 'core' ? 'full' : 'profile-only',
37  'cache' => TRUE,
38  );
39  if ($type == 'core') {
40  $options['drupal-project-rename'] = basename($download_location);
41  }
42  if (drush_get_option('no-cache', FALSE)) {
43  unset($options['cache']);
44  }
45 
46  $backend_options = array();
47  if (!drush_get_option(array('verbose', 'debug'), FALSE)) {
48  $backend_options['integrate'] = TRUE;
49  $backend_options['log'] = FALSE;
50  }
51 
52  // Perform actual download with `drush pm-download`.
53  $return = drush_invoke_process('@none', 'pm-download', array($full_project_version), $options, $backend_options);
54  if (empty($return['error_log'])) {
55  // @todo Report the URL we used for download. See
57  drush_log(dt('@project downloaded.', array('@project' => $full_project_version)), 'ok');
58  }
59 }
60 
61 /**
62  * Downloads a file to the specified location.
63  *
64  * @return mixed
65  * The destination directory on success, FALSE on failure.
66  */
67 function make_download_file($name, $type, $download, $download_location, $cache_duration = DRUSH_CACHE_LIFETIME_DEFAULT) {
68  if ($filename = _make_download_file($download['url'], $cache_duration)) {
69  if (!drush_get_option('ignore-checksums') && !_make_verify_checksums($download, $filename)) {
70  return FALSE;
71  }
72  drush_log(dt('@project downloaded from @url.', array('@project' => $name, '@url' => $download['url'])), 'ok');
73  $download_filename = isset($download['filename']) ? $download['filename'] : '';
74  $subtree = isset($download['subtree']) ? $download['subtree'] : NULL;
75  return make_download_file_unpack($filename, $download_location, $download_filename, $subtree);
76  }
77  make_error('DOWNLOAD_ERROR', dt('Unable to download @project from @url.', array('@project' => $name, '@url' => $download['url'])));
78  return FALSE;
79 }
80 
81 /**
82  * Wrapper to drush_download_file().
83  *
84  * @param string $download
85  * The url of the file to download.
86  * @param int $cache_duration
87  * The time in seconds to cache the resultant download.
88  *
89  * @return string
90  * The location of the downloaded file, or FALSE on failure.
91  */
92 function _make_download_file($download, $cache_duration = DRUSH_CACHE_LIFETIME_DEFAULT) {
93  if (drush_get_option('no-cache', FALSE)) {
94  $cache_duration = 0;
95  }
96 
97  $tmp_path = make_tmp();
98  // Ensure that we aren't including the querystring when generating a filename
99  // to save our download to.
100  $file = basename(current(explode('?', $download, 2)));
101  return drush_download_file($download, $tmp_path . '/' . $file, $cache_duration);
102 }
103 
104 /**
105  * Unpacks a file to the specified download location.
106  *
107  * @return mixed
108  * The download location on success, FALSE on failure.
109  */
110 function make_download_file_unpack($filename, $download_location, $name, $subtree = NULL) {
111  $success = FALSE;
112 
113  if (drush_file_is_tarball($filename)) {
114  $tmp_location = drush_tempdir();
115 
116  if (!drush_tarball_extract($filename, $tmp_location)) {
117  return FALSE;
118  }
119 
120  if ($subtree) {
121  $tmp_location .= '/' . $subtree;
122  if (!file_exists($tmp_location)) {
123  return drush_set_error('DRUSH_MAKE_SUBTREE_NOT_FOUND', dt('Directory !subtree not found within !file', array('!subtree' => $subtree, '!file' => $filename)));
124  }
125  }
126  else {
127  $files = scandir($tmp_location);
128  unset($files[0]); // . directory
129  unset($files[1]); // .. directory
130  if ((count($files) == 1) && is_dir($tmp_location . '/' . current($files))) {
131  $tmp_location .= '/' . current($files);
132  }
133  }
134 
135  $success = drush_move_dir($tmp_location, $download_location, TRUE);
136 
137  // Remove the tarball.
138  if (file_exists($filename)) {
139  drush_delete_dir($filename, TRUE);
140  }
141  }
142  else {
143  // If this is an individual file, and no filename has been specified,
144  // assume the original name.
145  if (is_file($filename) && !$name) {
146  $name = basename($filename);
147  }
148 
149  // The destination directory has already been created by
150  // findDownloadLocation().
151  $destination = $download_location . ($name ? '/' . $name : '');
152  $success = drush_move_dir($filename, $destination, TRUE);
153  }
154  return $success ? $download_location : FALSE;
155 }
156 
157 /**
158  * Move a downloaded and unpacked file or directory into place.
159  *
160  * TODO merge with core drush methods.
161  */
162 function _make_download_file_move($tmp_path, $filename, $download_location, $subtree = NULL) {
163  $lines = drush_scan_directory($tmp_path, '/./', array('.', '..'), 0, FALSE, 'filename', 0, TRUE);
164  $main_directory = basename($download_location);
165  if (count($lines) == 1) {
166  $directory = array_shift($lines);
167  if ($directory->basename != $main_directory) {
168  drush_move_dir($directory->filename, $tmp_path . DIRECTORY_SEPARATOR . $main_directory, TRUE);
169  }
170  drush_copy_dir($tmp_path . DIRECTORY_SEPARATOR . $main_directory . DIRECTORY_SEPARATOR . $subtree, $download_location, TRUE);
171  drush_delete_dir($tmp_path, TRUE);
172  }
173  elseif (count($lines) > 1) {
174  drush_delete_dir($download_location, TRUE);
175  drush_move_dir($tmp_path . DIRECTORY_SEPARATOR . $subtree, $download_location, TRUE);
176  }
177 
178  // Remove the tarball.
179  if (file_exists($filename)) {
180  drush_delete_dir($filename, TRUE);
181  }
182 
183  if (file_exists($tmp_path)) {
184  drush_delete_dir($tmp_path, TRUE);
185  }
186  return TRUE;
187 }
188 
189 
190 /**
191  * For backwards compatibility.
192  */
193 function make_download_get($name, $type, $download, $download_location) {
194  return make_download_file($name, $type, $download, $download_location);
195 }
196 
197 /**
198  * Checks out a git repository to the specified download location.
199  *
200  * Allowed parameters in $download, in order of precedence:
201  * - 'tag'
202  * - 'revision'
203  * - 'branch'
204  *
205  * This will also attempt to write out release information to the
206  * .info file if the 'no-gitinfofile' option is FALSE. If
207  * $download['full_version'] is present, this will be used, otherwise,
208  * version will be set in this order of precedence:
209  * - 'tag'
210  * - 'branch'
211  * - 'revision'
212  *
213  * @return mixed
214  * The download location on success, FALSE otherwise.
215  */
216 function make_download_git($name, $type, $download, $download_location) {
217  $tmp_path = make_tmp();
218  $wc = _get_working_copy_option($download);
219  // If no download URL specified, assume anonymous clone from git.drupal.org.
220  $download['url'] = isset($download['url']) ? $download['url'] : "http://git.drupal.org/project/$name.git";
221  // If no working-copy download URL specified, assume it is the same.
222  $download['wc_url'] = isset($download['wc_url']) ? $download['wc_url'] : $download['url'];
223 
224  // If not a working copy, and if --no-cache has not been explicitly
225  // declared, create a new git reference cache of the remote repository,
226  // or update the existing cache to fetch recent changes.
228  $cache = !$wc && !drush_get_option('no-cache', FALSE);
229  if ($cache && ($git_cache = drush_directory_cache('git'))) {
230  $project_cache = $git_cache . '/' . $name . '-' . md5($download['url']);
231  // Set up a new cache, if it doesn't exist.
232  if (!file_exists($project_cache)) {
233  $command = 'git clone --mirror';
234  if (drush_get_context('DRUSH_VERBOSE')) {
235  $command .= ' --verbose --progress';
236  }
237  $command .= ' %s %s';
238  drush_shell_cd_and_exec($git_cache, $command, $download['url'], $project_cache);
239  }
240  else {
241  // Update the --mirror clone.
242  drush_shell_cd_and_exec($project_cache, 'git remote update');
243  }
244  $git_cache = $project_cache;
245  }
246 
247  // Use working-copy download URL if --working-copy specified.
248  $url = $wc ? $download['wc_url'] : $download['url'];
249 
250  $tmp_location = drush_tempdir() . '/' . basename($download_location);
251 
252  $command = 'git clone %s %s';
253  if (drush_get_context('DRUSH_VERBOSE')) {
254  $command .= ' --verbose --progress';
255  }
256  if ($cache) {
257  $command .= ' --reference ' . drush_escapeshellarg($git_cache);
258  }
259 
260  // Before we can checkout anything, we need to clone the repository.
261  if (!drush_shell_exec($command, $url, $tmp_location)) {
262  make_error('DOWNLOAD_ERROR', dt('Unable to clone @project from @url.', array('@project' => $name, '@url' => $url)));
263  return FALSE;
264  }
265 
266  drush_log(dt('@project cloned from @url.', array('@project' => $name, '@url' => $url)), 'ok');
267 
268  // Get the current directory (so we can move back later).
269  $cwd = getcwd();
270  // Change into the working copy of the cloned repo.
271  chdir($tmp_location);
272 
273  // We want to use the most specific target possible, so first try a refspec.
274  if (!empty($download['refspec'])) {
275  if (drush_shell_exec("git fetch %s %s", $url, $download['refspec'])) {
276  drush_log(dt("Fetched refspec !refspec.", array('!refspec' => $download['refspec'])), 'ok');
277 
278  if (drush_shell_exec("git checkout FETCH_HEAD")) {
279  drush_log(dt("Checked out FETCH_HEAD."), 'info');
280  }
281  }
282  else {
283  make_error('DOWNLOAD_ERROR', dt("Unable to fetch the refspec @refspec from @project.", array('@refspec' => $download['refspec'], '@project' => $name)));
284  }
285  }
286 
287  // If there wasn't a refspec, try a tag.
288  elseif (!empty($download['tag'])) {
289  // @TODO: change checkout to refs path.
290  if (drush_shell_exec("git checkout %s", 'refs/tags/' . $download['tag'])) {
291  drush_log(dt("Checked out tag @tag.", array('@tag' => $download['tag'])), 'ok');
292  }
293  else {
294  make_error('DOWNLOAD_ERROR', dt("Unable to check out tag @tag.", array('@tag' => $download['tag'])));
295  }
296  }
297 
298  // If there wasn't a tag, try a specific revision hash.
299  elseif (!empty($download['revision'])) {
300  if (drush_shell_exec("git checkout %s", $download['revision'])) {
301  drush_log(dt("Checked out revision @revision.", array('@revision' => $download['revision'])), 'ok');
302  }
303  else {
304  make_error('DOWNLOAD_ERROR', dt("Unable to checkout revision @revision", array('@revision' => $download['revision'])));
305  }
306  }
307 
308  // If not, see if we at least have a branch.
309  elseif (!empty($download['branch'])) {
310  if (drush_shell_exec("git checkout %s", $download['branch']) && (trim(implode(drush_shell_exec_output())) != '')) {
311  drush_log(dt("Checked out branch @branch.", array('@branch' => $download['branch'])), 'ok');
312  }
313  elseif (drush_shell_exec("git checkout -b %s %s", $download['branch'], 'origin/' . $download['branch'])) {
314  drush_log(dt('Checked out branch origin/@branch.', array('@branch' => $download['branch'])), 'ok');
315  }
316  else {
317  make_error('DOWNLOAD_ERROR', dt('Unable to check out branch @branch.', array('@branch' => $download['branch'])));
318  }
319  }
320 
321  if (!empty($download['submodule'])) {
322  $command = 'git submodule update';
323  foreach ($download['submodule'] as $option) {
324  $command .= ' --%s';
325  }
326  if (call_user_func_array('drush_shell_exec', array_merge(array($command), $download['submodule']))) {
327  drush_log(dt('Initialized registered submodules.'), 'ok');
328  }
329  else {
330  make_error('DOWNLOAD_ERROR', dt('Unable to initialize submodules.'));
331  }
332  }
333 
334  // Move back to last current directory (first line).
335  chdir($cwd);
336 
337  // Move the directory into the final resting location.
338  drush_copy_dir($tmp_location, $download_location, TRUE);
339 
340  return dirname($tmp_location);
341 }
342 
343 /**
344  * Checks out a Bazaar repository to the specified download location.
345  *
346  * @return mixed
347  * The download location on success, FALSE otherwise.
348  */
349 function make_download_bzr($name, $type, $download, $download_location) {
350  $tmp_path = make_tmp();
351  $tmp_location = drush_tempdir() . '/' . basename($download_location);
352  $wc = _get_working_copy_option($download);
353  if (!empty($download['url'])) {
354  $args = array();
355  $command = 'bzr';
356  if ($wc) {
357  $command .= ' branch --use-existing-dir';
358  }
359  else {
360  $command .= ' export';
361  }
362  if (isset($download['revision'])) {
363  $command .= ' -r %s';
364  $args[] = $download['revision'];
365  }
366  $command .= ' %s %s';
367  if ($wc) {
368  $args[] = $download['url'];
369  $args[] = $tmp_location;
370  }
371  else {
372  $args[] = $tmp_location;
373  $args[] = $download['url'];
374  }
375  array_unshift($args, $command);
376  if (call_user_func_array('drush_shell_exec', $args)) {
377  drush_log(dt('@project downloaded from @url.', array('@project' => $name, '@url' => $download['url'])), 'ok');
378  drush_copy_dir($tmp_location, $download_location, TRUE);
379  return dirname($download_location);
380  }
381  }
382  else {
383  $download['url'] = dt("unspecified location");
384  }
385  make_error('DOWNLOAD_ERROR', dt('Unable to download @project from @url.', array('@project' => $name, '@url' => $download['url'])));
386  drush_delete_dir(dirname($tmp_location), TRUE);
387  return FALSE;
388 }
389 
390 /**
391  * Checks out an SVN repository to the specified download location.
392  *
393  * @return mixed
394  * The download location on success, FALSE otherwise.
395  */
396 function make_download_svn($name, $type, $download, $download_location) {
397  $wc = _get_working_copy_option($download);
398  if (!empty($download['url'])) {
399  if (!empty($download['interactive'])) {
400  $function = 'drush_shell_exec_interactive';
401  }
402  else {
403  $options = ' --non-interactive';
404  $function = 'drush_shell_exec';
405  }
406  if (!isset($download['force']) || $download['force']) {
407  $options = ' --force';
408  }
409  if ($wc) {
410  $command = 'svn' . $options . ' checkout';
411  }
412  else {
413  $command = 'svn' . $options . ' export';
414  }
415 
416  $args = array();
417 
418  if (isset($download['revision'])) {
419  $command .= ' -r%s';
420  $args[] = $download['revision'];
421  }
422 
423  $command .= ' %s %s';
424  $args[] = $download['url'];
425  $args[] = $download_location;
426 
427  if (!empty($download['username'])) {
428  $command .= ' --username %s';
429  $args[] = $download['username'];
430  if (!empty($download['password'])) {
431  $command .= ' --password %s';
432  $args[] = $download['password'];
433  }
434  }
435  array_unshift($args, $command);
436  $result = call_user_func_array($function, $args);
437  if ($result) {
438  $args = array(
439  '@project' => $name,
440  '@command' => $command,
441  '@url' => $download['url'],
442  );
443  drush_log(dt('@project @command from @url.', $args), 'ok');
444  return $download_location;
445  }
446  else {
447  $download['url'] = dt("unspecified location");
448  }
449  }
450  else {
451  make_error('DOWNLOAD_ERROR', dt('Unable to download @project from @url.', array('@project' => $name, '@url' => $download['url'])));
452  return FALSE;
453  }
454 }
455 
456 /**
457  * Test that any supplied hash values match the hash of the file content.
458  *
459  * Unsupported hash algorithms are reported as failure.
460  */
461 function _make_verify_checksums($info, $filename) {
462  $hash_algos = array('md5', 'sha1', 'sha256', 'sha512');
463  // We only have something to do if a key is an
464  // available function.
465  if (array_intersect(array_keys($info), $hash_algos)) {
466  $content = file_get_contents($filename);
467  foreach ($hash_algos as $algo) {
468  if (!empty($info[$algo])) {
469  $hash = _make_hash($algo, $content);
470  if ($hash !== $info[$algo]) {
471  $args = array(
472  '@algo' => $algo,
473  '@file' => basename($filename),
474  '@expected' => $info[$algo],
475  '@hash' => $hash,
476  );
477  make_error('DOWNLOAD_ERROR', dt('Checksum @algo verification failed for @file. Expected @expected, received @hash.', $args));
478  return FALSE;
479  }
480  }
481  }
482  }
483  return TRUE;
484 }
485 
486 /**
487  * Calculate the hash of a string for a given algorithm.
488  */
489 function _make_hash($algo, $string) {
490  switch ($algo) {
491  case 'md5':
492  return md5($string);
493  case 'sha1':
494  return sha1($string);
495  default:
496  return function_exists('hash') ? hash($algo, $string) : '';
497  }
498 }

File

doxygen/html/make_8download_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/make.download.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="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</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>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><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">make.download.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="make_8download_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"> * Download-specific functions for Drush Make.</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;<span class="comment"></span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * Downloads the given package to the destination directory.</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *   The destination path on success, FALSE on failure.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#aaa0817e712779645b563cfb8ddfd99cd">   13</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#aaa0817e712779645b563cfb8ddfd99cd">make_download_factory</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;  $function = <span class="stringliteral">&#39;make_download_&#39;</span> . $download[<span class="stringliteral">&#39;type&#39;</span>];</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;  <span class="keywordflow">if</span> (function_exists($function)) {</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;    <span class="keywordflow">return</span> $function($name, $type, $download, $download_location);</div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;  }</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;    <span class="keywordflow">return</span> FALSE;</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;}</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * Download project using drush&#39;s pm-download command.</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"><a class="code" href="make_8download_8inc.html#a1a9f4bc0852743166afa72edf88008f4">   26</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a1a9f4bc0852743166afa72edf88008f4">make_download_pm</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;  $full_project_version = $name . <span class="charliteral">&#39;-&#39;</span> . $download[<span class="stringliteral">&#39;full_version&#39;</span>];</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;  $options = array(</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;    <span class="stringliteral">&#39;destination&#39;</span> =&gt; dirname($download_location),</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="stringliteral">&#39;yes&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="stringliteral">&#39;package-handler&#39;</span> =&gt; <span class="stringliteral">&#39;wget&#39;</span>,</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    <span class="stringliteral">&#39;source&#39;</span> =&gt; $download[<span class="stringliteral">&#39;status url&#39;</span>],</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="comment">// This is only relevant for profiles, but we always want the variant to</span></div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    <span class="comment">// be &#39;profile-only&#39; so we don&#39;t end up with extra copies of core.</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="stringliteral">&#39;variant&#39;</span> =&gt; $type == <span class="stringliteral">&#39;core&#39;</span> ? <span class="stringliteral">&#39;full&#39;</span> : <span class="stringliteral">&#39;profile-only&#39;</span>,</div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="stringliteral">&#39;cache&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;  );</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;  <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;core&#39;</span>) {</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;    $options[<span class="stringliteral">&#39;drupal-project-rename&#39;</span>] = basename($download_location);</div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;  }</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-cache&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    unset($options[<span class="stringliteral">&#39;cache&#39;</span>]);</div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;  }</div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;  $backend_options = array();</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(array(<span class="stringliteral">&#39;verbose&#39;</span>, <span class="stringliteral">&#39;debug&#39;</span>), FALSE)) {</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    $backend_options[<span class="stringliteral">&#39;integrate&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    $backend_options[<span class="stringliteral">&#39;log&#39;</span>] = FALSE;</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;  }</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  <span class="comment">// Perform actual download with `drush pm-download`.</span></div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;  $return = <a class="code" href="group__dispatching.html#ga125471885af052278a0874446b332cf9">drush_invoke_process</a>(<span class="stringliteral">&#39;@none&#39;</span>, <span class="stringliteral">&#39;pm-download&#39;</span>, array($full_project_version), $options, $backend_options);</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  <span class="keywordflow">if</span> (empty($return[<span class="stringliteral">&#39;error_log&#39;</span>])) {</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    <span class="comment">// @todo Report the URL we used for download. See</span></div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;    <span class="comment">// http://drupal.org/node/1452672.</span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project downloaded.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $full_project_version)), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;  }</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;}</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="comment"> * Downloads a file to the specified location.</span></div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="comment"> *   The destination directory on success, FALSE on failure.</span></div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a9bca6953efd915cc338678422d3e65f4">   67</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a9bca6953efd915cc338678422d3e65f4">make_download_file</a>($name, $type, $download, $download_location, $cache_duration = <a class="code" href="drush_8inc.html#aa7401f966d8f78e341094bc304d56162">DRUSH_CACHE_LIFETIME_DEFAULT</a>) {</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;  <span class="keywordflow">if</span> ($filename = <a class="code" href="make_8download_8inc.html#a6381bf72fa72152dd12f122dbca83d78">_make_download_file</a>($download[<span class="stringliteral">&#39;url&#39;</span>], $cache_duration)) {</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;ignore-checksums&#39;</span>) &amp;&amp; !<a class="code" href="make_8download_8inc.html#a5ca2e2fb1cf115e40b99acbfc79128fa">_make_verify_checksums</a>($download, $filename)) {</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    }</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project downloaded from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    $download_filename = isset($download[<span class="stringliteral">&#39;filename&#39;</span>]) ? $download[<span class="stringliteral">&#39;filename&#39;</span>] : <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    $subtree = isset($download[<span class="stringliteral">&#39;subtree&#39;</span>]) ? $download[<span class="stringliteral">&#39;subtree&#39;</span>] : NULL;</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="make_8download_8inc.html#a39dc84607968d96b01b9edcda21a8422">make_download_file_unpack</a>($filename, $download_location, $download_filename, $subtree);</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;  }</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;  <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to download @project from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>])));</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;  <span class="keywordflow">return</span> FALSE;</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;<span class="comment"></span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="comment"> * Wrapper to drush_download_file().</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="comment"> * @param string $download</span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment"> *   The url of the file to download.</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment"> * @param int $cache_duration</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="comment"> *   The time in seconds to cache the resultant download.</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="comment"> *   The location of the downloaded file, or FALSE on failure.</span></div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a6381bf72fa72152dd12f122dbca83d78">   92</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a6381bf72fa72152dd12f122dbca83d78">_make_download_file</a>($download, $cache_duration = <a class="code" href="drush_8inc.html#aa7401f966d8f78e341094bc304d56162">DRUSH_CACHE_LIFETIME_DEFAULT</a>) {</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-cache&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    $cache_duration = 0;</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  }</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;  <span class="comment">// Ensure that we aren&#39;t including the querystring when generating a filename</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;  <span class="comment">// to save our download to.</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;  $file = basename(current(explode(<span class="charliteral">&#39;?&#39;</span>, $download, 2)));</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="drush_8inc.html#a9cce12bffedae74c4a45174c59c79311">drush_download_file</a>($download, $tmp_path . <span class="charliteral">&#39;/&#39;</span> . $file, $cache_duration);</div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;}</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="comment"> * Unpacks a file to the specified download location.</span></div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;<span class="comment"> *   The download location on success, FALSE on failure.</span></div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a39dc84607968d96b01b9edcda21a8422">  110</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a39dc84607968d96b01b9edcda21a8422">make_download_file_unpack</a>($filename, $download_location, $name, $subtree = NULL) {</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;  $success = FALSE;</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="drush_8inc.html#a78aae9f3ebfdb2bee27dee73fe088652">drush_file_is_tarball</a>($filename)) {</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;    $tmp_location = <a class="code" href="group__filesystemfunctions.html#ga883d28ed54603b2d268902cec2379804">drush_tempdir</a>();</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="drush_8inc.html#ad8f8c8d5b65e0d9a863173da63ef78ee">drush_tarball_extract</a>($filename, $tmp_location)) {</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    }</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="keywordflow">if</span> ($subtree) {</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;      $tmp_location .= <span class="charliteral">&#39;/&#39;</span> . $subtree;</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;      <span class="keywordflow">if</span> (!file_exists($tmp_location)) {</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_MAKE_SUBTREE_NOT_FOUND&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Directory !subtree not found within !file&#39;</span>, array(<span class="stringliteral">&#39;!subtree&#39;</span> =&gt; $subtree, <span class="stringliteral">&#39;!file&#39;</span> =&gt; $filename)));</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;    }</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;      $files = scandir($tmp_location);</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;      unset($files[0]); <span class="comment">// . directory</span></div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;      unset($files[1]); <span class="comment">// .. directory</span></div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;      <span class="keywordflow">if</span> ((count($files) == 1) &amp;&amp; is_dir($tmp_location . <span class="charliteral">&#39;/&#39;</span> . current($files))) {</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;        $tmp_location .= <span class="charliteral">&#39;/&#39;</span> . current($files);</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;      }</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    }</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    $success = <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($tmp_location, $download_location, TRUE);</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;    <span class="comment">// Remove the tarball.</span></div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <span class="keywordflow">if</span> (file_exists($filename)) {</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;      <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($filename, TRUE);</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    }</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;  }</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    <span class="comment">// If this is an individual file, and no filename has been specified,</span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="comment">// assume the original name.</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="keywordflow">if</span> (is_file($filename) &amp;&amp; !$name) {</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;      $name = basename($filename);</div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    }</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;    <span class="comment">// The destination directory has already been created by</span></div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="comment">// findDownloadLocation().</span></div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    $destination = $download_location . ($name ? <span class="charliteral">&#39;/&#39;</span> . $name : <span class="stringliteral">&#39;&#39;</span>);</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    $success = <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($filename, $destination, TRUE);</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;  }</div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;  <span class="keywordflow">return</span> $success ? $download_location : FALSE;</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;}</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment"></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">  158</span>&#160;<span class="comment"> * Move a downloaded and unpacked file or directory into place.</span></div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="comment"> * TODO merge with core drush methods.</span></div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a74fc37b0ad8db7422b33cbadbe302325">  162</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a74fc37b0ad8db7422b33cbadbe302325">_make_download_file_move</a>($tmp_path, $filename, $download_location, $subtree = NULL) {</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;  $lines = <a class="code" href="group__filesystemfunctions.html#ga1c545390a8890f6ea47385f79fbe2e82">drush_scan_directory</a>($tmp_path, <span class="stringliteral">&#39;/./&#39;</span>, array(<span class="charliteral">&#39;.&#39;</span>, <span class="stringliteral">&#39;..&#39;</span>), 0, FALSE, <span class="stringliteral">&#39;filename&#39;</span>, 0, TRUE);</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;  $main_directory = basename($download_location);</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;  <span class="keywordflow">if</span> (count($lines) == 1) {</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    $directory = array_shift($lines);</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    <span class="keywordflow">if</span> ($directory-&gt;basename != $main_directory) {</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;      <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($directory-&gt;filename, $tmp_path . DIRECTORY_SEPARATOR . $main_directory, TRUE);</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    }</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($tmp_path . DIRECTORY_SEPARATOR . $main_directory . DIRECTORY_SEPARATOR . $subtree, $download_location, TRUE);</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($tmp_path, TRUE);</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;  }</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  elseif (count($lines) &gt; 1) {</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;    <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($download_location, TRUE);</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($tmp_path . DIRECTORY_SEPARATOR . $subtree, $download_location, TRUE);</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;  }</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;  <span class="comment">// Remove the tarball.</span></div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;  <span class="keywordflow">if</span> (file_exists($filename)) {</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($filename, TRUE);</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;  }</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;  <span class="keywordflow">if</span> (file_exists($tmp_path)) {</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($tmp_path, TRUE);</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;  }</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;}</div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="comment"> * For backwards compatibility.</span></div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a2aa73a9f71f17d7bdeb88e75489e1344">  193</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a2aa73a9f71f17d7bdeb88e75489e1344">make_download_get</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="make_8download_8inc.html#a9bca6953efd915cc338678422d3e65f4">make_download_file</a>($name, $type, $download, $download_location);</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;}</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="comment"> * Checks out a git repository to the specified download location.</span></div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="comment"> * Allowed parameters in $download, in order of precedence:</span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="comment"> *   - &#39;tag&#39;</span></div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="comment"> *   - &#39;revision&#39;</span></div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="comment"> *   - &#39;branch&#39;</span></div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="comment"> * This will also attempt to write out release information to the</span></div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;<span class="comment"> * .info file if the &#39;no-gitinfofile&#39; option is FALSE. If</span></div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="comment"> * $download[&#39;full_version&#39;] is present, this will be used, otherwise,</span></div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="comment"> * version will be set in this order of precedence:</span></div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="comment"> *   - &#39;tag&#39;</span></div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="comment"> *   - &#39;branch&#39;</span></div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;<span class="comment"> *   - &#39;revision&#39;</span></div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#af0b8a0195e141dd3d497d2e663d993fa">  216</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#af0b8a0195e141dd3d497d2e663d993fa">make_download_git</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;  <span class="comment">// If no download URL specified, assume anonymous clone from git.drupal.org.</span></div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;  $download[<span class="stringliteral">&#39;url&#39;</span>] = isset($download[<span class="stringliteral">&#39;url&#39;</span>]) ? $download[<span class="stringliteral">&#39;url&#39;</span>] : <span class="stringliteral">&quot;http://git.drupal.org/project/$name.git&quot;</span>;</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;  <span class="comment">// If no working-copy download URL specified, assume it is the same.</span></div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  $download[<span class="stringliteral">&#39;wc_url&#39;</span>] = isset($download[<span class="stringliteral">&#39;wc_url&#39;</span>]) ? $download[<span class="stringliteral">&#39;wc_url&#39;</span>] : $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;  <span class="comment">// If not a working copy, and if --no-cache has not been explicitly</span></div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;  <span class="comment">// declared, create a new git reference cache of the remote repository,</span></div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;  <span class="comment">// or update the existing cache to fetch recent changes.</span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;  <span class="comment">// @see package_handler_download_project()</span></div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;  $cache = !$wc &amp;&amp; !<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;no-cache&#39;</span>, FALSE);</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;  <span class="keywordflow">if</span> ($cache &amp;&amp; ($git_cache = <a class="code" href="includes_2environment_8inc.html#a92afdf9afda25ac6d226ba45f6f1fbe0">drush_directory_cache</a>(<span class="stringliteral">&#39;git&#39;</span>))) {</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    $project_cache = $git_cache . <span class="charliteral">&#39;/&#39;</span> . $name . <span class="charliteral">&#39;-&#39;</span> . md5($download[<span class="stringliteral">&#39;url&#39;</span>]);</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="comment">// Set up a new cache, if it doesn&#39;t exist.</span></div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="keywordflow">if</span> (!file_exists($project_cache)) {</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;      $command = <span class="stringliteral">&#39;git clone --mirror&#39;</span>;</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_VERBOSE&#39;</span>)) {</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;        $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;      }</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;      $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;      <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($git_cache, $command, $download[<span class="stringliteral">&#39;url&#39;</span>], $project_cache);</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">else</span> {</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;      <span class="comment">// Update the --mirror clone.</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;      <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($project_cache, <span class="stringliteral">&#39;git remote update&#39;</span>);</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    }</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    $git_cache = $project_cache;</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;  }</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;  <span class="comment">// Use working-copy download URL if --working-copy specified.</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;  $url = $wc ? $download[<span class="stringliteral">&#39;wc_url&#39;</span>] : $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;  $tmp_location = <a class="code" href="group__filesystemfunctions.html#ga883d28ed54603b2d268902cec2379804">drush_tempdir</a>() . <span class="charliteral">&#39;/&#39;</span> . basename($download_location);</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  $command = <span class="stringliteral">&#39;git clone %s %s&#39;</span>;</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_VERBOSE&#39;</span>)) {</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;    $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;  }</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;  <span class="keywordflow">if</span> ($cache) {</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    $command .= <span class="stringliteral">&#39; --reference &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($git_cache);</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;</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;  <span class="comment">// Before we can checkout anything, we need to clone the repository.</span></div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>($command, $url, $tmp_location)) {</div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to clone @project from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $url)));</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;  }</div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;</div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;  <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project cloned from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $url)), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;  <span class="comment">// Get the current directory (so we can move back later).</span></div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;  $cwd = getcwd();</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;  <span class="comment">// Change into the working copy of the cloned repo.</span></div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;  chdir($tmp_location);</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;  <span class="comment">// We want to use the most specific target possible, so first try a refspec.</span></div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;refspec&#39;</span>])) {</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git fetch %s %s&quot;</span>, $url, $download[<span class="stringliteral">&#39;refspec&#39;</span>])) {</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Fetched refspec !refspec.&quot;</span>, array(<span class="stringliteral">&#39;!refspec&#39;</span> =&gt; $download[<span class="stringliteral">&#39;refspec&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;</div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git checkout FETCH_HEAD&quot;</span>)) {</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;        <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Checked out FETCH_HEAD.&quot;</span>), <span class="stringliteral">&#39;info&#39;</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="keywordflow">else</span> {</div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;      <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Unable to fetch the refspec @refspec from @project.&quot;</span>, array(<span class="stringliteral">&#39;@refspec&#39;</span> =&gt; $download[<span class="stringliteral">&#39;refspec&#39;</span>], <span class="stringliteral">&#39;@project&#39;</span> =&gt; $name)));</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;    }</div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;  }</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;  <span class="comment">// If there wasn&#39;t a refspec, try a tag.</span></div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  elseif (!empty($download[<span class="stringliteral">&#39;tag&#39;</span>])) {</div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    <span class="comment">// @TODO: change checkout to refs path.</span></div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git checkout %s&quot;</span>, <span class="stringliteral">&#39;refs/tags/&#39;</span> . $download[<span class="stringliteral">&#39;tag&#39;</span>])) {</div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Checked out tag @tag.&quot;</span>, array(<span class="stringliteral">&#39;@tag&#39;</span> =&gt; $download[<span class="stringliteral">&#39;tag&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    }</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;      <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Unable to check out tag @tag.&quot;</span>, array(<span class="stringliteral">&#39;@tag&#39;</span> =&gt; $download[<span class="stringliteral">&#39;tag&#39;</span>])));</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    }</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;  }</div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;  <span class="comment">// If there wasn&#39;t a tag, try a specific revision hash.</span></div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;  elseif (!empty($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git checkout %s&quot;</span>, $download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Checked out revision @revision.&quot;</span>, array(<span class="stringliteral">&#39;@revision&#39;</span> =&gt; $download[<span class="stringliteral">&#39;revision&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    }</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;      <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Unable to checkout revision @revision&quot;</span>, array(<span class="stringliteral">&#39;@revision&#39;</span> =&gt; $download[<span class="stringliteral">&#39;revision&#39;</span>])));</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;</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;  <span class="comment">// If not, see if we at least have a branch.</span></div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  elseif (!empty($download[<span class="stringliteral">&#39;branch&#39;</span>])) {</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git checkout %s&quot;</span>, $download[<span class="stringliteral">&#39;branch&#39;</span>]) &amp;&amp; (trim(implode(<a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>())) != <span class="stringliteral">&#39;&#39;</span>)) {</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Checked out branch @branch.&quot;</span>, array(<span class="stringliteral">&#39;@branch&#39;</span> =&gt; $download[<span class="stringliteral">&#39;branch&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;    }</div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    elseif (<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>(<span class="stringliteral">&quot;git checkout -b %s %s&quot;</span>, $download[<span class="stringliteral">&#39;branch&#39;</span>], <span class="stringliteral">&#39;origin/&#39;</span> . $download[<span class="stringliteral">&#39;branch&#39;</span>])) {</div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Checked out branch origin/@branch.&#39;</span>, array(<span class="stringliteral">&#39;@branch&#39;</span> =&gt; $download[<span class="stringliteral">&#39;branch&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;    }</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;      <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to check out branch @branch.&#39;</span>, array(<span class="stringliteral">&#39;@branch&#39;</span> =&gt; $download[<span class="stringliteral">&#39;branch&#39;</span>])));</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;    }</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;  }</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;</div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;submodule&#39;</span>])) {</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    $command = <span class="stringliteral">&#39;git submodule update&#39;</span>;</div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="keywordflow">foreach</span> ($download[<span class="stringliteral">&#39;submodule&#39;</span>] as $option) {</div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;      $command .= <span class="stringliteral">&#39; --%s&#39;</span>;</div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    }</div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    <span class="keywordflow">if</span> (call_user_func_array(<span class="stringliteral">&#39;drush_shell_exec&#39;</span>, array_merge(array($command), $download[<span class="stringliteral">&#39;submodule&#39;</span>]))) {</div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Initialized registered submodules.&#39;</span>), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    }</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;      <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to initialize submodules.&#39;</span>));</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;    }</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;  }</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;  <span class="comment">// Move back to last current directory (first line).</span></div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;  chdir($cwd);</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;  <span class="comment">// Move the directory into the final resting location.</span></div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;  <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($tmp_location, $download_location, TRUE);</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;  <span class="keywordflow">return</span> dirname($tmp_location);</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;}</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="comment"> * Checks out a Bazaar repository to the specified download location.</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#ac808bd6438397ca205135d0345cf4721">  349</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#ac808bd6438397ca205135d0345cf4721">make_download_bzr</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;  $tmp_location = <a class="code" href="group__filesystemfunctions.html#ga883d28ed54603b2d268902cec2379804">drush_tempdir</a>() . <span class="charliteral">&#39;/&#39;</span> . basename($download_location);</div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;url&#39;</span>])) {</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    $args = array();</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    $command = <span class="stringliteral">&#39;bzr&#39;</span>;</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;      $command .= <span class="stringliteral">&#39; branch  --use-existing-dir&#39;</span>;</div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    }</div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;      $command .= <span class="stringliteral">&#39; export&#39;</span>;</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    }</div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    <span class="keywordflow">if</span> (isset($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;      $command .= <span class="stringliteral">&#39; -r %s&#39;</span>;</div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;revision&#39;</span>];</div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    }</div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;    $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;      $args[] = $tmp_location;</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    }</div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;      $args[] = $tmp_location;</div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    }</div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    array_unshift($args, $command);</div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <span class="keywordflow">if</span> (call_user_func_array(<span class="stringliteral">&#39;drush_shell_exec&#39;</span>, $args)) {</div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project downloaded from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>])), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;      <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($tmp_location, $download_location, TRUE);</div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;      <span class="keywordflow">return</span> dirname($download_location);</div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    }</div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;  }</div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    $download[<span class="stringliteral">&#39;url&#39;</span>] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;unspecified location&quot;</span>);</div>
<div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;  }</div>
<div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;  <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to download @project from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>])));</div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;  <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>(dirname($tmp_location), TRUE);</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;  <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;}</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="comment"> * Checks out an SVN repository to the specified download location.</span></div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00396"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#aca118467de1ec3ed60b393ef49ecc7c5">  396</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#aca118467de1ec3ed60b393ef49ecc7c5">make_download_svn</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;url&#39;</span>])) {</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;interactive&#39;</span>])) {</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;      $function = <span class="stringliteral">&#39;drush_shell_exec_interactive&#39;</span>;</div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    }</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;      $options = <span class="stringliteral">&#39; --non-interactive&#39;</span>;</div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;      $function = <span class="stringliteral">&#39;drush_shell_exec&#39;</span>;</div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    }</div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="keywordflow">if</span> (!isset($download[<span class="stringliteral">&#39;force&#39;</span>]) || $download[<span class="stringliteral">&#39;force&#39;</span>]) {</div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;      $options = <span class="stringliteral">&#39; --force&#39;</span>;</div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    }</div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;      $command = <span class="stringliteral">&#39;svn&#39;</span> . $options . <span class="stringliteral">&#39; checkout&#39;</span>;</div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    }</div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;      $command = <span class="stringliteral">&#39;svn&#39;</span> . $options . <span class="stringliteral">&#39; export&#39;</span>;</div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    }</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    $args = array();</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    <span class="keywordflow">if</span> (isset($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;      $command .= <span class="stringliteral">&#39; -r%s&#39;</span>;</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;revision&#39;</span>];</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    }</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;    $args[] = $download_location;</div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;username&#39;</span>])) {</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;      $command .= <span class="stringliteral">&#39; --username %s&#39;</span>;</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;username&#39;</span>];</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;      <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;password&#39;</span>])) {</div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;        $command .= <span class="stringliteral">&#39; --password %s&#39;</span>;</div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;        $args[] = $download[<span class="stringliteral">&#39;password&#39;</span>];</div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;      }</div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;    }</div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    array_unshift($args, $command);</div>
<div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    $result = call_user_func_array($function, $args);</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <span class="keywordflow">if</span> ($result) {</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;      $args = array(</div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;        <span class="stringliteral">&#39;@project&#39;</span> =&gt; $name,</div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;        <span class="stringliteral">&#39;@command&#39;</span> =&gt; $command,</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;        <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>],</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;      );</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project @command from @url.&#39;</span>, $args), <span class="stringliteral">&#39;ok&#39;</span>);</div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;      <span class="keywordflow">return</span> $download_location;</div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    }</div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;      $download[<span class="stringliteral">&#39;url&#39;</span>] = <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;unspecified location&quot;</span>);</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;    }</div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;  }</div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to download @project from @url.&#39;</span>, array(<span class="stringliteral">&#39;@project&#39;</span> =&gt; $name, <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>])));</div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;  }</div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;}</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="comment"> * Test that any supplied hash values match the hash of the file content.</span></div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;<span class="comment"> * Unsupported hash algorithms are reported as failure.</span></div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a5ca2e2fb1cf115e40b99acbfc79128fa">  461</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a5ca2e2fb1cf115e40b99acbfc79128fa">_make_verify_checksums</a>($info, $filename) {</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;  $hash_algos = array(<span class="stringliteral">&#39;md5&#39;</span>, <span class="stringliteral">&#39;sha1&#39;</span>, <span class="stringliteral">&#39;sha256&#39;</span>, <span class="stringliteral">&#39;sha512&#39;</span>);</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;  <span class="comment">// We only have something to do if a key is an</span></div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;  <span class="comment">// available function.</span></div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;  <span class="keywordflow">if</span> (array_intersect(array_keys($info), $hash_algos)) {</div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    $content = file_get_contents($filename);</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <span class="keywordflow">foreach</span> ($hash_algos as $algo) {</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;      <span class="keywordflow">if</span> (!empty($info[$algo])) {</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;        $hash = <a class="code" href="make_8download_8inc.html#ad6e322df82e4cc8eabef054079321b6d">_make_hash</a>($algo, $content);</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;        <span class="keywordflow">if</span> ($hash !== $info[$algo]) {</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;          $args = array(</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;            <span class="stringliteral">&#39;@algo&#39;</span> =&gt; $algo,</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;            <span class="stringliteral">&#39;@file&#39;</span> =&gt; basename($filename),</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;            <span class="stringliteral">&#39;@expected&#39;</span> =&gt; $info[$algo],</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;            <span class="stringliteral">&#39;@hash&#39;</span> =&gt; $hash,</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;          );</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;          <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;DOWNLOAD_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Checksum @algo verification failed for @file. Expected @expected, received @hash.&#39;</span>, $args));</div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;          <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        }</div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;      }</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    }</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;  }</div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;}</div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;<span class="comment"> * Calculate the hash of a string for a given algorithm.</span></div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00489"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#ad6e322df82e4cc8eabef054079321b6d">  489</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#ad6e322df82e4cc8eabef054079321b6d">_make_hash</a>($algo, $string) {</div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;  <span class="keywordflow">switch</span> ($algo) {</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;md5&#39;</span>:</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;      <span class="keywordflow">return</span> md5($string);</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;sha1&#39;</span>:</div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;      <span class="keywordflow">return</span> sha1($string);</div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;    <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;      <span class="keywordflow">return</span> function_exists(<span class="stringliteral">&#39;hash&#39;</span>) ? hash($algo, $string) : <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;  }</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Oct 8 2014 09:04:54 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>