A Selenic liberou o Mercurial 2.0, a última atualização trianual para o seu DVCS (Distributed Version Control System, ou Sistema Distribuído de Controle de Versões).
Esta versão traz a extensão para arquivos grandes (Largefiles), que é uma forma de se utilizar armazenamento centralizado dentro de um sistema distribuído de controle de versões. Como o mecanismo de armazenamento Revlog do Mercurial não é otimizado para o armazenamento de arquivos binários grandes, a extensão Largefiles fornece um servidor central que permite que esses arquivos sejam baixados conforme a necessidade.
O armazenamento de grandes arquivos binários pode ser um problema em qualquer DVCS, se estes arquivos forem atualizados frequentemente. Mesmo que os arquivos sejam armazenados usando compactação de diferenças (delta compression, que armazena apenas as partes alteradas), grandes arquivos podem facilmente inflar o tamanho do repositório. Além disso, se os arquivos formam parte do histórico local do repositório, não podem ser removidos sem afetar os hashes de conteúdo e portanto a versão do repositório.
Dependendo do sistema de controle de versões em uso, o armazenamento de grandes arquivos em branches diferentes (e que não são baixados regularmente) pode afetar o tamanho do repositório clonado, mesmo que isso não afete muito o tamanho do original. O Largefiles do Mercurial usam uma solução diferente, fornecendo algo similar a um link simbólico para o arquivo no repositório clonado, que aponta para o arquivo existente no repositório original.
Desde que o arquivo em questão não seja necessário na versão sendo trabalhada, ele não será baixado como parte do clone em operações de fetch e push. Entretanto, se houver um checkout incluindo um ou mais destes links para arquivos grandes, será usada uma conexão separada para baixar do servidor original o conteúdo do arquivo. Então pode haver necessidade de conectividade para fazer o checkout de algumas versões do repositório; mas o clone local minimiza a necessidade de conexão, mantendo um cache de arquivos grandes, de modo que as operações possam usar o cache em vez do repositório de origem.
Foi adicionada ao comando hg add a opção --large, para indicar que um arquivo deve ser tratado como grande (e portanto utilizando o caminho alternativo de armazenamento centralizado, porém colocado no cache localmente, sob demanda). Também é possível definir um limite de tamanho (que é 10 Mb por default) ou um padrão de nomes (ex: *.zip) para tratar automaticamente adições como sendo arquivos grandes. Note que o formato do repositório tem que ser atualizado com o comando hg lfconvert, para que se tire proveito dessa nova funcionalidade. Outra adição é no comando dirstate, que permite acompanhar a situação de arquivos grandes. O comando está hoje limitado a 2Gb no Mercurial 2.0, mas se espera que a restrição seja removida em uma atualização futura.
O Mercurial 2.0 traz ainda o comando graft, que implementa cherry picking, ou seja, o merge de commits pontuais de um branch para outro (ou de um repositório para outro). Ele utiliza a lógica de merge para determinar quais mudanças devem ser transferidas, e então as aplica uma a uma, porém sem criar novos nós de merge. Assim como outras implementações de cherry picking, se uma mudança já havia sido copiada anteriormente, ela não será duplicada.