1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::io::Write;
use std::path::{Path, PathBuf};
use md5::Digest;
use md5;
use file;
use manifest::Config;
use std::collections::HashMap;
use error::*;
use archive::Archive;
use listener::Listener;
pub fn generate_archive(options: &Config, time: u64, listener: &mut Listener) -> CDResult<(Vec<u8>, HashMap<PathBuf, Digest>)> {
let mut archive = Archive::new(time);
let copy_hashes = archive_files(&mut archive, options, listener)?;
Ok((archive.into_inner()?, copy_hashes))
}
pub(crate) fn generate_changelog_asset(options: &Config) -> CDResult<Option<Vec<u8>>> {
if let Some(ref path) = options.changelog {
let changelog = file::get(options.path_in_workspace(path))
.map_err(|e| CargoDebError::IoFile("unable to read changelog file", e, path.into()))?;
Ok(Some(changelog))
} else {
Ok(None)
}
}
pub(crate) fn generate_copyright_asset(options: &Config) -> CDResult<Vec<u8>> {
let mut copyright: Vec<u8> = Vec::new();
write!(&mut copyright, "Upstream Name: {}\n", options.name)?;
if let Some(source) = options.repository.as_ref().or(options.homepage.as_ref()) {
write!(&mut copyright, "Source: {}\n", source)?;
}
write!(&mut copyright, "Copyright: {}\n", options.copyright)?;
if let Some(ref license) = options.license {
write!(&mut copyright, "License: {}\n", license)?;
}
if let Some(ref path) = options.license_file {
let license_string = file::get_text(path)
.map_err(|e| CargoDebError::IoFile("unable to read license file", e, path.to_owned()))?;
for line in license_string.lines().skip(options.license_file_skip_lines) {
if line.is_empty() {
copyright.write_all(b".\n")?;
} else {
copyright.write_all(line.trim().as_bytes())?;
copyright.write_all(b"\n")?;
}
}
}
Ok(copyright)
}
fn archive_files(archive: &mut Archive, options: &Config, listener: &mut Listener) -> CDResult<HashMap<PathBuf, Digest>> {
let mut hashes = HashMap::new();
for asset in &options.assets {
let out_data = asset.source.data()?;
listener.info(format!("{} -> {}", asset.source.path().unwrap_or_else(|| Path::new("-")).display(), asset.target_path.display()));
hashes.insert(asset.target_path.clone(), md5::compute(&out_data));
archive.file(&asset.target_path, &out_data, asset.chmod)?;
}
Ok(hashes)
}