add basepath cmdline flag

this allows a basepath to be set via commandline where ncspot will place
configuration and cache files.

fixes #65
This commit is contained in:
Henrik Friedrichsen
2019-05-16 23:53:15 +02:00
parent 4a760ac128
commit 4b4a027c3c
4 changed files with 33 additions and 1 deletions

1
Cargo.lock generated
View File

@@ -1560,6 +1560,7 @@ dependencies = [
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"fern 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "fern 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"librespot 0.1.0 (git+https://github.com/librespot-org/librespot.git?rev=14721f4)", "librespot 0.1.0 (git+https://github.com/librespot-org/librespot.git?rev=14721f4)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",

View File

@@ -22,6 +22,7 @@ directories = "1.0"
failure = "0.1.3" failure = "0.1.3"
fern = "0.5" fern = "0.5"
futures = "0.1" futures = "0.1"
lazy_static = "1.3.0"
log = "0.4.0" log = "0.4.0"
#rspotify = "0.4.0" #rspotify = "0.4.0"
serde = "1.0" serde = "1.0"

View File

@@ -1,6 +1,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::fs; use std::fs;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::RwLock;
use directories::ProjectDirs; use directories::ProjectDirs;
@@ -33,8 +34,17 @@ pub struct ConfigTheme {
pub cmdline_bg: Option<String>, pub cmdline_bg: Option<String>,
} }
lazy_static! {
pub static ref BASE_PATH: RwLock<Option<PathBuf>> = RwLock::new(None);
}
fn proj_dirs() -> ProjectDirs { fn proj_dirs() -> ProjectDirs {
ProjectDirs::from("org", "affekt", "ncspot").expect("can't determine project paths") match *BASE_PATH.read().expect("can't readlock BASE_PATH") {
Some(ref basepath) => ProjectDirs::from_path(basepath.clone()).expect("invalid basepath"),
None => {
ProjectDirs::from("org", "affekt", "ncspot").expect("can't determine project paths")
}
}
} }
pub fn config_path(file: &str) -> PathBuf { pub fn config_path(file: &str) -> PathBuf {

View File

@@ -6,6 +6,8 @@ extern crate clipboard;
extern crate directories; extern crate directories;
extern crate failure; extern crate failure;
extern crate futures; extern crate futures;
#[macro_use]
extern crate lazy_static;
extern crate librespot; extern crate librespot;
extern crate rspotify; extern crate rspotify;
extern crate tokio; extern crate tokio;
@@ -30,7 +32,9 @@ extern crate fern;
extern crate rand; extern crate rand;
use std::fs; use std::fs;
use std::path::PathBuf;
use std::process; use std::process;
use std::str::FromStr;
use std::sync::Arc; use std::sync::Arc;
use clap::{App, Arg}; use clap::{App, Arg};
@@ -120,12 +124,28 @@ fn main() {
.help("Enable debug logging to the specified file") .help("Enable debug logging to the specified file")
.takes_value(true), .takes_value(true),
) )
.arg(
Arg::with_name("basepath")
.short("b")
.long("basepath")
.value_name("PATH")
.help("custom basepath to config/cache files")
.takes_value(true),
)
.get_matches(); .get_matches();
if let Some(filename) = matches.value_of("debug") { if let Some(filename) = matches.value_of("debug") {
setup_logging(filename).expect("can't setup logging"); setup_logging(filename).expect("can't setup logging");
} }
if let Some(basepath) = matches.value_of("basepath") {
let path = PathBuf::from_str(basepath).expect("invalid path");
if !path.exists() {
fs::create_dir(&path).expect("could not create basepath directory");
}
*config::BASE_PATH.write().unwrap() = Some(path);
}
// Things here may cause the process to abort; we must do them before creating curses windows // Things here may cause the process to abort; we must do them before creating curses windows
// otherwise the error message will not be seen by a user // otherwise the error message will not be seen by a user
let cfg: ::config::Config = { let cfg: ::config::Config = {