Skip to content

Commit 3ba0020

Browse files
authored
Merge branch 'master' into ocaml_support
2 parents 7909622 + a133771 commit 3ba0020

File tree

8 files changed

+179
-28
lines changed

8 files changed

+179
-28
lines changed

Cargo.lock

Lines changed: 105 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ exclude = ["assets/*.png"]
1212
colored= "1.8.0"
1313
git2 = {version = "0.7.5", default-features = false}
1414
tokei = "10.0"
15-
license = "0.8.1"
15+
askalono = "0.3.0"
1616
bytecount = "0.5.1"
1717
clap = "2.33.0"
1818
strum = "0.16.0"
1919
strum_macros = "0.16.0"
2020
image = "0.22.3"
2121

22+
[build-dependencies]
23+
askalono = "0.3.0"
24+
2225
[target.'cfg(windows)'.dependencies]
2326
ansi_term = "0.12"
2427

resources/licenses/cache.bin.gz

1.46 MB
Binary file not shown.

src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ pub enum Error {
1616
ReferenceInfoError,
1717
/// Image probably doesn't exist or has wrong format
1818
ImageLoadError,
19+
/// Could not initialize the license detector
20+
LicenseDetectorError,
1921
}
2022

2123
impl std::fmt::Debug for Error {
@@ -29,6 +31,7 @@ impl std::fmt::Debug for Error {
2931
Error::BareGitRepo => "Unable to run onefetch on bare git repos",
3032
Error::ReferenceInfoError => "Error while retrieving reference information",
3133
Error::ImageLoadError => "Could not load the specified image",
34+
Error::LicenseDetectorError => "Could not initialize the license detector",
3235
};
3336
write!(f, "{}", content)
3437
}

src/info.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::process::Command;
66
use colored::{Color, ColoredString, Colorize};
77
use git2::Repository;
88
use image::DynamicImage;
9-
use license;
9+
use license::Detector;
1010

1111
use crate::image_backends;
1212
use crate::language::Language;
@@ -581,6 +581,8 @@ impl Info {
581581
}
582582

583583
fn get_project_license(dir: &str) -> Result<String> {
584+
let detector = Detector::new()?;
585+
584586
let output = fs::read_dir(dir)
585587
.map_err(|_| Error::ReadDirectory)?
586588
.filter_map(std::result::Result::ok)
@@ -596,9 +598,9 @@ impl Info {
596598
}, // TODO: multiple prefixes, like COPYING?
597599
)
598600
.filter_map(|entry| {
599-
license::from_text_ext(&fs::read_to_string(entry).unwrap_or_else(|_| "".into()))
601+
let contents = fs::read_to_string(entry).unwrap_or_default();
602+
detector.analyze(&contents)
600603
})
601-
.map(|license| license.name().to_string())
602604
.collect::<Vec<_>>()
603605
.join(", ");
604606

src/language.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ pub enum Language {
1111
C,
1212
Clojure,
1313
CoffeeScript,
14+
#[strum(serialize = "c++")]
1415
Cpp,
16+
#[strum(serialize = "c#")]
1517
Csharp,
1618
CSS,
1719
D,
@@ -20,6 +22,7 @@ pub enum Language {
2022
Elm,
2123
Erlang,
2224
Forth,
25+
#[strum(serialize = "fortran")]
2326
FortranModern,
2427
FSharp,
2528
Go,
@@ -34,8 +37,9 @@ pub enum Language {
3437
Lua,
3538
Markdown,
3639
Nim,
37-
OCaml,
40+
#[strum(serialize = "objective-c")]
3841
ObjectiveC,
42+
OCaml,
3943
Perl,
4044
Php,
4145
Prolog,
@@ -86,9 +90,9 @@ impl std::fmt::Display for Language {
8690
Language::Lisp => write!(f, "Lisp"),
8791
Language::Lua => write!(f, "Lua"),
8892
Language::Markdown => write!(f, "Markdown"),
89-
Language::Nim => write!(f, "Nim"),
90-
Language::OCaml => write!(f, "OCaml"),
93+
Language::Nim => write!(f, "Nim"),
9194
Language::ObjectiveC => write!(f, "Objective-C"),
95+
Language::OCaml => write!(f, "OCaml"),
9296
Language::PureScript => write!(f, "PureScript"),
9397
Language::Python => write!(f, "Python"),
9498
Language::R => write!(f, "R"),
@@ -142,9 +146,9 @@ impl From<tokei::LanguageType> for Language {
142146
tokei::LanguageType::Lisp => Language::Lisp,
143147
tokei::LanguageType::Lua => Language::Lua,
144148
tokei::LanguageType::Markdown => Language::Markdown,
145-
tokei::LanguageType::Nim => Language::Nim,
146-
tokei::LanguageType::OCaml => Language::OCaml,
149+
tokei::LanguageType::Nim => Language::Nim,
147150
tokei::LanguageType::ObjectiveC => Language::ObjectiveC,
151+
tokei::LanguageType::OCaml => Language::OCaml,
148152
tokei::LanguageType::Prolog => Language::Prolog,
149153
tokei::LanguageType::Perl => Language::Perl,
150154
tokei::LanguageType::Php => Language::Php,
@@ -197,9 +201,9 @@ impl Language {
197201
Language::Lisp => include_str!("../resources/lisp.ascii"),
198202
Language::Lua => include_str!("../resources/lua.ascii"),
199203
Language::Markdown => include_str!("../resources/markdown.ascii"),
200-
Language::Nim => include_str!("../resources/nim.ascii"),
201-
Language::OCaml => include_str!("../resources/ocaml.ascii"),
204+
Language::Nim => include_str!("../resources/nim.ascii"),
202205
Language::ObjectiveC => include_str!("../resources/objectivec.ascii"),
206+
Language::OCaml => include_str!("../resources/ocaml.ascii"),
203207
Language::Perl => include_str!("../resources/perl.ascii"),
204208
Language::Php => include_str!("../resources/php.ascii"),
205209
Language::Prolog => include_str!("../resources/prolog.ascii"),
@@ -263,9 +267,9 @@ impl Language {
263267
Language::Lisp => vec![Color::Yellow],
264268
Language::Lua => vec![Color::Blue],
265269
Language::Markdown => vec![Color::BrightWhite, Color::BrightRed],
266-
Language::Nim => vec![Color::Yellow, Color::BrightWhite],
267-
Language::OCaml => vec![Color::Yellow],
270+
Language::Nim => vec![Color::Yellow, Color::BrightWhite],
268271
Language::ObjectiveC => vec![Color::BrightBlue, Color::Blue],
272+
Language::OCaml => vec![Color::Yellow],
269273
Language::Perl => vec![Color::BrightBlue],
270274
Language::Php => vec![Color::BrightWhite],
271275
Language::Prolog => vec![Color::Blue, Color::Red],
@@ -372,8 +376,8 @@ fn get_all_language_types() -> Vec<tokei::LanguageType> {
372376
tokei::LanguageType::Lua,
373377
tokei::LanguageType::Markdown,
374378
tokei::LanguageType::Nim,
375-
tokei::LanguageType::OCaml,
376379
tokei::LanguageType::ObjectiveC,
380+
tokei::LanguageType::OCaml,
377381
tokei::LanguageType::Perl,
378382
tokei::LanguageType::Php,
379383
tokei::LanguageType::Prolog,

src/license.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use askalono::{Store, TextData};
2+
3+
use crate::Error;
4+
5+
type Result<T> = std::result::Result<T, Error>;
6+
7+
static CACHE_DATA: &[u8] = include_bytes!("../resources/licenses/cache.bin.gz");
8+
9+
pub struct Detector {
10+
store: Store,
11+
}
12+
13+
impl Detector {
14+
pub fn new() -> Result<Self> {
15+
Store::from_cache(CACHE_DATA)
16+
.map(|store| Self { store })
17+
.map_err(|_| Error::LicenseDetectorError)
18+
}
19+
20+
pub fn analyze(&self, text: &str) -> Option<String> {
21+
self.store
22+
.analyze(&TextData::from(text))
23+
.ok()
24+
.map(|license| license.name)
25+
}
26+
}

src/main.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
extern crate bytecount;
22

3+
extern crate askalono;
34
extern crate colored;
45
extern crate git2;
5-
extern crate license;
66
extern crate tokei;
77
#[macro_use]
88
extern crate clap;
@@ -33,6 +33,7 @@ mod error;
3333
mod image_backends;
3434
mod info;
3535
mod language;
36+
mod license;
3637

3738
use ascii_art::AsciiArt;
3839
use commit_info::CommitInfo;
@@ -93,6 +94,11 @@ fn main() -> Result<()> {
9394
return Err(Error::GitNotInstalled);
9495
}
9596

97+
let possible_languages: Vec<String> = Language::iter()
98+
.filter(|language| *language != Language::Unknown)
99+
.map(|language| language.to_string().to_lowercase())
100+
.collect();
101+
96102
let matches = App::new(crate_name!())
97103
.version(crate_version!())
98104
.author("o2sh <[email protected]>")
@@ -109,8 +115,14 @@ fn main() -> Result<()> {
109115
.short("a")
110116
.long("ascii_language")
111117
.takes_value(true)
112-
.default_value("")
113-
.help("Overrides showing the dominant language ascii logo"),
118+
.possible_values(
119+
&possible_languages
120+
.iter()
121+
.map(|l| l.as_str())
122+
.collect::<Vec<&str>>(),
123+
)
124+
.case_insensitive(true)
125+
.help("Overrides showing the dominant language ascii logo."),
114126
)
115127
.arg(
116128
Arg::with_name("disable_field")
@@ -179,7 +191,8 @@ Possible values: [{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}]",
179191
.long("image")
180192
.takes_value(true)
181193
.help("Sets a custom image to use instead of the ascii logo"),
182-
).arg(
194+
)
195+
.arg(
183196
Arg::with_name("no-merges")
184197
.short("m")
185198
.long("no-merges")
@@ -197,9 +210,11 @@ Possible values: [{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}]",
197210
}
198211

199212
let dir = String::from(matches.value_of("directory").unwrap());
200-
let custom_logo: Language =
201-
Language::from_str(&matches.value_of("ascii_language").unwrap().to_lowercase())
202-
.unwrap_or(Language::Unknown);
213+
let custom_logo: Language = if let Some(ascii_language) = matches.value_of("ascii_language") {
214+
Language::from_str(&ascii_language.to_lowercase()).unwrap()
215+
} else {
216+
Language::Unknown
217+
};
203218
let mut disable_fields = InfoFieldOn {
204219
..Default::default()
205220
};

0 commit comments

Comments
 (0)