Skip to content

Commit

Permalink
asar: Add support in fs.realpathSync
Browse files Browse the repository at this point in the history
  • Loading branch information
zcbenz committed Sep 30, 2014
1 parent d77bf04 commit 885ac53
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 4 deletions.
10 changes: 10 additions & 0 deletions atom/common/api/atom_api_asar.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ class Archive : public mate::Wrappable {
return mate::ConvertToV8(isolate, files);
}

// Returns the path of file with symbol link resolved.
v8::Handle<v8::Value> Realpath(v8::Isolate* isolate,
const base::FilePath& path) {
base::FilePath realpath;
if (!archive_ || !archive_->Realpath(path, &realpath))
return v8::False(isolate);
return mate::ConvertToV8(isolate, realpath);
}

// Copy the file out into a temporary file and returns the new path.
v8::Handle<v8::Value> CopyFileOut(v8::Isolate* isolate,
const base::FilePath& path) {
Expand All @@ -86,6 +95,7 @@ class Archive : public mate::Wrappable {
.SetMethod("getFileInfo", &Archive::GetFileInfo)
.SetMethod("stat", &Archive::Stat)
.SetMethod("readdir", &Archive::Readdir)
.SetMethod("realpath", &Archive::Realpath)
.SetMethod("copyFileOut", &Archive::CopyFileOut)
.SetMethod("destroy", &Archive::Destroy);
}
Expand Down
18 changes: 18 additions & 0 deletions atom/common/asar/archive.cc
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,24 @@ bool Archive::Readdir(const base::FilePath& path,
return true;
}

bool Archive::Realpath(const base::FilePath& path, base::FilePath* realpath) {
if (!header_)
return false;

const base::DictionaryValue* node;
if (!GetNodeFromPath(path.AsUTF8Unsafe(), header_.get(), &node))
return false;

std::string link;
if (node->GetString("link", &link)) {
*realpath = base::FilePath::FromUTF8Unsafe(link);
return true;
}

*realpath = path;
return true;
}

bool Archive::CopyFileOut(const base::FilePath& path, base::FilePath* out) {
if (external_files_.contains(path)) {
*out = external_files_.get(path)->path();
Expand Down
3 changes: 3 additions & 0 deletions atom/common/asar/archive.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class Archive {
// Fs.readdir(path).
bool Readdir(const base::FilePath& path, std::vector<base::FilePath>* files);

// Fs.realpath(path).
bool Realpath(const base::FilePath& path, base::FilePath* realpath);

// Copy the file into a temporary file, and return the new path.
bool CopyFileOut(const base::FilePath& path, base::FilePath* out);

Expand Down
21 changes: 17 additions & 4 deletions atom/common/lib/asar.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ fs.lstat = (p, callback) ->
return lstat p, callback unless isAsar

archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
return callback new Error("Invalid package #{asarPath}") unless archive

stats = getOrCreateArchive(asarPath).stat filePath
return callback createNotFoundError(asarPath, filePath) unless stats
Expand Down Expand Up @@ -109,13 +109,26 @@ fs.statSyncNoException = (p) ->
return false unless stats
asarStatsToFsStats stats

realpathSync = fs.realpathSync
fs.realpathSync = (p) ->
[isAsar, asarPath, filePath] = splitPath p
return realpathSync.apply this, arguments unless isAsar

archive = getOrCreateArchive asarPath
throw new Error("Invalid package #{asarPath}") unless archive

real = archive.realpath filePath
throw createNotFoundError(asarPath, filePath) unless real

path.join realpathSync(asarPath), real

exists = fs.exists
fs.exists = (p, callback) ->
[isAsar, asarPath, filePath] = splitPath p
return exists p, callback unless isAsar

archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
return callback new Error("Invalid package #{asarPath}") unless archive

process.nextTick -> callback archive.stat(filePath) isnt false

Expand All @@ -140,7 +153,7 @@ fs.readFile = (p, options, callback) ->
options = undefined

archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
return callback new Error("Invalid package #{asarPath}") unless archive

info = archive.getFileInfo filePath
return callback createNotFoundError(asarPath, filePath) unless info
Expand Down Expand Up @@ -200,7 +213,7 @@ fs.readdir = (p, callback) ->
return readdir.apply this, arguments unless isAsar

archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
return callback new Error("Invalid package #{asarPath}") unless archive

files = archive.readdir filePath
return callback createNotFoundError(asarPath, filePath) unless files
Expand Down

0 comments on commit 885ac53

Please sign in to comment.