tests/test-hardlinks-whitelisted.t
branchstable
changeset 33572 857876ebaed4
parent 33202 c1994c986d77
parent 33571 9a944e908ecf
child 33573 9e0fea06ae2c
equal deleted inserted replaced
33202:c1994c986d77 33572:857876ebaed4
     1 #require hardlink
       
     2 #require hardlink-whitelisted
       
     3 
       
     4 This test is similar to test-hardlinks.t, but will only run on some filesystems
       
     5 that we are sure to have known good hardlink supports (see issue4546 for an
       
     6 example where the filesystem claims hardlink support but is actually
       
     7 problematic).
       
     8 
       
     9   $ cat > nlinks.py <<EOF
       
    10   > import sys
       
    11   > from mercurial import util
       
    12   > for f in sorted(sys.stdin.readlines()):
       
    13   >     f = f[:-1]
       
    14   >     print util.nlinks(f), f
       
    15   > EOF
       
    16 
       
    17   $ nlinksdir()
       
    18   > {
       
    19   >     find $1 -type f | python $TESTTMP/nlinks.py
       
    20   > }
       
    21 
       
    22 Some implementations of cp can't create hardlinks (replaces 'cp -al' on Linux):
       
    23 
       
    24   $ cat > linkcp.py <<EOF
       
    25   > from mercurial import util
       
    26   > import sys
       
    27   > util.copyfiles(sys.argv[1], sys.argv[2], hardlink=True)
       
    28   > EOF
       
    29 
       
    30   $ linkcp()
       
    31   > {
       
    32   >     python $TESTTMP/linkcp.py $1 $2
       
    33   > }
       
    34 
       
    35 Prepare repo r1:
       
    36 
       
    37   $ hg init r1
       
    38   $ cd r1
       
    39 
       
    40   $ echo c1 > f1
       
    41   $ hg add f1
       
    42   $ hg ci -m0
       
    43 
       
    44   $ mkdir d1
       
    45   $ cd d1
       
    46   $ echo c2 > f2
       
    47   $ hg add f2
       
    48   $ hg ci -m1
       
    49   $ cd ../..
       
    50 
       
    51   $ nlinksdir r1/.hg/store
       
    52   1 r1/.hg/store/00changelog.i
       
    53   1 r1/.hg/store/00manifest.i
       
    54   1 r1/.hg/store/data/d1/f2.i
       
    55   1 r1/.hg/store/data/f1.i
       
    56   1 r1/.hg/store/fncache
       
    57   1 r1/.hg/store/phaseroots
       
    58   1 r1/.hg/store/undo
       
    59   1 r1/.hg/store/undo.backup.fncache
       
    60   1 r1/.hg/store/undo.backupfiles
       
    61   1 r1/.hg/store/undo.phaseroots
       
    62 
       
    63 
       
    64 Create hardlinked clone r2:
       
    65 
       
    66   $ hg clone -U --debug r1 r2 --config progress.debug=true
       
    67   linking: 1
       
    68   linking: 2
       
    69   linking: 3
       
    70   linking: 4
       
    71   linking: 5
       
    72   linking: 6
       
    73   linking: 7
       
    74   linked 7 files
       
    75 
       
    76 Create non-hardlinked clone r3:
       
    77 
       
    78   $ hg clone --pull r1 r3
       
    79   requesting all changes
       
    80   adding changesets
       
    81   adding manifests
       
    82   adding file changes
       
    83   added 2 changesets with 2 changes to 2 files
       
    84   updating to branch default
       
    85   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
    86 
       
    87 
       
    88 Repos r1 and r2 should now contain hardlinked files:
       
    89 
       
    90   $ nlinksdir r1/.hg/store
       
    91   2 r1/.hg/store/00changelog.i
       
    92   2 r1/.hg/store/00manifest.i
       
    93   2 r1/.hg/store/data/d1/f2.i
       
    94   2 r1/.hg/store/data/f1.i
       
    95   2 r1/.hg/store/fncache
       
    96   1 r1/.hg/store/phaseroots
       
    97   1 r1/.hg/store/undo
       
    98   1 r1/.hg/store/undo.backup.fncache
       
    99   1 r1/.hg/store/undo.backupfiles
       
   100   1 r1/.hg/store/undo.phaseroots
       
   101 
       
   102   $ nlinksdir r2/.hg/store
       
   103   2 r2/.hg/store/00changelog.i
       
   104   2 r2/.hg/store/00manifest.i
       
   105   2 r2/.hg/store/data/d1/f2.i
       
   106   2 r2/.hg/store/data/f1.i
       
   107   2 r2/.hg/store/fncache
       
   108 
       
   109 Repo r3 should not be hardlinked:
       
   110 
       
   111   $ nlinksdir r3/.hg/store
       
   112   1 r3/.hg/store/00changelog.i
       
   113   1 r3/.hg/store/00manifest.i
       
   114   1 r3/.hg/store/data/d1/f2.i
       
   115   1 r3/.hg/store/data/f1.i
       
   116   1 r3/.hg/store/fncache
       
   117   1 r3/.hg/store/phaseroots
       
   118   1 r3/.hg/store/undo
       
   119   1 r3/.hg/store/undo.backupfiles
       
   120   1 r3/.hg/store/undo.phaseroots
       
   121 
       
   122 
       
   123 Create a non-inlined filelog in r3:
       
   124 
       
   125   $ cd r3/d1
       
   126   >>> f = open('data1', 'wb')
       
   127   >>> for x in range(10000):
       
   128   ...     f.write("%s\n" % str(x))
       
   129   >>> f.close()
       
   130   $ for j in 0 1 2 3 4 5 6 7 8 9; do
       
   131   >   cat data1 >> f2
       
   132   >   hg commit -m$j
       
   133   > done
       
   134   $ cd ../..
       
   135 
       
   136   $ nlinksdir r3/.hg/store
       
   137   1 r3/.hg/store/00changelog.i
       
   138   1 r3/.hg/store/00manifest.i
       
   139   1 r3/.hg/store/data/d1/f2.d
       
   140   1 r3/.hg/store/data/d1/f2.i
       
   141   1 r3/.hg/store/data/f1.i
       
   142   1 r3/.hg/store/fncache
       
   143   1 r3/.hg/store/phaseroots
       
   144   1 r3/.hg/store/undo
       
   145   1 r3/.hg/store/undo.backup.fncache
       
   146   1 r3/.hg/store/undo.backup.phaseroots
       
   147   1 r3/.hg/store/undo.backupfiles
       
   148   1 r3/.hg/store/undo.phaseroots
       
   149 
       
   150 Push to repo r1 should break up most hardlinks in r2:
       
   151 
       
   152   $ hg -R r2 verify
       
   153   checking changesets
       
   154   checking manifests
       
   155   crosschecking files in changesets and manifests
       
   156   checking files
       
   157   2 files, 2 changesets, 2 total revisions
       
   158 
       
   159   $ cd r3
       
   160   $ hg push
       
   161   pushing to $TESTTMP/r1 (glob)
       
   162   searching for changes
       
   163   adding changesets
       
   164   adding manifests
       
   165   adding file changes
       
   166   added 10 changesets with 10 changes to 1 files
       
   167 
       
   168   $ cd ..
       
   169 
       
   170   $ nlinksdir r2/.hg/store
       
   171   1 r2/.hg/store/00changelog.i
       
   172   1 r2/.hg/store/00manifest.i
       
   173   1 r2/.hg/store/data/d1/f2.i
       
   174   2 r2/.hg/store/data/f1.i
       
   175   2 r2/.hg/store/fncache
       
   176 
       
   177   $ hg -R r2 verify
       
   178   checking changesets
       
   179   checking manifests
       
   180   crosschecking files in changesets and manifests
       
   181   checking files
       
   182   2 files, 2 changesets, 2 total revisions
       
   183 
       
   184 
       
   185   $ cd r1
       
   186   $ hg up
       
   187   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   188 
       
   189 Committing a change to f1 in r1 must break up hardlink f1.i in r2:
       
   190 
       
   191   $ echo c1c1 >> f1
       
   192   $ hg ci -m00
       
   193   $ cd ..
       
   194 
       
   195   $ nlinksdir r2/.hg/store
       
   196   1 r2/.hg/store/00changelog.i
       
   197   1 r2/.hg/store/00manifest.i
       
   198   1 r2/.hg/store/data/d1/f2.i
       
   199   1 r2/.hg/store/data/f1.i
       
   200   2 r2/.hg/store/fncache
       
   201 
       
   202 
       
   203   $ cd r3
       
   204   $ hg tip --template '{rev}:{node|short}\n'
       
   205   11:a6451b6bc41f
       
   206   $ echo bla > f1
       
   207   $ hg ci -m1
       
   208   $ cd ..
       
   209 
       
   210 Create hardlinked copy r4 of r3 (on Linux, we would call 'cp -al'):
       
   211 
       
   212   $ linkcp r3 r4
       
   213 
       
   214 r4 has hardlinks in the working dir (not just inside .hg):
       
   215 
       
   216   $ nlinksdir r4
       
   217   2 r4/.hg/00changelog.i
       
   218   2 r4/.hg/branch
       
   219   2 r4/.hg/cache/branch2-served
       
   220   2 r4/.hg/cache/checkisexec
       
   221   3 r4/.hg/cache/checklink (?)
       
   222   ? r4/.hg/cache/checklink-target (glob)
       
   223   2 r4/.hg/cache/checknoexec
       
   224   2 r4/.hg/cache/rbc-names-v1
       
   225   2 r4/.hg/cache/rbc-revs-v1
       
   226   2 r4/.hg/dirstate
       
   227   2 r4/.hg/hgrc
       
   228   2 r4/.hg/last-message.txt
       
   229   2 r4/.hg/requires
       
   230   2 r4/.hg/store/00changelog.i
       
   231   2 r4/.hg/store/00manifest.i
       
   232   2 r4/.hg/store/data/d1/f2.d
       
   233   2 r4/.hg/store/data/d1/f2.i
       
   234   2 r4/.hg/store/data/f1.i
       
   235   2 r4/.hg/store/fncache
       
   236   2 r4/.hg/store/phaseroots
       
   237   2 r4/.hg/store/undo
       
   238   2 r4/.hg/store/undo.backup.fncache
       
   239   2 r4/.hg/store/undo.backup.phaseroots
       
   240   2 r4/.hg/store/undo.backupfiles
       
   241   2 r4/.hg/store/undo.phaseroots
       
   242   4 r4/.hg/undo.backup.dirstate
       
   243   2 r4/.hg/undo.bookmarks
       
   244   2 r4/.hg/undo.branch
       
   245   2 r4/.hg/undo.desc
       
   246   4 r4/.hg/undo.dirstate
       
   247   2 r4/d1/data1
       
   248   2 r4/d1/f2
       
   249   2 r4/f1
       
   250 
       
   251 Update back to revision 11 in r4 should break hardlink of file f1:
       
   252 
       
   253   $ hg -R r4 up 11
       
   254   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
       
   255 
       
   256   $ nlinksdir r4
       
   257   2 r4/.hg/00changelog.i
       
   258   1 r4/.hg/branch
       
   259   2 r4/.hg/cache/branch2-served
       
   260   2 r4/.hg/cache/checkisexec
       
   261   2 r4/.hg/cache/checklink-target
       
   262   2 r4/.hg/cache/checknoexec
       
   263   2 r4/.hg/cache/rbc-names-v1
       
   264   2 r4/.hg/cache/rbc-revs-v1
       
   265   1 r4/.hg/dirstate
       
   266   2 r4/.hg/hgrc
       
   267   2 r4/.hg/last-message.txt
       
   268   2 r4/.hg/requires
       
   269   2 r4/.hg/store/00changelog.i
       
   270   2 r4/.hg/store/00manifest.i
       
   271   2 r4/.hg/store/data/d1/f2.d
       
   272   2 r4/.hg/store/data/d1/f2.i
       
   273   2 r4/.hg/store/data/f1.i
       
   274   2 r4/.hg/store/fncache
       
   275   2 r4/.hg/store/phaseroots
       
   276   2 r4/.hg/store/undo
       
   277   2 r4/.hg/store/undo.backup.fncache
       
   278   2 r4/.hg/store/undo.backup.phaseroots
       
   279   2 r4/.hg/store/undo.backupfiles
       
   280   2 r4/.hg/store/undo.phaseroots
       
   281   4 r4/.hg/undo.backup.dirstate
       
   282   2 r4/.hg/undo.bookmarks
       
   283   2 r4/.hg/undo.branch
       
   284   2 r4/.hg/undo.desc
       
   285   4 r4/.hg/undo.dirstate
       
   286   2 r4/d1/data1
       
   287   2 r4/d1/f2
       
   288   1 r4/f1
       
   289 
       
   290 
       
   291 Test hardlinking outside hg:
       
   292 
       
   293   $ mkdir x
       
   294   $ echo foo > x/a
       
   295 
       
   296   $ linkcp x y
       
   297   $ echo bar >> y/a
       
   298 
       
   299 No diff if hardlink:
       
   300 
       
   301   $ diff x/a y/a
       
   302 
       
   303 Test mq hardlinking:
       
   304 
       
   305   $ echo "[extensions]" >> $HGRCPATH
       
   306   $ echo "mq=" >> $HGRCPATH
       
   307 
       
   308   $ hg init a
       
   309   $ cd a
       
   310 
       
   311   $ hg qimport -n foo - << EOF
       
   312   > # HG changeset patch
       
   313   > # Date 1 0
       
   314   > diff -r 2588a8b53d66 a
       
   315   > --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
       
   316   > +++ b/a	Wed Jul 23 15:54:29 2008 +0200
       
   317   > @@ -0,0 +1,1 @@
       
   318   > +a
       
   319   > EOF
       
   320   adding foo to series file
       
   321 
       
   322   $ hg qpush
       
   323   applying foo
       
   324   now at: foo
       
   325 
       
   326   $ cd ..
       
   327   $ linkcp a b
       
   328   $ cd b
       
   329 
       
   330   $ hg qimport -n bar - << EOF
       
   331   > # HG changeset patch
       
   332   > # Date 2 0
       
   333   > diff -r 2588a8b53d66 a
       
   334   > --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
       
   335   > +++ b/b	Wed Jul 23 15:54:29 2008 +0200
       
   336   > @@ -0,0 +1,1 @@
       
   337   > +b
       
   338   > EOF
       
   339   adding bar to series file
       
   340 
       
   341   $ hg qpush
       
   342   applying bar
       
   343   now at: bar
       
   344 
       
   345   $ cat .hg/patches/status
       
   346   430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
       
   347   4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c:bar
       
   348 
       
   349   $ cat .hg/patches/series
       
   350   foo
       
   351   bar
       
   352 
       
   353   $ cat ../a/.hg/patches/status
       
   354   430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
       
   355 
       
   356   $ cat ../a/.hg/patches/series
       
   357   foo
       
   358 
       
   359 Test tags hardlinking:
       
   360 
       
   361   $ hg qdel -r qbase:qtip
       
   362   patch foo finalized without changeset message
       
   363   patch bar finalized without changeset message
       
   364 
       
   365   $ hg tag -l lfoo
       
   366   $ hg tag foo
       
   367 
       
   368   $ cd ..
       
   369   $ linkcp b c
       
   370   $ cd c
       
   371 
       
   372   $ hg tag -l -r 0 lbar
       
   373   $ hg tag -r 0 bar
       
   374 
       
   375   $ cat .hgtags
       
   376   4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
       
   377   430ed4828a74fa4047bc816a25500f7472ab4bfe bar
       
   378 
       
   379   $ cat .hg/localtags
       
   380   4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo
       
   381   430ed4828a74fa4047bc816a25500f7472ab4bfe lbar
       
   382 
       
   383   $ cat ../b/.hgtags
       
   384   4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
       
   385 
       
   386   $ cat ../b/.hg/localtags
       
   387   4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo
       
   388 
       
   389   $ cd ..