# HG changeset patch # User Matt Mackall # Date 2008-08-14 01:18:44 # Node ID 0642d9d7ec80a307e0c0bb7fa9c696155fc146da # Parent 93f761c25dea995917268cb9acca55da3ce36230 clone: get a list of files to clone from store diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -164,13 +164,6 @@ def clone(ui, source, dest=None, pull=Fa copy = False if copy: - def force_copy(src, dst): - if not os.path.exists(src): - # Tolerate empty source repository and optional files - return - util.copyfiles(src, dst) - - src_store = os.path.realpath(src_repo.spath) if not os.path.exists(dest): os.mkdir(dest) try: @@ -182,28 +175,18 @@ def clone(ui, source, dest=None, pull=Fa raise util.Abort(_("destination '%s' already exists") % dest) raise - if src_repo.spath != src_repo.path: - # XXX racy - dummy_changelog = os.path.join(dest_path, "00changelog.i") - # copy the dummy changelog - force_copy(src_repo.join("00changelog.i"), dummy_changelog) - dest_store = os.path.join(dest_path, "store") - os.mkdir(dest_store) - else: - dest_store = dest_path - # copy the requires file - force_copy(src_repo.join("requires"), - os.path.join(dest_path, "requires")) - # we lock here to avoid premature writing to the target - dest_lock = lock.lock(os.path.join(dest_store, "lock")) - files = ("data", - "00manifest.d", "00manifest.i", - "00changelog.d", "00changelog.i") - for f in files: - src = os.path.join(src_store, f) - dst = os.path.join(dest_store, f) - force_copy(src, dst) + for f in src_repo.store.copylist(): + src = os.path.join(src_repo.path, f) + if os.path.exists(src): + dst = os.path.join(dest_path, f) + dstbase = os.path.dirname(dst) + if not os.path.exists(dstbase): + os.mkdir(dstbase) + if dst.endswith('data'): + # lock to avoid premature writing to the target + dest_lock = lock.lock(os.path.join(dstbase, "lock")) + util.copyfiles(src, dst) # we need to re-init the repo after manually copying the data # into it diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -46,6 +46,8 @@ def _calcmode(path): mode = None return mode +_data = 'data 00manifest.d 00manifest.i 00changelog.d 00changelog.i' + class basicstore: '''base class for local repository stores''' def __init__(self, path, opener): @@ -90,6 +92,9 @@ class basicstore: for x in meta: yield x + def copylist(self): + return ['requires'] + _data.split() + class encodedstore(basicstore): def __init__(self, path, opener): self.path = os.path.join(path, 'store') @@ -109,6 +114,10 @@ class encodedstore(basicstore): def join(self, f): return os.path.join(self.path, encodefilename(f)) + def copylist(self): + return (['requires', '00changelog.i'] + + ['store/' + f for f in _data.split()]) + def store(requirements, path, opener): if 'store' in requirements: return encodedstore(path, opener)