wiki:DeveloperTips

Version 5 (modified by Samuli Seppänen, 7 years ago) (diff)

Fix typo

Introduction

This page contains developer documentation that is useful, but not needed very often.

Applying patches from emails

It's often necessary to test individual patches sent to a mailing list. Patches that are real attachments are trivial to download and merge. However, sometimes the patches are stored inline, in the message body, which makes thing slightly more difficult. If you're running Mozilla Thunderbird, you export emails containing inline emails as mbox file using ImportExportTools add-on. These can then be applied to a git repository using git am <mbox-filename>.

Alternatively you can view the email source (Ctrl-U), copy-and-paste the contents to a text file and "git am" the text file.

Sending GitHub pull requests to the mailing list with git-send-email

Getting a "git am"-compatible patch out of a GitHub pull requests is simple:

$ wget https://github.com/OpenVPN/openvpn/pull/<pr-number>.patch

You can then apply the patch:

$ git am <pr-number>.patch

Then you should amend the commit message to add information and to fix errors (if any):

  • What pull request the patch was created from
  • Who ACKed the patch
  • Who relayed the patch (in case if you're not the author)
  • Fix formatting issues

And example below:

$ git commit -s --amend
Update contrib/pull-resolv-conf/client.up for no DOMAIN

When no DOMAIN is received from push/pull, do not add either domain or
search to the resolv.conf. Fix typo in comment resolv.con[f]. Only add
new line when using domain or search.

URL: https://github.com/OpenVPN/openvpn/pull/34
Acked-by: Steffan Karger <steffan@karger.me>
Signed-off-by: Samuli Seppänen <samuli@openvpn.net>

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Author:    Jeffrey Cutter <jeff_m_cutter@yahoo.com>
# Date:      Sat Sep 12 20:03:18 2015 -0400
...

After adjusting the commit message you can send the patch using git-send-email:

$ git-send-email --to=openvpn-devel@lists.sourceforge.net HEAD^1...HEAD

Adjust as necessary if you there is more than one patch.

Bisecting commits to detect introduction of a bug

In most cases, it's easiest to use git-bisect to find the commit which introduced a problem. However, if the buildsystem is not in perfect working order all the way through from last known good commit to known bad, you may need to do manual bisecting such as was done here. In practice, you can reset to an earlier commit with

$ git reset --hard <commit-id>

Next build and test. If it still fails, move further back in history and retry, until you find a version that works. Optimally, you should bisecting at the middle of commits between known good and known bad, then repeat the procedure until you pinpoint the bad commit.

If you have hunch which commit might have introduced the bug, you can try reverting it to see what happens:

git revert <commit-id>

In case no later commits conflict with the commit, this will work. If there are conflicts, fix them manually or abort the revert and write a reverting commit manually.

Converting SVN revisions to Git patches

There's a Python script available that converts SVN revisions into patches git am can understand:

To use this script, copy it into the SVN repository root as svnrev2git.py. Then create an authors file using this format:

svnusername, firstname lastname, email

For example:

johndoe, John Doe, john.doe@domain.com

To use the script, call it like this:

$ python svnrev2git.py authors <revision>
$ python svnrev2git.py authors <revision_start>-<revision_end>

For example:

$ python svnrev2git.py authors 8126
$ python svnrev2git.py authors 8126-8225
$ for REV in 8206 8212 8219 8225; do python svnrev2git.py authors $REV;done

Note that the script is slow in processing long revision ranges: it's usually a better idea to pick the required revisions by hand.

Poor-man's Symdiff

Andj came up with a clever script in an IRC meeting to generate diffs that make reviewing refactoring patches easier:

#!/bin/bash
git diff $1 $2 >/tmp/difftmp123.txt
cat /tmp/difftmp123.txt |grep "^-" |sed s/^-// >/tmp/removed123.txt
cat /tmp/difftmp123.txt |grep "^+" |sed s/^+// >/tmp/added123.txt
diff /tmp/removed123.txt /tmp/added123.txt -u

This is similar to Symdiff.