##// END OF EJS Templates
localrepo: move repo creation logic out of localrepository.__init__ (API)...
Gregory Szorc -
r39584:7ce9dea3 default
parent child Browse files
Show More
@@ -439,7 +439,7 b' def demo(ui, repo, *args, **opts):'
439 baseui = ui
439 baseui = ui
440 else:
440 else:
441 baseui = repo.baseui
441 baseui = repo.baseui
442 repo = localrepo.localrepository(baseui, tmpdir, True)
442 repo = localrepo.instance(baseui, tmpdir, create=True)
443 ui.setconfig('keyword', fn, '', 'keyword')
443 ui.setconfig('keyword', fn, '', 'keyword')
444 svn = ui.configbool('keywordset', 'svn')
444 svn = ui.configbool('keywordset', 'svn')
445 # explicitly set keywordset for demo output
445 # explicitly set keywordset for demo output
@@ -426,7 +426,13 b' class localrepository(object):'
426 'bisect.state',
426 'bisect.state',
427 }
427 }
428
428
429 def __init__(self, baseui, path, create=False, intents=None):
429 def __init__(self, baseui, path, intents=None):
430 """Create a new local repository instance.
431
432 Most callers should use ``hg.repository()`` or ``localrepo.instance()``
433 for obtaining a new repository object.
434 """
435
430 self.requirements = set()
436 self.requirements = set()
431 self.filtername = None
437 self.filtername = None
432 # wvfs: rooted at the repository root, used to access the working copy
438 # wvfs: rooted at the repository root, used to access the working copy
@@ -475,31 +481,12 b' class localrepository(object):'
475 self.supported.add('exp-compression-%s' % name)
481 self.supported.add('exp-compression-%s' % name)
476
482
477 if not self.vfs.isdir():
483 if not self.vfs.isdir():
478 if create:
484 try:
479 self.requirements = newreporequirements(self.ui)
485 self.vfs.stat()
480
486 except OSError as inst:
481 if not self.wvfs.exists():
487 if inst.errno != errno.ENOENT:
482 self.wvfs.makedirs()
488 raise
483 self.vfs.makedir(notindexed=True)
489 raise error.RepoError(_("repository %s not found") % path)
484
485 if 'store' in self.requirements:
486 self.vfs.mkdir("store")
487
488 # create an invalid changelog
489 self.vfs.append(
490 "00changelog.i",
491 '\0\0\0\2' # represents revlogv2
492 ' dummy changelog to prevent using the old repo layout'
493 )
494 else:
495 try:
496 self.vfs.stat()
497 except OSError as inst:
498 if inst.errno != errno.ENOENT:
499 raise
500 raise error.RepoError(_("repository %s not found") % path)
501 elif create:
502 raise error.RepoError(_("repository %s already exists") % path)
503 else:
490 else:
504 try:
491 try:
505 self.requirements = scmutil.readrequires(
492 self.requirements = scmutil.readrequires(
@@ -546,8 +533,6 b' class localrepository(object):'
546 else: # standard vfs
533 else: # standard vfs
547 self.svfs.audit = self._getsvfsward(self.svfs.audit)
534 self.svfs.audit = self._getsvfsward(self.svfs.audit)
548 self._applyopenerreqs()
535 self._applyopenerreqs()
549 if create:
550 self._writerequirements()
551
536
552 self._dirstatevalidatewarned = False
537 self._dirstatevalidatewarned = False
553
538
@@ -2396,8 +2381,15 b' def undoname(fn):'
2396 return os.path.join(base, name.replace('journal', 'undo', 1))
2381 return os.path.join(base, name.replace('journal', 'undo', 1))
2397
2382
2398 def instance(ui, path, create, intents=None):
2383 def instance(ui, path, create, intents=None):
2399 return localrepository(ui, util.urllocalpath(path), create,
2384 if create:
2400 intents=intents)
2385 vfs = vfsmod.vfs(path, expandpath=True, realpath=True)
2386
2387 if vfs.exists('.hg'):
2388 raise error.RepoError(_('repository %s already exists') % path)
2389
2390 createrepository(ui, vfs)
2391
2392 return localrepository(ui, util.urllocalpath(path), intents=intents)
2401
2393
2402 def islocal(path):
2394 def islocal(path):
2403 return True
2395 return True
@@ -2447,3 +2439,34 b' def newreporequirements(ui):'
2447 requirements.add('internal-phase')
2439 requirements.add('internal-phase')
2448
2440
2449 return requirements
2441 return requirements
2442
2443 def createrepository(ui, wdirvfs):
2444 """Create a new repository in a vfs.
2445
2446 ``wdirvfs`` is a vfs instance pointing at the working directory.
2447 ``requirements`` is a set of requirements for the new repository.
2448 """
2449 requirements = newreporequirements(ui)
2450
2451 if not wdirvfs.exists():
2452 wdirvfs.makedirs()
2453
2454 hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
2455 hgvfs.makedir(notindexed=True)
2456
2457 if b'store' in requirements:
2458 hgvfs.mkdir(b'store')
2459
2460 # We create an invalid changelog outside the store so very old
2461 # Mercurial versions (which didn't know about the requirements
2462 # file) encounter an error on reading the changelog. This
2463 # effectively locks out old clients and prevents them from
2464 # mucking with a repo in an unknown format.
2465 #
2466 # The revlog header has version 2, which won't be recognized by
2467 # such old clients.
2468 hgvfs.append(b'00changelog.i',
2469 b'\0\0\0\2 dummy changelog to prevent using the old repo '
2470 b'layout')
2471
2472 scmutil.writerequires(hgvfs, requirements)
@@ -22,7 +22,7 b' def print(*args, **kwargs):'
22 u = uimod.ui.load()
22 u = uimod.ui.load()
23
23
24 print('% creating repo')
24 print('% creating repo')
25 repo = localrepo.localrepository(u, b'.', create=True)
25 repo = localrepo.instance(u, b'.', create=True)
26
26
27 f = open('test.py', 'w')
27 f = open('test.py', 'w')
28 try:
28 try:
General Comments 0
You need to be logged in to leave comments. Login now