view tests/test-eol-hook.t @ 29021:92d37fb3f1aa stable

verify: don't init subrepo when missing one is referenced (issue5128) (API) Initializing a subrepo when one doesn't exist is the right thing to do when the parent is being updated, but in few other cases. Unfortunately, there isn't enough context in the subrepo module to distinguish this case. This same issue can be caused with other subrepo aware commands, so there is a general issue here beyond the scope of this fix. A simpler attempt I tried was to add an '_updating' boolean to localrepo, and set/clear it around the call to mergemod.update() in hg.updaterepo(). That mostly worked, but doesn't handle the case where archive will clone the subrepo if it is missing. (I vaguely recall that there may be other commands that will clone if needed like this, but certainly not all do. It seems both handy, and a bit surprising for what should be a read only operation. It might be nice if all commands did this consistently, but we probably need Angel's subrepo caching first, to not make a mess of the working directory.) I originally handled 'Exception' in order to pick up the Aborts raised in subrepo.state(), but this turns out to be unnecessary because that is called once and cached by ctx.sub() when iterating the subrepos. It was suggested in the bug discussion to skip looking at the subrepo links unless -S is specified. I don't really like that idea because missing a subrepo or (less likely, but worse) a corrupt .hgsubstate is a problem of the parent repo when checking out a revision. The -S option seems like a better fit for functionality that would recurse into each subrepo and do a full verification. Ultimately, the default value for 'allowcreate' should probably be flipped, but since the default behavior was to allow creation, this is less risky for now.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 27 Apr 2016 22:45:52 -0400
parents f5b6b4e574c1
children d7304434390f
line wrap: on
line source

Test the EOL hook

  $ hg init main
  $ cat > main/.hg/hgrc <<EOF
  > [hooks]
  > pretxnchangegroup = python:hgext.eol.hook
  > EOF
  $ hg clone main fork
  updating to branch default
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd fork

Create repo
  $ cat > .hgeol <<EOF
  > [patterns]
  > mixed.txt = BIN
  > crlf.txt = CRLF
  > **.txt = native
  > EOF
  $ hg add .hgeol
  $ hg commit -m 'Commit .hgeol'

  $ printf "first\nsecond\nthird\n" > a.txt
  $ hg add a.txt
  $ hg commit -m 'LF a.txt'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 2 files

  $ printf "first\r\nsecond\r\nthird\n" > a.txt
  $ hg commit -m 'CRLF a.txt'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  error: pretxnchangegroup hook failed: end-of-line check failed:
    a.txt in a8ee6548cd86 should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    a.txt in a8ee6548cd86 should not have CRLF line endings
  [255]

  $ printf "first\nsecond\nthird\n" > a.txt
  $ hg commit -m 'LF a.txt (fixed)'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files

  $ printf "first\nsecond\nthird\n" > crlf.txt
  $ hg add crlf.txt
  $ hg commit -m 'LF crlf.txt'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  error: pretxnchangegroup hook failed: end-of-line check failed:
    crlf.txt in 004ba2132725 should not have LF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    crlf.txt in 004ba2132725 should not have LF line endings
  [255]

  $ printf "first\r\nsecond\r\nthird\r\n" > crlf.txt
  $ hg commit -m 'CRLF crlf.txt (fixed)'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files

  $ printf "first\r\nsecond" > b.txt
  $ hg add b.txt
  $ hg commit -m 'CRLF b.txt'
  $ hg push ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  error: pretxnchangegroup hook failed: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  [255]

  $ hg up -r -2
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ printf "some\nother\nfile" > c.txt
  $ hg add c.txt
  $ hg commit -m "LF c.txt, b.txt doesn't exist here"
  created new head
  $ hg push -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 2 files (+1 heads)
  error: pretxnchangegroup hook failed: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  [255]

Test checkheadshook alias

  $ cat > ../main/.hg/hgrc <<EOF
  > [hooks]
  > pretxnchangegroup = python:hgext.eol.checkheadshook
  > EOF
  $ hg push -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 2 files (+1 heads)
  error: pretxnchangegroup hook failed: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  [255]

We can fix the head and push again

  $ hg up 6
  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ printf "first\nsecond" > b.txt
  $ hg ci -m "remove CRLF from b.txt"
  $ hg push -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 3 changesets with 3 changes to 2 files (+1 heads)
  $ hg -R ../main rollback
  repository tip rolled back to revision 5 (undo push)

Test it still fails with checkallhook

  $ cat > ../main/.hg/hgrc <<EOF
  > [hooks]
  > pretxnchangegroup = python:hgext.eol.checkallhook
  > EOF
  $ hg push -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 3 changesets with 3 changes to 2 files (+1 heads)
  error: pretxnchangegroup hook failed: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
  [255]

But we can push the clean head

  $ hg push -r7 -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files

Test multiple files/revisions output

  $ printf "another\r\nbad\r\none" > d.txt
  $ hg add d.txt
  $ hg ci -m "add d.txt"
  $ hg push -f ../main
  pushing to ../main
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 3 changesets with 3 changes to 2 files (+1 heads)
  error: pretxnchangegroup hook failed: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
    d.txt in a7040e68714f should not have CRLF line endings
  transaction abort!
  rollback completed
  abort: end-of-line check failed:
    b.txt in fbcf9b1025f5 should not have CRLF line endings
    d.txt in a7040e68714f should not have CRLF line endings
  [255]

  $ cd ..