Mercurial > hg
view hgext/amend.py @ 48950:11c0411bf4e2
dirstate-tree: optimize HashMap lookups with raw_entry_mut
This switches to using `HashMap` from the hashbrown crate,
in order to use its `raw_entry_mut` method.
The standard library’s `HashMap` is also based on this same crate,
but `raw_entry_mut` is not yet stable there:
https://github.com/rust-lang/rust/issues/56167
Using version 0.9 because 0.10 is yanked and 0.11 requires Rust 1.49
This replaces in `DirstateMap::get_or_insert_node` a call to
`HashMap<K, V>::entry` with `K = WithBasename<Cow<'on_disk, HgPath>>`.
`entry` takes and consumes an "owned" `key: K` parameter, in case a new entry
ends up inserted. This key is converted by `to_cow` from a value that borrows
the `'path` lifetime.
When this function is called by `Dirstate::new_v1`, `'path` is in fact
the same as `'on_disk` so `to_cow` can return an owned key that contains
`Cow::Borrowed`.
For other callers, `to_cow` needs to create a `Cow::Owned` and thus make
a costly heap memory allocation. This is wasteful if this key was already
present in the map. Even when inserting a new node this is typically the case
for its ancestor nodes (assuming most directories have numerous descendants).
Differential Revision: https://phab.mercurial-scm.org/D12317
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 08 Feb 2022 15:51:52 +0100 |
parents | 6000f5b25c9b |
children | e78a41686464 |
line wrap: on
line source
# amend.py - provide the amend command # # Copyright 2017 Facebook, Inc. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. """provide the amend command (EXPERIMENTAL) This extension provides an ``amend`` command that is similar to ``commit --amend`` but does not prompt an editor. """ from mercurial.i18n import _ from mercurial import ( cmdutil, commands, registrar, ) # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should # be specifying the version(s) of Mercurial they are tested with, or # leave the attribute unspecified. testedwith = b'ships-with-hg-core' cmdtable = {} command = registrar.command(cmdtable) @command( b'amend', [ ( b'A', b'addremove', None, _(b'mark new/missing files as added/removed before committing'), ), (b'e', b'edit', None, _(b'invoke editor on commit messages')), (b'i', b'interactive', None, _(b'use interactive mode')), ( b'', b'close-branch', None, _(b'mark a branch as closed, hiding it from the branch list'), ), (b's', b'secret', None, _(b'use the secret phase for committing')), (b'n', b'note', b'', _(b'store a note on the amend')), ] + cmdutil.walkopts + cmdutil.commitopts + cmdutil.commitopts2 + cmdutil.commitopts3, _(b'[OPTION]... [FILE]...'), helpcategory=command.CATEGORY_COMMITTING, inferrepo=True, ) def amend(ui, repo, *pats, **opts): """amend the working copy parent with all or specified outstanding changes Similar to :hg:`commit --amend`, but reuse the commit message without invoking editor, unless ``--edit`` was set. See :hg:`help commit` for more details. """ cmdutil.check_note_size(opts) with repo.wlock(), repo.lock(): if not opts.get('logfile'): opts['message'] = opts.get('message') or repo[b'.'].description() opts['amend'] = True return commands._docommit(ui, repo, *pats, **opts)