Browse Source

🏗 gitmoji module

master
n0m1s 6 years ago
parent
commit
0e2dacf71d
Signed by: nomis GPG Key ID: BC0454CAD76FE803
2 changed files with 96 additions and 97 deletions
  1. +94
    -0
      src/gitmoji.rs
  2. +2
    -97
      src/main.rs

+ 94
- 0
src/gitmoji.rs View File

@ -0,0 +1,94 @@
extern crate git2;
extern crate curl;
extern crate derive_more;
use std::path::PathBuf;
use std::io::Write;
use std::fs::File;
use self::derive_more::{Display, From};
use self::git2::Repository;
use self::git2::build::RepoBuilder;
use self::curl::easy::Easy;
fn config_path() -> PathBuf {
let mut config_dir = dirs::config_dir().expect("cannot open config dir");
config_dir.push("gitmoji-rust");
config_dir
}
#[derive(Debug, From, Display)]
pub enum RetrievingError {
Git(git2::Error),
Curl(curl::Error),
IO(std::io::Error),
}
fn need_update() -> Result<bool, RetrievingError> {
let gitmoji_url = "https://github.com/carloscuesta/gitmoji/";
//path to the "gitmoji" git repo
let mut repo_path = config_path();
repo_path.push("gitmoji");
let repo_path = repo_path;
//if repo has to be cloned, we need to force the JSON download
let mut force_json_dl = false;
let repo = if repo_path.is_dir() {
Repository::open_bare(gitmoji_url)
} else {
force_json_dl = true;
RepoBuilder::new()
.bare(true)
.clone(gitmoji_url, &repo_path)
}?;
//OID of the local master branch
let mut master = repo.find_reference("refs/heads/master")?;
let local_oid = master.peel_to_commit()?.id();
//fetch updates
repo.find_remote("origin")?.fetch(&["master"], None, None)?;
//OID of the remote master branch
let remote_oid = repo.find_reference("refs/remotes/origin/master")?
.peel_to_commit()?
.id();
if local_oid == remote_oid {
return Ok(force_json_dl);
}
//fast-forward the local branch to the remote
master.set_target(remote_oid, "")?;
Ok(true)
}
pub fn update() -> Result<(), RetrievingError> {
if !need_update()? {
return Ok(());
}
let mut json_path = config_path();
json_path.push("gitmoji.json");
let json_path = json_path;
let mut file = File::create(&json_path)?;
let mut curl = Easy::new();
curl.url("https://raw.githubusercontent.com/carloscuesta/gitmoji/master/src/data/gitmojis.json")?;
let mut transfer = curl.transfer();
transfer.write_function(|data| {
file.write_all(data).unwrap();
Ok(data.len())
})?;
transfer.perform()?;
Ok(())
}

+ 2
- 97
src/main.rs View File

@ -1,100 +1,5 @@
extern crate dirs;
extern crate git2;
extern crate curl;
extern crate derive_more;
use std::path::PathBuf;
use std::io::Write;
use std::fs::File;
use derive_more::{Display, From};
use git2::Repository;
use git2::build::RepoBuilder;
use curl::easy::Easy;
#[derive(Debug, From, Display)]
enum RetrievingError {
Git(git2::Error),
Curl(curl::Error),
IO(std::io::Error),
}
fn config_path() -> PathBuf {
let mut config_dir = dirs::config_dir().expect("cannot open config dir");
config_dir.push("gitmoji-rust");
config_dir
}
fn emojis_need_update() -> Result<bool, RetrievingError> {
let gitmoji_url = "https://github.com/carloscuesta/gitmoji/";
//path to the "gitmoji" git repo
let mut repo_path = config_path();
repo_path.push("gitmoji");
let repo_path = repo_path;
//if repo has to be cloned, we need to force the JSON download
let mut force_json_dl = false;
let repo = if repo_path.is_dir() {
Repository::open_bare(gitmoji_url)
} else {
force_json_dl = true;
RepoBuilder::new()
.bare(true)
.clone(gitmoji_url, &repo_path)
}?;
//OID of the local master branch
let mut master = repo.find_reference("refs/heads/master")?;
let local_oid = master.peel_to_commit()?.id();
//fetch updates
repo.find_remote("origin")?.fetch(&["master"], None, None)?;
//OID of the remote master branch
let remote_oid = repo.find_reference("refs/remotes/origin/master")?
.peel_to_commit()?
.id();
if local_oid == remote_oid {
return Ok(force_json_dl);
}
//fast-forward the local branch to the remote
master.set_target(remote_oid, "")?;
Ok(true)
}
fn update_emojis() -> Result<(), RetrievingError> {
if !emojis_need_update()? {
return Ok(());
}
let mut json_path = config_path();
json_path.push("gitmoji.json");
let json_path = json_path;
let mut file = File::create(&json_path)?;
let mut curl = Easy::new();
curl.url("https://raw.githubusercontent.com/carloscuesta/gitmoji/master/src/data/gitmojis.json")?;
let mut transfer = curl.transfer();
transfer.write_function(|data| {
file.write_all(data).unwrap();
Ok(data.len())
})?;
transfer.perform()?;
Ok(())
}
mod gitmoji;
fn main() { fn main() {
update_emojis().unwrap();
gitmoji::update().unwrap();
} }

Loading…
Cancel
Save