comparison mercurial/cmdutil.py @ 34046:6e6452bc441d

editor: use an unambiguous path suffix for editor files Changes the API of `ui.edit()` to take an optional `action` argument, which is used when constructing the suffix of the temp file. Previously, it was possible to set the suffix by specifying a `suffix` to the optional `extra` dict that was passed to `ui.edit()`, but the goal is to drop support for `extra.suffix` and make `action` a required argument. To this end, `ui.edit()` now yields a `develwarn()` if `action` is not set or if `extra.suffix` is set. I updated all calls to `ui.edit()` I could find in `hg-crew` to specify the appropriate `action`. This means that when creating a commit, instead of the path to the editor file being something like: `/tmp/hg-editor-XXXXXX.txt` it is now something like: `/tmp/hg-editor-XXXXXX.commit.hg.txt` Some editors (such as Atom) make it possible to statically define a [TextMate] grammar for files with a particular suffix. For example, because Git reliably uses `.git/COMMIT_EDITMSG` and `.git/MERGE_MSG` as the paths for commit-type messages, it is trivial to define a grammar that is applied when files of either name are opened in Atom: https://github.com/atom/language-git/blob/v0.19.1/grammars/git%20commit%20message.cson#L4-L5 Because Hg historically used a generic `.txt` suffix, it was much harder to disambiguate whether a file was an arbitrary text file as opposed to one created for the specific purpose of authoring an Hg commit message. This also makes it easier to add special support for `histedit`, as it has its own suffix that is distinct from a commit: `/tmp/hg-histedit-XXXXXX.histedit.hg.txt` Test Plan: Added an integration test: `test-editor-filename.t`. Manually tested: ran `hg ci --amend` for this change and saw that it used `/tmp/hg-editor-ZZjcz0.commit.hg.txt` as the path instead of `/tmp/hg-editor-ZZjcz0.txt` as the path. Verified `make tests` passes. Differential Revision: https://phab.mercurial-scm.org/D464
author Michael Bolin <mbolin@fb.com>
date Wed, 30 Aug 2017 20:25:56 +0000
parents d5b2beca16c0
children ae92e5c0441c
comparison
equal deleted inserted replaced
34045:bfb38c5cebf4 34046:6e6452bc441d
339 if opts.get('review', False): 339 if opts.get('review', False):
340 patchtext = (crecordmod.diffhelptext 340 patchtext = (crecordmod.diffhelptext
341 + crecordmod.patchhelptext 341 + crecordmod.patchhelptext
342 + fp.read()) 342 + fp.read())
343 reviewedpatch = ui.edit(patchtext, "", 343 reviewedpatch = ui.edit(patchtext, "",
344 extra={"suffix": ".diff"}, 344 action="diff",
345 repopath=repo.path) 345 repopath=repo.path)
346 fp.truncate(0) 346 fp.truncate(0)
347 fp.write(reviewedpatch) 347 fp.write(reviewedpatch)
348 fp.seek(0) 348 fp.seek(0)
349 349
3215 repo.dirstate.write(tr) 3215 repo.dirstate.write(tr)
3216 pending = tr and tr.writepending() and repo.root 3216 pending = tr and tr.writepending() and repo.root
3217 3217
3218 editortext = repo.ui.edit(committext, ctx.user(), ctx.extra(), 3218 editortext = repo.ui.edit(committext, ctx.user(), ctx.extra(),
3219 editform=editform, pending=pending, 3219 editform=editform, pending=pending,
3220 repopath=repo.path) 3220 repopath=repo.path, action='commit')
3221 text = editortext 3221 text = editortext
3222 3222
3223 # strip away anything below this special string (used for editors that want 3223 # strip away anything below this special string (used for editors that want
3224 # to display the diff) 3224 # to display the diff)
3225 stripbelow = re.search(_linebelow, text, flags=re.MULTILINE) 3225 stripbelow = re.search(_linebelow, text, flags=re.MULTILINE)