Browse Source

fix: support ASAR in fs.copyFile (#14953)

trop[bot] 6 years ago
parent
commit
73935bc5dd
2 changed files with 45 additions and 0 deletions
  1. 6 0
      lib/common/asar.js
  2. 39 0
      spec/asar-spec.js

+ 6 - 0
lib/common/asar.js

@@ -750,6 +750,12 @@
       }
     }
 
+    // Strictly implementing the flags of fs.copyFile is hard, just do a simple
+    // implementation for now. Doing 2 copies won't spend much time more as OS
+    // has filesystem caching.
+    overrideAPI(fs, 'copyFile')
+    overrideAPISync(fs, 'copyFileSync')
+
     overrideAPI(fs, 'open')
     overrideAPI(childProcess, 'execFile')
     overrideAPISync(process, 'dlopen', 1)

+ 39 - 0
spec/asar-spec.js

@@ -2,6 +2,7 @@ const assert = require('assert')
 const ChildProcess = require('child_process')
 const fs = require('fs')
 const path = require('path')
+const temp = require('temp').track()
 const util = require('util')
 const {closeWindow} = require('./window-helpers')
 
@@ -136,6 +137,44 @@ describe('asar package', function () {
       })
     })
 
+    describe('fs.copyFile', function () {
+      it('copies a normal file', function (done) {
+        const p = path.join(fixtures, 'asar', 'a.asar', 'file1')
+        const dest = temp.path()
+        fs.copyFile(p, dest, function (err) {
+          assert.strictEqual(err, null)
+          assert(fs.readFileSync(p).equals(fs.readFileSync(dest)))
+          done()
+        })
+      })
+
+      it('copies a unpacked file', function (done) {
+        const p = path.join(fixtures, 'asar', 'unpack.asar', 'a.txt')
+        const dest = temp.path()
+        fs.copyFile(p, dest, function (err) {
+          assert.strictEqual(err, null)
+          assert(fs.readFileSync(p).equals(fs.readFileSync(dest)))
+          done()
+        })
+      })
+    })
+
+    describe('fs.copyFileSync', function () {
+      it('copies a normal file', function () {
+        const p = path.join(fixtures, 'asar', 'a.asar', 'file1')
+        const dest = temp.path()
+        fs.copyFileSync(p, dest)
+        assert(fs.readFileSync(p).equals(fs.readFileSync(dest)))
+      })
+
+      it('copies a unpacked file', function () {
+        const p = path.join(fixtures, 'asar', 'unpack.asar', 'a.txt')
+        const dest = temp.path()
+        fs.copyFileSync(p, dest)
+        assert(fs.readFileSync(p).equals(fs.readFileSync(dest)))
+      })
+    })
+
     describe('fs.lstatSync', function () {
       it('handles path with trailing slash correctly', function () {
         var p = path.join(fixtures, 'asar', 'a.asar', 'link2', 'link2', 'file1')