]> git.lizzy.rs Git - rust.git/commitdiff
Check the license of vendored deps
authorBrian Anderson <banderson@mozilla.com>
Sat, 10 Dec 2016 23:27:42 +0000 (23:27 +0000)
committerBrian Anderson <banderson@mozilla.com>
Sat, 10 Dec 2016 23:27:42 +0000 (23:27 +0000)
src/tools/tidy/src/deps.rs [new file with mode: 0644]
src/tools/tidy/src/main.rs

diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs
new file mode 100644 (file)
index 0000000..7592c09
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Check license of third-party deps by inspecting src/vendor
+
+use std::fs::File;
+use std::io::Read;
+use std::path::Path;
+
+static LICENSES: &'static [&'static str] = &[
+    "MIT/Apache-2.0"
+];
+
+pub fn check(path: &Path, bad: &mut bool) {
+    let path = path.join("vendor");
+    assert!(path.exists(), "vendor directory missing");
+    let mut saw_dir = false;
+    for dir in t!(path.read_dir()) {
+        saw_dir = true;
+        let dir = t!(dir);
+        let toml = dir.path().join("Cargo.toml");
+        if !check_license(&toml) {
+            *bad = true;
+        }
+    }
+    assert!(saw_dir, "no vendored source");
+}
+
+fn check_license(path: &Path) -> bool {
+    if !path.exists() {
+        panic!("{} does not exist", path.display());
+    }
+    let mut contents = String::new();
+    t!(t!(File::open(path)).read_to_string(&mut contents));
+
+    let mut found_license = false;
+    for line in contents.lines() {
+        if !line.starts_with("license") {
+            continue;
+        }
+        let license = extract_license(line);
+        if !LICENSES.contains(&&*license) {
+            println!("invalid license {} in {}", license, path.display());
+            return false;
+        }
+        found_license = true;
+        break;
+    }
+    if !found_license {
+        println!("no license in {}", path.display());
+        return false;
+    }
+
+    true
+}
+
+fn extract_license(line: &str) -> String {
+    let first_quote = line.find('"');
+    let last_quote = line.rfind('"');
+    if let (Some(f), Some(l)) = (first_quote, last_quote) {
+        let license = &line[f + 1 .. l];
+        license.into()
+    } else {
+        "bad-license-parse".into()
+    }
+}
index cb11fe261c459a97351a4d8cd30708c8e6325749..7566580b1a5f2f904317c98d6a424c7d38bb8e33 100644 (file)
@@ -36,6 +36,7 @@ macro_rules! t {
 mod features;
 mod cargo;
 mod pal;
+mod deps;
 
 fn main() {
     let path = env::args_os().skip(1).next().expect("need an argument");
@@ -48,6 +49,7 @@ fn main() {
     cargo::check(&path, &mut bad);
     features::check(&path, &mut bad);
     pal::check(&path, &mut bad);
+    deps::check(&path, &mut bad);
 
     if bad {
         panic!("some tidy checks failed");