[PATCH v2] update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi
ikostia at fb.com
Fri Jul 1 12:06:46 UTC 2016
Sorry for two emails, I wasnât sure whether I had a problem with patchbomp configuration. Aslo, I did not notice the âagainsâ-related comment by timeless at first, so if youâre going to accept this, please fix in-flight agains->against.
On 6/30/16, 11:51 PM, "Mercurial-devel on behalf of Kostia Balytskyi" <mercurial-devel-bounces at mercurial-scm.org on behalf of ikostia at fb.com> wrote:
># HG changeset patch
># User Kostia Balytskyi <ikostia at fb.com>
># Date 1467323089 25200
># Thu Jun 30 14:44:49 2016 -0700
># Node ID 51c1f0ae6dc4855e213b7ce49acc8010d5505a3f
># Parent 33a6b750b5b9e0cc193ae0103420dc80af074352
>update: teach hg to override untracked dir with a tracked file on update
>
>This is a fix to an old problem when Mercurial got confused by an
>untracked folder with the same name as one of the files in a commit
>hg was trying to update to. It is pretty safe to remove this folder if
>it is empty. Backing up an empty folder seems to go agains Mercurial's
>"don't track dirs" philosophy.
>
>Let me know if I am wrong about the above assumption please.
>
>diff --git a/mercurial/merge.py b/mercurial/merge.py
>--- a/mercurial/merge.py
>+++ b/mercurial/merge.py
>@@ -1076,15 +1076,14 @@ def batchget(repo, mctx, actions):
> absf = repo.wjoin(f)
> orig = scmutil.origpath(ui, repo, absf)
> try:
>- # TODO Mercurial has always aborted if an untracked
>- # directory is replaced by a tracked file, or generally
>- # with file/directory merges. This needs to be sorted out.
> if repo.wvfs.isfileorlink(f):
> util.rename(absf, orig)
> except OSError as e:
> if e.errno != errno.ENOENT:
> raise
>
>+ if repo.wvfs.isdir(f):
>+ repo.wvfs.removedirs(f)
> wwrite(f, fctx(f).data(), flags, backgroundclose=True)
> if i == 100:
> yield i, f
>diff --git a/tests/test-merge1.t b/tests/test-merge1.t
>--- a/tests/test-merge1.t
>+++ b/tests/test-merge1.t
>@@ -26,10 +26,7 @@
>
> Test interrupted updates by exploiting our non-handling of directory collisions
>
>- $ mkdir b
>- $ hg up
>- abort: *: '$TESTTMP/t/b' (glob)
>- [255]
>+ $ echo somethingsomething > .hg/updatestate
> $ hg ci
> abort: last update was interrupted
> (use 'hg update' to get a consistent checkout)
>@@ -41,7 +38,7 @@ Test interrupted updates by exploiting o
> commit: (interrupted update)
> update: 1 new changesets (update)
> phases: 2 draft
>- $ rmdir b
>+ $ rm .hg/updatestate
> $ hg up
> 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> $ hg sum
>diff --git a/tests/test-update-renames.t b/tests/test-update-names.t
>rename from tests/test-update-renames.t
>rename to tests/test-update-names.t
>--- a/tests/test-update-renames.t
>+++ b/tests/test-update-names.t
>@@ -1,8 +1,9 @@
>-Test update logic when there are renames
>+Test update logic when there are renames or weird same-name cases between dirs
>+and files
>
> Update with local changes across a file rename
>
>- $ hg init
>+ $ hg init r1 && cd r1
>
> $ echo a > a
> $ hg add a
>@@ -24,3 +25,31 @@ Update with local changes across a file
> 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
> use 'hg resolve' to retry unresolved file merges
> [1]
>+
>+Test update when local untracked directory exists with the same name as a
>+tracked file in a commit we are updating to
>+ $ hg init r2 && cd r2
>+ $ echo root > root && hg ci -Am root # rev 0
>+ adding root
>+ $ echo text > name && hg ci -Am "name is a file" # rev 1
>+ adding name
>+ $ hg up 0
>+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>+ $ mkdir name
>+ $ hg up 1
>+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>+
>+Test update when local untracked directory exists with some files in it and has
>+the same name a tracked file in a commit we are updating to. In future this
>+should be updated to give an friendlier error message, but now we should just
>+make sure that this does not erase untracked data
>+ $ hg up 0
>+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>+ $ mkdir name
>+ $ echo text > name/file
>+ $ hg st
>+ ? name/file
>+ $ hg up 1
>+ abort: Directory not empty: '$TESTTMP/r1/r2/name'
>+ [255]
>+ $ cd ..
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at mercurial-scm.org
>https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=Pp-gQYFgs4tKlSFPF5kfCw&m=cW-pM3joq-4g86Su1YmqxcYHAszk9Nh9fZfsg-FK7ws&s=Sv90sHaM4l2hPlDp7HF88vWlBC04XHRb0bb7msj21B4&e=
More information about the Mercurial-devel
mailing list