Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSfy paths.coffee #723

Merged
merged 2 commits into from
Apr 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 0 additions & 125 deletions lib/misc/paths.coffee

This file was deleted.

147 changes: 147 additions & 0 deletions lib/misc/paths.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/** @babel */

import path from 'path'
import fs from 'fs'
import child_process from 'child_process'

export function home (...p) {
const key = process.platform === 'win32' ? 'USERPROFILE' : 'HOME'
return path.join(process.env[key], ...p)
}

export function juliaHome (...p) {
const juliaHome = (process.env.JULIA_HOME || home('.julia'))
return path.join(juliaHome, ...p)
}

export function jlpath () {
return expandHome(atom.config.get('julia-client.juliaPath'))
}

export function expandHome (p) {
return p.startsWith('~') ? p.replace('~', home()) : p
}

export function fullPath (p) {
return new Promise((resolve, reject) => {
if (fs.existsSync(p)) return resolve(p)
const current_dir = process.cwd()
const exepath = path.dirname(process.execPath)
try {
process.chdir(exepath)
const realpath = fs.realpathSync(p)
fs.existsSync(realpath) && resolve(realpath)
} catch (err) {
console.log(err)
} finally {
try {
process.chdir(current_dir)
} catch (err) {
console.error(err)
}
}
if (process.platform === 'win32') {
if (/[a-zA-Z]\:/.test(p)) return reject("Couldn't resolve path.")
}
const which = process.platform === 'win32' ? 'where' : 'which'
child_process.exec(`${which} "${p}"`, (err, stdout, stderr) => {
if (err) return reject(stderr)
const p = stdout.trim()
if (fs.existsSync(p)) return resolve(p)
return reject('Couldn\'t resolve path.')
})
})
}

export function getVersion (path = jlpath()) {
return new Promise((resolve, reject) => {
child_process.exec(`"${path}" --version`, (err, stdout, stderr) => {
if (err) return reject(stderr)
const res = stdout.match(/(\d+)\.(\d+)\.(\d+)/)
if (!res) return reject('Couldn\'t resolve version.')
const [_, major, minor, patch] = res
return resolve({ major, minor, patch })
})
})
}

export function projectDir () {
if (atom.config.get('julia-client.juliaOptions.persistWorkingDir')) {
return new Promise(resolve => {
const p = atom.config.get('julia-client.juliaOptions.workingDir')
try {
fs.stat(p, (err, stats) => {
if (err) {
return resolve(atomProjectDir())
} else {
return resolve(p)
}
})
} catch (err) {
return resolve(atomProjectDir())
}
})
} else {
return atomProjectDir()
}
}

function atomProjectDir () {
const dirs = atom.workspace.project.getDirectories()
let ws = process.env.HOME
if (!ws) {
ws = process.env.USERPROFILE
}
if (dirs.length === 0 || dirs[0].path.match('app.asar')) {
return Promise.resolve(ws)
}
return new Promise(resolve => {
// use the first open project folder (or its parent folder for files) if
// it is valid
try {
fs.stat(dirs[0].path, (err, stats) => {
if (err) return resolve(ws)
if (stats.isFile()) return resolve(path.dirname(dirs[0].path))
return resolve(dirs[0].path)
})
} catch (err) {
return resolve(ws)
}
})
}

function packageDir (...s) {
const packageRoot = path.resolve(__dirname, '..', '..')
return path.join(packageRoot, ...s)
}

export const script = (...s) => packageDir('script', ...s)

export function getPathFromTreeView (el) {
// invoked from tree-view context menu
let pathEl = el.closest('[data-path]')
if (!pathEl) {
// invoked from command with focusing on tree-view
const activeEl = el.querySelector('.tree-view .selected')
if (activeEl) pathEl = activeEl.querySelector('[data-path]')
}
if (pathEl) return pathEl.dataset.path
return null
}

export function getDirPathFromTreeView (el) {
// invoked from tree-view context menu
let dirEl = el.closest('.directory')
if (!dirEl) {
// invoked from command with focusing on tree-view
const activeEl = el.querySelector('.tree-view .selected')
if (activeEl) dirEl = activeEl.closest('.directory')
}
if (dirEl) {
const pathEl = dirEl.querySelector('[data-path]')
if (pathEl) return pathEl.dataset.path
}
return null
}

export const readCode = (path) => fs.readFileSync(path, 'utf-8')