# Fossil
## O Fossil

O Fossil é um sistema de gerenciamento de configuração de software que foi projetado para controlar e acompanhar o desenvolvimento de um projeto registrando seu histórico. É livre e Open-Source sob licença BSD para o controle de versão de forma distribuída criada em 2006. É um sistema com uma operação e instalação simples, necessitando somente baixar o arquivo binário para um local apropriado permitindo o acesso direto por linha de comando ou pelo navegador onde pode ser utilizado através de uma interface web, pois o sistema já possui um servidor web embutido dispensando uma instalação adicional.

### Características

* É livre e open source, utilizando a licença BSD, garantindo assim o direito de alteração e de redistribuição do código fonte;
* Possui um WEB SERVICE embutido, facilitando o monitoramento do projeto via GUI web;
* É um sistema de controle de versão distribuído, assim como git ou mercurial;
* Também integra um sistema de rastreamento de defeitos ou rastreamento de bugs, onde cada repositório criado contém um bug tracking, chamado de “ticket system” ;
* Possui uma wiki embutida que pode ser editada no navegador;
* Possui um fórum de discussão embutido;
* E também um sistema de notas técnicas (semelhante a um note-taking ou Outlining);
* Mantido pelo seu principal criador, Dwayne Richard Hipp, também responsável pelo Projeto SQLite, que gerencia e armazena todos os dados e usa o Fossil como sistema de controle de versão;
* É Multiplataforma, estando disponível nas versões para Linux, MacOS, Windows e RaspberryPi;
* Permite que se trabalhe normalmente offline, e sincronizar ao estar online;
* Possui a grande maioria dos comandos básicos semelhantes aos do Git (exceto “rebase”, por exemplo);
* Há o suporte para o visual studio code na forma de plugin ;
* Como a comunidade ainda não é tão grande, não existe muito conteúdo disponível na web;
* A ferramenta e sua documentação estão somente em inglês, (conteúdo em português só na wikipedia, mas é pouco);

### Conceitos utilizados em um projeto no Fossil

Source tree - uma hierarquia de arquivos de um projeto que são utilizados para gerar o produto final. Não podem se sobrepor em um repositório.
Check-in - uma versão do projeto, criada geralmente quando se dá um commit. Check-ins são dispostos numa hierarquia do projeto.
Repositório - um único arquivo no disco onde são armazenados todos os check-ins e o histórico do projeto, por isso pode ser renomeado, movido, salvo em um cartão de memória, ou qualquer outra coisa que se faz com arquivos. Cada source tree está associada a um único repositório (o contrário pode não ocorrer, um repositório pode conter mais de uma source tree). Em projetos com vários desenvolvedores, cada um tem um repositório local e uma source tree.
Codificação delta - formato compactado em que os check-ins são armazenados.
_FOSSIL_ (ou .fslckout) - arquivo identificando a source tree no diretório raiz do projeto. Este arquivo contém o caminho para o repositório (mas o repositório não tem registro de suas árvores de origem).
Artefato - uma versão específica de um arquivo do projeto. Artefatos são imutáveis, e são identificados por um ID que é um ç de 40 caracteres em hexadecimal, porém, quando for necessário se referir a um artefato, Fóssil mostrará apenas os primeiros 10. Fossil foi projetado para ao analisar um conjunto de artefatos em qualquer ordem, reconstruir o histórico completo do desenvolvimento de um projeto.
Manifesto - arquivo computado na memória para cada check-in. Ele contém todos os ID’s dos artefatos de um dado check-in. É gerado sempre que um commit é feito. Um manifesto não é um documento real no disco, mas pode ser materializado via comando específico. O ID do manifesto é o identificador do check-in.

## Fluxos de trabalho

O Fossil suporta dois fluxos de trabalho: autosync e manual-merge. O autosync (é o modo de operação padrão, mas pode ser alterada) é uma reminiscência do CVS e do SVN, mantendo automaticamente as alterações na sincronização com os colegas de trabalho através de um servidor central. O manual-merge é o modo de operação semelhante ao do Git e do Mercurial, com desenvolvimento em repositórios locais e onde as mudanças podem ser “mescladas" manualmente.

### Autosync

Configuração padrão. Permite “pull” automático quando der um "update", e um “push” automático quando der um “commit”. Quando os colegas de trabalho em um projeto fazem suas próprias alterações é possível mesclar essas alterações na source tree local usando o comando “update". Neste modo, ao dar um “update”, o fluxo primeiro volta para o servidor de onde o projeto foi clonado ou ao qual o desenvolvedor está sincronizado, e atualiza o repositório local com as mudanças recentes do projeto contidas no servidor remoto. E em seguida, serão fundidas as mudanças recentes na árvore fonte local.

### Manual-Merge

Quando autosync está desativado, o comando "commit" é dissociado do "push" e o comando "pull" é dissociado do "update". Isso significa que esses passos devem ser feitos manualmente. A configuração padrão para um novo repositório é com autosync, por isso é necessário desativá-lo. Se duas ou mais pessoas comitaram sobre o mesmo check-in, isso irá resultar em um fork, que pode ser resolvido através de um “merge”, seguido de outro commit.

## Instalação

Instalação em Linux:
Caso a biblioteca OpenSSL não esteja com os pacotes para desenvolvedor instalados será necessário o comando:
$ sudo apt-get install libssl-dev
Agora podemos iniciar a instalação do Fossil. O Fossil está disponível para download nos repositórios de diversas distribuições linux. Pode-se instalar o programa pelo comando:
$ sudo apt-get install fossil
Instalação em Windows:
É um software de fácil instalação, contendo um arquivo apenas, e não requer instalação de dependências ou de outro software para funcionar. Também é fácil de desinstalar, sendo necessário apenas apagar o executável. Para atualizar com uma nova versão, precisa-se apenas substituir o executável antigo pelo mais novo, e digitar o comando “fossil all rebuild” no terminal para reestruturar todos os repositórios de projetos Fóssil.

## Primeiros Passos
### Iniciando um novo projeto

Para criar um repositório para um novo projeto pode ser utilizado os comandos abaixo:
$ fossil init <parâmetro><NOME DO PROJETO>
ou
$ fossil new <parâmetro><NOME DO PROJETO>
Por padrão a ferramenta irá gerar um user admin para o projeto de acordo com o user admin da máquina. Isso pode ser modificado durante a criação do projeto com o parâmetro: --admin-user| -A <NOME DO USUÁRIO>

### Conectar repositório

O repositório foi criado e está vazio e também não possui nenhuma conexão. Para estabelecer uma conexão para o repositório fossil.
$ fossil open <NOME DO PROJETO>
Verificando o status para confirmar a conexão.
$ fossil status
Para verificar os arquivos no diretório que não estão sendo monitorados.
$ fossil extra

### Adicionar arquivos e realizar o commit inicial

Para adicionar arquivos no repositório utilizamos o comando.
$ fossil add .
O comando add é recursivo então se você adicionar os arquivos de um nível superior ele irá recorrer automaticamente nos subdiretórios para obter os arquivos.
Por fim podemos colocar todos os arquivos adicionados em nosso repositório.
$ fossil commit -m "MENSAGEM DO COMMIT"

## Comandos Básicos

Abaixo estão listados alguns dos principais comandos utilizados no Fossil juntamente com as suas funções:

### Para verificar o status da árvore de trabalho

* fossil info - fornece informações sobre o objeto passado como argumento (nome, código, quantidade de checkins e etc)
* fossil status - reporta o status da árvore de trabalho
* fossil changes - relatório sobre o estado de edição dos arquivos
* fossil diff - mostrar diferenças de versões de arquivos
* fossil timeline - exibe um histórico de modificações passando data e hora específicos
* fossil branch - gerenciar branches (new- criar, list- listar branches)

### Para mudar entre as diferentes versões e branches

* fossil update - mescla a versão atualizada do repositório local com a versão presente na source tree local, integrando alterações locais
* fossil checkout - também atualiza versão da source tree , mas não faz isso se houver modificações não comitadas localmente, a menos que seja forçado, e sendo assim, irá sobrescrever o que foi feito localmente

### Para configurar o repositório local

* fossil ui - inicia o webserver para configuração

### Para realizar modificações

* fossil rm- remover arquivos (o arquivo continua no histórico após a remoção)
* fossil add- adiciona uma ou mais modificações antes de commitá-las
* fossil commit- copia as mudanças da source tree local para o repositório local

### Compartilhando as modificações

* fossil push- envia as mudanças para o repositório remoto
* fossil pull- obtém as mudanças do repositório remoto para o repositório local, e então elas vão para o repositório local. Porém é necessário dar um “update” pra levar essas mudanças para a source tree local
* fossil sync- sincronizar todas as mudanças entre o repositório local e o remoto (push e pull)

## Comparações GIT x FOSSIL

* Só versiona arquivos x Versiona tickets (Bug-report do Git), Wiki e notas técnicas adicionalmente.
* Desenvolvimento estilo Bazaar x Desenvolvimento estilo Cathedral
* Projetado para desenvolvimento linux x Projetado para desenvolvimento SQLite
* Grande quantidade de pequenas ferramentas x Executável stand-alone
* Lembra o que você deveria ter feito x Lembra o que você fez
* GPL x BSD