# Darcs
## Introdução

Assim como Git e Subversion, o Darcs (Darcs Advanced Revision Control System) é um sistema de controle de versão, ou seja, ele mantém o controle de diversas revisões e ramos de um projeto, permitindo que alterações sejam feitas de um ramo para outro. O sistema foi desenvolvido por David Roundy, utilizando a linguagem de programação Haskell, tendo sua primeira release lançada em 2003. Trata-se de um sistema multiplataforma e com licença GNU GPL.
O sistema Darcs possui duas características distintas que o diferem de outros sistemas de controle de revisão, sendo elas:
* Cada árvore fonte é uma branch
Diferente do Subversion, onde o código fonte é armazenado em um repositório central, no Darcs cada cópia do código fonte é um repositório completo. Isto traz diversas vantagens, podendo acessar todas as funções do Darcs a partir de qualquer cópia do seu código, sem commitar mudanças instáveis para um repositório central.
* Darcs mantém controle das mudanças, não de versões
No Darcs, a árvore fonte não é o objeto fundamental, e sim os patches. De modo geral, um repositório pode ser visto como um conjunto de patches que podem ser reordenados sem que a árvore seja modificada. Isso faz com que várias operações, como "cherry-picking" ou "merge", sejam muito mais simples.

## Features

* Salva mudanças localmente
* Registros interativos
* Desfaz mudanças localmente
* Suítes de testes
* Funciona em qualquer servidor
* Você decide as permissões de escrita
* Move arquivos e diretórios
* Substituição de token
* Padrões configuráveis

## Instalação

Para instalar Darcs é necessário que tenha instalado o Stack (Ferramenta de desenvolvimento Haskell).
Para baixar e instalar o Stack:
Para instalar o Darcs:

## Comandos Darcs

Os principais comandos do sistema Darcs são:
Comando utilizado para inicializar um novo repositório. O diretório pode atual de trabalho pode conter arquivos, mas neste ponto o darcs ainda não está rastreando-os.
Comando diz ao Darcs que deve restrear os arquivos selecionados. É criado um Patch especial temporário chamado de Patch pendente.
Compara o diretório de trabalho com a árvore primitiva.
Comando para salvar o trabalho. Copia as mudanças selecionadas do diretório de trabalho para a árvore primitiva, e o mais importante, cria um novo Patch que representa essas mudanças.
Esse comando substitui uma determinada palavra por outra (por exemplo, um nome de variável) no código fonte.
Permite renomear um arquivo ou coloca-lo em outro diretório.
Não apaga um arquivo do diretório, apenas informa ao Darcs que não deve mais rastrear mudanças neste arquivo.
Faz uma cópia completa do repositório (Árvore primitiva e patches não pendentes)
Copia de algum outro repositório os patches que o repositório atual não possui.

## Vantagens

* Toda cópia de trabalho do repositório é um repositório completamente funcional - Enquanto no SVN existe um repositório central e uma ou mais cópias de trabalho que necessitam acessar o repositório para operações me comum.
* Darcs se comporta muito bem quando o servidor/repositório central falha - Com darcs, se o servidor fica fora do ar, os usuários ainda podem trocar patches entre si.
* Usuários de Darcs podem trabalhar offline e ainda assim salvar as mudanças conforme são feitas - Ao contrário do SVN que não fornece uma opção para se salvar o trabalho quando não se tem acesso ao servidor.
* Merge e Branch simples - Uma branch é apenas uma outra cópia local de seu repositório. Pode-se mover determinados patches entre as branches, e para o servidor. Na maioria dos casos, o merge não requer interação do usuário.
* Darcs é mais interativo, criando fluxos de trabalho mais eficientes - Darcs é de fácil aprendizado e agradável de usar por ser mais interativo. Enquanto se salva, envia ou recebe Patches, você tem a oportunidade de revisar detalhes, ser mais seletivo e criar fluxos de trabalho que convém.
* Darcs torna mais fácil de se aceitar contribuições de não-commiters - Enviar patches por e-mail é a alternativa usual para se commitar diretamente em um projeto. Esse processo é automático, com o comando darcs send só é necessário escolher quais patches devem ser enviados.

## Desvantagens em relação ao SVN

* SVN possui mais ferramentas e interfaces gráficas - Projetos como TortoiseSVN torna mais fácil a utilização por parte de usuários menos técnicos. Darcs não é tão bem integrado com repositórios web populares e ferramentas de visualização de patches.
* SVN é mais rápido em grandes projetos - Darcs ainda falha quando se trata de velocidade em projetos grandes.
* Melhor manejo de arquivos binários - Darcs consegue manipular arquivos binários, porém ele salva cada versão de um arquivo binário como um arquivo completo, enquanto o SVN apenas armazena a diferença entre os arquivos.