A git workflow for Drupal Core development

1,532 views
1,396 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,532
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
12
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

A git workflow for Drupal Core development

  1. 1. Cameron Tod - Solutions Architect, Acquia! @cam8001
  2. 2. Who am I??? • From New Zealand (sorry for the accent) • Live in Hackney • Solutions Architect @ Acquia • A casual contributor to Drupal core • Maintain a few simple modules on d.o • Like to help new contributors as much as I can • cam8001 on drupal.org, IRC, Twitter
  3. 3. Get yourself set up
  4. 4. The cli is your friend • Use git on command line. If this scares you, I can comfort you. • If you are on OS X - use brew! • If you are on Linux, use your package manager • If you are on Windows, try this https://drupal.org/ documentation/git/install
  5. 5. First, git clone • Gets a complete copy of Drupal and all its history ██ cameron.tod @ kerbcrawler:~ 🍺 ██ 13:02:45 $ git clone --branch 8.x http://git.drupal.org/project/drupal.git Cloning into 'drupal'... remote: Counting objects: 319961, done. remote: Compressing objects: 100% (62618/62618), done. remote: Total 319961 (delta 223601), reused 317995 (delta 222129) Receiving objects: 100% (319961/319961), 74.74 MiB | 291.00 KiB/s, done. Resolving deltas: 100% (223601/223601), done. Checking connectivity... done ██ cameron.tod @ kerbcrawler:~/Sites/drupal (8.x) 🍺 ██ 01:13:34 $ git lg 008612ad4999138662a32abab2115cf3f03bca64 * 008612a - Imported sources (14 years ago) <Dries Buytaert>
  6. 6. Our workflow 1. Create your issue branch 2. Make your changes 3. Stage your changes 4. Commit your changes 5. Make a patch file 6. Upload it to drupal.org for review
  7. 7. Commit • A single changeset, relative to a repository and file system • Git stores commits as snapshots • Commit metadata; author, timestamp, message
  8. 8. Photo credit! Sankatha Bamanuge! https://drupal.org/user/566194
  9. 9. So what is a branch? • A branch is a stream of commits • A branch has full history • One repo can have many branches • You can branch at any point, or merge branches back together into a single history
  10. 10. Files have 3 states • Committed • Modified • Staged
  11. 11. 1. Create your issue branch Creates a new branch ██ cameron.tod @ kerbcrawler:~/Sites/drupal-pres (8.x) Branch name prefixed with issue number 🍺 ██ 15:47:07 $ git checkout -b 2091511-cache_form_expiry_to_variable Switched to a new branch '2091511-cache_form_expiry_to_variable' ! ██ cameron.tod @ kerbcrawler:~/Sites/drupal-pres (2091511-cache_form_expiry_to_variable) 🍺 ██ 15:47:13 $ ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 15:47:54 $ git branch * 2091511-cache_form_expiry_to_variable 8.x Brief description of the issue
  12. 12. 2. Make your changes
  13. 13. hack hack hack
  14. 14. Modified state ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 00:40:39 $ git status # On branch 2091511-cache_form_expiry_to_variable # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: core/lib/Drupal/Core/Form/FormBuilder.php ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 00:42:09 $ git diff core/lib/Drupal/Core/Form/FormBuilder.php ! diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php index 49692d9..d70bf4f 100644 --- a/core/lib/Drupal/Core/Form/FormBuilder.php +++ b/core/lib/Drupal/Core/Form/FormBuilder.php @@ -390,8 +390,7 @@ public function getCache($form_build_id, &$form_state) { * {@inheritdoc} */ public function setCache($form_build_id, $form, $form_state) { // 6 hours cache life time for forms should be plenty. $expire = 21600; + $expire = Drupal::config('system.form')->get('cache_expire'); // Cache form structure. if (isset($form)) {
  15. 15. 3. Stage your changes ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 01:53:46 $ git add core/lib/Drupal/Core/Form/FormBuilder.php ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) ██ 01:28:58 $ git status # On branch 2091511-cache_form_expiry_to_variable # Your branch is behind 'origin/8.x' by 17 commits, and can be fast-forwarded. # (use "git pull" to update your local branch) # # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: core/lib/Drupal/Core/Form/FormBuilder.php 🍺
  16. 16. 4. Commit your changes ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 01:32:38 $ git commit -m 'Added form expiration as a config.' [2091511-cache_form_expiry_to_variable 7d1ca38] Added form expiration as a config. 1 file changed, 1 insertion(+), 2 deletions(-) ! ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 16:30:09 $ git lg * 22edfd2 - (HEAD, 2091511-cache_form_expiry_to_variable) Added form expiration as a config. (57 seconds ago) <Cameron Tod> * 5fb617d - Issue #1938926 by sun, Cottser, joelpittet, pplantinga: Convert simpletest theme tables to table #type. (21 hours ago) <Dries>
  17. 17. 5. Make a patch file • A patch file is a commit changeset, saved in a text file • When you upload your patch to Drupal: • The testbots pick it up, apply the patch to Drupal core, and test it on qa.drupal.org • Other contributors can download it and apply it to their git repository
  18. 18. $ git diff origin/8.x diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php index 49692d9..d70bf4f 100644 --- a/core/lib/Drupal/Core/Form/FormBuilder.php +++ b/core/lib/Drupal/Core/Form/FormBuilder.php @@ -390,8 +390,7 @@ public function getCache($form_build_id, &$form_state) { * {@inheritdoc} */ public function setCache($form_build_id, $form, $form_state) { // 6 hours cache life time for forms should be plenty. $expire = 21600; + $expire = Drupal::config('system.form')->get('cache_expire'); // Cache form structure. if (isset($form)) { $ git diff origin/8.x > 2091511-cache_form_expiry_to_variable-27.patch $ cat 2091511-cache_form_expiry_to_variable-27.patch diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php index 49692d9..d70bf4f 100644 --- a/core/lib/Drupal/Core/Form/FormBuilder.php +++ b/core/lib/Drupal/Core/Form/FormBuilder.php @@ -390,8 +390,7 @@ public function getCache($form_build_id, &$form_state) { * {@inheritdoc} */ public function setCache($form_build_id, $form, $form_state) { // 6 hours cache life time for forms should be plenty. $expire = 21600; + $expire = Drupal::config('system.form')->get('cache_expire'); // Cache form structure. if (isset($form)) {
  19. 19. But don’t forget to rebase ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 22:52:22 $ git fetch remote: Counting objects: 857, done. remote: Compressing objects: 100% (234/234), done. remote: Total 534 (delta 334), reused 324 (delta 199) Receiving objects: 100% (534/534), 93.66 KiB | 0 bytes/s, done. Resolving deltas: 100% (334/334), completed with 225 local objects. From http://git.drupal.org/project/drupal 7d985d5..3ae51ab 8.x -> origin/8.x ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 22:54:12 $ git rebase origin/8.x First, rewinding head to replay your work on top of it... Applying: Added form expiration as a config. Applying: Adding closing newline to system.form.yml. Applying: Explicitly set cache expiry for cache_form. Applying: Moved form_cache expire setting into system_performance.yml. Applying: Added new config key to tests. Applying: Added config schema for new config key. Applying: Changed form cache expire key. Applying: Added config.factory stub to test. Applying: Added value to config factory stub. ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺 ██ 22:55:49 $ git lg * b23c13a - (HEAD, 2091511-cache_form_expiry_to_variable) Added value to config factory stub. (57 seconds ago) <Cameron Tod> * 0c2eec4 - Added config.factory stub to test. (57 seconds ago) <Cameron Tod> * 4df1959 - Changed form cache expire key. (57 seconds ago) <Cameron Tod> * e2f18d3 - Added config schema for new config key. (57 seconds ago) <Cameron Tod> * 0f54db6 - Added new config key to tests. (57 seconds ago) <Cameron Tod> * cef2510 - Moved form_cache expire setting into system_performance.yml. (57 seconds ago) <Cameron Tod> * 141ce4e - Explicitly set cache expiry for cache_form. (58 seconds ago) <Cameron Tod> * 9346d8e - Adding closing newline to system.form.yml. (58 seconds ago) <Cameron Tod> * 9408e2c - Added form expiration as a config. (58 seconds ago) <Cameron Tod> * 3ae51ab - (origin/HEAD, origin/8.x) Issue #2201149 by sidharthap, sandipmkhairnar: Remove comment_entity_info cache deletes. (11 hours ago) <Nathaniel Catchpole>
  20. 20. Keep commits small $ git lg 668d277... * b23c13a - (HEAD, 2091511-cache_form_expiry_to_variable) Added value to config factory stub. (3 hours ago) <Cameron Tod> * 0c2eec4 - Added config.factory stub to test. (3 hours ago) <Cameron Tod> * 4df1959 - Changed form cache expire key. (3 hours ago) <Cameron Tod> * e2f18d3 - Added config schema for new config key. (3 hours ago) <Cameron Tod> * 0f54db6 - Added new config key to tests. (3 hours ago) <Cameron Tod> * cef2510 - Moved form_cache expire setting into system_performance.yml. (3 hours ago) <Cameron Tod> * 141ce4e - Explicitly set cache expiry for cache_form. (3 hours ago) <Cameron Tod> * 9346d8e - Adding closing newline to system.form.yml. (3 hours ago) <Cameron Tod> * 9408e2c - Added form expiration as a config. (3 hours ago) <Cameron Tod> * 3ae51ab - (origin/HEAD, origin/8.x) Issue #2201149 by sidharthap, sandipmkhairnar: Remove comment_entity_info cache deletes. (14 hours ago) <Nathaniel Catchpole>
  21. 21. 6. Upload your patch for review
  22. 22. If you remember one thing
  23. 23. Branch per issue ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) ██ 02:12:20 $ git branch 2084637-aggregator-test 2084637-service-container-automated-wrappers 2084637-service-container-automated-wrappers-foundation-only 2084637-service-container-with-get-prefix * 2091511-cache_form_expiry_to_variable 2205797-configmanager-unit-test 2205799-phpunit_consistent_config 8.x 8.x-SystemControllerTest-namespace maintenance-mode-cache-pages-1032936-fixes maintenance-mode-cache-pages-1032936-tests maintenance-mode-cache-pages-1032936-tests-travis 🍺
  24. 24. Branches are cheap • Create ‘em like crazy! • They take no time at all!! • You can branch from any point! • Create one for every issue! • Remember, everything is a branch. And you can branch from a branch.! • Switch between branches quickly and easily! • No one else will ever see them. You can’t break Drupal core with git
  25. 25. If you remember one (more) thing… • Everything is a branch • Everything is a branch • Everything is a branch • Every commit? A fully functional branch • Every tag? A branch. • Your remote upstream server (git.drupal.org)? A branch. Locally. • A branch?? A branch.
  26. 26. Use case: test + fix branch $ git checkout maintenance-mode-cache-pages-1032936-fixes Checking out files: 100% (5288/5288), done. Switched to branch 'maintenance-mode-cache-pages-1032936-fixes' $ git checkout maintenance-mode-cache-pages-1032936-tests Switched to branch 'maintenance-mode-cache-pages-1032936-tests' $ git checkout -b maintenance-mode-cache-pages-1032936-tests+fixes Switched to a new branch 'maintenance-mode-cache-pages-1032936-tests+fixes' $ git merge maintenance-mode-cache-pages-1032936-fixes Merge made by the 'recursive' strategy. core/includes/bootstrap.inc | 5 ++++1 file changed, 4 insertions(+), 1 deletion(-)
  27. 27. Handy stuff
  28. 28. Apply a patch $ wget https://drupal.org/files/issues/2091511-cache_form_expiry_to_variable-27.patch --2014-03-01 03:06:00-- https://drupal.org/files/issues/2091511-cache_form_expiry_to_variable-27.patch Resolving drupal.org... 140.211.10.62, 140.211.10.16 Connecting to drupal.org|140.211.10.62|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 2969 (2.9K) [text/plain] Saving to: ‘2091511-cache_form_expiry_to_variable-27.patch’ ! 100% [=========================================================================================================================================== ==================>] 2,969 --.-K/s in 0s ! 2014-03-01 03:06:01 (1.38 GB/s) - ‘2091511-cache_form_expiry_to_variable-27.patch’ saved [2969/2969] ! ! ! ██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable-presentation) 🍺 ██ 03:06:01 $ git apply -v --index 2091511-cache_form_expiry_to_variable-27.patch Checking patch core/lib/Drupal/Core/Form/FormBuilder.php... Checking patch core/modules/system/config/schema/system.schema.yml... Checking patch core/modules/system/config/system.performance.yml... Checking patch core/modules/system/lib/Drupal/system/Tests/Form/FormCacheTest.php... Checking patch core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php... Applied patch core/lib/Drupal/Core/Form/FormBuilder.php cleanly. Applied patch core/modules/system/config/schema/system.schema.yml cleanly. Applied patch core/modules/system/config/system.performance.yml cleanly. Applied patch core/modules/system/lib/Drupal/system/Tests/Form/FormCacheTest.php cleanly. Applied patch core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php cleanly. $ git commit -m 'Applied 2091511-cache_form_expiry_to_variable-27.patch' [2091511-cache_form_expiry_to_variable-presentation d4290d8] Applied 2091511-cache_form_expiry_to_variable-27.patch 5 files changed, 14 insertions(+), 3 deletions(-)
  29. 29. Use git, kthx
  30. 30. Any questions?
  31. 31. Resources • https://drupal.org/project/drupal/git-instructions • http://drupalladder.org/ • Drush 7 for Drupal 8: https://github.com/drush-ops/drush • Show branch in prompt: http://www.neverstopbuilding.com/gitpro • Git Number: https://github.com/holygeek/git-number • git lg: https://coderwall.com/p/euwpig • D8 reset script: https://gist.github.com/cam8001/9270022 • Ask me! @cam8001
  32. 32. Thank you! • Slides will be on http://2014.drupalcamplondon.co.uk/ • Come to Drupal monthly sprints at Techhub @ Campus, Shoreditch • We are hiring! Technical Architects, Devops, Technical Account Managers, Solutions Architects. Come and find me if you’re interested :)

×