tests/test-mq-eol.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 05 Apr 2024 11:05:54 +0200
changeset 51576 de5bf3fe0233
parent 41707 140b542b0e59
permissions -rw-r--r--
revset: stop serializing node when using "%ln" Turning hundred of thousand of node from node to hex and back can be slow… what about we stop doing it? In many case were we are using node id we should be using revision id. However this is not a good reason to have a stupidly slow implementation of "%ln". This caught my attention again because the phase discovery during push make an extensive use of "%ln" or huge set. In absolute, that phase discovery probably should use "%ld" and need to improves its algorithmic complexity, but improving "%ln" seems simple and long overdue. This greatly speeds up `hg push` on repository with many drafts. Here are some relevant poulpe benchmarks: ### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog # benchmark.name = hg.command.push # bin-env-vars.hg.flavor = default # bin-env-vars.hg.py-re2-module = default # benchmark.variants.explicit-rev = all-out-heads # benchmark.variants.issue6528 = disabled # benchmark.variants.protocol = ssh # benchmark.variants.reuse-external-delta-parent = default ## benchmark.variants.revs = any-1-extra-rev before: 44.235070 after: 20.416329 (-53.85%, -23.82) ## benchmark.variants.revs = any-100-extra-rev before: 49.234697 after: 26.519829 (-46.14%, -22.71) ### benchmark.name = hg.command.bundle # bin-env-vars.hg.flavor = default # bin-env-vars.hg.py-re2-module = default # benchmark.variants.revs = all # benchmark.variants.type = none-streamv2 ## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog before: 10.138396 after: 7.750458 (-23.55%, -2.39) ## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog before: 1.263859 after: 0.700229 (-44.60%, -0.56) ## data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog before: 399.484481 after: 346.5089 (-13.26%, -52.98) ## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog before: 4.540080 after: 3.401700 (-25.07%, -1.14) ## data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog before: 2.975765 after: 1.870798 (-37.13%, -1.10)


Test interactions between mq and patch.eol


  $ cat <<EOF >> $HGRCPATH
  > [extensions]
  > mq =
  > [diff]
  > nodates = 1
  > EOF

  $ cat > makepatch.py <<EOF
  > f = open('eol.diff', 'wb')
  > w = f.write
  > w(b'test message\n')
  > w(b'diff --git a/a b/a\n')
  > w(b'--- a/a\n')
  > w(b'+++ b/a\n')
  > w(b'@@ -1,5 +1,5 @@\n')
  > w(b' a\n')
  > w(b'-b\r\n')
  > w(b'+y\r\n')
  > w(b' c\r\n')
  > w(b' d\n')
  > w(b'-e\n')
  > w(b'\\\\ No newline at end of file\n')
  > w(b'+z\r\n')
  > w(b'\\\\ No newline at end of file\r\n')
  > EOF

  $ cat > cateol.py <<EOF
  > import sys
  > try:
  >     stdout = sys.stdout.buffer
  > except AttributeError:
  >     stdout = sys.stdout
  > for line in open(sys.argv[1], 'rb'):
  >     line = line.replace(b'\r', b'<CR>')
  >     line = line.replace(b'\n', b'<LF>')
  >     stdout.write(line + b'\n')
  > EOF

  $ hg init repo
  $ cd repo
  $ echo '\.diff' > .hgignore
  $ echo '\.rej' >> .hgignore


Test different --eol values

  $ "$PYTHON" -c 'open("a", "wb").write(b"a\nb\nc\nd\ne")'
  $ hg ci -Am adda
  adding .hgignore
  adding a
  $ "$PYTHON" ../makepatch.py
  $ hg qimport eol.diff
  adding eol.diff to series file

should fail in strict mode

  $ hg qpush
  applying eol.diff
  patching file a
  Hunk #1 FAILED at 0
  1 out of 1 hunks FAILED -- saving rejects to file a.rej
  patch failed, unable to continue (try -v)
  patch failed, rejects left in working directory
  errors during apply, please fix and qrefresh eol.diff
  [2]
  $ hg qpop
  popping eol.diff
  patch queue now empty

invalid eol

  $ hg --config patch.eol='LFCR' qpush
  applying eol.diff
  patch failed, unable to continue (try -v)
  patch failed, rejects left in working directory
  errors during apply, please fix and qrefresh eol.diff
  [2]
  $ hg qpop
  popping eol.diff
  patch queue now empty

force LF

  $ hg --config patch.eol='CRLF' qpush
  applying eol.diff
  now at: eol.diff
  $ hg qrefresh
  $ "$PYTHON" ../cateol.py .hg/patches/eol.diff
  # HG changeset patch<LF>
  # Parent  0d0bf99a8b7a3842c6f8ef09e34f69156c4bd9d0<LF>
  test message<LF>
  <LF>
  diff -r 0d0bf99a8b7a a<LF>
  --- a/a<LF>
  +++ b/a<LF>
  @@ -1,5 +1,5 @@<LF>
  -a<LF>
  -b<LF>
  -c<LF>
  -d<LF>
  -e<LF>
  \ No newline at end of file<LF>
  +a<CR><LF>
  +y<CR><LF>
  +c<CR><LF>
  +d<CR><LF>
  +z<LF>
  \ No newline at end of file<LF>
  $ "$PYTHON" ../cateol.py a
  a<CR><LF>
  y<CR><LF>
  c<CR><LF>
  d<CR><LF>
  z
  $ hg qpop
  popping eol.diff
  patch queue now empty

push again forcing LF and compare revisions

  $ hg --config patch.eol='CRLF' qpush
  applying eol.diff
  now at: eol.diff
  $ "$PYTHON" ../cateol.py a
  a<CR><LF>
  y<CR><LF>
  c<CR><LF>
  d<CR><LF>
  z
  $ hg qpop
  popping eol.diff
  patch queue now empty

push again without LF and compare revisions

  $ hg qpush
  applying eol.diff
  now at: eol.diff
  $ "$PYTHON" ../cateol.py a
  a<CR><LF>
  y<CR><LF>
  c<CR><LF>
  d<CR><LF>
  z
  $ hg qpop
  popping eol.diff
  patch queue now empty
  $ cd ..


Test .rej file EOL are left unchanged

  $ hg init testeol
  $ cd testeol
  $ "$PYTHON" -c "open('a', 'wb').write(b'1\r\n2\r\n3\r\n4')"
  $ hg ci -Am adda
  adding a
  $ "$PYTHON" -c "open('a', 'wb').write(b'1\r\n2\r\n33\r\n4')"
  $ hg qnew patch1
  $ hg qpop
  popping patch1
  patch queue now empty
  $ "$PYTHON" -c "open('a', 'wb').write(b'1\r\n22\r\n33\r\n4')"
  $ hg ci -m changea

  $ hg --config 'patch.eol=LF' qpush
  applying patch1
  patching file a
  Hunk #1 FAILED at 0
  1 out of 1 hunks FAILED -- saving rejects to file a.rej
  patch failed, unable to continue (try -v)
  patch failed, rejects left in working directory
  errors during apply, please fix and qrefresh patch1
  [2]
  $ hg qpop
  popping patch1
  patch queue now empty
  $ cat a.rej
  --- a
  +++ a
  @@ -1,4 +1,4 @@
   1\r (esc)
   2\r (esc)
  -3\r (esc)
  +33\r (esc)
   4
  \ No newline at end of file

  $ hg --config 'patch.eol=auto' qpush
  applying patch1
  patching file a
  Hunk #1 FAILED at 0
  1 out of 1 hunks FAILED -- saving rejects to file a.rej
  patch failed, unable to continue (try -v)
  patch failed, rejects left in working directory
  errors during apply, please fix and qrefresh patch1
  [2]
  $ hg qpop
  popping patch1
  patch queue now empty
  $ cat a.rej
  --- a
  +++ a
  @@ -1,4 +1,4 @@
   1\r (esc)
   2\r (esc)
  -3\r (esc)
  +33\r (esc)
   4
  \ No newline at end of file
  $ cd ..