diff -Nru rust-debcargo-2.2.9/Cargo.toml rust-debcargo-2.2.10/Cargo.toml --- rust-debcargo-2.2.9/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ rust-debcargo-2.2.10/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] name = "debcargo" -version = "2.2.9" +version = "2.2.10" authors = ["Josh Triplett ", "Ximin Luo ", "Vasudev Kamath "] description = "Create a Debian package from a Cargo crate." license = "MIT/Apache-2.0" @@ -21,7 +21,7 @@ version = "0.11" [dependencies.cargo] -version = "0.31" +version = "0.32" [dependencies.chrono] version = "0.4" @@ -45,7 +45,7 @@ version = "0.2" [dependencies.itertools] -version = "0.7" +version = "0.8" [dependencies.regex] version = "1.0" @@ -69,7 +69,7 @@ version = "3" [dependencies.textwrap] -version = "0.10" +version = "0.11" [dependencies.toml] version = "0.4" diff -Nru rust-debcargo-2.2.9/Cargo.toml.orig rust-debcargo-2.2.10/Cargo.toml.orig --- rust-debcargo-2.2.9/Cargo.toml.orig 2018-11-15 03:55:18.000000000 +0000 +++ rust-debcargo-2.2.10/Cargo.toml.orig 2019-01-21 07:10:42.000000000 +0000 @@ -1,6 +1,6 @@ [package] name = "debcargo" -version = "2.2.9" +version = "2.2.10" authors = [ "Josh Triplett ", "Ximin Luo ", @@ -10,14 +10,14 @@ description = "Create a Debian package from a Cargo crate." [dependencies] -cargo = "0.31" +cargo = "0.32" clap = "2.18" chrono = "0.4" failure = "0.1" filetime = "0.2" flate2 = "1" glob = "0.2" -itertools = "0.7" +itertools = "0.8" regex = "1.0" semver = "0.9" semver-parser = "0.9" @@ -27,6 +27,6 @@ ansi_term = "0.11" serde = "1.0" serde_derive = "1.0" -textwrap = "0.10" +textwrap = "0.11" toml = "0.4" git2 = "0.7" diff -Nru rust-debcargo-2.2.9/debcargo.toml.example rust-debcargo-2.2.10/debcargo.toml.example --- rust-debcargo-2.2.9/debcargo.toml.example 2018-09-13 03:40:29.000000000 +0000 +++ rust-debcargo-2.2.10/debcargo.toml.example 2019-01-21 05:59:17.000000000 +0000 @@ -142,3 +142,9 @@ # want the -dev versions of the library packages, since our crate packages are # development packages and not runtime packages. #depends = ["PLACEHOLDER", "PLACEHOLDER"] + +# More additional fields. This is mostly useful for binary packages that might +# relate to other external programs, e.g. debcargo Recommends cargo. +#recommends = ["PLACEHOLDER", "PLACEHOLDER"] +#suggests = ["PLACEHOLDER", "PLACEHOLDER"] +#provides = ["PLACEHOLDER", "PLACEHOLDER"] diff -Nru rust-debcargo-2.2.9/debian/cargo-checksum.json rust-debcargo-2.2.10/debian/cargo-checksum.json --- rust-debcargo-2.2.9/debian/cargo-checksum.json 2018-11-30 06:33:36.000000000 +0000 +++ rust-debcargo-2.2.10/debian/cargo-checksum.json 2019-01-21 07:25:15.000000000 +0000 @@ -1 +1 @@ -{"package":"9252b411c4a21ea1de7f1e43836812fde3ca319c946bceca894acc41151bc142","files":{}} +{"package":"890e2439fa1793a96c40c7c7347616c8197be1fa3ce31eafe64a64ed4ebe4ab5","files":{}} diff -Nru rust-debcargo-2.2.9/debian/changelog rust-debcargo-2.2.10/debian/changelog --- rust-debcargo-2.2.9/debian/changelog 2018-11-30 06:33:36.000000000 +0000 +++ rust-debcargo-2.2.10/debian/changelog 2019-01-21 07:25:15.000000000 +0000 @@ -1,3 +1,9 @@ +rust-debcargo (2.2.10-1) unstable; urgency=medium + + * Package debcargo 2.2.10 from crates.io using debcargo 2.2.10 + + -- Ximin Luo Sun, 20 Jan 2019 23:25:15 -0800 + rust-debcargo (2.2.9-2) unstable; urgency=medium * Package debcargo 2.2.9 from crates.io using debcargo 2.2.9 diff -Nru rust-debcargo-2.2.9/debian/control rust-debcargo-2.2.10/debian/control --- rust-debcargo-2.2.9/debian/control 2018-11-30 06:33:36.000000000 +0000 +++ rust-debcargo-2.2.10/debian/control 2019-01-21 07:25:15.000000000 +0000 @@ -2,12 +2,12 @@ Section: rust Priority: optional Build-Depends: debhelper (>= 11), - dh-cargo (>= 10), + dh-cargo (>= 15), cargo:native, rustc:native, libstd-rust-dev, librust-ansi-term-0.11+default-dev, - librust-cargo-0.31+default-dev, + librust-cargo-0.32+default-dev, librust-chrono-0.4+default-dev, librust-clap-2+default-dev (>= 2.18-~~), librust-failure-0.1+default-dev, @@ -15,7 +15,7 @@ librust-flate2-1+default-dev, librust-git2-0.7+default-dev, librust-glob-0.2+default-dev, - librust-itertools-0.7+default-dev, + librust-itertools-0.8+default-dev, librust-regex-1+default-dev, librust-semver-0.9+default-dev, librust-semver-parser-0.9+default-dev, @@ -23,7 +23,7 @@ librust-serde-derive-1+default-dev, librust-tar-0.4+default-dev, librust-tempfile-3+default-dev, - librust-textwrap-0.10+default-dev, + librust-textwrap-0.11+default-dev, librust-toml-0.4+default-dev, librust-walkdir-2+default-dev Maintainer: Debian Rust Maintainers @@ -39,7 +39,7 @@ Depends: ${misc:Depends}, librust-ansi-term-0.11+default-dev, - librust-cargo-0.31+default-dev, + librust-cargo-0.32+default-dev, librust-chrono-0.4+default-dev, librust-clap-2+default-dev (>= 2.18-~~), librust-failure-0.1+default-dev, @@ -47,7 +47,7 @@ librust-flate2-1+default-dev, librust-git2-0.7+default-dev, librust-glob-0.2+default-dev, - librust-itertools-0.7+default-dev, + librust-itertools-0.8+default-dev, librust-regex-1+default-dev, librust-semver-0.9+default-dev, librust-semver-parser-0.9+default-dev, @@ -55,7 +55,7 @@ librust-serde-derive-1+default-dev, librust-tar-0.4+default-dev, librust-tempfile-3+default-dev, - librust-textwrap-0.10+default-dev, + librust-textwrap-0.11+default-dev, librust-toml-0.4+default-dev, librust-walkdir-2+default-dev Provides: @@ -64,8 +64,8 @@ librust-debcargo-2+default-dev (= ${binary:Version}), librust-debcargo-2.2-dev (= ${binary:Version}), librust-debcargo-2.2+default-dev (= ${binary:Version}), - librust-debcargo-2.2.9-dev (= ${binary:Version}), - librust-debcargo-2.2.9+default-dev (= ${binary:Version}) + librust-debcargo-2.2.10-dev (= ${binary:Version}), + librust-debcargo-2.2.10+default-dev (= ${binary:Version}) Description: Create a Debian package from a Cargo crate - Rust source code This package contains the source for the Rust debcargo crate, packaged by debcargo for use with cargo and dh-cargo. @@ -77,7 +77,15 @@ Depends: ${misc:Depends}, ${shlibs:Depends}, + ${cargo:Depends}, quilt +Recommends: + ${cargo:Recommends}, + cargo +Suggests: + ${cargo:Suggests} +Provides: + ${cargo:Provides} Built-Using: ${cargo:Built-Using} XB-X-Cargo-Built-Using: ${cargo:X-Cargo-Built-Using} Description: Create a Debian package from a Cargo crate diff -Nru rust-debcargo-2.2.9/debian/copyright.debcargo.hint rust-debcargo-2.2.10/debian/copyright.debcargo.hint --- rust-debcargo-2.2.9/debian/copyright.debcargo.hint 2018-11-30 06:33:36.000000000 +0000 +++ rust-debcargo-2.2.10/debian/copyright.debcargo.hint 2019-01-21 07:25:15.000000000 +0000 @@ -27,8 +27,8 @@ Files: debian/* Copyright: - 2018 Debian Rust Maintainers - 2018 Ximin Luo + 2018-2019 Debian Rust Maintainers + 2018-2019 Ximin Luo License: MIT or Apache-2.0 License: Apache-2.0 diff -Nru rust-debcargo-2.2.9/debian/debcargo.toml rust-debcargo-2.2.10/debian/debcargo.toml --- rust-debcargo-2.2.9/debian/debcargo.toml 2018-11-30 06:33:36.000000000 +0000 +++ rust-debcargo-2.2.10/debian/debcargo.toml 2019-01-21 07:25:15.000000000 +0000 @@ -4,3 +4,4 @@ [packages.bin] section = "devel" depends = ["quilt"] +recommends = ["cargo"] diff -Nru rust-debcargo-2.2.9/src/bin/debcargo.rs rust-debcargo-2.2.10/src/bin/debcargo.rs --- rust-debcargo-2.2.9/src/bin/debcargo.rs 2018-09-08 04:07:54.000000000 +0000 +++ rust-debcargo-2.2.10/src/bin/debcargo.rs 2019-01-21 06:35:50.000000000 +0000 @@ -23,7 +23,7 @@ use std::io::{BufRead, BufReader}; use debcargo::errors::*; -use debcargo::crates::CrateInfo; +use debcargo::crates::{update_crates_io, CrateInfo}; use debcargo::debian::{self, BaseInfo}; use debcargo::config::{parse_config, Config}; use debcargo::util; @@ -143,7 +143,7 @@ let crate_name = matches.value_of("crate").unwrap(); let version = matches.value_of("version"); - let crate_info = CrateInfo::new(crate_name, version)?; + let crate_info = CrateInfo::new_with_update(crate_name, version, false)?; let pkgbase = BaseInfo::new(crate_name, &crate_info, crate_version!(), version.is_some()); println!("{}", pkgbase.package_name()); @@ -163,6 +163,10 @@ Ok(()) } +fn do_update() -> Result<()> { + update_crates_io() +} + fn real_main() -> Result<()> { let m = App::new("debcargo") .author(crate_authors!()) @@ -195,11 +199,15 @@ include dependency operators'") .arg_from_usage("--directory [directory] 'Output directory.'") ]) + .subcommands(vec![SubCommand::with_name("update") + .about("Update the crates.io index, outside of a workspace.") + ]) .get_matches(); match m.subcommand() { ("package", Some(sm)) => do_package(sm), ("deb-src-name", Some(sm)) => do_deb_src_name(sm), ("extract", Some(sm)) => do_extract(sm), + ("update", Some(_)) => do_update(), _ => unreachable!(), } } diff -Nru rust-debcargo-2.2.9/src/config.rs rust-debcargo-2.2.10/src/config.rs --- rust-debcargo-2.2.9/src/config.rs 2018-09-29 08:59:28.000000000 +0000 +++ rust-debcargo-2.2.10/src/config.rs 2019-01-21 05:57:29.000000000 +0000 @@ -40,6 +40,9 @@ summary: Option, description: Option, depends: Option>, + recommends: Option>, + suggests: Option>, + provides: Option>, } impl Default for Config { @@ -127,17 +130,17 @@ None } - pub fn package_section(&self, pkgname: &str) -> Option<&str> { + pub fn package_section(&self, key: PackageKey) -> Option<&str> { self.packages.as_ref().and_then(|pkg| { - pkg.get(pkgname).and_then(|package| { + pkg.get(&package_key_string(key)).and_then(|package| { package.section.as_ref().map(|s| s.as_str()) }) }) } - pub fn package_summary(&self, pkgname: &str) -> Option<(&str, &str)> { + pub fn package_summary(&self, key: PackageKey) -> Option<(&str, &str)> { self.packages.as_ref().and_then(|pkg| { - pkg.get(pkgname).map(|package| { + pkg.get(&package_key_string(key)).map(|package| { let s = match package.summary { Some(ref s) => s, None => "", @@ -151,22 +154,36 @@ }) } - pub fn package_depends(&self, pkgname: &str) -> Option<&Vec> { + pub fn package_depends(&self, key: PackageKey) -> Option<&Vec> { self.packages.as_ref().and_then(|pkg| { - pkg.get(pkgname).and_then(|package| { + pkg.get(&package_key_string(key)).and_then(|package| { package.depends.as_ref() }) }) } - pub fn package_depends_for_feature<'a>( - &'a self, - feature: &'a str, - f_depends: Vec<&'a str>) - -> impl Iterator + 'a { - Some(feature).into_iter().chain(f_depends.into_iter()).map(move |f| - vec_opt_iter(self.package_depends(&package_key_for_feature(f))) - ).flatten().map(|s| s.as_str()) + pub fn package_recommends(&self, key: PackageKey) -> Option<&Vec> { + self.packages.as_ref().and_then(|pkg| { + pkg.get(&package_key_string(key)).and_then(|package| { + package.recommends.as_ref() + }) + }) + } + + pub fn package_suggests(&self, key: PackageKey) -> Option<&Vec> { + self.packages.as_ref().and_then(|pkg| { + pkg.get(&package_key_string(key)).and_then(|package| { + package.suggests.as_ref() + }) + }) + } + + pub fn package_provides(&self, key: PackageKey) -> Option<&Vec> { + self.packages.as_ref().and_then(|pkg| { + pkg.get(&package_key_string(key)).and_then(|package| { + package.provides.as_ref() + }) + }) } pub fn vcs_git(&self) -> Option<&str> { @@ -196,13 +213,39 @@ Ok(toml::from_str(&content)?) } -pub fn package_key_for_feature(feature: &str) -> String { - if feature == "" { - PACKAGE_KEY_FOR_LIB.to_string() - } else { - format!("{}+{}", PACKAGE_KEY_FOR_LIB, feature) +pub fn package_field_for_feature<'a>( + get_field: &'a Fn(PackageKey) -> Option<&'a Vec>, + feature: PackageKey, + f_provides: &[&str]) +-> Vec { + Some(feature).into_iter().chain(f_provides.into_iter().map(|s| PackageKey::feature(s))).map(move |f| + vec_opt_iter(get_field(f)) + ).flatten().map(|s| s.to_string()).collect() +} + +#[derive(Clone, Copy)] +pub enum PackageKey<'a> { + Bin, + BareLib, + FeatureLib(&'a str), +} + +impl <'a> PackageKey<'a> { + pub fn feature(f: &'a str) -> PackageKey<'a> { + use self::PackageKey::*; + if f == "" { + BareLib + } else { + FeatureLib(f) + } } } -pub const PACKAGE_KEY_FOR_BIN : &'static str = "bin"; -pub const PACKAGE_KEY_FOR_LIB : &'static str = "lib"; +fn package_key_string(key: PackageKey) -> String { + use self::PackageKey::*; + match key { + Bin => "bin".to_string(), + BareLib => "lib".to_string(), + FeatureLib(feature) => format!("lib+{}", feature), + } +} diff -Nru rust-debcargo-2.2.9/src/crates.rs rust-debcargo-2.2.10/src/crates.rs --- rust-debcargo-2.2.9/src/crates.rs 2018-11-15 03:45:30.000000000 +0000 +++ rust-debcargo-2.2.10/src/crates.rs 2019-01-21 06:46:52.000000000 +0000 @@ -1,10 +1,7 @@ -use cargo::{Config, - core::{Dependency, Package, PackageId, Source, SourceId, Summary, - TargetKind, FeatureValue}, - core::manifest::{self, EitherManifest}, - sources::RegistrySource}; -use cargo::util::FileLock; -use cargo::util::toml::read_manifest; +use cargo::{Config, core::manifest::ManifestMetadata, core::registry::PackageRegistry, + core::{Dependency, EitherManifest, FeatureValue, Manifest, Package, PackageId, + Registry, Source, SourceId, Summary, Target, TargetKind}, + sources::registry::RegistrySource, util::{FileLock, toml::read_manifest}}; use failure::Error; use filetime::{set_file_times, FileTime}; use glob::Pattern; @@ -23,14 +20,9 @@ use errors::*; -pub struct CratesIo { - pub config: Config, - pub source_id: SourceId, -} - pub struct CrateInfo { package: Package, - manifest: manifest::Manifest, + manifest: Manifest, crate_file: FileLock, config: Config, source_id: SourceId, @@ -45,7 +37,7 @@ fn traverse_depth<'a>(map: &BTreeMap<&'a str, Vec<&'a str>>, key: &'a str) -> Vec<&'a str> { let mut x = Vec::new(); - if let Some (pp) = (*map).get(key) { + if let Some(pp) = (*map).get(key) { x.extend(pp); for p in pp { x.extend(traverse_depth(map, p)); @@ -54,47 +46,42 @@ x } -impl CratesIo { - pub fn new() -> Result { - let config = Config::default()?; - let source_id = SourceId::crates_io(&config)?; - - Ok(CratesIo { - config: config, - source_id: source_id, - }) - } - - pub fn create_dependency(&self, name: &str, version: Option<&str>) -> Result { - Dependency::parse_no_deprecated(name, version, &self.source_id) - } - - pub fn fetch_candidates(&self, dep: &Dependency) -> Result> { - let mut registry = self.registry(); - let mut summaries = registry.query_vec(dep)?; - summaries.sort_by(|a, b| b.package_id().partial_cmp(a.package_id()).unwrap()); - Ok(summaries) - } - - pub fn fetch_as_dependency(&self, dep: &Dependency) -> Result> { - let summaries = self.fetch_candidates(dep)?; - let deps: Vec = summaries - .iter() - .map(|s| { - self.create_dependency(&s.name(), Some(format!("{}", s.version()).as_str())) - .unwrap() - }) - .collect(); - Ok(deps) - } +fn fetch_candidates(registry: &mut PackageRegistry, dep: &Dependency) -> Result> { + let mut summaries = registry.query_vec(dep, false)?; + summaries.sort_by(|a, b| b.package_id().partial_cmp(a.package_id()).unwrap()); + Ok(summaries) +} - pub fn registry(&self) -> RegistrySource { - RegistrySource::remote(&self.source_id, &self.config) - } +pub fn update_crates_io() -> Result<()> { + let config = Config::default()?; + let source_id = SourceId::crates_io(&config)?; + let mut r = RegistrySource::remote(&source_id, &config); + r.update() } impl CrateInfo { pub fn new(crate_name: &str, version: Option<&str>) -> Result { + CrateInfo::new_with_update(crate_name, version, true) + } + + pub fn new_with_update( + crate_name: &str, + version: Option<&str>, + update: bool, + ) -> Result { + let config = Config::default()?; + let source_id = { + let source_id = SourceId::crates_io(&config)?; + if update { + source_id + } else { + // The below is a bit of a hack and depends on some cargo internals + // but unless we do this, fetch_candidates() will update the index + // The behaviour is brittle; we really should write a test for it. + source_id.with_precise(Some("locked".to_string())) + } + }; + let version = version.map(|v| { if v.starts_with(|c: char| c.is_digit(10)) { ["=", v].concat() @@ -103,47 +90,45 @@ } }); - let crates_io = CratesIo::new()?; let dependency = Dependency::parse_no_deprecated( crate_name, version.as_ref().map(String::as_str), - &crates_io.source_id, + &source_id, )?; - let summaries = crates_io.fetch_candidates(&dependency)?; let registry_name = format!( "{}-{:016x}", - crates_io.source_id.url().host_str().unwrap_or(""), - hash(&crates_io.source_id).swap_bytes() + source_id.url().host_str().unwrap_or(""), + hash(&source_id).swap_bytes() ); - let summary = summaries - .iter() - .max_by_key(|s| s.package_id()) - .ok_or_else(|| { + let (package, manifest, crate_file) = { + let mut registry = PackageRegistry::new(&config)?; + registry.lock_patches(); + let summaries = fetch_candidates(&mut registry, &dependency)?; + let pkgids = summaries + .into_iter() + .map(|s| s.package_id().clone()) + .collect::>(); + let pkgid = pkgids.iter().max().ok_or_else(|| { format_err!( concat!( - "Couldn't find any crate matching {} {}\n Try `cargo ", - "update` to", - "update the crates.io index" + "Couldn't find any crate matching {} {}\n ", + "Try `debcargo update` to update the crates.io index." ), dependency.package_name(), dependency.version_req() ) })?; - - let pkgid = summary.package_id(); - - let (package, manifest, crate_file) = { - let mut registry = crates_io.registry(); - let package = registry.download(pkgid)?; + let pkgset = registry.get(pkgids.as_slice())?; + let package = pkgset.get_one(pkgid)?; let manifest = package.manifest(); let filename = format!("{}-{}.crate", pkgid.name(), pkgid.version()); - let crate_file = crates_io - .config - .registry_cache_path() - .join(®istry_name) - .open_ro(&filename, &crates_io.config, &filename)?; + let crate_file = config.registry_cache_path().join(®istry_name).open_ro( + &filename, + &config, + &filename, + )?; (package.clone(), manifest.clone(), crate_file) }; @@ -151,12 +136,12 @@ package: package, manifest: manifest, crate_file: crate_file, - config: crates_io.config, - source_id: crates_io.source_id, + config: config, + source_id: source_id, }) } - pub fn targets(&self) -> &[manifest::Target] { + pub fn targets(&self) -> &[Target] { self.manifest.targets() } @@ -164,7 +149,7 @@ self.manifest.summary().package_id().version() } - pub fn manifest(&self) -> &manifest::Manifest { + pub fn manifest(&self) -> &Manifest { &self.manifest } @@ -183,7 +168,7 @@ self.manifest.summary().package_id() } - pub fn metadata(&self) -> &manifest::ManifestMetadata { + pub fn metadata(&self) -> &ManifestMetadata { self.manifest.metadata() } @@ -380,6 +365,17 @@ } } + pub fn semver_uscan_pattern(&self) -> String { + // See `man uscan` description of @ANY_VERSION@ on how these + // regex patterns were built. + match *self.package_id().version() { + Version { major: 0, minor, .. } => + format!("[-_]?(0\\.{}\\.\\d[\\-+\\.:\\~\\da-zA-Z]*)", minor), + Version { major, .. } => + format!("[-_]?({}\\.\\d[\\-+\\.:\\~\\da-zA-Z]*)", major), + } + } + pub fn get_summary_description(&self) -> (Option, Option) { let (summary, description) = if let Some(ref description) = self.metadata().description { // Convention these days seems to be to do manual text diff -Nru rust-debcargo-2.2.9/src/debian/control.rs rust-debcargo-2.2.10/src/debian/control.rs --- rust-debcargo-2.2.9/src/debian/control.rs 2018-11-11 18:27:05.000000000 +0000 +++ rust-debcargo-2.2.10/src/debian/control.rs 2019-01-21 06:03:27.000000000 +0000 @@ -6,7 +6,7 @@ use semver::Version; use textwrap::fill; -use config::Config; +use config::{Config, PackageKey, package_field_for_feature}; use errors::*; use util::vec_opt_iter; @@ -314,7 +314,7 @@ description: Option<&str>, boilerplate: &str, ) -> Self { - let (name, provides) = match name_suffix { + let (name, mut provides) = match name_suffix { None => (basename.to_string(), vec![]), Some(suf) => (format!("{}{}", basename, suf), vec![format!("{} (= ${{binary:Version}})", basename)]), @@ -329,6 +329,7 @@ Some(s) => s.to_string(), }; + provides.push("${cargo:Provides}".to_string()); Package { name: name, arch: "any".to_string(), @@ -337,9 +338,14 @@ depends: vec![ "${misc:Depends}".to_string(), "${shlibs:Depends}".to_string(), + "${cargo:Depends}".to_string(), + ], + recommends: vec![ + "${cargo:Recommends}".to_string(), + ], + suggests: vec![ + "${cargo:Suggests}".to_string(), ], - recommends: vec![], - suggests: vec![], provides: provides, summary: short_desc, description: long_desc, @@ -374,7 +380,7 @@ Ok(()) } - pub fn apply_overrides, T: ToString>(&mut self, config: &Config, key: &str, deps: I) { + pub fn apply_overrides(&mut self, config: &Config, key: PackageKey, f_provides: Vec<&str>) { if let Some(section) = config.package_section(key) { self.section = Some(section.to_string()); } @@ -389,7 +395,14 @@ } } - self.depends.extend(deps.into_iter().map(|s| s.to_string())); + self.depends.extend( + package_field_for_feature(&|x| config.package_depends(x), key, &f_provides)); + self.recommends.extend( + package_field_for_feature(&|x| config.package_recommends(x), key, &f_provides)); + self.suggests.extend( + package_field_for_feature(&|x| config.package_suggests(x), key, &f_provides)); + self.provides.extend( + package_field_for_feature(&|x| config.package_provides(x), key, &f_provides)); } } diff -Nru rust-debcargo-2.2.9/src/debian/mod.rs rust-debcargo-2.2.10/src/debian/mod.rs --- rust-debcargo-2.2.9/src/debian/mod.rs 2018-11-11 18:18:01.000000000 +0000 +++ rust-debcargo-2.2.10/src/debian/mod.rs 2019-01-21 05:57:08.000000000 +0000 @@ -17,7 +17,7 @@ use crates::CrateInfo; use errors::*; -use config::{Config, package_key_for_feature, PACKAGE_KEY_FOR_BIN}; +use config::{Config, PackageKey, package_field_for_feature}; use util::{self, copy_tree, vec_opt_iter}; use self::control::deb_version; @@ -35,6 +35,7 @@ upstream_name: String, base_package_name: String, name_suffix: Option, + uscan_version_pattern: Option, package_name: String, debian_version: String, debcargo_version: String, @@ -48,11 +49,12 @@ let upstream = name.to_string(); let name_dashed = upstream.replace('_', "-"); let base_package_name = name_dashed.to_lowercase(); - let (name_suffix, package_name) = if semver_suffix { + let (name_suffix, uscan_version_pattern, package_name) = if semver_suffix { (Some(crate_info.semver_suffix()), + Some(crate_info.semver_uscan_pattern()), format!("{}{}", base_package_name, crate_info.semver_suffix())) } else { - (None, base_package_name.clone()) + (None, None, base_package_name.clone()) }; let debian_version = deb_version(crate_info.version()); let debian_source = match name_suffix { @@ -66,6 +68,7 @@ upstream_name: upstream, base_package_name: base_package_name, name_suffix: name_suffix, + uscan_version_pattern: uscan_version_pattern, package_name: package_name, debian_version: debian_version, debcargo_version: debcargo_version.to_string(), @@ -298,6 +301,10 @@ // debian/watch let mut watch = file("watch")?; + let uscan_version_pattern = pkgbase + .uscan_version_pattern + .as_ref() + .map_or_else(|| "@ANY_VERSION@".to_string(), |ref s| s.to_string()); writeln!( watch, "{}\n{}\n{}\n{}\n", @@ -305,8 +312,9 @@ format!(r"opts=filenamemangle=s/.*\/(.*)\/download/{name}-$1\.tar\.gz/g,\", name = upstream_name), r"uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \", format!("https://qa.debian.org/cgi-bin/fakeupstream.cgi?upstream=crates.io/{name} \ - .*/crates/{name}/@ANY_VERSION@/download", - name = upstream_name) + .*/crates/{name}/{version_pattern}/download", + name = upstream_name, + version_pattern = uscan_version_pattern) )?; // debian/source/format @@ -331,19 +339,20 @@ let build_deps = { let build_deps = [ "debhelper (>= 11)", - "dh-cargo (>= 10)" + "dh-cargo (>= 15)" ].iter().map(|x| x.to_string()); let (default_features, default_deps) = crate_info.feature_all_deps(&features_with_deps, "default"); //debcargo_info!("default_features: {:?}", default_features); //debcargo_info!("default_deps: {:?}", deb_deps(config, &default_deps)?); - let extra_override_deps = config.package_depends_for_feature("default", default_features); + let extra_override_deps = + package_field_for_feature(&|x| config.package_depends(x), PackageKey::feature("default"), &default_features); let build_deps_extra = [ "cargo:native", "rustc:native", "libstd-rust-dev", ].iter().map(|s| s.to_string()) .chain(deb_deps(config, &default_deps)?) - .chain(extra_override_deps.map(|s| s.to_string())); + .chain(extra_override_deps); if !bins.is_empty() { build_deps.chain(build_deps_extra).collect() } else { @@ -409,8 +418,7 @@ if feature == "" { suggests.clone() } else { vec![] })?; // If any overrides present for this package it will be taken care. - package.apply_overrides(config, &package_key_for_feature(feature), - config.package_depends_for_feature(feature, f_provides)); + package.apply_overrides(config, PackageKey::feature(feature), f_provides); write!(control, "\n{}", package)?; } assert!(provides.is_empty()); @@ -439,8 +447,7 @@ ); // Binary package overrides. - bin_pkg.apply_overrides(config, PACKAGE_KEY_FOR_BIN, - vec_opt_iter(config.package_depends(PACKAGE_KEY_FOR_BIN))); + bin_pkg.apply_overrides(config, PackageKey::Bin, vec![]); write!(control, "\n{}", bin_pkg)?; } @@ -497,7 +504,7 @@ let source_deb_version = format!("{}-{}", pkgbase.debian_version(), &deb_version_suffix); if !uploaders.contains(&author.as_str()) { - debcargo_warn!("You are not in Uploaders; adding \"Team upload\" to d/changelog"); + debcargo_warn!("You ({}) are not in Uploaders; adding \"Team upload\" to d/changelog", author); if !changelog_items.contains(&changelog::COMMENT_TEAM_UPLOAD.to_string()) { changelog_items.insert(0, changelog::COMMENT_TEAM_UPLOAD.to_string()); }