Patchwork D10850: clone: use "official" API to create local clone destination

login
register
mail settings
Submitter phabricator
Date June 9, 2021, 2:39 p.m.
Message ID <differential-rev-PHID-DREV-kowvvv75fvaqidwmsdbw-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49173/
State Superseded
Headers show

Comments

phabricator - June 9, 2021, 2:39 p.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This make sure we have a properly created, fully functional repository early.
  This will be useful to simply the hardlink/copy phases of the local clone to
  make it share more of its logic with the similar "stream" cloning.
  
  This has a minor impact of the test and the resulting repository has is better initialized (eg: the `wcache` directory is pre-created.)

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D10850

AFFECTED FILES
  mercurial/hg.py
  tests/test-empty.t
  tests/test-extension.t

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-extension.t b/tests/test-extension.t
--- a/tests/test-extension.t
+++ b/tests/test-extension.t
@@ -111,6 +111,7 @@ 
   reposetup called for a
   ui == repo.ui
   uipopulate called (1 times)
+  uipopulate called (1 times)
   reposetup called for b
   ui == repo.ui
   updating to branch default
diff --git a/tests/test-empty.t b/tests/test-empty.t
--- a/tests/test-empty.t
+++ b/tests/test-empty.t
@@ -48,6 +48,7 @@ 
   hgrc
   requires
   store
+  wcache
 
 Should be empty:
 
diff --git a/mercurial/hg.py b/mercurial/hg.py
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -857,20 +857,17 @@ 
 
         if copy:
             srcrepo.hook(b'preoutgoing', throw=True, source=b'clone')
-            hgdir = os.path.realpath(os.path.join(dest, b".hg"))
-            if not os.path.exists(dest):
-                util.makedirs(dest)
-            try:
-                destpath = hgdir
-                util.makedir(destpath, notindexed=True)
-            except OSError as inst:
-                if inst.errno == errno.EEXIST:
-                    cleandir = None
-                    raise error.Abort(
-                        _(b"destination '%s' already exists") % dest
-                    )
-                raise
 
+            destrootpath = urlutil.urllocalpath(dest)
+            dest_reqs = localrepo.clone_requirements(ui, createopts, srcrepo)
+            localrepo.createrepository(
+                ui,
+                destrootpath,
+                requirements=dest_reqs,
+            )
+            destrepo = localrepo.makelocalrepository(ui, destrootpath)
+
+            destpath = destrepo.vfs.base
             destlock = copystore(ui, srcrepo, destpath)
             # copy bookmarks over
             srcbookmarks = srcrepo.vfs.join(b'bookmarks')