[[!meta title="Update Guide for 2.0 to 2.1"]]

## Introduction

When changing your installation from 2.0 to 2.1, there are
a lot of changes coming up. 2.1 is mainly a cleanup release,
which removes long time deprecated behaviour, but also makes
a lot of things more consistent and allows you to split off your types,
explorers and manifest to custom directories.

This document will guide you to a successful update.

## Preparation

As for every software and system you use in production, you should first of 
all make a backup of your data. To prevent any breakage, it is
recommended to create a new git branch to do the update on:

    % git checkout -b update_to_2.1

This also ensure that whenever you need to do a change in your
2.0 based tree, you can simply go back to that branch, apply the change
and configure your systems - independently of your update progress!

Next fetch the latest upstream changes, I assume that
origin refers to one of the upstream mirrors (change origin if you use
another remote name for upstream cdist):

    % git fetch -v origin

## Merge the changes

Now try to merge upstream into the new branch.

    % git merge origin/2.1

Fix any conflicts that may have been occurred due to local changes
and then **git add** and *git commit** those changes. This should seldom 
occur and if, it's mostly for people hacking on the cdist core.

## Move "conf" directory

One of the biggest changes in cdist 2.1 is that you can have multiple
**conf** directories: Indeed, the new default behaviour of cdist is to
search for conf directories

 * below the python module (cdist/conf in the source tree or in the installed location)
 * at ~/.cdist/ (on conf suffix there)

So you can now choose, where to store your types.

### Integrate your conf/ back into the tree

If you choose to store your types together with the upstream types,
you can just move all your stuff below **cdist/conf**:

    % git mv conf/type/* cdist/conf/type
    % git mv conf/manifest/* cdist/conf/manifest
    % git mv conf/explorer/* cdist/conf/explorer
    % git commit -m "Re-Integrate my conf directory into cdist 2.1 tree"

### Move your conf/ directory to ~/.cdist

If you want to store your site specific
configuration outside of the cdist tree, you
can move your conf/ directory to your homedirectory ($HOME) under ~/.cdist:

    % mv conf ~/.cdist
    % git rm -r conf
    % git commit -m "Move my conf directory to ~/.cdist"

It it still recommended to use a version control system like git in it:

    % cd ~/.cdist
    % git init
    % git add .
    % git commit -m "Create new git repository containing my cdist configuration"

## Test the migration

Some of the types shipped with upstream were changed, so you may want to test 
the result by running cdist on one of your staging target hosts:

    % ./bin/cdist config -v staging-host

All incompatibilities are listed on the [[cdist update page|software/cdist/update]],
so you can browse through the list and update your configuration.

## Final Cleanups

When everything is tested, there are some cleanups to be done to finalise the update.

### When continuing to keep conf/ in the tree

You can then merge back your changes into the master tree and continue to work
as normal.

### When using ~/.cdist

If you decided to move your site specific code to ~/.cdist, you can now switch your
**master** branch or version branch to upstream directly. Assumnig you are in the
cdist directory, having your previous branch checked out, you can create a clean
state using the following commands:

    % upstream_branch=2.1
    % current_branch=$(git rev-parse --abbrev-ref HEAD)
    % git checkout -b archive_my_own_tree
    % git branch -D "$current_branch"
    % git checkout -b "$current_branch" "origin/$upstream_branch"

Afther these commands, your previous main branch is accessible at
**archive_my_own_tree** and your branch is now tracking upstream.

## Questions? Critics? Hints?

If you think this manual helped or misses some information, do not 
hesitate to contact us on any of the usual ways (irc, mailinglist,
github issue tracker, ...).
