Drush: commands/pm/package_handler/git_drupalorg.inc Source File

  1. 7.x doxygen/html/git__drupalorg_8inc_source.html
  2. master doxygen/html/git__drupalorg_8inc_source.html
Go to the documentation of this file.
1 <?php
2 
3 /**
4  * @file
5  * Drush PM drupal.org Git extension.
6  */
7 
8 /**
9  * Validate this package handler can run.
10  */
12  // Check git command exists. Disable possible output.
13  $debug = drush_get_context('DRUSH_DEBUG');
14  drush_set_context('DRUSH_DEBUG', FALSE);
15 
16  // We need to check for a git executable and then make sure version is >=1.7
17  // (avoid drush_shell_exec because we want to run this even in --simulated mode.)
18  $success = exec('git --version', $git);
19  $git_version_array = explode(" ", $git[0]);
20  $git_version = $git_version_array[2];
21 
22  drush_set_context('DRUSH_DEBUG', $debug);
23  if (!$success) {
24  return drush_set_error('DRUSH_SHELL_COMMAND_NOT_FOUND', dt('git executable not found.'));
25  } elseif ($git_version < '1.7') {
26  return drush_set_error('GIT_VERSION_UNSUPPORTED', dt('Your git version !git_version is not supported; please upgrade to git 1.7 or later.', array('!git_version' => $git_version)));
27  }
28  // Check git_deploy is enabled. Only for bootstrapped sites.
29  if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_FULL) {
30  drush_include_engine('drupal', 'environment');
31  if (!drush_get_option('gitinfofile') && !drush_module_exists('git_deploy')) {
32  drush_log(dt('git package handler needs git_deploy module enabled to work properly.'), 'warning');
33  }
34  }
35 
36  return TRUE;
37 }
38 
39 /**
40  * Download a project.
41  *
42  * @param $request
43  * The project array with name, base and full (final) paths.
44  * @param $release
45  * The release details array from drupal.org.
46  */
47 function package_handler_download_project(&$request, $release) {
48  if ($username = drush_get_option('gitusername')) {
49  // Uses SSH, which enables pushing changes back to git.drupal.org.
50  $repository = $username . '@git.drupal.org:project/' . $request['name'] . '.git';
51  }
52  else {
53  $repository = 'git://git.drupal.org/project/' . $request['name'] . '.git';
54  }
55  $request['repository'] = $repository;
56  $tag = $release['tag'];
57 
58  // If the --cache option was given, create a new git reference cache of the
59  // remote repository, or update the existing cache to fetch recent changes.
60  if (drush_get_option('cache') && ($cachedir = drush_directory_cache())) {
61  $gitcache = $cachedir . '/git';
62  $projectcache = $gitcache . '/' . $request['name'] . '.git';
63  drush_mkdir($gitcache);
64  // Setup a new cache, if we don't have this project yet.
65  if (!file_exists($projectcache)) {
66  // --mirror works similar to --bare, but retrieves all tags, local
67  // branches, remote branches, and any other refs (notes, stashes, etc).
69  $command = 'git clone --mirror';
70  if (drush_get_context('DRUSH_VERBOSE')) {
71  $command .= ' --verbose --progress';
72  }
73  $command .= ' %s %s';
74  drush_shell_cd_and_exec($gitcache, $command, $repository, $request['name'] . '.git');
75  }
76  // If we already have this project, update it to speed up subsequent clones.
77  else {
78  // A --mirror clone is fully synchronized with `git remote update` instead
79  // of `git fetch --all`.
81  drush_shell_cd_and_exec($projectcache, 'git remote update');
82  }
83  $gitcache = $projectcache;
84  }
85 
86  // Clone the repo into its appropriate target location.
87  $command = 'git clone';
88  $command .= ' ' . drush_get_option('gitcloneparams');
89  if (drush_get_option('cache')) {
90  $command .= ' --reference ' . drush_escapeshellarg($gitcache);
91  }
92  if (drush_get_context('DRUSH_VERBOSE')) {
93  $command .= ' --verbose --progress';
94  }
95  $command .= ' ' . drush_escapeshellarg($repository);
96  $command .= ' ' . drush_escapeshellarg($request['full_project_path']);
97  if (!drush_shell_exec($command)) {
98  return drush_set_error('DRUSH_PM_GIT_CHECKOUT_PROBLEMS', dt('Unable to clone project !name from git.drupal.org.', array('!name' => $request['name'])));
99  }
100 
101  // Check if the 'tag' from the release feed is a tag or a branch.
102  // If the tag exists, git will return it
103  if (!drush_shell_cd_and_exec($request['full_project_path'], 'git tag -l ' . drush_escapeshellarg($tag))) {
104  return drush_set_error('DRUSH_PM_GIT_CHECKOUT_PROBLEMS', dt('Unable to clone project !name from git.drupal.org.', array('!name' => $request['name'])));
105  }
106  $output = drush_shell_exec_output();
107 
108  if (isset($output[0]) && ($output[0] == $tag)) {
109  // If we want a tag, simply checkout it. The checkout will end up in
110  // "detached head" state.
111  $command = 'git checkout ' . drush_get_option('gitcheckoutparams');
112  $command .= ' ' . drush_escapeshellarg($tag);
113  if (!drush_shell_cd_and_exec($request['full_project_path'], $command)) {
114  return drush_set_error('DRUSH_PM_UNABLE_CHECKOUT', 'Unable to retrieve ' . $request['name'] . ' from git.drupal.org.');
115  }
116  }
117  else {
118  // Else, we want to checkout a branch.
119  // First check if we are not already in the correct branch.
120  if (!drush_shell_cd_and_exec($request['full_project_path'], 'git symbolic-ref HEAD')) {
121  return drush_set_error('DRUSH_PM_UNABLE_CHECKOUT', 'Unable to retrieve ' . $request['name'] . ' from git.drupal.org.');
122  }
123  $output = drush_shell_exec_output();
124  $current_branch = preg_replace('@^refs/heads/@', '', $output[0]);
125 
126  // If we are not on the correct branch already, switch to the correct one.
127  if ($current_branch != $tag) {
128  $command = 'git checkout';
129  $command .= ' ' . drush_get_option('gitcheckoutparams');
130  $command .= ' --track ' . drush_escapeshellarg('origin/' . $tag) . ' -b ' . drush_escapeshellarg($tag);
131  if (!drush_shell_cd_and_exec($request['full_project_path'], $command)) {
132  return drush_set_error('DRUSH_PM_UNABLE_CHECKOUT', 'Unable to retrieve ' . $request['name'] . ' from git.drupal.org.');
133  }
134  }
135  }
136 
137  return TRUE;
138 }
139 
140 /**
141  * Update a project (so far, only modules are supported).
142  *
143  * @param $request
144  * The project array with name, base and full (final) paths.
145  * @param $release
146  * The release details array from drupal.org.
147  */
148 function package_handler_update_project($request, $release) {
149  drush_log('Updating project ' . $request['name'] . ' ...');
150 
151  $commands = array();
152  if ($release['version_extra'] == 'dev') {
153  // Update the branch of the development repository.
154  $commands[] = 'git pull';
155  $commands[] = drush_get_option('gitpullparams');
156  }
157  else {
158  // Use a stable repository.
159  $commands[] = 'git fetch';
160  $commands[] = drush_get_option('gitfetchparams');
161  $commands[] = ';';
162  $commands[] = 'git checkout';
163  $commands[] = drush_get_option('gitcheckoutparams');
164  $commands[] = $release['version'];
165  }
166 
167  if (!drush_shell_cd_and_exec($request['full_project_path'], implode(' ', $commands))) {
168  return drush_set_error('DRUSH_PM_UNABLE_CHECKOUT', 'Unable to update ' . $request['name'] . ' from git.drupal.org.');
169  }
170 
171  return TRUE;
172 }
173 
174 /**
175  * Post download action.
176  *
177  * This action take place once the project is placed in its final location.
178  *
179  * Here we add the project as a git submodule.
180  */
181 function package_handler_post_download($project, $release) {
182  if (drush_get_option('gitsubmodule', FALSE)) {
183  // Obtain the superproject path, then add as submodule.
184  if (drush_shell_cd_and_exec(dirname($project['full_project_path']), 'git rev-parse --show-toplevel')) {
185  $output = drush_shell_exec_output();
186  $superproject = $output[0];
187  // Add the downloaded project as a submodule of its git superproject.
188  $command = array();
189  $command[] = 'git submodule add';
190  $command[] = drush_get_option('gitsubmoduleaddparams');
191  $command[] = $project['repository'];
192  // We need the submodule relative path.
193  $command[] = substr($project['full_project_path'], strlen($superproject) + 1);
194  if (!drush_shell_cd_and_exec($superproject, implode(' ', $command))) {
195  return drush_set_error('DRUSH_PM_GIT_CHECKOUT_PROBLEMS', dt('Unable to add !name as a git submodule of !super.', array('!name' => $project['name'], '!super' => $superproject)));
196  }
197  }
198  else {
199  return drush_set_error('DRUSH_PM_GIT_SUBMODULE_PROBLEMS', dt('Unable to create !project as a git submodule: !dir is not in a Git repository.', array('!project' => $project['name'], '!dir' => dirname($project['full_project_path']))));
200  }
201  }
202 
203  if (drush_get_option('gitinfofile', FALSE)) {
204  $matches = array();
205  if (preg_match('/^(.+).x-dev$/', $release['version'], $matches)) {
206  $full_version = drush_pm_git_drupalorg_compute_rebuild_version($project['project_install_location'], $matches[1]);
207  }
208  else {
209  $full_version = $release['version'];
210  }
211  drush_pm_inject_info_file_metadata($project['project_install_location'], $project['name'], $full_version);
212  }
213 
214 }
215 
216 /**
217  * Helper function to compute the rebulid version string for a project.
218  *
219  * This does some magic in Git to find the latest release tag along
220  * the branch we're packaging from, count the number of commits since
221  * then, and use that to construct this fancy alternate version string
222  * which is useful for the version-specific dependency support in Drupal
223  * 7 and higher.
224  *
225  * NOTE: A similar function lives in git_deploy and in the drupal.org
226  * packaging script (see DrupalorgProjectPackageRelease.class.php inside
227  * drupalorg/drupalorg_project/plugins/release_packager). Any changes to the
228  * actual logic in here should probably be reflected in the other places.
229  *
230  * @param string $project_dir
231  * The full path to the root directory of the project to operate on.
232  * @param string $branch
233  * The branch that we're using for -dev. This should only include the
234  * core version, the dash, and the branch's major version (eg. '7.x-2').
235  *
236  * @return string
237  * The full 'rebuild version string' in the given Git checkout.
238  */
239 function drush_pm_git_drupalorg_compute_rebuild_version($project_dir, $branch) {
240  $rebuild_version = '';
241  $branch_preg = preg_quote($branch);
242 
243  if (drush_shell_cd_and_exec($project_dir, 'git describe --tags')) {
244  $shell_output = drush_shell_exec_output();
245  $last_tag = $shell_output[0];
246  // Make sure the tag starts as Drupal formatted (for eg.
247  // 7.x-1.0-alpha1) and if we are on a proper branch (ie. not master)
248  // then it's on that branch.
249  if (preg_match('/^(?<drupalversion>' . $branch_preg . '\.\d+(?:-[^-]+)?)(?<gitextra>-(?<numberofcommits>\d+-)g[0-9a-f]{7})?$/', $last_tag, $matches)) {
250  // If we found additional git metadata (in particular, number of commits)
251  // then use that info to build the version string.
252  if (isset($matches['gitextra'])) {
253  $rebuild_version = $matches['drupalversion'] . '+' . $matches['numberofcommits'] . 'dev';
254  }
255  // Otherwise, the branch tip is pointing to the same commit as the
256  // last tag on the branch, in which case we use the prior tag and
257  // add '+0-dev' to indicate we're still on a -dev branch.
258  else {
259  $rebuild_version = $last_tag . '+0-dev';
260  }
261  }
262  }
263  return $rebuild_version;
264 }

File

doxygen/html/git__drupalorg_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/pm/package_handler/git_drupalorg.inc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Drush
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>

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

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_afac61274991793aa7e9133a8f4f291e.html">commands</a></li><li class="navelem"><a class="el" href="dir_15591510fc66414792ea8adada328324.html">pm</a></li><li class="navelem"><a class="el" href="dir_fd7191258f571be46cdba38dca2de902.html">package_handler</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">git_drupalorg.inc</div>  </div>
</div><!--header-->
<div class="contents">
<a href="git__drupalorg_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</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">/**</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * @file</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * Drush PM drupal.org Git extension.</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> * Validate this package handler can run.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#ae203b6a2394bb0cae2970befc56eea36">   11</a></span>&#160;<span class="keyword">function</span> <a class="code" href="git__drupalorg_8inc.html#ae203b6a2394bb0cae2970befc56eea36">package_handler_validate</a>() {</div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;  <span class="comment">// Check git command exists. Disable possible output.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;  $debug = <a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_DEBUG&#39;</span>);</div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_DEBUG&#39;</span>, FALSE);</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;  <span class="comment">// We need to check for a git executable and then make sure version is &gt;=1.7</span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;  <span class="comment">// (avoid drush_shell_exec because we want to run this even in --simulated mode.)</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;  $success = exec(<span class="stringliteral">&#39;git --version&#39;</span>, $git);</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;  $git_version_array = explode(<span class="stringliteral">&quot; &quot;</span>, $git[0]);</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;  $git_version = $git_version_array[2];</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;  <a class="code" href="context_8inc.html#af983acfe90e7d7bbdbd67c57f93708ba">drush_set_context</a>(<span class="stringliteral">&#39;DRUSH_DEBUG&#39;</span>, $debug);</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;  <span class="keywordflow">if</span> (!$success) {</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_SHELL_COMMAND_NOT_FOUND&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;git executable not found.&#39;</span>));</div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;  } elseif ($git_version &lt; <span class="stringliteral">&#39;1.7&#39;</span>) {</div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;GIT_VERSION_UNSUPPORTED&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Your git version !git_version is not supported; please upgrade to git 1.7 or later.&#39;</span>, array(<span class="stringliteral">&#39;!git_version&#39;</span> =&gt; $git_version)));</div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;  }</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;  <span class="comment">// Check git_deploy is enabled. Only for bootstrapped sites.</span></div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt;= <a class="code" href="lib_2Drush_2Boot_2bootstrap_8inc.html#a6ea86b0ce6756b159a3fdef78fdff159">DRUSH_BOOTSTRAP_DRUPAL_FULL</a>) {</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;    <a class="code" href="engines_8inc.html#a91df31f18b0a1d05540ccaf85e6d9a88">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;environment&#39;</span>);</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitinfofile&#39;</span>) &amp;&amp; !<a class="code" href="commands_2core_2drupal_2environment_8inc.html#a643d851fd8dc63ea2ce8cf67aa33098c">drush_module_exists</a>(<span class="stringliteral">&#39;git_deploy&#39;</span>)) {</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;      <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;git package handler needs git_deploy module enabled to work properly.&#39;</span>), <span class="stringliteral">&#39;warning&#39;</span>);</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    }</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;  }</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;}</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"> * Download a project.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"> * @param $request</span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment"> *   The project array with name, base and full (final) paths.</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment"> * @param $release</span></div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="comment"> *   The release details array from drupal.org.</span></div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a5332feb31d03dabd7e99bb9e8f763ce4">   47</a></span>&#160;<span class="keyword">function</span> <a class="code" href="git__drupalorg_8inc.html#a5332feb31d03dabd7e99bb9e8f763ce4">package_handler_download_project</a>(&amp;$request, $release) {</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;  <span class="keywordflow">if</span> ($username = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitusername&#39;</span>)) {</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    <span class="comment">// Uses SSH, which enables pushing changes back to git.drupal.org.</span></div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    $repository = $username . <span class="stringliteral">&#39;@git.drupal.org:project/&#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39;.git&#39;</span>;</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;  }</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    $repository = <span class="stringliteral">&#39;git://git.drupal.org/project/&#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39;.git&#39;</span>;</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  }</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;  $request[<span class="stringliteral">&#39;repository&#39;</span>] = $repository;</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;  $tag = $release[<span class="stringliteral">&#39;tag&#39;</span>];</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;  <span class="comment">// If the --cache option was given, create a new git reference cache of the</span></div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;  <span class="comment">// remote repository, or update the existing cache to fetch recent changes.</span></div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;cache&#39;</span>) &amp;&amp; ($cachedir = <a class="code" href="includes_2environment_8inc.html#a92afdf9afda25ac6d226ba45f6f1fbe0">drush_directory_cache</a>())) {</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    $gitcache = $cachedir . <span class="stringliteral">&#39;/git&#39;</span>;</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;    $projectcache = $gitcache . <span class="charliteral">&#39;/&#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39;.git&#39;</span>;</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <a class="code" href="group__filesystemfunctions.html#ga6027285d97028ad3299d3aa262be8c2f">drush_mkdir</a>($gitcache);</div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    <span class="comment">// Setup a new cache, if we don&#39;t have this project yet.</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    <span class="keywordflow">if</span> (!file_exists($projectcache)) {</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;      <span class="comment">// --mirror works similar to --bare, but retrieves all tags, local</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;      <span class="comment">// branches, remote branches, and any other refs (notes, stashes, etc).</span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;      <span class="comment">// @see http://stackoverflow.com/questions/3959924</span></div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;      $command = <span class="stringliteral">&#39;git clone --mirror&#39;</span>;</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</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="l00071"></a><span class="lineno">   71</span>&#160;        $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;      }</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;      $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;      <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($gitcache, $command, $repository, $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39;.git&#39;</span>);</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    }</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="comment">// If we already have this project, update it to speed up subsequent clones.</span></div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;      <span class="comment">// A --mirror clone is fully synchronized with `git remote update` instead</span></div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;      <span class="comment">// of `git fetch --all`.</span></div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;      <span class="comment">// @see http://stackoverflow.com/questions/6150188</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;      <a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($projectcache, <span class="stringliteral">&#39;git remote update&#39;</span>);</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    }</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    $gitcache = $projectcache;</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;  }</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  <span class="comment">// Clone the repo into its appropriate target location.</span></div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;  $command  = <span class="stringliteral">&#39;git clone&#39;</span>;</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;  $command .= <span class="charliteral">&#39; &#39;</span> . <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitcloneparams&#39;</span>);</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;cache&#39;</span>)) {</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    $command .= <span class="stringliteral">&#39; --reference &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($gitcache);</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;  }</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</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="l00093"></a><span class="lineno">   93</span>&#160;    $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;  }</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  $command .= <span class="charliteral">&#39; &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($repository);</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;  $command .= <span class="charliteral">&#39; &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>]);</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#gafd358ceac1286dbdd141ff2b8eb7d556">drush_shell_exec</a>($command)) {</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_GIT_CHECKOUT_PROBLEMS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to clone project !name from git.drupal.org.&#39;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>])));</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;  }</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;  <span class="comment">// Check if the &#39;tag&#39; from the release feed is a tag or a branch.</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;  <span class="comment">// If the tag exists, git will return it</span></div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>], <span class="stringliteral">&#39;git tag -l &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($tag))) {</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_GIT_CHECKOUT_PROBLEMS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to clone project !name from git.drupal.org.&#39;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $request[<span class="stringliteral">&#39;name&#39;</span>])));</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;  }</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;  $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;  <span class="keywordflow">if</span> (isset($output[0]) &amp;&amp; ($output[0] == $tag)) {</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="comment">// If we want a tag, simply checkout it. The checkout will end up in</span></div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="comment">// &quot;detached head&quot; state.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;    $command  = <span class="stringliteral">&#39;git checkout &#39;</span> . <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitcheckoutparams&#39;</span>);</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    $command .= <span class="charliteral">&#39; &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($tag);</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>], $command)) {</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_UNABLE_CHECKOUT&#39;</span>, <span class="stringliteral">&#39;Unable to retrieve &#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39; from git.drupal.org.&#39;</span>);</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    }</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;  }</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    <span class="comment">// Else, we want to checkout a branch.</span></div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    <span class="comment">// First check if we are not already in the correct branch.</span></div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>], <span class="stringliteral">&#39;git symbolic-ref HEAD&#39;</span>)) {</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_UNABLE_CHECKOUT&#39;</span>, <span class="stringliteral">&#39;Unable to retrieve &#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39; from git.drupal.org.&#39;</span>);</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;    }</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    $current_branch = preg_replace(<span class="stringliteral">&#39;@^refs/heads/@&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $output[0]);</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    <span class="comment">// If we are not on the correct branch already, switch to the correct one.</span></div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    <span class="keywordflow">if</span> ($current_branch != $tag) {</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;      $command  = <span class="stringliteral">&#39;git checkout&#39;</span>;</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;      $command .= <span class="charliteral">&#39; &#39;</span> . <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitcheckoutparams&#39;</span>);</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;      $command .= <span class="stringliteral">&#39; --track &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>(<span class="stringliteral">&#39;origin/&#39;</span> . $tag) . <span class="stringliteral">&#39; -b &#39;</span> . <a class="code" href="group__commandwrappers.html#gafc52f7e769d935b4d2462467cdf8d5ee">drush_escapeshellarg</a>($tag);</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>], $command)) {</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_UNABLE_CHECKOUT&#39;</span>, <span class="stringliteral">&#39;Unable to retrieve &#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39; from git.drupal.org.&#39;</span>);</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;      }</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    }</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;  }</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;  <span class="keywordflow">return</span> 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"></span></div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="comment"> * Update a project (so far, only modules are supported).</span></div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="comment"> * @param $request</span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="comment"> *   The project array with name, base and full (final) paths.</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment"> * @param $release</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment"> *   The release details array from drupal.org.</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a842ef59d187c73488ad44f832cd8974f">  148</a></span>&#160;<span class="keyword">function</span> <a class="code" href="git__drupalorg_8inc.html#a842ef59d187c73488ad44f832cd8974f">package_handler_update_project</a>($request, $release) {</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;  <a class="code" href="group__logging.html#gad820f489a93518301794ada4ff7816b6">drush_log</a>(<span class="stringliteral">&#39;Updating project &#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39; ...&#39;</span>);</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;  $commands = array();</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;  <span class="keywordflow">if</span> ($release[<span class="stringliteral">&#39;version_extra&#39;</span>] == <span class="stringliteral">&#39;dev&#39;</span>) {</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    <span class="comment">// Update the branch of the development repository.</span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    $commands[] = <span class="stringliteral">&#39;git pull&#39;</span>;</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    $commands[] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitpullparams&#39;</span>);</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;  }</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    <span class="comment">// Use a stable repository.</span></div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    $commands[] = <span class="stringliteral">&#39;git fetch&#39;</span>;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    $commands[] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitfetchparams&#39;</span>);</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    $commands[] = <span class="charliteral">&#39;;&#39;</span>;</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    $commands[] = <span class="stringliteral">&#39;git checkout&#39;</span>;</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;    $commands[] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitcheckoutparams&#39;</span>);</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    $commands[] = $release[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;  }</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($request[<span class="stringliteral">&#39;full_project_path&#39;</span>], implode(<span class="charliteral">&#39; &#39;</span>, $commands))) {</div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_UNABLE_CHECKOUT&#39;</span>, <span class="stringliteral">&#39;Unable to update &#39;</span> . $request[<span class="stringliteral">&#39;name&#39;</span>] . <span class="stringliteral">&#39; from git.drupal.org.&#39;</span>);</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;  }</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;}</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="comment"> * Post download action.</span></div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;<span class="comment"> * This action take place once the project is placed in its final location.</span></div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;<span class="comment"> * Here we add the project as a git submodule.</span></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"><a class="code" href="git__drupalorg_8inc.html#a24cb40954a8234867336586a498d76b2">  181</a></span>&#160;<span class="keyword">function</span> <a class="code" href="git__drupalorg_8inc.html#a24cb40954a8234867336586a498d76b2">package_handler_post_download</a>($project, $release) {</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitsubmodule&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="comment">// Obtain the superproject path, then add as submodule.</span></div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>(dirname($project[<span class="stringliteral">&#39;full_project_path&#39;</span>]), <span class="stringliteral">&#39;git rev-parse --show-toplevel&#39;</span>)) {</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;      $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      $superproject = $output[0];</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;      <span class="comment">// Add the downloaded project as a submodule of its git superproject.</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;      $command = array();</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;      $command[] = <span class="stringliteral">&#39;git submodule add&#39;</span>;</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;      $command[] = <a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitsubmoduleaddparams&#39;</span>);</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;      $command[] = $project[<span class="stringliteral">&#39;repository&#39;</span>];</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;      <span class="comment">// We need the submodule relative path.</span></div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;      $command[] = substr($project[<span class="stringliteral">&#39;full_project_path&#39;</span>], strlen($superproject) + 1);</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($superproject, implode(<span class="charliteral">&#39; &#39;</span>, $command))) {</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_GIT_CHECKOUT_PROBLEMS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to add !name as a git submodule of !super.&#39;</span>, array(<span class="stringliteral">&#39;!name&#39;</span> =&gt; $project[<span class="stringliteral">&#39;name&#39;</span>], <span class="stringliteral">&#39;!super&#39;</span> =&gt; $superproject)));</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;      }</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">else</span> {</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;      <span class="keywordflow">return</span> <a class="code" href="group__errorhandling.html#ga23fe9e1e8c1e5ade39256106044b6da4">drush_set_error</a>(<span class="stringliteral">&#39;DRUSH_PM_GIT_SUBMODULE_PROBLEMS&#39;</span>, <a class="code" href="group__outputfunctions.html#ga1218abcb1e27dd3bb412113d1e344d96">dt</a>(<span class="stringliteral">&#39;Unable to create !project as a git submodule: !dir is not in a Git repository.&#39;</span>, array(<span class="stringliteral">&#39;!project&#39;</span> =&gt; $project[<span class="stringliteral">&#39;name&#39;</span>], <span class="stringliteral">&#39;!dir&#39;</span> =&gt; dirname($project[<span class="stringliteral">&#39;full_project_path&#39;</span>]))));</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    }</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;  }</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;gitinfofile&#39;</span>, FALSE)) {</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    $matches = array();</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/^(.+).x-dev$/&#39;</span>, $release[<span class="stringliteral">&#39;version&#39;</span>], $matches)) {</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;      $full_version = <a class="code" href="git__drupalorg_8inc.html#a258fb6515d2a1d8f92e54c4278acb4cb">drush_pm_git_drupalorg_compute_rebuild_version</a>($project[<span class="stringliteral">&#39;project_install_location&#39;</span>], $matches[1]);</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    }</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;      $full_version = $release[<span class="stringliteral">&#39;version&#39;</span>];</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    }</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <a class="code" href="pm_8drush_8inc.html#ae5c95f9279eaddddd401970d1065c023">drush_pm_inject_info_file_metadata</a>($project[<span class="stringliteral">&#39;project_install_location&#39;</span>], $project[<span class="stringliteral">&#39;name&#39;</span>], $full_version);</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;  }</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;}</div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;<span class="comment"></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"> * Helper function to compute the rebulid version string for a project.</span></div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="comment"> * This does some magic in Git to find the latest release tag along</span></div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="comment"> * the branch we&#39;re packaging from, count the number of commits since</span></div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;<span class="comment"> * then, and use that to construct this fancy alternate version string</span></div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;<span class="comment"> * which is useful for the version-specific dependency support in Drupal</span></div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;<span class="comment"> * 7 and higher.</span></div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="comment"> * NOTE: A similar function lives in git_deploy and in the drupal.org</span></div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="comment"> * packaging script (see DrupalorgProjectPackageRelease.class.php inside</span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="comment"> * drupalorg/drupalorg_project/plugins/release_packager). Any changes to the</span></div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="comment"> * actual logic in here should probably be reflected in the other places.</span></div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="comment"> * @param string $project_dir</span></div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="comment"> *   The full path to the root directory of the project to operate on.</span></div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="comment"> * @param string $branch</span></div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="comment"> *   The branch that we&#39;re using for -dev. This should only include the</span></div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="comment"> *   core version, the dash, and the branch&#39;s major version (eg. &#39;7.x-2&#39;).</span></div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="comment"> *   The full &#39;rebuild version string&#39; in the given Git checkout.</span></div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a258fb6515d2a1d8f92e54c4278acb4cb">  239</a></span>&#160;<span class="keyword">function</span> <a class="code" href="git__drupalorg_8inc.html#a258fb6515d2a1d8f92e54c4278acb4cb">drush_pm_git_drupalorg_compute_rebuild_version</a>($project_dir, $branch) {</div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;  $rebuild_version = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;  $branch_preg = preg_quote($branch);</div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($project_dir, <span class="stringliteral">&#39;git describe --tags&#39;</span>)) {</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    $shell_output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    $last_tag = $shell_output[0];</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    <span class="comment">// Make sure the tag starts as Drupal formatted (for eg.</span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    <span class="comment">// 7.x-1.0-alpha1) and if we are on a proper branch (ie. not master)</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="comment">// then it&#39;s on that branch.</span></div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/^(?&lt;drupalversion&gt;&#39;</span> . $branch_preg . <span class="stringliteral">&#39;\.\d+(?:-[^-]+)?)(?&lt;gitextra&gt;-(?&lt;numberofcommits&gt;\d+-)g[0-9a-f]{7})?$/&#39;</span>, $last_tag, $matches)) {</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;      <span class="comment">// If we found additional git metadata (in particular, number of commits)</span></div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;      <span class="comment">// then use that info to build the version string.</span></div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;      <span class="keywordflow">if</span> (isset($matches[<span class="stringliteral">&#39;gitextra&#39;</span>])) {</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        $rebuild_version = $matches[<span class="stringliteral">&#39;drupalversion&#39;</span>] . <span class="charliteral">&#39;+&#39;</span> . $matches[<span class="stringliteral">&#39;numberofcommits&#39;</span>] . <span class="stringliteral">&#39;dev&#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;      <span class="comment">// Otherwise, the branch tip is pointing to the same commit as the</span></div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;      <span class="comment">// last tag on the branch, in which case we use the prior tag and</span></div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;      <span class="comment">// add &#39;+0-dev&#39; to indicate we&#39;re still on a -dev branch.</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;        $rebuild_version = $last_tag . <span class="stringliteral">&#39;+0-dev&#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;    }</div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;  }</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;  <span class="keywordflow">return</span> $rebuild_version;</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Oct 8 2014 09:04:54 for Drush by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.1.2
</small></address>
</body>
</html>