On 2012-08-31 11:58, Steve Gardner wrote:
> We have a strange situation with one of our Mercurial repositories, and
> I'd like to confirm if its likely to cause us any problems in future.
>
> The repository is being updated using push over hgweb.cgi and in the
> past there were a number of problems with permissions errors, so I think
> at some point all of the files under the hg folder were deleted and then
> recreated via a push from a copy of the repository.
>
>
> Most of our repositories contain a cache folder and a store folder
> within the .hg folder, but now in this one there is a data folder
> instead of the store folder.
> Everything else seems to work as it should (the history is still
> correct etc), but I would like to be certain that nothing will be broken
> by this.
This story seems to match with a repository having Mercurial's very
first repository format.
Just creating an empty ".hg" directory (instead of using 'hg init' or
'hg clone') leaves a valid Mercurial repository.
I just tried this on my Windows 7 box:
$ hg version -q
Mercurial Distributed SCM (version 2.2.2+12-d1a0ac9b6b8a)
$ mkdir b
$ cd b
$ mkdir .hg
$ hg verify
repository uses revlog format 0
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
0 files, 0 changesets, 0 total revisions
As you can see, an empty .hg directory is a valid repository. But it's
in an ancient format. Continuing the experiment:
$ echo foo > bla.txt
$ hg add
adding bla.txt
$ hg ci -m1
$ cd .hg
$ dir
Volume in drive C has no label.
Volume Serial Number is F80E-0A52
Directory of C:\Users\adi\hgrepos\tests\b\.hg
31.08.2012 13:42 <DIR> .
31.08.2012 13:42 <DIR> ..
31.08.2012 13:42 104 00changelog.d
31.08.2012 13:42 76 00changelog.i
31.08.2012 13:42 50 00manifest.d
31.08.2012 13:42 76 00manifest.i
31.08.2012 13:42 <DIR> cache
31.08.2012 13:42 <DIR> data
31.08.2012 13:42 64 dirstate
31.08.2012 13:42 1 last-message.txt
31.08.2012 13:42 43 phaseroots
31.08.2012 13:42 2 thgstatus
31.08.2012 13:42 102 undo
31.08.2012 13:42 0 undo.bookmarks
31.08.2012 13:42 7 undo.branch
31.08.2012 13:42 9 undo.desc
31.08.2012 13:42 64 undo.dirstate
31.08.2012 13:42 0 undo.phaseroots
14 File(s) 598 bytes
4 Dir(s) 374'871'592'960 bytes free
You will notice that there is no file named "requires" in the .hg
directory. And thus no "store" subdirectory. Because that format [aka
"layout"] didn't use a "store" subdirectory.
See also
http://mercurial.selenic.com/wiki/RequiresFile
The "requires" file was introduced later. It is used to denote in what
format a repository is.
Current Mercurial versions can read and write all repository formats
ever released (up to that version you are using).
If your repo passes "hg verify", then your data should be fine.
If you want to profit from a newer repo format (which is recommended),
then you can clone it using the pull protocol.
$ hg clone --pull repoA repoB
repoB will then be in the format that is "most recent" (for the version
of "hg" you are using). repoA can be in any old format (which includes
the very first one).