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

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="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Pages</a></div>

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

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_71080c12e208a9908650860bfe2a57f6.html">make</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">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;</div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;use <a class="code" href="classDrush_1_1Log_1_1LogLevel.html">Drush\Log\LogLevel</a>;</div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"></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"> * Downloads the given package to the destination directory.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *   The destination path on success, FALSE on failure.</span></div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#aaa0817e712779645b563cfb8ddfd99cd">   15</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="l00016"></a><span class="lineno">   16</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="l00017"></a><span class="lineno">   17</span>&#160;  <span class="keywordflow">if</span> (function_exists($function)) {</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;    <span class="keywordflow">return</span> $function($name, $type, $download, $download_location);</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;  }</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;  }</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;}</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * Download project using drush&#39;s pm-download command.</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a1a9f4bc0852743166afa72edf88008f4">   28</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="l00029"></a><span class="lineno">   29</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="l00030"></a><span class="lineno">   30</span>&#160;</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;  $options = array(</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="stringliteral">&#39;destination&#39;</span> =&gt; dirname($download_location),</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    <span class="stringliteral">&#39;yes&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="stringliteral">&#39;package-handler&#39;</span> =&gt; <span class="stringliteral">&#39;wget&#39;</span>,</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</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="l00036"></a><span class="lineno">   36</span>&#160;    <span class="comment">// This is only relevant for profiles, but we generally want the variant to</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</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="l00038"></a><span class="lineno">   38</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> : $download[<span class="stringliteral">&#39;variant&#39;</span>],</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    <span class="stringliteral">&#39;cache&#39;</span> =&gt; TRUE,</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;  );</div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;  <span class="keywordflow">if</span> ($type == <span class="stringliteral">&#39;core&#39;</span>) {</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;    $options[<span class="stringliteral">&#39;drupal-project-rename&#39;</span>] = basename($download_location);</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;  }</div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</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="l00045"></a><span class="lineno">   45</span>&#160;    unset($options[<span class="stringliteral">&#39;cache&#39;</span>]);</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;  }</div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;  $backend_options = array();</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</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="l00050"></a><span class="lineno">   50</span>&#160;    $backend_options[<span class="stringliteral">&#39;integrate&#39;</span>] = TRUE;</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    $backend_options[<span class="stringliteral">&#39;log&#39;</span>] = FALSE;</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  }</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  <span class="comment">// Perform actual download with `drush pm-download`.</span></div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</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="l00056"></a><span class="lineno">   56</span>&#160;  <span class="keywordflow">if</span> (empty($return[<span class="stringliteral">&#39;error_log&#39;</span>])) {</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="comment">// @todo Report the URL we used for download. See</span></div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="comment">// http://drupal.org/node/1452672.</span></div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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)), LogLevel::OK);</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;  }</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;}</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="comment"></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"> * Downloads a file to the specified location.</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="comment"> *   The destination directory on success, FALSE on failure.</span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a9bca6953efd915cc338678422d3e65f4">   69</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="l00070"></a><span class="lineno">   70</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="l00071"></a><span class="lineno">   71</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="l00072"></a><span class="lineno">   72</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    }</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</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="l00076"></a><span class="lineno">   76</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="l00077"></a><span class="lineno">   77</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="l00078"></a><span class="lineno">   78</span>&#160;  }</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</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="l00080"></a><span class="lineno">   80</span>&#160;  <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;}</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="comment"></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"> * Wrapper to drush_download_file().</span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment"> * @param string $download</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="comment"> *   The url of the file to download.</span></div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment"> * @param int $cache_duration</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment"> *   The time in seconds to cache the resultant download.</span></div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="comment"> *   The location of the downloaded file, or FALSE on failure.</span></div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a6381bf72fa72152dd12f122dbca83d78">   94</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="l00095"></a><span class="lineno">   95</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="l00096"></a><span class="lineno">   96</span>&#160;    $cache_duration = 0;</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  }</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</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="l00101"></a><span class="lineno">  101</span>&#160;  <span class="comment">// to save our download to.</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;  $file = basename(current(explode(<span class="charliteral">&#39;?&#39;</span>, $download, 2)));</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</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="l00104"></a><span class="lineno">  104</span>&#160;}</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="comment"></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"> * Unpacks a file to the specified download location.</span></div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="comment"> *   The download location on success, FALSE on failure.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a39dc84607968d96b01b9edcda21a8422">  112</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="l00113"></a><span class="lineno">  113</span>&#160;  $success = FALSE;</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</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="l00116"></a><span class="lineno">  116</span>&#160;    $tmp_location = <a class="code" href="group__filesystemfunctions.html#ga883d28ed54603b2d268902cec2379804">drush_tempdir</a>();</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="drush_8inc.html#ad8f8c8d5b65e0d9a863173da63ef78ee">drush_tarball_extract</a>($filename, $tmp_location)) {</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;      <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    }</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;    <span class="keywordflow">if</span> ($subtree) {</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;      $tmp_location .= <span class="charliteral">&#39;/&#39;</span> . $subtree;</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;      <span class="keywordflow">if</span> (!file_exists($tmp_location)) {</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</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="l00126"></a><span class="lineno">  126</span>&#160;      }</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    }</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;      $files = scandir($tmp_location);</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;      unset($files[0]); <span class="comment">// . directory</span></div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;      unset($files[1]); <span class="comment">// .. directory</span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</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="l00133"></a><span class="lineno">  133</span>&#160;        $tmp_location .= <span class="charliteral">&#39;/&#39;</span> . current($files);</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;    }</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;    $success = <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($tmp_location, $download_location, TRUE);</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="comment">// Remove the tarball.</span></div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keywordflow">if</span> (file_exists($filename)) {</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;      <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>($filename, TRUE);</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    }</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;  }</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="comment">// If this is an individual file, and no filename has been specified,</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    <span class="comment">// assume the original name.</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="keywordflow">if</span> (is_file($filename) &amp;&amp; !$name) {</div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;      $name = basename($filename);</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    }</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    <span class="comment">// The destination directory has already been created by</span></div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    <span class="comment">// findDownloadLocation().</span></div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</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="l00154"></a><span class="lineno">  154</span>&#160;    $success = <a class="code" href="group__filesystemfunctions.html#gaac7379e8cfa2163a874542fc021bf521">drush_move_dir</a>($filename, $destination, TRUE);</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="keywordflow">return</span> $success ? $download_location : FALSE;</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;}</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment"></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"> * For backwards compatibility.</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#a2aa73a9f71f17d7bdeb88e75489e1344">  162</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="l00163"></a><span class="lineno">  163</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="l00164"></a><span class="lineno">  164</span>&#160;}</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;<span class="comment"> * Copies a folder the specified location.</span></div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="comment"> *   The TRUE on success, FALSE on failure.</span></div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a593902a3666d1820aa6a482989eb6939">  172</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a593902a3666d1820aa6a482989eb6939">make_download_copy</a>($name, $type, $download, $download_location) {</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="keywordflow">if</span> ($folder = <a class="code" href="make_8download_8inc.html#a8ee672dfff99c9ce5d0fb6c65bba933d">_make_download_copy</a>($download[<span class="stringliteral">&#39;url&#39;</span>])) {</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project copied 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>])), LogLevel::OK);</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($folder, $download_location, FILE_EXISTS_OVERWRITE);</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;    <a class="code" href="make_8utilities_8inc.html#aa2a78298291b42502718822ed5b59969">make_error</a>(<span class="stringliteral">&#39;COPY_ERROR&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to copy @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="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;}</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="comment"> * Wrapper to drush_download_copy().</span></div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="comment"> * @param string $folder</span></div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="comment"> *   The location of the folder to copy.</span></div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="comment"> *   The location of the folder, or FALSE on failure.</span></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"><a class="code" href="make_8download_8inc.html#a8ee672dfff99c9ce5d0fb6c65bba933d">  190</a></span>&#160;<span class="keyword">function</span> <a class="code" href="make_8download_8inc.html#a8ee672dfff99c9ce5d0fb6c65bba933d">_make_download_copy</a>($folder) {</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    <span class="keywordflow">if</span> (substr($folder, 0, 7) == <span class="stringliteral">&#39;file://&#39;</span>) {</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;        $folder = substr($folder, 7);</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    }</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keywordflow">if</span> (is_dir($folder)) {</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="keywordflow">return</span> $folder;</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    }</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;}</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="comment"> * Checks out a git repository to the specified download location.</span></div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;<span class="comment"> * Allowed parameters in $download, in order of precedence:</span></div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="comment"> *   - &#39;tag&#39;</span></div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;<span class="comment"> *   - &#39;revision&#39;</span></div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="comment"> *   - &#39;branch&#39;</span></div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="comment"> * This will also attempt to write out release information to the</span></div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="comment"> * .info file if the &#39;no-gitinfofile&#39; option is FALSE. If</span></div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;<span class="comment"> * $download[&#39;full_version&#39;] is present, this will be used, otherwise,</span></div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="comment"> * version will be set in this order of precedence:</span></div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="comment"> *   - &#39;tag&#39;</span></div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="comment"> *   - &#39;branch&#39;</span></div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;<span class="comment"> *   - &#39;revision&#39;</span></div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00220"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#af0b8a0195e141dd3d497d2e663d993fa">  220</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="l00221"></a><span class="lineno">  221</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;  $checkout_after_clone = TRUE;</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;  <span class="comment">// If no download URL specified, assume anonymous clone from git.drupal.org.</span></div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</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="l00226"></a><span class="lineno">  226</span>&#160;  <span class="comment">// If no working-copy download URL specified, assume it is the same.</span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</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="l00228"></a><span class="lineno">  228</span>&#160;</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</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="l00230"></a><span class="lineno">  230</span>&#160;  <span class="comment">// declared, create a new git reference cache of the remote repository,</span></div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;  <span class="comment">// or update the existing cache to fetch recent changes.</span></div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;  <span class="comment">// @see package_handler_download_project()</span></div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</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="l00234"></a><span class="lineno">  234</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="l00235"></a><span class="lineno">  235</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="l00236"></a><span class="lineno">  236</span>&#160;    <span class="comment">// Set up a new cache, if it doesn&#39;t exist.</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="keywordflow">if</span> (!file_exists($project_cache)) {</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;      $command = <span class="stringliteral">&#39;git clone --mirror&#39;</span>;</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</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="l00240"></a><span class="lineno">  240</span>&#160;        $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;      }</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;      $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</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="l00244"></a><span class="lineno">  244</span>&#160;    }</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;      <span class="comment">// Update the --mirror clone.</span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</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="l00248"></a><span class="lineno">  248</span>&#160;    }</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    $git_cache = $project_cache;</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;  }</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;  <span class="comment">// Use working-copy download URL if --working-copy specified.</span></div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</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="l00254"></a><span class="lineno">  254</span>&#160;</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</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="l00256"></a><span class="lineno">  256</span>&#160;</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;  $command = <span class="stringliteral">&#39;git clone %s %s&#39;</span>;</div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</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="l00259"></a><span class="lineno">  259</span>&#160;    $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;  }</div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;  <span class="keywordflow">if</span> ($cache) {</div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    $command .= <span class="stringliteral">&#39; --reference &#39;</span> . drush_escapeshellarg($git_cache);</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;  }</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;  <span class="comment">// the shallow clone option is only applicable to git entries which reference a tag or a branch</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;shallow-clone&#39;</span>, FALSE) &amp;&amp;</div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;     (!empty($download[<span class="stringliteral">&#39;tag&#39;</span>]) || !empty($download[<span class="stringliteral">&#39;branch&#39;</span>]))) {</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;</div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    $branch = (!empty($download[<span class="stringliteral">&#39;branch&#39;</span>]) ? $download[<span class="stringliteral">&#39;branch&#39;</span>] : $download[<span class="stringliteral">&#39;tag&#39;</span>]);</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    $command .= <span class="stringliteral">&quot; --depth=1 --branch=${branch}&quot;</span>;</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    <span class="comment">// since the shallow copy option automatically &quot;checks out&quot; the requested branch, no further</span></div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="comment">// actions are needed after the clone command</span></div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    $checkout_after_clone = FALSE;</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;  }</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="comment">// Before we can checkout anything, we need to clone the repository.</span></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>($command, $url, $tmp_location)) {</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</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="l00280"></a><span class="lineno">  280</span>&#160;    <span class="keywordflow">return</span> FALSE;</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;</div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;  <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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)), LogLevel::OK);</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;  <span class="keywordflow">if</span> ($checkout_after_clone) {</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;    <span class="comment">// Get the current directory (so we can move back later).</span></div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;    $cwd = getcwd();</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="comment">// Change into the working copy of the cloned repo.</span></div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    chdir($tmp_location);</div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;</div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    <span class="comment">// We want to use the most specific target possible, so first try a refspec.</span></div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;refspec&#39;</span>])) {</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</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="l00294"></a><span class="lineno">  294</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</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;        <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="l00297"></a><span class="lineno">  297</span>&#160;          <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&quot;Checked out FETCH_HEAD.&quot;</span>), LogLevel::INFO);</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        }</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;      }</div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</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="l00302"></a><span class="lineno">  302</span>&#160;      }</div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    }</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    <span class="comment">// If there wasn&#39;t a refspec, try a tag.</span></div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    elseif (!empty($download[<span class="stringliteral">&#39;tag&#39;</span>])) {</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;      <span class="comment">// @TODO: change checkout to refs path.</span></div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</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="l00309"></a><span class="lineno">  309</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;      }</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</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="l00313"></a><span class="lineno">  313</span>&#160;      }</div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    }</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="comment">// If there wasn&#39;t a tag, try a specific revision hash.</span></div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    elseif (!empty($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</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="l00319"></a><span class="lineno">  319</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</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">else</span> {</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</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="l00323"></a><span class="lineno">  323</span>&#160;      }</div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;    }</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="comment">// If not, see if we at least have a branch.</span></div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    elseif (!empty($download[<span class="stringliteral">&#39;branch&#39;</span>])) {</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</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="l00329"></a><span class="lineno">  329</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;      }</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</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="l00332"></a><span class="lineno">  332</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</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="keywordflow">else</span> {</div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</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="l00336"></a><span class="lineno">  336</span>&#160;      }</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    }</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;submodule&#39;</span>])) {</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;      $command = <span class="stringliteral">&#39;git submodule update&#39;</span>;</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;      <span class="keywordflow">foreach</span> ($download[<span class="stringliteral">&#39;submodule&#39;</span>] as $option) {</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;        $command .= <span class="stringliteral">&#39; --%s&#39;</span>;</div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;      }</div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</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="l00345"></a><span class="lineno">  345</span>&#160;        <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Initialized registered submodules.&#39;</span>), LogLevel::OK);</div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;      }</div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</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="l00349"></a><span class="lineno">  349</span>&#160;      }</div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    }</div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    <span class="comment">// Move back to last current directory (first line).</span></div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    chdir($cwd);</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;  }</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;  <span class="comment">// Move the directory into the final resting location.</span></div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;  <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($tmp_location, $download_location, FILE_EXISTS_OVERWRITE);</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">return</span> dirname($tmp_location);</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;}</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<span class="comment"> * Checks out a Bazaar repository to the specified download location.</span></div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#ac808bd6438397ca205135d0345cf4721">  368</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="l00369"></a><span class="lineno">  369</span>&#160;  $tmp_path = <a class="code" href="make_8utilities_8inc.html#ab3c72a6d8be958f40fc0cbcca29a183b">make_tmp</a>();</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</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="l00371"></a><span class="lineno">  371</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;url&#39;</span>])) {</div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    $args = array();</div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    $command = <span class="stringliteral">&#39;bzr&#39;</span>;</div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;      $command .= <span class="stringliteral">&#39; branch  --use-existing-dir&#39;</span>;</div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    }</div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;      $command .= <span class="stringliteral">&#39; export&#39;</span>;</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;    <span class="keywordflow">if</span> (isset($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;      $command .= <span class="stringliteral">&#39; -r %s&#39;</span>;</div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;revision&#39;</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;    $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;      $args[] = $tmp_location;</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    }</div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;      $args[] = $tmp_location;</div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    }</div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;    array_unshift($args, $command);</div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</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="l00396"></a><span class="lineno">  396</span>&#160;      <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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>])), LogLevel::OK);</div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;      <a class="code" href="group__filesystemfunctions.html#ga1d86ac8e2e56a75acb0abcdc8e0dcf09">drush_copy_dir</a>($tmp_location, $download_location, FILE_EXISTS_OVERWRITE);</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;      <span class="keywordflow">return</span> dirname($download_location);</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    }</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;  }</div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</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="l00403"></a><span class="lineno">  403</span>&#160;  }</div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</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="l00405"></a><span class="lineno">  405</span>&#160;  <a class="code" href="group__filesystemfunctions.html#gabff54c630a451976fc121257f6efd960">drush_delete_dir</a>(dirname($tmp_location), TRUE);</div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;  <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;}</div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment"> * Checks out an SVN repository to the specified download location.</span></div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="comment"> * @return mixed</span></div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;<span class="comment"> *   The download location on success, FALSE otherwise.</span></div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#aca118467de1ec3ed60b393ef49ecc7c5">  415</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="l00416"></a><span class="lineno">  416</span>&#160;  $wc = <a class="code" href="make_8utilities_8inc.html#a4936fba59cad3feaaf82d602958af199">_get_working_copy_option</a>($download);</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;  <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;url&#39;</span>])) {</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;interactive&#39;</span>])) {</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;      $function = <span class="stringliteral">&#39;drush_shell_exec_interactive&#39;</span>;</div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    }</div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;      $options = <span class="stringliteral">&#39; --non-interactive&#39;</span>;</div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;      $function = <span class="stringliteral">&#39;drush_shell_exec&#39;</span>;</div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    }</div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</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="l00426"></a><span class="lineno">  426</span>&#160;      $options = <span class="stringliteral">&#39; --force&#39;</span>;</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    }</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    <span class="keywordflow">if</span> ($wc) {</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;      $command = <span class="stringliteral">&#39;svn&#39;</span> . $options . <span class="stringliteral">&#39; checkout&#39;</span>;</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;    }</div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;      $command = <span class="stringliteral">&#39;svn&#39;</span> . $options . <span class="stringliteral">&#39; export&#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;    $args = array();</div>
<div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <span class="keywordflow">if</span> (isset($download[<span class="stringliteral">&#39;revision&#39;</span>])) {</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;      $command .= <span class="stringliteral">&#39; -r%s&#39;</span>;</div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;revision&#39;</span>];</div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    }</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;    $args[] = $download[<span class="stringliteral">&#39;url&#39;</span>];</div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    $args[] = $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">if</span> (!empty($download[<span class="stringliteral">&#39;username&#39;</span>])) {</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;      $command .= <span class="stringliteral">&#39; --username %s&#39;</span>;</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;      $args[] = $download[<span class="stringliteral">&#39;username&#39;</span>];</div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;      <span class="keywordflow">if</span> (!empty($download[<span class="stringliteral">&#39;password&#39;</span>])) {</div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;        $command .= <span class="stringliteral">&#39; --password %s&#39;</span>;</div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;        $args[] = $download[<span class="stringliteral">&#39;password&#39;</span>];</div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;      }</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;    array_unshift($args, $command);</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    $result = call_user_func_array($function, $args);</div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="keywordflow">if</span> ($result) {</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;      $args = array(</div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;        <span class="stringliteral">&#39;@project&#39;</span> =&gt; $name,</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        <span class="stringliteral">&#39;@command&#39;</span> =&gt; $command,</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        <span class="stringliteral">&#39;@url&#39;</span> =&gt; $download[<span class="stringliteral">&#39;url&#39;</span>],</div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;      );</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;      <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;@project @command from @url.&#39;</span>, $args), LogLevel::OK);</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;      <span class="keywordflow">return</span> $download_location;</div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    }</div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</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="l00467"></a><span class="lineno">  467</span>&#160;    }</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;  }</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</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="l00471"></a><span class="lineno">  471</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;  }</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;}</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</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="l00477"></a><span class="lineno">  477</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;<span class="comment"> * Unsupported hash algorithms are reported as failure.</span></div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00480"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#a5ca2e2fb1cf115e40b99acbfc79128fa">  480</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="l00481"></a><span class="lineno">  481</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="l00482"></a><span class="lineno">  482</span>&#160;  <span class="comment">// We only have something to do if a key is an</span></div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;  <span class="comment">// available function.</span></div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;  <span class="keywordflow">if</span> (array_intersect(array_keys($info), $hash_algos)) {</div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    $content = file_get_contents($filename);</div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;    <span class="keywordflow">foreach</span> ($hash_algos as $algo) {</div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;      <span class="keywordflow">if</span> (!empty($info[$algo])) {</div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;        $hash = <a class="code" href="make_8download_8inc.html#ad6e322df82e4cc8eabef054079321b6d">_make_hash</a>($algo, $content);</div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;        <span class="keywordflow">if</span> ($hash !== $info[$algo]) {</div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;          $args = array(</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;            <span class="stringliteral">&#39;@algo&#39;</span> =&gt; $algo,</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;            <span class="stringliteral">&#39;@file&#39;</span> =&gt; basename($filename),</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;            <span class="stringliteral">&#39;@expected&#39;</span> =&gt; $info[$algo],</div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;            <span class="stringliteral">&#39;@hash&#39;</span> =&gt; $hash,</div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;          );</div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</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="l00497"></a><span class="lineno">  497</span>&#160;          <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        }</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;      }</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;    }</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;  }</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;}</div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;<span class="comment"> * Calculate the hash of a string for a given algorithm.</span></div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"><a class="code" href="make_8download_8inc.html#ad6e322df82e4cc8eabef054079321b6d">  508</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="l00509"></a><span class="lineno">  509</span>&#160;  <span class="keywordflow">switch</span> ($algo) {</div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;md5&#39;</span>:</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;      <span class="keywordflow">return</span> md5($string);</div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    <span class="keywordflow">case</span> <span class="stringliteral">&#39;sha1&#39;</span>:</div>
<div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;      <span class="keywordflow">return</span> sha1($string);</div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</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="l00516"></a><span class="lineno">  516</span>&#160;  }</div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Nov 2 2016 07:28:55 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>