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

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="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_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;</div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;use <a class="code" href="classDrush_1_1Log_1_1LogLevel.html">Drush\Log\LogLevel</a>;</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">/**</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> * Validate this package handler can run.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#ae203b6a2394bb0cae2970befc56eea36">   13</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="l00014"></a><span class="lineno">   14</span>&#160;  <span class="comment">// Check git command exists. Disable possible output.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</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="l00016"></a><span class="lineno">   16</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="l00017"></a><span class="lineno">   17</span>&#160;</div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</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="l00019"></a><span class="lineno">   19</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="l00020"></a><span class="lineno">   20</span>&#160;  $success = exec(<span class="stringliteral">&#39;git --version&#39;</span>, $git);</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;  $git_version_array = explode(<span class="stringliteral">&quot; &quot;</span>, $git[0]);</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;  $git_version = $git_version_array[2];</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;  <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="l00025"></a><span class="lineno">   25</span>&#160;  <span class="keywordflow">if</span> (!$success) {</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;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="l00027"></a><span class="lineno">   27</span>&#160;  } elseif ($git_version &lt; <span class="stringliteral">&#39;1.7&#39;</span>) {</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</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="l00029"></a><span class="lineno">   29</span>&#160;  }</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  <span class="comment">// Check git_deploy is enabled. Only for bootstrapped sites.</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#ad25559f8d7d753f636fbeac347c29fc5">drush_get_context</a>(<span class="stringliteral">&#39;DRUSH_BOOTSTRAP_PHASE&#39;</span>) &gt;= DRUSH_BOOTSTRAP_DRUPAL_FULL) {</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <a class="code" href="engines_8inc.html#a92390a2dd40c8ed5190be4af058813a8">drush_include_engine</a>(<span class="stringliteral">&#39;drupal&#39;</span>, <span class="stringliteral">&#39;environment&#39;</span>);</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</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="l00034"></a><span class="lineno">   34</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;git package handler needs git_deploy module enabled to work properly.&#39;</span>), LogLevel::WARNING);</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;  }</div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;}</div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"> * Download a project.</span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment"> * @param $request</span></div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="comment"> *   The project array with name, base and full (final) paths.</span></div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment"> * @param $release</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="comment"> *   The release details array from drupal.org.</span></div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a5332feb31d03dabd7e99bb9e8f763ce4">   49</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="l00050"></a><span class="lineno">   50</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="l00051"></a><span class="lineno">   51</span>&#160;    <span class="comment">// Uses SSH, which enables pushing changes back to git.drupal.org.</span></div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</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="l00053"></a><span class="lineno">   53</span>&#160;  }</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</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="l00056"></a><span class="lineno">   56</span>&#160;  }</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;  $request[<span class="stringliteral">&#39;repository&#39;</span>] = $repository;</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;  $tag = $release[<span class="stringliteral">&#39;tag&#39;</span>];</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;  <span class="comment">// If the --cache option was given, create a new git reference cache of the</span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;  <span class="comment">// remote repository, or update the existing cache to fetch recent changes.</span></div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</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="l00063"></a><span class="lineno">   63</span>&#160;    $gitcache = $cachedir . <span class="stringliteral">&#39;/git&#39;</span>;</div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</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="l00065"></a><span class="lineno">   65</span>&#160;    <a class="code" href="group__filesystemfunctions.html#ga6027285d97028ad3299d3aa262be8c2f">drush_mkdir</a>($gitcache);</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</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="l00067"></a><span class="lineno">   67</span>&#160;    <span class="keywordflow">if</span> (!file_exists($projectcache)) {</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;      <span class="comment">// --mirror works similar to --bare, but retrieves all tags, local</span></div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;      <span class="comment">// branches, remote branches, and any other refs (notes, stashes, etc).</span></div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;      <span class="comment">// @see http://stackoverflow.com/questions/3959924</span></div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;      $command = <span class="stringliteral">&#39;git clone --mirror&#39;</span>;</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</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="l00073"></a><span class="lineno">   73</span>&#160;        $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;      }</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;      $command .= <span class="stringliteral">&#39; %s %s&#39;</span>;</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</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="l00077"></a><span class="lineno">   77</span>&#160;    }</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</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="l00079"></a><span class="lineno">   79</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;      <span class="comment">// A --mirror clone is fully synchronized with `git remote update` instead</span></div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;      <span class="comment">// of `git fetch --all`.</span></div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;      <span class="comment">// @see http://stackoverflow.com/questions/6150188</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</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="l00084"></a><span class="lineno">   84</span>&#160;    }</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    $gitcache = $projectcache;</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  }</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;  <span class="comment">// Clone the repo into a temporary path.</span></div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;  $clone_path = <a class="code" href="group__filesystemfunctions.html#ga883d28ed54603b2d268902cec2379804">drush_tempdir</a>();</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;  $command  = <span class="stringliteral">&#39;git clone&#39;</span>;</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</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="l00093"></a><span class="lineno">   93</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="context_8inc.html#afe91fb3e5219ecb2208c3b036b1f0cb8">drush_get_option</a>(<span class="stringliteral">&#39;cache&#39;</span>)) {</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    $command .= <span class="stringliteral">&#39; --reference &#39;</span> . drush_escapeshellarg($gitcache);</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  }</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;  <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="l00097"></a><span class="lineno">   97</span>&#160;    $command .= <span class="stringliteral">&#39; --verbose --progress&#39;</span>;</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;  }</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;  $command .= <span class="charliteral">&#39; &#39;</span> . drush_escapeshellarg($repository);</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;  $command .= <span class="charliteral">&#39; &#39;</span> . drush_escapeshellarg($clone_path);</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</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="l00102"></a><span class="lineno">  102</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="l00103"></a><span class="lineno">  103</span>&#160;  }</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">// Check if the &#39;tag&#39; from the release feed is a tag or a branch.</span></div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;  <span class="comment">// If the tag exists, git will return it</span></div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;  <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($clone_path, <span class="stringliteral">&#39;git tag -l &#39;</span> . drush_escapeshellarg($tag))) {</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</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="l00109"></a><span class="lineno">  109</span>&#160;  }</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;  $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;  <span class="keywordflow">if</span> (isset($output[0]) &amp;&amp; ($output[0] == $tag)) {</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</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="l00114"></a><span class="lineno">  114</span>&#160;    <span class="comment">// &quot;detached head&quot; state.</span></div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</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="l00116"></a><span class="lineno">  116</span>&#160;    $command .= <span class="charliteral">&#39; &#39;</span> . drush_escapeshellarg($tag);</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($clone_path, $command)) {</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</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="l00119"></a><span class="lineno">  119</span>&#160;    }</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;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;    <span class="comment">// Else, we want to checkout a branch.</span></div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <span class="comment">// First check if we are not already in the correct branch.</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($clone_path, <span class="stringliteral">&#39;git symbolic-ref HEAD&#39;</span>)) {</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_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="l00126"></a><span class="lineno">  126</span>&#160;    }</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</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="l00129"></a><span class="lineno">  129</span>&#160;</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</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="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordflow">if</span> ($current_branch != $tag) {</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;      $command  = <span class="stringliteral">&#39;git checkout&#39;</span>;</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</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="l00134"></a><span class="lineno">  134</span>&#160;      $command .= <span class="stringliteral">&#39; --track &#39;</span> . drush_escapeshellarg(<span class="stringliteral">&#39;origin/&#39;</span> . $tag) . <span class="stringliteral">&#39; -b &#39;</span> . drush_escapeshellarg($tag);</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;      <span class="keywordflow">if</span> (!<a class="code" href="group__commandwrappers.html#ga59e8ee9f53442f2029080ac723ed008f">drush_shell_cd_and_exec</a>($clone_path, $command)) {</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</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="l00137"></a><span class="lineno">  137</span>&#160;      }</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;  }</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;  <span class="keywordflow">return</span> $clone_path;</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;<span class="comment"></span></div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment"> * Update a project (so far, only modules are supported).</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment"> * @param $request</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="comment"> *   The project array with name, base and full (final) paths.</span></div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="comment"> * @param $release</span></div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="comment"> *   The release details array from drupal.org.</span></div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a842ef59d187c73488ad44f832cd8974f">  152</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="l00153"></a><span class="lineno">  153</span>&#160;  <a class="code" href="group__logging.html#ga47324b65808524558a488916b150dd51">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="l00154"></a><span class="lineno">  154</span>&#160;</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;  $commands = array();</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;  <span class="keywordflow">if</span> ((!empty($release[<span class="stringliteral">&#39;version_extra&#39;</span>])) &amp;&amp; ($release[<span class="stringliteral">&#39;version_extra&#39;</span>] == <span class="stringliteral">&#39;dev&#39;</span>)) {</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;    <span class="comment">// Update the branch of the development repository.</span></div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    $commands[] = <span class="stringliteral">&#39;git pull&#39;</span>;</div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</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="l00160"></a><span class="lineno">  160</span>&#160;  }</div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    <span class="comment">// Use a stable repository.</span></div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;    $commands[] = <span class="stringliteral">&#39;git fetch&#39;</span>;</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</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="l00165"></a><span class="lineno">  165</span>&#160;    $commands[] = <span class="charliteral">&#39;;&#39;</span>;</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    $commands[] = <span class="stringliteral">&#39;git checkout&#39;</span>;</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</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="l00168"></a><span class="lineno">  168</span>&#160;    $commands[] = $release[<span class="stringliteral">&#39;version&#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">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="l00172"></a><span class="lineno">  172</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="l00173"></a><span class="lineno">  173</span>&#160;  }</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;  <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;}</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;<span class="comment"></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"> * Post download action.</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">  181</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="l00182"></a><span class="lineno">  182</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;<span class="comment"> * Here we add the project as a git submodule.</span></div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a24cb40954a8234867336586a498d76b2">  185</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="l00186"></a><span class="lineno">  186</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="l00187"></a><span class="lineno">  187</span>&#160;    <span class="comment">// Obtain the superproject path, then add as submodule.</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</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="l00189"></a><span class="lineno">  189</span>&#160;      $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;      $superproject = $output[0];</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;      <span class="comment">// Add the downloaded project as a submodule of its git superproject.</span></div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;      $command = array();</div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;      $command[] = <span class="stringliteral">&#39;git submodule add&#39;</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</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="l00195"></a><span class="lineno">  195</span>&#160;      $command[] = $project[<span class="stringliteral">&#39;repository&#39;</span>];</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;      <span class="comment">// We need the submodule relative path.</span></div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;      $command[] = substr(realpath($project[<span class="stringliteral">&#39;full_project_path&#39;</span>]), strlen(realpath($superproject)) + 1);</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</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="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_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="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;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</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="l00204"></a><span class="lineno">  204</span>&#160;    }</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;  }</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</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="l00208"></a><span class="lineno">  208</span>&#160;    $matches = array();</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</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="l00210"></a><span class="lineno">  210</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;full_project_path&#39;</span>], $matches[1]);</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    }</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;      $full_version = $release[<span class="stringliteral">&#39;version&#39;</span>];</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="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 log -1 --pretty=format:%ct&#39;</span>)) {</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;      $output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;      $datestamp = $output[0];</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;    }</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;      $datestamp = time();</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    }</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <a class="code" href="pm_8drush_8inc.html#a2a6a34d3c5d64d6b05edab9095408b48">drush_pm_inject_info_file_metadata</a>($project[<span class="stringliteral">&#39;full_project_path&#39;</span>], $project[<span class="stringliteral">&#39;name&#39;</span>], $full_version, $datestamp);</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;  }</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;}</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="comment"> * Helper function to compute the rebulid version string for a project.</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"> * This does some magic in Git to find the latest release tag along</span></div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</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="l00232"></a><span class="lineno">  232</span>&#160;<span class="comment"> * then, and use that to construct this fancy alternate version string</span></div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="comment"> * which is useful for the version-specific dependency support in Drupal</span></div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="comment"> * 7 and higher.</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"> * NOTE: A similar function lives in git_deploy and in the drupal.org</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="comment"> * packaging script (see DrupalorgProjectPackageRelease.class.php inside</span></div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="comment"> * drupalorg/drupalorg_project/plugins/release_packager). Any changes to the</span></div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="comment"> * actual logic in here should probably be reflected in the other places.</span></div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="comment"> * @param string $project_dir</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</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="l00243"></a><span class="lineno">  243</span>&#160;<span class="comment"> * @param string $branch</span></div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</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="l00245"></a><span class="lineno">  245</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="l00246"></a><span class="lineno">  246</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="comment"> * @return string</span></div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="comment"> *   The full &#39;rebuild version string&#39; in the given Git checkout.</span></div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00250"></a><span class="lineno"><a class="code" href="git__drupalorg_8inc.html#a258fb6515d2a1d8f92e54c4278acb4cb">  250</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="l00251"></a><span class="lineno">  251</span>&#160;  $rebuild_version = <span class="stringliteral">&#39;&#39;</span>;</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;  $branch_preg = preg_quote($branch);</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</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="l00255"></a><span class="lineno">  255</span>&#160;    $shell_output = <a class="code" href="group__commandwrappers.html#gadba8c59ba260dd39f615bc22ca78e1af">drush_shell_exec_output</a>();</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    $last_tag = $shell_output[0];</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    <span class="comment">// Make sure the tag starts as Drupal formatted (for eg.</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</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="l00259"></a><span class="lineno">  259</span>&#160;    <span class="comment">// then it&#39;s on that branch.</span></div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</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="l00261"></a><span class="lineno">  261</span>&#160;      <span class="comment">// If we found additional git metadata (in particular, number of commits)</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;      <span class="comment">// then use that info to build the version string.</span></div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;      <span class="keywordflow">if</span> (isset($matches[<span class="stringliteral">&#39;gitextra&#39;</span>])) {</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</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="l00265"></a><span class="lineno">  265</span>&#160;      }</div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;      <span class="comment">// Otherwise, the branch tip is pointing to the same commit as the</span></div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</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="l00268"></a><span class="lineno">  268</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="l00269"></a><span class="lineno">  269</span>&#160;      <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        $rebuild_version = $last_tag . <span class="stringliteral">&#39;+0-dev&#39;</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;    }</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;  }</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;  <span class="keywordflow">return</span> $rebuild_version;</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</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:56 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>