view tests/test-issue660.t @ 48976:877d7e1a4223 stable

amend: fix amend with copies in extras If copy information is stored only in the commit extras and not in filelogs, then they get lost on amend if the file wasn't also modified in the working copy. That's because we create `filectx` object from the old commit in those cases, and the `.copysource()` of such objects read only from the filelog. This patch fixes it by always creating a new `memfilectx` in these cases, passing the calculated copy information to it. Differential Revision: https://phab.mercurial-scm.org/D12387
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 18 Mar 2022 21:15:54 -0700
parents cb70501d8b71
children 8309c83b6e2c
line wrap: on
line source

https://bz.mercurial-scm.org/660 and:
https://bz.mercurial-scm.org/322

  $ hg init
  $ echo a > a
  $ mkdir b
  $ echo b > b/b
  $ hg commit -A -m "a is file, b is dir"
  adding a
  adding b/b

File replaced with directory:

  $ rm a
  $ mkdir a
  $ echo a > a/a

Should fail - would corrupt dirstate:

  $ hg add a/a
  abort: file 'a' in dirstate clashes with 'a/a'
  [255]

Removing shadow:

  $ hg rm --after a

Should succeed - shadow removed:

  $ hg add a/a

Directory replaced with file:

  $ rm -r b
  $ echo b > b

Should fail - would corrupt dirstate:

  $ hg add b
  abort: directory 'b' already in dirstate
  [255]

Removing shadow:

  $ hg rm --after b/b

Should succeed - shadow removed:

  $ hg add b

Look what we got:

  $ hg st
  A a/a
  A b
  R a
  R b/b

Revert reintroducing shadow - should fail:

  $ rm -r a b
  $ hg revert b/b
  abort: file 'b' in dirstate clashes with 'b/b'
  [255]

Revert all - should succeed:

  $ hg revert --all
  forgetting a/a
  forgetting b
  undeleting a
  undeleting b/b

  $ hg st

Issue3423:

  $ hg forget a
  $ echo zed > a
  $ hg revert a
  $ hg st
  ? a.orig
  $ rm a.orig

addremove:

  $ rm -r a b
  $ mkdir a
  $ echo a > a/a
  $ echo b > b

  $ hg addremove -s 0
  removing a
  adding a/a
  adding b
  removing b/b

  $ hg st
  A a/a
  A b
  R a
  R b/b

commit:

  $ hg ci -A -m "a is dir, b is file"
  $ hg st --all
  C a/a
  C b

Long directory replaced with file:

  $ mkdir d
  $ mkdir d/d
  $ echo d > d/d/d
  $ hg commit -A -m "d is long directory"
  adding d/d/d

  $ rm -r d
  $ echo d > d

Should fail - would corrupt dirstate:

  $ hg add d
  abort: directory 'd' already in dirstate
  [255]

Removing shadow:

  $ hg rm --after d/d/d

Should succeed - shadow removed:

  $ hg add d
  $ hg ci -md

Update should work at least with clean working directory:

  $ rm -r a b d
  $ hg up -r 0
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ hg st --all
  C a
  C b/b

  $ rm -r a b
  $ hg up -r 1
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ hg st --all
  C a/a
  C b