oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
TRANSCRIPT
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 1/93
Practical SVNfor PHP Developers
Matthew Weier O'PhinneyProject Lead
Zend Framework
Lorna Jane MitchellSoftware Engineer
Ibuildings
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 2/93
What isVersion Control?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 3/93
• What did you change from the previous
revision?• What changes have others recorded
since your last local update?
Change Management
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 4/93
Types of Version Control
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 5/93
• Each checkout is a fully functional repository
• Anybody may accept patches from anyone
else• Anybody may send patches to anyone else
• Ideal for projects with parallel feature
developement
Distributed
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 6/93
• One canonical repository
• All changes are submitted to the repository
• All changes are retrieved from the repository• Ideal when:
– a canonical version is required,
– access to the repository should be controlled
Non-Distributed
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 7/93
What isSubversion?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 8/93
• Non-Distributed Version Control System
• Successor to CVS
• Stores and versions: – source code
– documentation
– anything, really
Subversion is...
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 9/93
InstallingSubversion
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 10/93
Choose a Protocol
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 11/93
• give repo access to local users
• give users and/or groups read/write on therepo to grant access
• file:///home/lorna/svn-repos/main/trunk/
Local filesystem
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 12/93
• give repo access to users with sshcredentials
• give users and/or groups read/write onthe repo to grant access
• svn+ssh svn://rivendell/home/lorna/svn-
repos/main/trunk
svn+ssh
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 13/93
• make repo web-browseable and haveapache handle credentials
• basic or digest HTTP authentication(e.g., .htpasswd)
• mod_authz_svn - an Apache module togive finer access control
• http://svn.example.com/main/trunk
WebDAV via HTTP/S
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 14/93
Installingon Linux
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 15/93
• Debian/Ubuntu:
aptitude install subversion• Fedora/RedHat:
yum install subversion
Distribution packages
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 16/93
• download fromhttp://subversion.tigris.org
• check dependencies (install apache,mod_dav, etc., first)
• compile
From source
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 17/93
Setting up arepository
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 18/93
What is arepository ?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 19/93
• The place all changesets are stored
• A black box; you may only interact with itusing svn tools
A repository is...
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 20/93
Creating therepository
U “ d i ”
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 21/93
Use “svnadmin create”
C t i iti l t t
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 22/93
Create initial content
C it i iti l t t
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 23/93
Commit initial structure
Alt t i t i t th
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 24/93
Alternate way: import into the repo
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 25/93
About
repositorystructure
Repository Structure
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 26/93
• Trunk – the main code version
• Branches – copies of code which can be
modified• Tags – copies of code which are never
changed
•
All are “cheap” copies
Repository Structure
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 27/93
Using Subversion
Checkout: svn checkout (co)
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 28/93
Checkout: svn checkout (co)
svn directory
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 29/93
.svn directory
Status: svn status (st)
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 30/93
Status: svn status (st)
Common status codes
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 31/93
• ' ' no modifications
•
'A' Added• 'C' Conflicted
• 'D' Deleted
• 'M' Modified• '?' item is not under version control
• '!' item is missing (removed by non-
svn command) or incomplete• 'X' external resource managed by svn
(svn:externals)
Common status codes
Add to repo: svn add
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 32/93
Add to repo: svn add
Commit to repo: svn commit (ci)
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 33/93
Commit to repo: svn commit (ci)
Changelog: svn log
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 34/93
Changelog: svn log
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 35/93
Dealing withmissing files
Missing files - ! in the status
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 36/93
• “!” in the status listing
• Usually because something was moved
or deleted without using the svn tools• Always use svn rm and svn mv
• To fix: update (svn up) and try again
Missing files ! in the status
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 37/93
What and Whento commit
Bad practices
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 38/93
•
hourly, semi-daily, daily checkins• code only, tests only, docs only
Bad practices
The Best Practice:
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 39/93
Each commit should include all
code, tests, and docs relatedto a discrete behavior or set of functionality.
The Best Practice:
Why?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 40/93
• Easy to “cherry-pick” changesets
between branches• Trivial to identify changesets to rollback
y
Examples
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 41/93
p
Examples
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 42/93
p
How?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 43/93
• PLAN your project; break it into distinct units of functionality
• Use an issue tracker; issues should include
expectations, actual results, and reproducecode (these become your tests!)
• No unit of functionality should take more than3-4 hours to implement; longer, and it likely
should be broken into sub-tasks.
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 44/93
Conflicts
svn blame
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 45/93
•
svn blame / annotate / praise• shows who last edited which line
Example
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 46/93
Conflicts
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 47/93
• Two people change same line of same
file• svn will ask user to choose
Example: conflict adds files
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 48/93
• index.php.r4 version from before either yourchanges or the commit that has conflicted
• index.php.r6 current repo version
• index.php.mine working copy before servershowed conflict
• index.php whole file with some markup to
show just the conflict(s) in place
svn resolved
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 49/93
• edit index.php until correct
•
may copy one of the "extra" files intoplace of this one
• let SVN know you're all sorted
Avoiding Conflicts
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 50/93
• Good team communication
• Update often• Commit first!
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 51/93
Branchingand Tagging
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 52/93
Patterns
Feature Branches
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 53/93
Graph by Eli White
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 54/93
Long-lived Branches
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 55/93
Graph by Eli White
Long-lived Branches
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 56/93
●Pros:−Production is always stable−Rollback by pointing to production tags
●Cons:−Long-lived feature development often lags trunk features●Difficult to determine what to merge
−
Difficult to do parallel feature development−More difficult to rollback specific features
Release Branches
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 57/93
Graph by Eli White
Release Branches
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 58/93
●Pros:−Easy to isolate features by version (parallel development)−
Possibility of keeping multiple active versions of a project●Cons:
−Harder to merge patches between branches (files may
differ widely)
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 59/93
Merging
Merging
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 60/93
• Moving changes between branches(including trunk)
• Merge single changes
• Merging as part of a branch lifecycle
How to merge
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 61/93
• Check out the target branch• From the target directory, run svn diff
until the output illustrates the operation
you wanted• Replace "diff" with "merge"
• Review changes to working copy and/or
test
How to merge: the easy way
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 62/93
• Use “svn log” to identify discretechangesets you want to merge.
• Use the “cherry-pick” flag of “svn
merge” (-c) to merge that singlechangeset.
• Works well if you're following the best
practices outlined earlier!
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 63/93
AdministeringRepositories
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 64/93
Backing upyour Repository
svnadmin hotcopy
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 65/93
• Copying files directly can lead tocorruption in the copy
• Use “svnadmin hotcopy” or
“svnadmin dump”
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 66/93
Authentication
svnserve or svn+ssh
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 67/93
●Dependent on how the OS doesauthentication:
−Local accounts−“Virtual” accounts−etc.
●
SSH public keys are a common solution
WebDAV (http/https)
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 68/93
● Typically HTTP basic or digestauthentication
−Use htpasswd to generate user/passpairs
−Can still allow anonymous access−Configure your server to require it
Example HTTP Auth configuration
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 69/93
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 70/93
Authorization
T i ll f/ th i
ACL File
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 71/93
● Typically conf/authz in your repo, or
“access.conf” accessible to web server●INI-style file with [sections]
−[groups] section to define users and
groups−[/path] specifies path on repo−[repo:/path] specifies path on
specific repo (if more than one repodefined)
ACL File
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 72/93
●ACLs:−[user|group] = [r|rw]−“*” as group/user means any user−Groups are prefixed with “@”
ACL File: example
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 73/93
ACL File: placement
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 74/93
●Svnserve, file access, or svn+ssh:conf/authz in your repository●WebDAV: anywhere.
− Tell your vhost where to find it−Must setup authorization prior toauthentication
ACL File in WebDAV: vhost setup
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 75/93
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 76/93
Hooks
What are hooks?
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 77/93
●
Allow extending SVN's capabilities viauserland scripts●“Hook” into specific processes:
−pre/post-commit, start-commit−pre/post-revprop-change−pre/post-lock
−pre/post-unlock
Running a linter REPOS="$1"
TXN="$2"
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 78/93
PHP="/path/to/php"
SVNLOOK="/path/to/svnlook"
AWK="/path/to/awk"GREP="/path/to/egrep"
SED="/path/to/sed"
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | \
$AWK '{print $2}' | \
$GREP \\.php$`
for FILE in $CHANGED
do
MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | $PHP -l`
if [ $? -ne 0 ]
then
echo 1>&2
echo "***********************************" 1>&2
echo "PHP error in: $FILE:" 1>&2
echo `echo "$MESSAGE" | $SED "s| -| $FILE|g"` 1>&2
echo "***********************************" 1>&2
exit 1
fi
done
Sample linter output
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 79/93
***********************************PHP error in: test.phpecho $foobar ***********************************
R t it t bl ki i
Running unit tests
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 80/93
• Run post-commit – prevents blocking issues
• Send email notification when tests fail
• Two approaches:
– Run entire suite
– Grep committed files for classes, and test just those classes
• Typically best to do this from a Continuous
Integration server, and not via subversionhooks
●Email Nabaztag TwitterSVN
Sending notifications
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 81/93
●Email, Nabaztag, TwitterSVN
●
Email notifications post-commit●SVN::Notify:
−http://search.cpan.org/~dwheeler/SVN-
Notify-2.79/lib/SVN/Notify.pm−Can selectively determine whichpeople/lists get notifications based on
commit path−Plain text and/or HTML emails
Example notification:
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 82/93
Publishing RSS Feeds
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 83/93
• svn2feed.py:http://svn.collab.net/repos/svn/trunk/tools/ho
ok-scripts/svn2feed.py• Add svn2feed.py to your hooks/ directory
Adding svn2feed.py to your post-commit hook:
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 84/93
path/to/python path/to/hooks/svn2feed.py \
--svn-path /usr/bin/ \
--max-items=100 \
--format=atom \ --revision "$REV" –item-url \
"http://localhost/svn/" \
--feed-url="http://localhost/rss/svn.rss" \
--feed-file "path/to/rss/svn.rss" \
"$REPOS" &
Generating documentation
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 85/93
• Trigger docbook build process, orPhpDocumentor
•
Run post-commit, so as not to block• Typically best done from a CI server, and
not subversion hooks
PHP C d S iff i l d i
Running PHP_CodeSniffer
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 86/93
●PHP_CodeSniffer includes a script,
bin/scripts/phpcs-svn-pre-commit− Edit the script to provide the path to svnlook:− define('PHP_CODESNIFFER_SVNLOOK',
'/usr/bin/svnlook');●Edit the pre-commit hook script to invoke thescript:
− /path/to/bin/scripts/phpcs-svn-pre-commit"$REPOS" -t "$TXN" >&2 || exit 1
PHP_CodeSniffer hook output
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 87/93
Transmitting file data .svn: Commit failed (detailsfollow):
svn: 'pre-commit' hook failed with error output:
FILE: temp.php---------------------------------------------------------------FOUND 1 ERROR(S) AND 0 WARNING(S) AFFECTING 1 LINE(S)
---------------------------------------------------------------2 | ERROR | Missing file doc comment--------------------------------------------------------------
For more info on PHP_CodeSniffer:
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 88/93
http://pear.php.net/manual/en/package.php.php-codesniffer.svn-pre-commit.php
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 89/93
Deploying from SVN
Deployment Considerations
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 90/93
• What else needs to happen at deploytime?
•
Preserve uploads• Set permissions
• Database patches
Checkout or Export
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 91/93
• Checkout retains link to repo
• Meta data present on server
•
Inconsistent state during update• Export is clean copy, no dependencies
• Other ways to keep track of version
Best Practices
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 92/93
•
Tag and export from svn – includesome tag info
• Use symlinks to enable seamless
switching• Wrap in a script
• Have a rollback plan/script
•
Consider database strategies
7/27/2019 oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01
http://slidepdf.com/reader/full/oweierphinney-2009-05-19-svnforphpdevs-090519165923-phpapp01 93/93
Thank you.