Skip to content
Migrate a project from redmine instance to redmine instance using the API
PHP
Branch: master
Clone or download
Del
Latest commit cf807f7 Mar 22, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore First cut, not yet working Mar 21, 2017
LICENSE Initial commit Mar 20, 2017
README.md Update to include migrating wiki pages Mar 22, 2017
composer.json First cut, not yet working Mar 21, 2017
composer.lock First cut, not yet working Mar 21, 2017
runme.php Update to include migrating wiki pages Mar 22, 2017

README.md

redmine-migrator

This is a command line script to migrate a project from redmine instance to redmine instance using the API.

Many thanks to Kevin Saliou for this package: https://github.com/kbsali/php-redmine-api

Installation

Just copy the files to a location on your machine and run:

composer install

then

./runme.php

... and follow the instructions.

Overview

runme.php reads configuration from the file config.json and performs the migration. Configuration is written back to the file config.json as the script progresses, so each time you run the script, configuration is read back from the file. To start from scratch, just delete the config.json file.

Status

All of the configuration is asked from the command line. If it has been supplied from the command line on a previous run, it is not asked again (unless the config.json file has been deleted).

The following is working so far:

  • Source and destination servers can be supplied.
  • Mapping of trackers (issue types) from source to destination
  • Mapping of issue statuses from source to destination
  • Mapping of priorities from source to destination
  • Mapping of users from source to destination
  • Migration of issues. If the program is re-run, previously migrated issues are not migrated a second time.
  • Migration of wiki pages, except attachments.

TODO

Turn this into a web application using a framework like Laravel, storing the configuration in the session.

  • Categories not supported yet
  • Target versions not supported yet
  • Parent issues not supported yet
  • Custom fields not supported yet
  • Watchers not supported yet
  • is_private not supported yet
  • Wiki pages are migrated but the underlying library does not support migrating attaches on image pages.
  • Re-numbering of issues in comments and wiki pages, i.e. from #oldnumber to #newnumber.
  • All issues are migrated with the correct creator but the issue comments are all migrated with the creator == the owner of the API key.

Data Dumps

This information comes from me playing with the API provided by kbsali/php-redmine-api

//
// This is what one issue looks like
//
[issue] => Array
    (
        [created_on] => 2017-01-03T22:55:53Z
        [tracker] => Array
            (
                [id] => 4
                [name] => Requirement
            )

        [updated_on] => 2017-01-08T04:43:31Z
        [author] => Array
            (
                [id] => 21
                [name] => NAME
            )

        [journals] => Array
            (
                [0] => Array
                    (
                        [created_on] => 2017-01-04T03:33:08Z
                        [notes] => BLABLABLA

                        [id] => 3470
                        [details] => Array
                            (
                                [0] => Array
                                    (
                                        [property] => attachment
                                        [new_value] => Screenshot_20170104_102949.png
                                        [name] => 570
                                    )

                                [1] => Array
                                    (
                                        [property] => attr
                                        [old_value] => 11
                                        [new_value] => 4
                                        [name] => status_id
                                    )

                            )

                        [user] => Array
                            (
                                [id] => 3
                                [name] => NAME
                            )

                    )

                [1] => Array
                    (
                        [created_on] => 2017-01-08T04:43:32Z
                        [notes] =>
                        [id] => 3492
                        [details] => Array
                            (
                                [0] => Array
                                    (
                                        [property] => attr
                                        [old_value] => 4
                                        [new_value] => 13
                                        [name] => status_id
                                    )

                            )

                        [user] => Array
                            (
                                [id] => 3
                                [name] => NAME
                            )

                    )

            )

        [attachments] => Array
            (
                [0] => Array
                    (
                        [created_on] => 2017-01-04T03:32:53Z
                        [filename] => Screenshot_20170104_102949.png
                        [author] => Array
                            (
                                [id] => 3
                                [name] => NAME
                            )

                        [content_url] => http://redmine.MYSITE.COM/attachments/download/570/Screenshot_20170104_102949.png
                        [id] => 570
                        [description] =>
                        [filesize] => 102517
                    )

            )

        [description] => BLABLABLA
        [id] => 630
        [status] => Array
            (
                [id] => 13
                [name] => On Hold
            )

        [start_date] => 2017-01-04
        [assigned_to] => Array
            (
                [id] => 3
                [name] => NAME
            )

        [spent_hours] => 0
        [priority] => Array
            (
                [id] => 2
                [name] => Normal
            )

        [subject] => BLABLABLA
        [project] => Array
            (
                [id] => 4
                [name] => BLABLABLA
            )

        [done_ratio] => 0
    )
)

This is how to create an issue:

$client->issue->create([
    'project_id' => 'test',
    'subject' => 'test api (xml) 3',
    'description' => 'test api',
    'assigned_to_id' => $userId,
    'custom_fields' => [
        [
            'id' => 2,
            'name' => 'Issuer',
            'value' => $_POST['ISSUER'],
        ],
        [
            'id' => 5,
            'name' => 'Phone',
            'value' => $_POST['PHONE'],
        ],
        [
            'id' => '8',
            'name' => 'Email',
            'value' => $_POST['EMAIL'],
        ],
    ],
    'watcher_user_ids' => [],
]);

Here are the default values when creating an issue:

$defaults = [
    'subject' => null,
    'description' => null,
    'project_id' => null,
    'category_id' => null,
    'priority_id' => null,
    'status_id' => null,
    'tracker_id' => null,
    'assigned_to_id' => null,
    'author_id' => null,
    'due_date' => null,
    'start_date' => null,
    'watcher_user_ids' => null,
    'fixed_version_id' => null,
];

Here is how to update an issue, e.g. to add a note

$client->issue->update($issueId, [
    // 'subject'        => 'test note (xml) 1',
    // 'notes'          => 'test note api',
    // 'assigned_to_id' => $userId,
    // 'status_id'      => 2,
    'status' => 'Resolved',
    'priority_id' => 5,
    'due_date' => date('Y-m-d'),
]);
You can’t perform that action at this time.