45
Cameron Tod - Solutions Architect, Acquia @cam8001

A git workflow for Drupal Core development

Embed Size (px)

Citation preview

Page 1: A git workflow for Drupal Core development

Cameron Tod - Solutions Architect, Acquia!@cam8001

Page 2: A git workflow for Drupal Core development

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

Page 3: A git workflow for Drupal Core development
Page 4: A git workflow for Drupal Core development
Page 5: A git workflow for Drupal Core development
Page 6: A git workflow for Drupal Core development

Get yourself set up

Page 7: A git workflow for Drupal Core development

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

Page 8: A git workflow for Drupal Core development

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>

Page 9: A git workflow for Drupal Core development

Our workflow1. 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

Page 10: A git workflow for Drupal Core development
Page 11: A git workflow for Drupal Core development

Commit

• A single changeset, relative to a repository and file system

• Git stores commits as snapshots

• Commit metadata; author, timestamp, message

Page 12: A git workflow for Drupal Core development

Photo credit!Sankatha Bamanuge!https://drupal.org/user/566194

Page 13: A git workflow for Drupal Core development

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

Page 14: A git workflow for Drupal Core development

Files have 3 states

• Committed

• Modified

• Staged

Page 15: A git workflow for Drupal Core development
Page 16: A git workflow for Drupal Core development
Page 17: A git workflow for Drupal Core development

Creates a new branch Branch name prefixed with issue number

██ cameron.tod @ kerbcrawler:~/Sites/drupal-pres (8.x) 🍺

██ 15:47:07 $ git checkout -b 2091511-cache_form_expiry_to_variable

Brief description of the issue

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

1. Create your issue branch

Page 18: A git workflow for Drupal Core development

2. Make your changes

Page 19: A git workflow for Drupal Core development

hack hack hack

Page 20: A git workflow for Drupal Core development

██ 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)) {

Modified state

Page 21: A git workflow for Drupal Core development

3. Stage your changes██ 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

██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺

██ 01:53:46 $ git add core/lib/Drupal/Core/Form/FormBuilder.php

Page 22: A git workflow for Drupal Core development

* 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>

██ cameron.tod @ kerbcrawler:~/Sites/drupal (2091511-cache_form_expiry_to_variable) 🍺

██ 16:30:09 $ git lg

██ 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(-) !

4. Commit your changes

Page 23: A git workflow for Drupal Core development

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

Page 24: A git workflow for Drupal Core development

$ git diff origin/8.x > 2091511-cache_form_expiry_to_variable-27.patch

$ git diff origin/8.x

$ 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)) {

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)) {

Page 25: A git workflow for Drupal Core development

██ 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>

But don’t forget to rebase

Page 26: A git workflow for Drupal Core development

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>

Page 27: A git workflow for Drupal Core development

6. Upload your patch for review

Page 28: A git workflow for Drupal Core development
Page 29: A git workflow for Drupal Core development
Page 30: A git workflow for Drupal Core development
Page 31: A git workflow for Drupal Core development

If you remember one thing

Page 32: A git workflow for Drupal Core development

██ 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

Branch per issue

Page 33: A git workflow for Drupal Core development

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

Page 34: A git workflow for Drupal Core development

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.

Page 35: A git workflow for Drupal Core development

$ git checkout maintenance-mode-cache-pages-1032936-fixes Checking out files: 100% (5288/5288), done. Switched to branch 'maintenance-mode-cache-pages-1032936-fixes'

Use case: test + fix branch

$ 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(-)

$ git checkout maintenance-mode-cache-pages-1032936-tests Switched to branch 'maintenance-mode-cache-pages-1032936-tests'

Page 36: A git workflow for Drupal Core development

Handy stuff

Page 37: A git workflow for Drupal Core development

$ 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] !!!

$ 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(-)

██ 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.

Apply a patch

Page 38: A git workflow for Drupal Core development
Page 39: A git workflow for Drupal Core development
Page 40: A git workflow for Drupal Core development
Page 41: A git workflow for Drupal Core development

Use git, kthx

Page 42: A git workflow for Drupal Core development
Page 43: A git workflow for Drupal Core development

Any questions?

Page 44: A git workflow for Drupal Core development

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

Page 45: A git workflow for Drupal Core development

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 :)