424 # this changeset was introduced. Someone should fix |
424 # this changeset was introduced. Someone should fix |
425 # the remainig bit and drop this line |
425 # the remainig bit and drop this line |
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 |
433 self.wvfs = vfsmod.vfs(path, expandpath=True, realpath=True) |
439 self.wvfs = vfsmod.vfs(path, expandpath=True, realpath=True) |
434 # vfs: rooted at .hg, used to access repo files outside of .hg/store |
440 # vfs: rooted at .hg, used to access repo files outside of .hg/store |
473 engine = util.compengines[name] |
479 engine = util.compengines[name] |
474 if engine.revlogheader(): |
480 if engine.revlogheader(): |
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( |
506 self.vfs, self.supported) |
493 self.vfs, self.supported) |
507 except IOError as inst: |
494 except IOError as inst: |
544 if util.safehasattr(self.svfs, 'vfs'): # this is filtervfs |
531 if util.safehasattr(self.svfs, 'vfs'): # this is filtervfs |
545 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit) |
532 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit) |
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 |
554 self._branchcaches = {} |
539 self._branchcaches = {} |
555 self._revbranchcache = None |
540 self._revbranchcache = None |
2394 base, name = os.path.split(fn) |
2379 base, name = os.path.split(fn) |
2395 assert name.startswith('journal') |
2380 assert name.startswith('journal') |
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 |
2404 |
2396 |
2405 def newreporequirements(ui): |
2397 def newreporequirements(ui): |
2445 # experimental config: format.internal-phase |
2437 # experimental config: format.internal-phase |
2446 if ui.configbool('format', 'internal-phase'): |
2438 if ui.configbool('format', 'internal-phase'): |
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) |