view tests/test-eol-add.t @ 30446:b324b4e431e5

posix: give checkexec a fast path; keep the check files and test read only Before, Mercurial would create a new temporary file every time, stat it, change its exec mode, stat it again, and delete it. Most of this dance was done to handle the rare and not-so-essential case of VFAT mounts on unix. The cost of that was paid by the much more common and important case of using normal file systems. Instead, try to create and preserve .hg/cache/checkisexec and .hg/cache/checknoexec with and without exec flag set. If the files exist and have correct exec flags set, we can conclude that that file system supports the exec flag. Best case, the whole exec check can thus be done with two stat calls. Worst case, we delete the wrong files and check as usual. That will be because temporary loss of exec bit or on file systems without support for the exec bit. In that case we check as we did before, with the additional overhead of one extra stat call. It is possible that this different test algorithm in some cases on odd file systems will give different behaviour. Again, I think it will be rare and special cases and I think it is worth the risk. test-clone.t happens to show the situation where checkisexec is left behind from the old style check, while checknoexec only will be created next time a exec check will be performed.
author Mads Kiilerich <madski@unity3d.com>
date Wed, 14 Jan 2015 01:15:26 +0100
parents 43b3b761d9d1
children
line wrap: on
line source

Test adding .hgeol

  $ cat >> $HGRCPATH <<EOF
  > [diff]
  > git = 1
  > EOF
  $ seteol () {
  >     if [ $1 = "LF" ]; then
  >         EOL='\n'
  >     else
  >         EOL='\r\n'
  >     fi
  > }
  $ makerepo () {
  >     echo
  >     echo "# ==== setup repository ===="
  >     echo '% hg init'
  >     hg init repo
  >     cd repo
  >     printf "first\nsecond\nthird\n" > a.txt
  >     hg commit -d '100 0' --addremove -m 'LF commit'
  >     cd ..
  > }
  $ dotest () {
  >     seteol $1
  >     echo
  >     echo "% hg clone repo repo-$1"
  >     hg clone repo repo-$1
  >     cd repo-$1
  >     cat > .hg/hgrc <<EOF
  > [extensions]
  > eol =
  > [eol]
  > native = LF
  > EOF
  >     cat > .hgeol <<EOF
  > [patterns]
  > **.txt = native
  > [repository]
  > native = $1
  > EOF
  >     echo '% hg add .hgeol'
  >     hg add .hgeol
  >     echo '% hg status'
  >     hg status
  >     echo '% hg commit'
  >     hg commit -d '200 0' -m 'Added .hgeol file'
  >     echo '% hg status'
  >     hg status
  >     echo '% hg tip -p'
  >     hg tip -p
  >     cd ..
  >     rm -r repo-$1
  > }
  $ makerepo
  
  # ==== setup repository ====
  % hg init
  adding a.txt
  $ dotest LF
  
  % hg clone repo repo-LF
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  % hg add .hgeol
  % hg status
  A .hgeol
  % hg commit
  % hg status
  % hg tip -p
  changeset:   1:33503edb53b0
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:03:20 1970 +0000
  summary:     Added .hgeol file
  
  diff --git a/.hgeol b/.hgeol
  new file mode 100644
  --- /dev/null
  +++ b/.hgeol
  @@ -0,0 +1,4 @@
  +[patterns]
  +**.txt = native
  +[repository]
  +native = LF
  
  $ dotest CRLF
  
  % hg clone repo repo-CRLF
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  % hg add .hgeol
  % hg status
  M a.txt
  A .hgeol
  % hg commit
  % hg status
  % hg tip -p
  changeset:   1:6e64eaa9eb23
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:03:20 1970 +0000
  summary:     Added .hgeol file
  
  diff --git a/.hgeol b/.hgeol
  new file mode 100644
  --- /dev/null
  +++ b/.hgeol
  @@ -0,0 +1,4 @@
  +[patterns]
  +**.txt = native
  +[repository]
  +native = CRLF
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,3 @@
  -first
  -second
  -third
  +first\r (esc)
  +second\r (esc)
  +third\r (esc)
  
  $ rm -r repo