We're always happy to receive patches, whether for contribution to a project or for general community availability on [http://pkp.sfu.ca/support/forum the forums]. The one thing we do ask is that you provide the patch in [http://en.wikipedia.org/wiki/Diff#Unified_format Unified Diff] format. If you are patching against one of the above CVS modules, the easiest thing to do is generate your patch using something like the following command (which will generate a diff of the entire directory you are currently in, for example ojs2-devel, against the entire cvs module):

+

We're always happy to receive patches, whether for contribution to a project or for general community availability on [http://pkp.sfu.ca/support/forum the forums]. The one thing we do ask is that you provide the patch in [http://en.wikipedia.org/wiki/Diff#Unified_format Unified Diff] format. If you are using our [http://pkp.sfu.ca/wiki/index.php/Main_Page#Development_Topics git instructions] to work with the application codebase (highly recommended), you can create unified diffs via git using the following command:

+

+

git diff -u ./ > patch.diff

+

+

... which will find all differences in the working directory and '''recursively''', and write them to a file called patch.diff.

−

cvs diff -uN ./ > patch.diff

=== Applying Patches ===

=== Applying Patches ===

Line 48:

Line 51:

** extension_dir must point to the absolute path of the version specific extension binaries

** extension_dir must point to the absolute path of the version specific extension binaries

For PHP 4 only: If you get an error "Client does not support authentication protocol requested by server" or simply "Database connection failed" in PHP4 while everything works fine for PHP5 then you may have created your MySQL account with a [http://dev.mysql.com/doc/refman/5.1/en/old-client.html new style password].

−

−

Entering the following statement from a working MySQL client should fix the problem:

−

SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');

== Install and Configure Apache ==

== Install and Configure Apache ==

Line 156:

Line 153:

http -DPHP53 -DFCGI

http -DPHP53 -DFCGI

−

Please note that PHP 4.3 only supports CGI mode. PHP 4's module is only compatible with Apache 1.3 or 2.0 and PHP 4 does not correctly interpret fcgi's PATH_INFO when used with the FcgiWrapper directive.

+

= Collaboration with Github =

−

+

−

= PHP 4 compatibility coding oddities collection =

+

−

+

−

We'll not try to reproduce a full catalogue of PHP4/5 incompatibilities here. Have a look at http://www.php.net/manual/en/migration5.php which is quite complete. There are however some PKP-specific solutions to certain compatibility problems that we document here.

+

−

+

−

== Chaining -> accessors ==

+

−

+

−

PHP 4 does not support the chaining of -> accessors. We therefore write:

+

−

+

−

$someTempVar =& $firstObject->getOtherObject();

+

−

$someTargetVar =& $someTempVar->getTargetObject();

+

−

+

−

== Passing objects as method parameters ==

+

−

+

−

Most of the more serious PHP4 compatibility problems have to do with the fact that PHP5 passes and assigns objects by reference by default while PHP4 makes shallow copies if not explicitly asked to use references. This results in a few coding particularities that I'll describe here.

+

−

+

−

We always use explicit by-ref method parameters when possible. This will automatically guarantee PHP4/5 compatibility:

to maintain PHP4 compatibility although this is less efficient in PHP4.

+

−

+

−

== Returning parameters by-ref ==

+

−

+

−

Returning non-variable return values by-ref in PHP 5 generates a warning while PHP 4 tolerates this. We therefore always use the following workaround:

+

−

+

−

function &myMethod() {

+

−

...

+

−

$returner = null;

+

−

return $returner;

+

−

}

+

−

+

−

== Use of $this in the constructor ==

+

−

+

−

This is a tricky one. To understand it look at the following code:

+

−

+

−

class Test {

+

−

var $instance;

+

−

var $data;

+

−

+

−

function Test() {

+

−

$this->instance =& $this;

+

−

}

+

−

}

+

−

+

−

$instanceFromNew = new Test();

+

−

$instanceFromConstructor =& $instanceFromNew->instance;

+

−

+

−

$instanceFromNew->data = 1;

+

−

$instanceFromConstructor->data = 2;

+

−

+

−

echo $instanceFromNew->data."\n";

+

−

echo $instanceFromConstructor->data;

+

−

+

−

This will result in the output 1 - 2 for PHP 4 and 2 - 2 for PHP 5.

+

−

+

−

Changing

+

−

$instanceFromNew = new Test();

+

−

to

+

−

$instanceFromNew =& new Test();

+

−

+

−

Solves the problem in PHP 4 but causes a deprecation warning in PHP 5.3.

+

−

+

−

This is especially problematic in our case as we use lambda functions for validation that are created in the constructor and often get $this passed in as a parameter. If we don't use ... =& new ... in the caller then changes made by the instantiating caller to the object later on will not appear to the validator in PHP 4. This leads to validation errors and can cause security vulnerabilities. In PHP 5.3 the deprecation warning will be raised on parse time. This means that the workaround no longer works. We have to switch off E_DEPRECATION in PHP 5.3 until we drop PHP 4 compatibility.

+

−

+

−

Our solution to this problem is:

+

−

+

−

* When you create a reference to $this within the constructor that will later be used to '''access data in the object instance that might be changed by the instantiating caller''' then you'll have to use the following workaround:

+

−

if (checkPhpVersion('5.0.0')) { // WARNING: This form needs $this in constructor

+

−

... = new ...;

+

−

} else {

+

−

... =& new ...;

+

−

}

+

−

+

−

* In all other cases just use

+

−

... = new ...

+

−

in the caller. This is a little less efficient in PHP 4 but makes the code more readable and easier to maintain.

+

−

+

−

= CVS Access (deprecated) =

+

−

+

−

CVS Access is now deprecated in favor of git. Please see our git documentation on the Wiki's main page. The following documentation is for those who don't have access to git.

(This is not a guide on how to use CVS. For more CVS information, try [http://www.nongnu.org/cvs/ here], [http://www.eyrie.org/~eagle/notes/cvs/basic-usage.html here], and [http://en.wikipedia.org/wiki/Concurrent_Versions_System here].

+

−

+

−

You can check out all CVS modules via anonymous CVS. Before you do so, you should know which modules, exactly, you want to work with. OJS and OCS each have a stable and devel branch; the stable branches are standalone maintenance releases (extensions of OJS 2.2.2 and OCS 2.1.1 codebases), while the devel branches also requires the PKP Web Application Library (WAL) be checked out and installed in the lib/ directory. Harvester2 and Open Monograph Press only have one devel branch, and each require the PKP WAL. Lemon8 is a standalone program with only one branch at the moment.

+

−

+

−

=== Setting up the Environment ===

+

−

+

−

The following instructions are more or less directly applicable to any *nix operating systems (OS X incl.); Windows users probably need to do things a little differently. Also, these are general instructions, pertaining to how I manage my own setup -- you might want to do things a little bit differently.

+

−

+

−

Firstly, create a CVS directory to store all your cvs checkouts in. I created mine in /Users/jmacgreg/ and then entered into the new directory, from which I ran the remaining commands:

+

−

+

−

mkdir /Users/jmacgreg/cvs

+

−

cd cvs

+

−

+

−

You'll then have to log into our CVS repository using our anonymous credentials:

+

−

+

−

cvs -d :pserver:anonymous@lib-pkp.lib.sfu.ca:/cvs login

+

−

+

−

You will be asked for a password — there is none, so just hit enter. After which you should be able to run the following commands to grab specific modules.

The above command will download the current code for the OJS 2.2.2 branch of the ojs2 module, and deposit in a new 'ojs2-stable' directory in the directory you are currently in (you moved to your cvs/ directory, right?)

Setting this up to be served by Apache is up to you (I have it symlinked to my web folder). Remember, while this branch is still fairly stable in comparison to the heavily modified devel branch, it's still a work in progress and shouldn't be used in a production environment unless you know what you're doing.

+

−

+

−

=== Development Branches ===

+

−

+

−

OJS and OCS development branches, as well as the only Harvester2 and OMP (and de facto development) branches, all work a little differently: they all rely on the PKP WAL module as a dependency. The WAL module needs to be 'installed' (symlinking is fine) in each branches' lib/ directory.

Now the tricky part. You need to download the PKP WAL (called 'pkp' in CVS) and either copy it or [http://en.wikipedia.org/wiki/Symbolic_link symlink] it to your devel instances' lib/ directory. I prefer symlinking, as I can do this for each devel instance I'm running, and only have to remember to update one directory.

+

−

+

−

Checkout the pkp module:

+

−

+

−

cvs -d :pserver:anonymous@lib-pkp.lib.sfu.ca:/cvs checkout -d pkp pkp

+

−

Symlink the module to eg. OJS' lib/ directory:

+

Please see http://pkp.sfu.ca/wiki/index.php/HOW-TO_check_out_PKP_applications_from_git and http://pkp.sfu.ca/wiki/index.php/Frequent_git_use_cases for extensive instructions on the ins and outs of working with git repositories.

−

ln -s /Users/jmacgreg/cvs/pkp /Users/jmacgreg/cvs/ojs2-devel/lib/pkp

+

To contribute code back to us, feel free to submit a pull request from git. (We can accept code in other forms, though pull requests are preferred.)

−

... and repeat as necessary for each application.

+

If you are working against a particular entry in our Bugzilla database, use the following format for commit messages:

−

Alternatively, it is possible to change into the ojs2-devel/lib and create, what are called, relative symlinks:

+

*1234* My Commit Description

−

cd ojs2-devel/lib

+

...where the 1234 is the bug ID from Bugzilla. This allows Bugzilla to track back to the commits made in that entry and helps us assemble release notes consistently.

Bugzilla

You can access our Bugzilla database here. We welcome any bug reports and feature requests, so long as they are understandably written and flagged correctly (mostly an issue of setting the severity between enhancement; trivial; minor; normal; major; critical; or blocker levels, although you can also set the priority as well if you'd like). You can see a great set of bug-writing guidelines here.

You are also advised to search for similar reports to avoid duplication.

Patches

Making Patches

We're always happy to receive patches, whether for contribution to a project or for general community availability on the forums. The one thing we do ask is that you provide the patch in Unified Diff format. If you are using our git instructions to work with the application codebase (highly recommended), you can create unified diffs via git using the following command:

git diff -u ./ > patch.diff

... which will find all differences in the working directory and recursively, and write them to a file called patch.diff.

Applying Patches

If you want to apply a patch, download it to your development environment, and from the application's root directory and run

patch -p0 < ./path/to/patch.diff

The --dry-run option to the patch tool allows you to safely test the patch to see if it will apply cleanly, and if not, where the conflicts will arise.

Setting up a flexible development environment

NB: This is not a beginner's installation/configuration tutorial. We only highlight a few important differences from a standard installation as a help for experienced PKP, database, PHP and web server users.

Install and Configure Databases

There is nothing special to the database installation. Use your OS' standard installation procedure to install the necessary databases you want to test in parallel.

Edit config.inc.php to switch the database connection.

Install and Configure supported PHP versions

Download or build the PHP binaries you want to test (newer versions can be downloaded from php.net or are part of the standard OS distributions, older versions must be built from source).

You'll need the thread-safe version if you want to test mod_php in Apache.

Install all binaries and configuration separately. Do not create any shared files or configuration (separate php.ini, separate installation directories).

On Windows:

Get the PHP zip arquive distributions where available and unzip them into separate folders.

XAMPP has lots of old Windows binaries if the version you look for is no longer officially supported on php.net.

Download the thread-safe VC6 version as VC9 versions are not compatible with Apache.

Do not install DLL files in C:\WINDOWS or any other directory on the path.

Do not install any registry keys.

Do not configure any shared environment variables.

Exception: Install PEAR in a central folder that is accessible by all PHP versions. Install necessary PEAR dependencies (e.g. PHPUnit, etc.) - see separate documentation on this Wiki for that.

Edit the development php.ini files as required:

extension_dir must point to the absolute path of the version specific extension binaries

Install and Configure Apache

We use Apache so that we can test CGI, FCGI and Module configurations in parallel. Install Apache 2.2 (standard distribution for your OS). Then get and install mod_fcgid as explained on the linked web pages.

All the magic lies in Apache's httpd.conf. Here's the Windows version. It should be easy to adapt that to your specific OS: