SlideShare a Scribd company logo
Cameron Tod - Solutions Architect, Acquia!
@cam8001
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
A git workflow for Drupal Core development
A git workflow for Drupal Core development
A git workflow for Drupal Core development
Get yourself set up
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
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>
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
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
Photo credit!
Sankatha Bamanuge!
https://drupal.org/user/566194
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
Files have 3 states
•

Committed

•

Modified

•

Staged
A git workflow for Drupal Core development
A git workflow for Drupal Core development
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
2. Make your changes
hack hack hack
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)) {
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

🍺
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>
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
$ 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)) {
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>
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>
6. Upload your patch
for review
A git workflow for Drupal Core development
A git workflow for Drupal Core development
A git workflow for Drupal Core development
If you remember one
thing
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

🍺
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
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.
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(-)
Handy stuff
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(-)
A git workflow for Drupal Core development
A git workflow for Drupal Core development
A git workflow for Drupal Core development
Use git, kthx
A git workflow for Drupal Core development
Any questions?
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
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 :)

More Related Content

What's hot (20)

PPTX
Troubleshooting containerized triple o deployment
Sadique Puthen
 
PDF
Shaping Clouds with Terraform
Mike Fowler
 
PDF
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Anne Nicolas
 
PDF
ATO Linux Performance 2018
Brendan Gregg
 
PPTX
Using Git as your VCS with Bioconductor
timyates
 
KEY
Varnish @ Velocity Ignite
Artur Bergman
 
PDF
USENIX ATC 2017 Performance Superpowers with Enhanced BPF
Brendan Gregg
 
PPT
11 Things About11g
fcamachob
 
PDF
Velocity 2017 Performance analysis superpowers with Linux eBPF
Brendan Gregg
 
PPT
Oracle 10g Performance: chapter 09 enqueues
Kyle Hailey
 
PDF
ClickHouse Monitoring 101: What to monitor and how
Altinity Ltd
 
PDF
BPF Tools 2017
Brendan Gregg
 
PPTX
Debugging linux issues with eBPF
Ivan Babrou
 
PDF
Creating Beautiful Dashboards with Grafana and ClickHouse
Altinity Ltd
 
DOC
Rman duplicate-database-on-the-same-host1
hunghtc83
 
PPT
Upgrade & ndmp
חנה שפרבר
 
PDF
Oracle cluster installation with grid and iscsi
Chanaka Lasantha
 
PPTX
How to Troubleshoot OpenStack Without Losing Sleep
Sadique Puthen
 
PDF
Kernel Recipes 2017: Performance Analysis with BPF
Brendan Gregg
 
PDF
NetConf 2018 BPF Observability
Brendan Gregg
 
Troubleshooting containerized triple o deployment
Sadique Puthen
 
Shaping Clouds with Terraform
Mike Fowler
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Anne Nicolas
 
ATO Linux Performance 2018
Brendan Gregg
 
Using Git as your VCS with Bioconductor
timyates
 
Varnish @ Velocity Ignite
Artur Bergman
 
USENIX ATC 2017 Performance Superpowers with Enhanced BPF
Brendan Gregg
 
11 Things About11g
fcamachob
 
Velocity 2017 Performance analysis superpowers with Linux eBPF
Brendan Gregg
 
Oracle 10g Performance: chapter 09 enqueues
Kyle Hailey
 
ClickHouse Monitoring 101: What to monitor and how
Altinity Ltd
 
BPF Tools 2017
Brendan Gregg
 
Debugging linux issues with eBPF
Ivan Babrou
 
Creating Beautiful Dashboards with Grafana and ClickHouse
Altinity Ltd
 
Rman duplicate-database-on-the-same-host1
hunghtc83
 
Upgrade & ndmp
חנה שפרבר
 
Oracle cluster installation with grid and iscsi
Chanaka Lasantha
 
How to Troubleshoot OpenStack Without Losing Sleep
Sadique Puthen
 
Kernel Recipes 2017: Performance Analysis with BPF
Brendan Gregg
 
NetConf 2018 BPF Observability
Brendan Gregg
 

Viewers also liked (15)

PDF
Intro to Git for Drupal 7
Chris Caple
 
PDF
Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23
msohn
 
PPTX
Awesome Git Workflow for Agencies and Teams
Chris Reynolds
 
PPTX
Gerrit & Jenkins Workflow: An Integrated CI Demonstration
vanoorts
 
PDF
Gerrit Code Review
Johannes Barop
 
PDF
Code Review with Git and Gerrit - Devoxx 2011 - Tools in Action - 2011-11-14
msohn
 
PDF
CakeDC Git Workflow extension
Lubomír Štork
 
PDF
Anton Parkhomenko Boost your design workflow or git rebase for designers
Аліна Шепшелей
 
PDF
Building a Drupal site with Git
dirtytactics
 
PDF
Effective Development With Eclipse Mylyn, Git, Gerrit and Hudson
Chris Aniszczyk
 
PDF
Drupal 7 Tutorial: Features Module
Acquia
 
PPTX
Ultimate Git Workflow - Seoul 2015
Atlassian 대한민국
 
ZIP
Drupal Deployment
Jeff Eaton
 
PDF
How Git and Gerrit make you more productive
Karsten Dambekalns
 
PPTX
Gerrit Code Review
Luca Milanesio
 
Intro to Git for Drupal 7
Chris Caple
 
Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23
msohn
 
Awesome Git Workflow for Agencies and Teams
Chris Reynolds
 
Gerrit & Jenkins Workflow: An Integrated CI Demonstration
vanoorts
 
Gerrit Code Review
Johannes Barop
 
Code Review with Git and Gerrit - Devoxx 2011 - Tools in Action - 2011-11-14
msohn
 
CakeDC Git Workflow extension
Lubomír Štork
 
Anton Parkhomenko Boost your design workflow or git rebase for designers
Аліна Шепшелей
 
Building a Drupal site with Git
dirtytactics
 
Effective Development With Eclipse Mylyn, Git, Gerrit and Hudson
Chris Aniszczyk
 
Drupal 7 Tutorial: Features Module
Acquia
 
Ultimate Git Workflow - Seoul 2015
Atlassian 대한민국
 
Drupal Deployment
Jeff Eaton
 
How Git and Gerrit make you more productive
Karsten Dambekalns
 
Gerrit Code Review
Luca Milanesio
 
Ad

Similar to A git workflow for Drupal Core development (20)

PDF
Do + ldo for developers(full)
Andrii Podanenko
 
PDF
Updated non-lab version of Level Up. Delivered at LOPSA-East, May 3, 2014.
Mandi Walls
 
PPTX
Git Basics
Ryan Condron
 
PDF
Open Source Tools for Leveling Up Operations FOSSET 2014
Mandi Walls
 
KEY
ActiveLAMP Process
Tom Friedhof
 
PDF
An introduction to Git with Atlassian Suite
Chetan Khatri
 
ZIP
Staging and Deployment
heyrocker
 
KEY
Git - Some tips to do it better
Jonas De Smet
 
PDF
Getting Git Right
Sven Peters
 
PDF
Modernize Your Drupal Development
Chris Tankersley
 
PPTX
Build drupal project based on drush make
永对 陈
 
PDF
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
KEY
Automating Drupal Development: Makefiles, features and beyond
Nuvole
 
PDF
Automatisation in development and testing - within budget [IronCamp prague 20...
David Lukac
 
PDF
Drupal Best Practices
Mukesh Agarwal
 
PDF
Live deployment, ci, drupal
Andrii Podanenko
 
PPTX
Git Going w/ Git
heyMP
 
PDF
Efficient development workflows with composer
nuppla
 
PDF
Introduction to git
Phill Brown
 
PDF
Git basics
GHARSALLAH Mohamed
 
Do + ldo for developers(full)
Andrii Podanenko
 
Updated non-lab version of Level Up. Delivered at LOPSA-East, May 3, 2014.
Mandi Walls
 
Git Basics
Ryan Condron
 
Open Source Tools for Leveling Up Operations FOSSET 2014
Mandi Walls
 
ActiveLAMP Process
Tom Friedhof
 
An introduction to Git with Atlassian Suite
Chetan Khatri
 
Staging and Deployment
heyrocker
 
Git - Some tips to do it better
Jonas De Smet
 
Getting Git Right
Sven Peters
 
Modernize Your Drupal Development
Chris Tankersley
 
Build drupal project based on drush make
永对 陈
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
Automating Drupal Development: Makefiles, features and beyond
Nuvole
 
Automatisation in development and testing - within budget [IronCamp prague 20...
David Lukac
 
Drupal Best Practices
Mukesh Agarwal
 
Live deployment, ci, drupal
Andrii Podanenko
 
Git Going w/ Git
heyMP
 
Efficient development workflows with composer
nuppla
 
Introduction to git
Phill Brown
 
Git basics
GHARSALLAH Mohamed
 
Ad

Recently uploaded (20)

PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
Apache CloudStack 201: Let's Design & Build an IaaS Cloud
ShapeBlue
 
PDF
Français Patch Tuesday - Juillet
Ivanti
 
PPTX
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
PDF
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
PPTX
Building a Production-Ready Barts Health Secure Data Environment Tooling, Acc...
Barts Health
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PDF
CloudStack GPU Integration - Rohit Yadav
ShapeBlue
 
PPTX
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
PDF
Ampere Offers Energy-Efficient Future For AI And Cloud
ShapeBlue
 
PPTX
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
PDF
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
PDF
Predicting the unpredictable: re-engineering recommendation algorithms for fr...
Speck&Tech
 
PDF
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
PDF
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
Apache CloudStack 201: Let's Design & Build an IaaS Cloud
ShapeBlue
 
Français Patch Tuesday - Juillet
Ivanti
 
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
Building a Production-Ready Barts Health Secure Data Environment Tooling, Acc...
Barts Health
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
CloudStack GPU Integration - Rohit Yadav
ShapeBlue
 
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
Ampere Offers Energy-Efficient Future For AI And Cloud
ShapeBlue
 
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
Predicting the unpredictable: re-engineering recommendation algorithms for fr...
Speck&Tech
 
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 

A git workflow for Drupal Core development

  • 1. Cameron Tod - Solutions Architect, Acquia! @cam8001
  • 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
  • 7. 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
  • 8. 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>
  • 9. 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
  • 11. Commit • A single changeset, relative to a repository and file system • Git stores commits as snapshots • Commit metadata; author, timestamp, message
  • 13. 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
  • 14. Files have 3 states • Committed • Modified • Staged
  • 17. 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
  • 18. 2. Make your changes
  • 20. 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)) {
  • 21. 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 🍺
  • 22. 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>
  • 23. 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
  • 24. $ 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)) {
  • 25. 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>
  • 26. 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>
  • 27. 6. Upload your patch for review
  • 31. If you remember one thing
  • 32. 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 🍺
  • 33. 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
  • 34. 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.
  • 35. 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(-)
  • 37. 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(-)
  • 44. 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
  • 45. 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 :)