diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
index 69000dc0dcedb849c22e3b82414781724b600f73_bWVyY3VyaWFsL2ZpbGVtZXJnZS5weQ==..f90337706ce7954496d50e8d3ac5795ef20c5593_bWVyY3VyaWFsL2ZpbGVtZXJnZS5weQ== 100644
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -742,5 +742,10 @@
         return False, 1, None
     localpath = _workingpath(repo, fcd)
     args = _toolstr(repo.ui, tool, b"args")
-    localoutputpath = None
+
+    files = [
+        (b"base", fca.path(), fca.decodeddata()),
+        (b"other", fco.path(), fco.decodeddata()),
+    ]
+    outpath = b""
     if b"$output" in args:
@@ -746,5 +751,7 @@
     if b"$output" in args:
+        # read input from backup, write to original
+        outpath = localpath
         localoutputpath = backup.path()
         # Remove the .orig to make syntax-highlighting more likely.
         if localoutputpath.endswith(b'.orig'):
             localoutputpath, ext = os.path.splitext(localoutputpath)
@@ -747,5 +754,7 @@
         localoutputpath = backup.path()
         # Remove the .orig to make syntax-highlighting more likely.
         if localoutputpath.endswith(b'.orig'):
             localoutputpath, ext = os.path.splitext(localoutputpath)
+        localdata = util.readfile(localpath)
+        files.append((b"local", localoutputpath, localdata))
 
@@ -751,11 +760,8 @@
 
-    with _maketempfiles(
-        fco,
-        fca,
-        localoutputpath,
-    ) as temppaths:
-        basepath, otherpath, localoutputpath = temppaths
-        outpath = b""
+    with _maketempfiles(files) as temppaths:
+        basepath, otherpath = temppaths[:2]
+        if len(temppaths) == 3:
+            localpath = temppaths[2]
 
         def format_label(input):
             if input.label_detail:
@@ -777,10 +783,6 @@
         }
         ui = repo.ui
 
-        if b"$output" in args:
-            # read input from backup, write to original
-            outpath = localpath
-            localpath = localoutputpath
         replace = {
             b'local': localpath,
             b'base': basepath,
@@ -915,10 +917,9 @@
 
 
 @contextlib.contextmanager
-def _maketempfiles(fco, fca, localpath):
-    """Writes out `fco` and `fca` as temporary files, and (if localpath is not
-    None) copies `localpath` to another temporary file, so an external merge
-    tool may use them.
+def _maketempfiles(files):
+    """Creates a temporary file for each (prefix, path, data) tuple in `files`,
+    so an external merge tool may use them.
     """
     tmproot = pycompat.mkdtemp(prefix=b'hgmerge-')
 
@@ -931,14 +932,7 @@
         util.writefile(name, data)
         return name
 
-    def tempfromcontext(prefix, ctx):
-        return maketempfrompath(prefix, ctx.path(), ctx.decodeddata())
-
-    b = tempfromcontext(b"base", fca)
-    c = tempfromcontext(b"other", fco)
-    d = localpath
-    if localpath is not None:
-        data = util.readfile(localpath)
-        d = maketempfrompath(b"local", localpath, data)
-
+    temp_files = []
+    for prefix, path, data in files:
+        temp_files.append(maketempfrompath(prefix, path, data))
     try:
@@ -944,5 +938,5 @@
     try:
-        yield b, c, d
+        yield temp_files
     finally:
         shutil.rmtree(tmproot)