Hex Artifact Content
Not logged in

Artifact 7c8ed821d329d70c69e199a7135d538831c2be2a:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 37 20 54 68 65 20 52 75 73 74 20 50 72 6f 6a 65  7 The Rust Proje
0020: 63 74 20 44 65 76 65 6c 6f 70 65 72 73 2e 20 53  ct Developers. S
0030: 65 65 20 74 68 65 20 43 4f 50 59 52 49 47 48 54  ee the COPYRIGHT
0040: 0a 2f 2f 20 66 69 6c 65 20 61 74 20 74 68 65 20  .// file at the 
0050: 74 6f 70 2d 6c 65 76 65 6c 20 64 69 72 65 63 74  top-level direct
0060: 6f 72 79 20 6f 66 20 74 68 69 73 20 64 69 73 74  ory of this dist
0070: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 61 74 0a  ribution and at.
0080: 2f 2f 20 68 74 74 70 3a 2f 2f 72 75 73 74 2d 6c  // http://rust-l
0090: 61 6e 67 2e 6f 72 67 2f 43 4f 50 59 52 49 47 48  ang.org/COPYRIGH
00a0: 54 2e 0a 2f 2f 0a 2f 2f 20 4c 69 63 65 6e 73 65  T..//.// License
00b0: 64 20 75 6e 64 65 72 20 74 68 65 20 41 70 61 63  d under the Apac
00c0: 68 65 20 4c 69 63 65 6e 73 65 2c 20 56 65 72 73  he License, Vers
00d0: 69 6f 6e 20 32 2e 30 20 3c 4c 49 43 45 4e 53 45  ion 2.0 <LICENSE
00e0: 2d 41 50 41 43 48 45 20 6f 72 0a 2f 2f 20 68 74  -APACHE or.// ht
00f0: 74 70 3a 2f 2f 77 77 77 2e 61 70 61 63 68 65 2e  tp://www.apache.
0100: 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4c 49 43  org/licenses/LIC
0110: 45 4e 53 45 2d 32 2e 30 3e 20 6f 72 20 74 68 65  ENSE-2.0> or the
0120: 20 4d 49 54 20 6c 69 63 65 6e 73 65 0a 2f 2f 20   MIT license.// 
0130: 3c 4c 49 43 45 4e 53 45 2d 4d 49 54 20 6f 72 20  <LICENSE-MIT or 
0140: 68 74 74 70 3a 2f 2f 6f 70 65 6e 73 6f 75 72 63  http://opensourc
0150: 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4d  e.org/licenses/M
0160: 49 54 3e 2c 20 61 74 20 79 6f 75 72 0a 2f 2f 20  IT>, at your.// 
0170: 6f 70 74 69 6f 6e 2e 20 54 68 69 73 20 66 69 6c  option. This fil
0180: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 6f 70  e may not be cop
0190: 69 65 64 2c 20 6d 6f 64 69 66 69 65 64 2c 20 6f  ied, modified, o
01a0: 72 20 64 69 73 74 72 69 62 75 74 65 64 0a 2f 2f  r distributed.//
01b0: 20 65 78 63 65 70 74 20 61 63 63 6f 72 64 69 6e   except accordin
01c0: 67 20 74 6f 20 74 68 6f 73 65 20 74 65 72 6d 73  g to those terms
01d0: 2e 0a 0a 75 73 65 20 73 74 64 3a 3a 69 6f 3a 3a  ...use std::io::
01e0: 7b 73 65 6c 66 2c 20 57 72 69 74 65 7d 3b 0a 75  {self, Write};.u
01f0: 73 65 20 73 74 64 3a 3a 70 61 74 68 3a 3a 50 61  se std::path::Pa
0200: 74 68 3b 0a 0a 75 73 65 20 66 6c 61 74 65 32 3b  th;..use flate2;
0210: 0a 75 73 65 20 66 6c 61 74 65 32 3a 3a 77 72 69  .use flate2::wri
0220: 74 65 3a 3a 47 7a 45 6e 63 6f 64 65 72 3b 0a 75  te::GzEncoder;.u
0230: 73 65 20 74 61 72 3a 3a 42 75 69 6c 64 65 72 3b  se tar::Builder;
0240: 0a 75 73 65 20 77 61 6c 6b 64 69 72 3a 3a 57 61  .use walkdir::Wa
0250: 6c 6b 44 69 72 3b 0a 75 73 65 20 78 7a 32 3a 3a  lkDir;.use xz2::
0260: 77 72 69 74 65 3a 3a 58 7a 45 6e 63 6f 64 65 72  write::XzEncoder
0270: 3b 0a 0a 75 73 65 20 65 72 72 6f 72 73 3a 3a 2a  ;..use errors::*
0280: 3b 0a 75 73 65 20 75 74 69 6c 3a 3a 2a 3b 0a 0a  ;.use util::*;..
0290: 61 63 74 6f 72 21 7b 0a 20 20 20 20 23 5b 64 65  actor!{.    #[de
02a0: 72 69 76 65 28 44 65 62 75 67 29 5d 0a 20 20 20  rive(Debug)].   
02b0: 20 70 75 62 20 73 74 72 75 63 74 20 54 61 72 62   pub struct Tarb
02c0: 61 6c 6c 65 72 20 7b 0a 20 20 20 20 20 20 20 20  aller {.        
02d0: 2f 2f 2f 20 54 68 65 20 69 6e 70 75 74 20 66 6f  /// The input fo
02e0: 6c 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 72  lder to be compr
02f0: 65 73 73 65 64 0a 20 20 20 20 20 20 20 20 69 6e  essed.        in
0300: 70 75 74 3a 20 53 74 72 69 6e 67 20 3d 20 22 70  put: String = "p
0310: 61 63 6b 61 67 65 22 2c 0a 0a 20 20 20 20 20 20  ackage",..      
0320: 20 20 2f 2f 2f 20 54 68 65 20 70 72 65 66 69 78    /// The prefix
0330: 20 6f 66 20 74 68 65 20 74 61 72 62 61 6c 6c 73   of the tarballs
0340: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 3a  .        output:
0350: 20 53 74 72 69 6e 67 20 3d 20 22 2e 2f 64 69 73   String = "./dis
0360: 74 22 2c 0a 0a 20 20 20 20 20 20 20 20 2f 2f 2f  t",..        ///
0370: 20 54 68 65 20 66 6f 6c 64 65 72 20 69 6e 20 77   The folder in w
0380: 68 69 63 68 20 74 68 65 20 69 6e 70 75 74 20 69  hich the input i
0390: 73 20 74 6f 20 62 65 20 66 6f 75 6e 64 0a 20 20  s to be found.  
03a0: 20 20 20 20 20 20 77 6f 72 6b 5f 64 69 72 3a 20        work_dir: 
03b0: 53 74 72 69 6e 67 20 3d 20 22 2e 2f 77 6f 72 6b  String = "./work
03c0: 64 69 72 22 2c 0a 20 20 20 20 7d 0a 7d 0a 0a 69  dir",.    }.}..i
03d0: 6d 70 6c 20 54 61 72 62 61 6c 6c 65 72 20 7b 0a  mpl Tarballer {.
03e0: 20 20 20 20 2f 2f 2f 20 47 65 6e 65 72 61 74 65      /// Generate
03f0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 72 62   the actual tarb
0400: 61 6c 6c 73 0a 20 20 20 20 70 75 62 20 66 6e 20  alls.    pub fn 
0410: 72 75 6e 28 73 65 6c 66 29 20 2d 3e 20 52 65 73  run(self) -> Res
0420: 75 6c 74 3c 28 29 3e 20 7b 0a 20 20 20 20 20 20  ult<()> {.      
0430: 20 20 6c 65 74 20 74 61 72 5f 67 7a 20 3d 20 73    let tar_gz = s
0440: 65 6c 66 2e 6f 75 74 70 75 74 2e 63 6c 6f 6e 65  elf.output.clone
0450: 28 29 20 2b 20 22 2e 74 61 72 2e 67 7a 22 3b 0a  () + ".tar.gz";.
0460: 20 20 20 20 20 20 20 20 6c 65 74 20 74 61 72 5f          let tar_
0470: 78 7a 20 3d 20 73 65 6c 66 2e 6f 75 74 70 75 74  xz = self.output
0480: 2e 63 6c 6f 6e 65 28 29 20 2b 20 22 2e 74 61 72  .clone() + ".tar
0490: 2e 78 7a 22 3b 0a 0a 20 20 20 20 20 20 20 20 2f  .xz";..        /
04a0: 2f 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 78 69  / Remove any exi
04b0: 73 74 69 6e 67 20 66 69 6c 65 73 0a 20 20 20 20  sting files.    
04c0: 20 20 20 20 66 6f 72 20 66 69 6c 65 20 69 6e 20      for file in 
04d0: 26 5b 26 74 61 72 5f 67 7a 2c 20 26 74 61 72 5f  &[&tar_gz, &tar_
04e0: 78 7a 5d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xz] {.          
04f0: 20 20 69 66 20 50 61 74 68 3a 3a 6e 65 77 28 66    if Path::new(f
0500: 69 6c 65 29 2e 65 78 69 73 74 73 28 29 20 7b 0a  ile).exists() {.
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0520: 72 65 6d 6f 76 65 5f 66 69 6c 65 28 66 69 6c 65  remove_file(file
0530: 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )?;.            
0540: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
0550: 20 20 20 20 20 2f 2f 20 53 6f 72 74 20 66 69 6c       // Sort fil
0560: 65 73 20 62 79 20 74 68 65 69 72 20 73 75 66 66  es by their suff
0570: 69 78 2c 20 74 6f 20 67 72 6f 75 70 20 66 69 6c  ix, to group fil
0580: 65 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  es with the same
0590: 20 6e 61 6d 65 20 66 72 6f 6d 0a 20 20 20 20 20   name from.     
05a0: 20 20 20 2f 2f 20 64 69 66 66 65 72 65 6e 74 20     // different 
05b0: 6c 6f 63 61 74 69 6f 6e 73 20 28 6c 69 6b 65 6c  locations (likel
05c0: 79 20 69 64 65 6e 74 69 63 61 6c 29 20 61 6e 64  y identical) and
05d0: 20 66 69 6c 65 73 20 77 69 74 68 20 74 68 65 20   files with the 
05e0: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2f 2f 20  same.        // 
05f0: 65 78 74 65 6e 73 69 6f 6e 20 28 6c 69 6b 65 6c  extension (likel
0600: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 6d  y containing sim
0610: 69 6c 61 72 20 64 61 74 61 29 2e 0a 20 20 20 20  ilar data)..    
0620: 20 20 20 20 6c 65 74 20 28 64 69 72 73 2c 20 6d      let (dirs, m
0630: 75 74 20 66 69 6c 65 73 29 20 3d 20 67 65 74 5f  ut files) = get_
0640: 72 65 63 75 72 73 69 76 65 5f 70 61 74 68 73 28  recursive_paths(
0650: 26 73 65 6c 66 2e 77 6f 72 6b 5f 64 69 72 2c 20  &self.work_dir, 
0660: 26 73 65 6c 66 2e 69 6e 70 75 74 29 0a 20 20 20  &self.input).   
0670: 20 20 20 20 20 20 20 20 20 2e 63 68 61 69 6e 5f           .chain_
0680: 65 72 72 28 7c 7c 20 22 66 61 69 6c 65 64 20 74  err(|| "failed t
0690: 6f 20 63 6f 6c 6c 65 63 74 20 66 69 6c 65 20 70  o collect file p
06a0: 61 74 68 73 22 29 3f 3b 0a 20 20 20 20 20 20 20  aths")?;.       
06b0: 20 66 69 6c 65 73 2e 73 6f 72 74 5f 62 79 28 7c   files.sort_by(|
06c0: 61 2c 20 62 7c 20 61 2e 62 79 74 65 73 28 29 2e  a, b| a.bytes().
06d0: 72 65 76 28 29 2e 63 6d 70 28 62 2e 62 79 74 65  rev().cmp(b.byte
06e0: 73 28 29 2e 72 65 76 28 29 29 29 3b 0a 0a 20 20  s().rev()));..  
06f0: 20 20 20 20 20 20 2f 2f 20 50 72 65 70 61 72 65        // Prepare
0700: 20 74 68 65 20 2e 74 61 72 2e 67 7a 20 66 69 6c   the .tar.gz fil
0710: 65 0a 20 20 20 20 20 20 20 20 6c 65 74 20 67 7a  e.        let gz
0720: 20 3d 20 47 7a 45 6e 63 6f 64 65 72 3a 3a 6e 65   = GzEncoder::ne
0730: 77 28 63 72 65 61 74 65 5f 6e 65 77 5f 66 69 6c  w(create_new_fil
0740: 65 28 74 61 72 5f 67 7a 29 3f 2c 20 66 6c 61 74  e(tar_gz)?, flat
0750: 65 32 3a 3a 43 6f 6d 70 72 65 73 73 69 6f 6e 3a  e2::Compression:
0760: 3a 42 65 73 74 29 3b 0a 0a 20 20 20 20 20 20 20  :Best);..       
0770: 20 2f 2f 20 50 72 65 70 61 72 65 20 74 68 65 20   // Prepare the 
0780: 2e 74 61 72 2e 78 7a 20 66 69 6c 65 0a 20 20 20  .tar.xz file.   
0790: 20 20 20 20 20 6c 65 74 20 78 7a 20 3d 20 58 7a       let xz = Xz
07a0: 45 6e 63 6f 64 65 72 3a 3a 6e 65 77 28 63 72 65  Encoder::new(cre
07b0: 61 74 65 5f 6e 65 77 5f 66 69 6c 65 28 74 61 72  ate_new_file(tar
07c0: 5f 78 7a 29 3f 2c 20 39 29 3b 0a 0a 20 20 20 20  _xz)?, 9);..    
07d0: 20 20 20 20 2f 2f 20 57 72 69 74 65 20 74 68 65      // Write the
07e0: 20 74 61 72 20 69 6e 74 6f 20 62 6f 74 68 20 65   tar into both e
07f0: 6e 63 6f 64 65 64 20 66 69 6c 65 73 2e 20 20 57  ncoded files.  W
0800: 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69 72 65  e write all dire
0810: 63 74 6f 72 69 65 73 0a 20 20 20 20 20 20 20 20  ctories.        
0820: 2f 2f 20 66 69 72 73 74 2c 20 73 6f 20 66 69 6c  // first, so fil
0830: 65 73 20 6d 61 79 20 62 65 20 64 69 72 65 63 74  es may be direct
0840: 6c 79 20 63 72 65 61 74 65 64 2e 20 28 73 65 65  ly created. (see
0850: 20 72 75 73 74 75 70 2e 72 73 23 31 30 39 32 29   rustup.rs#1092)
0860: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
0870: 20 62 75 69 6c 64 65 72 20 3d 20 42 75 69 6c 64   builder = Build
0880: 65 72 3a 3a 6e 65 77 28 54 65 65 28 67 7a 2c 20  er::new(Tee(gz, 
0890: 78 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  xz));.        fo
08a0: 72 20 70 61 74 68 20 69 6e 20 64 69 72 73 20 7b  r path in dirs {
08b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
08c0: 20 73 72 63 20 3d 20 50 61 74 68 3a 3a 6e 65 77   src = Path::new
08d0: 28 26 73 65 6c 66 2e 77 6f 72 6b 5f 64 69 72 29  (&self.work_dir)
08e0: 2e 6a 6f 69 6e 28 26 70 61 74 68 29 3b 0a 20 20  .join(&path);.  
08f0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 65            builde
0900: 72 2e 61 70 70 65 6e 64 5f 64 69 72 28 26 70 61  r.append_dir(&pa
0910: 74 68 2c 20 26 73 72 63 29 0a 20 20 20 20 20 20  th, &src).      
0920: 20 20 20 20 20 20 20 20 20 20 2e 63 68 61 69 6e            .chain
0930: 5f 65 72 72 28 7c 7c 20 66 6f 72 6d 61 74 21 28  _err(|| format!(
0940: 22 66 61 69 6c 65 64 20 74 6f 20 74 61 72 20 64  "failed to tar d
0950: 69 72 20 27 7b 7d 27 22 2c 20 73 72 63 2e 64 69  ir '{}'", src.di
0960: 73 70 6c 61 79 28 29 29 29 3f 3b 0a 20 20 20 20  splay()))?;.    
0970: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
0980: 72 20 70 61 74 68 20 69 6e 20 66 69 6c 65 73 20  r path in files 
0990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
09a0: 74 20 73 72 63 20 3d 20 50 61 74 68 3a 3a 6e 65  t src = Path::ne
09b0: 77 28 26 73 65 6c 66 2e 77 6f 72 6b 5f 64 69 72  w(&self.work_dir
09c0: 29 2e 6a 6f 69 6e 28 26 70 61 74 68 29 3b 0a 20  ).join(&path);. 
09d0: 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
09e0: 65 72 2e 61 70 70 65 6e 64 5f 66 69 6c 65 28 26  er.append_file(&
09f0: 70 61 74 68 2c 20 26 6d 75 74 20 6f 70 65 6e 5f  path, &mut open_
0a00: 66 69 6c 65 28 26 73 72 63 29 3f 29 0a 20 20 20  file(&src)?).   
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 63 68               .ch
0a20: 61 69 6e 5f 65 72 72 28 7c 7c 20 66 6f 72 6d 61  ain_err(|| forma
0a30: 74 21 28 22 66 61 69 6c 65 64 20 74 6f 20 74 61  t!("failed to ta
0a40: 72 20 66 69 6c 65 20 27 7b 7d 27 22 2c 20 73 72  r file '{}'", sr
0a50: 63 2e 64 69 73 70 6c 61 79 28 29 29 29 3f 3b 0a  c.display()))?;.
0a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0a70: 20 20 6c 65 74 20 54 65 65 28 67 7a 2c 20 78 7a    let Tee(gz, xz
0a80: 29 20 3d 20 62 75 69 6c 64 65 72 2e 69 6e 74 6f  ) = builder.into
0a90: 5f 69 6e 6e 65 72 28 29 0a 20 20 20 20 20 20 20  _inner().       
0aa0: 20 20 20 20 20 2e 63 68 61 69 6e 5f 65 72 72 28       .chain_err(
0ab0: 7c 7c 20 22 66 61 69 6c 65 64 20 74 6f 20 66 69  || "failed to fi
0ac0: 6e 69 73 68 20 77 72 69 74 69 6e 67 20 2e 74 61  nish writing .ta
0ad0: 72 20 73 74 72 65 61 6d 22 29 3f 3b 0a 0a 20 20  r stream")?;..  
0ae0: 20 20 20 20 20 20 2f 2f 20 46 69 6e 69 73 68 20        // Finish 
0af0: 62 6f 74 68 20 65 6e 63 6f 64 65 64 20 66 69 6c  both encoded fil
0b00: 65 73 0a 20 20 20 20 20 20 20 20 67 7a 2e 66 69  es.        gz.fi
0b10: 6e 69 73 68 28 29 2e 63 68 61 69 6e 5f 65 72 72  nish().chain_err
0b20: 28 7c 7c 20 22 66 61 69 6c 65 64 20 74 6f 20 66  (|| "failed to f
0b30: 69 6e 69 73 68 20 2e 74 61 72 2e 67 7a 20 66 69  inish .tar.gz fi
0b40: 6c 65 22 29 3f 3b 0a 20 20 20 20 20 20 20 20 78  le")?;.        x
0b50: 7a 2e 66 69 6e 69 73 68 28 29 2e 63 68 61 69 6e  z.finish().chain
0b60: 5f 65 72 72 28 7c 7c 20 22 66 61 69 6c 65 64 20  _err(|| "failed 
0b70: 74 6f 20 66 69 6e 69 73 68 20 2e 74 61 72 2e 78  to finish .tar.x
0b80: 7a 20 66 69 6c 65 22 29 3f 3b 0a 0a 20 20 20 20  z file")?;..    
0b90: 20 20 20 20 4f 6b 28 28 29 29 0a 20 20 20 20 7d      Ok(()).    }
0ba0: 0a 7d 0a 0a 2f 2f 2f 20 52 65 74 75 72 6e 73 20  .}../// Returns 
0bb0: 61 6c 6c 20 60 28 64 69 72 65 63 74 6f 72 69 65  all `(directorie
0bc0: 73 2c 20 66 69 6c 65 73 29 60 20 75 6e 64 65 72  s, files)` under
0bd0: 20 74 68 65 20 73 6f 75 72 63 65 20 70 61 74 68   the source path
0be0: 0a 66 6e 20 67 65 74 5f 72 65 63 75 72 73 69 76  .fn get_recursiv
0bf0: 65 5f 70 61 74 68 73 3c 50 2c 20 51 3e 28 72 6f  e_paths<P, Q>(ro
0c00: 6f 74 3a 20 50 2c 20 6e 61 6d 65 3a 20 51 29 20  ot: P, name: Q) 
0c10: 2d 3e 20 52 65 73 75 6c 74 3c 28 56 65 63 3c 53  -> Result<(Vec<S
0c20: 74 72 69 6e 67 3e 2c 20 56 65 63 3c 53 74 72 69  tring>, Vec<Stri
0c30: 6e 67 3e 29 3e 0a 20 20 20 20 77 68 65 72 65 20  ng>)>.    where 
0c40: 50 3a 20 41 73 52 65 66 3c 50 61 74 68 3e 2c 20  P: AsRef<Path>, 
0c50: 51 3a 20 41 73 52 65 66 3c 50 61 74 68 3e 0a 7b  Q: AsRef<Path>.{
0c60: 0a 20 20 20 20 6c 65 74 20 72 6f 6f 74 20 3d 20  .    let root = 
0c70: 72 6f 6f 74 2e 61 73 5f 72 65 66 28 29 3b 0a 20  root.as_ref();. 
0c80: 20 20 20 6c 65 74 20 6e 61 6d 65 20 3d 20 6e 61     let name = na
0c90: 6d 65 2e 61 73 5f 72 65 66 28 29 3b 0a 0a 20 20  me.as_ref();..  
0ca0: 20 20 69 66 20 21 6e 61 6d 65 2e 69 73 5f 72 65    if !name.is_re
0cb0: 6c 61 74 69 76 65 28 29 20 26 26 20 21 6e 61 6d  lative() && !nam
0cc0: 65 2e 73 74 61 72 74 73 5f 77 69 74 68 28 72 6f  e.starts_with(ro
0cd0: 6f 74 29 20 7b 0a 20 20 20 20 20 20 20 20 62 61  ot) {.        ba
0ce0: 69 6c 21 28 22 69 6e 70 75 74 20 27 7b 7d 27 20  il!("input '{}' 
0cf0: 69 73 20 6e 6f 74 20 69 6e 20 77 6f 72 6b 20 64  is not in work d
0d00: 69 72 20 27 7b 7d 27 22 2c 20 6e 61 6d 65 2e 64  ir '{}'", name.d
0d10: 69 73 70 6c 61 79 28 29 2c 20 72 6f 6f 74 2e 64  isplay(), root.d
0d20: 69 73 70 6c 61 79 28 29 29 3b 0a 20 20 20 20 7d  isplay());.    }
0d30: 0a 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 64 69  ..    let mut di
0d40: 72 73 20 3d 20 76 65 63 21 5b 5d 3b 0a 20 20 20  rs = vec![];.   
0d50: 20 6c 65 74 20 6d 75 74 20 66 69 6c 65 73 20 3d   let mut files =
0d60: 20 76 65 63 21 5b 5d 3b 0a 20 20 20 20 66 6f 72   vec![];.    for
0d70: 20 65 6e 74 72 79 20 69 6e 20 57 61 6c 6b 44 69   entry in WalkDi
0d80: 72 3a 3a 6e 65 77 28 72 6f 6f 74 2e 6a 6f 69 6e  r::new(root.join
0d90: 28 6e 61 6d 65 29 29 20 7b 0a 20 20 20 20 20 20  (name)) {.      
0da0: 20 20 6c 65 74 20 65 6e 74 72 79 20 3d 20 65 6e    let entry = en
0db0: 74 72 79 3f 3b 0a 20 20 20 20 20 20 20 20 6c 65  try?;.        le
0dc0: 74 20 70 61 74 68 20 3d 20 65 6e 74 72 79 2e 70  t path = entry.p
0dd0: 61 74 68 28 29 2e 73 74 72 69 70 5f 70 72 65 66  ath().strip_pref
0de0: 69 78 28 72 6f 6f 74 29 3f 3b 0a 20 20 20 20 20  ix(root)?;.     
0df0: 20 20 20 6c 65 74 20 70 61 74 68 20 3d 20 70 61     let path = pa
0e00: 74 68 5f 74 6f 5f 73 74 72 28 26 70 61 74 68 29  th_to_str(&path)
0e10: 3f 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 65  ?;..        if e
0e20: 6e 74 72 79 2e 66 69 6c 65 5f 74 79 70 65 28 29  ntry.file_type()
0e30: 2e 69 73 5f 64 69 72 28 29 20 7b 0a 20 20 20 20  .is_dir() {.    
0e40: 20 20 20 20 20 20 20 20 64 69 72 73 2e 70 75 73          dirs.pus
0e50: 68 28 70 61 74 68 2e 74 6f 5f 6f 77 6e 65 64 28  h(path.to_owned(
0e60: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  ));.        } el
0e70: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
0e80: 20 66 69 6c 65 73 2e 70 75 73 68 28 70 61 74 68   files.push(path
0e90: 2e 74 6f 5f 6f 77 6e 65 64 28 29 29 3b 0a 20 20  .to_owned());.  
0ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0eb0: 20 20 4f 6b 28 28 64 69 72 73 2c 20 66 69 6c 65    Ok((dirs, file
0ec0: 73 29 29 0a 7d 0a 0a 73 74 72 75 63 74 20 54 65  s)).}..struct Te
0ed0: 65 3c 41 2c 20 42 3e 28 41 2c 20 42 29 3b 0a 0a  e<A, B>(A, B);..
0ee0: 69 6d 70 6c 3c 41 3a 20 57 72 69 74 65 2c 20 42  impl<A: Write, B
0ef0: 3a 20 57 72 69 74 65 3e 20 57 72 69 74 65 20 66  : Write> Write f
0f00: 6f 72 20 54 65 65 3c 41 2c 20 42 3e 20 7b 0a 20  or Tee<A, B> {. 
0f10: 20 20 20 66 6e 20 77 72 69 74 65 28 26 6d 75 74     fn write(&mut
0f20: 20 73 65 6c 66 2c 20 62 75 66 3a 20 26 5b 75 38   self, buf: &[u8
0f30: 5d 29 20 2d 3e 20 69 6f 3a 3a 52 65 73 75 6c 74  ]) -> io::Result
0f40: 3c 75 73 69 7a 65 3e 20 7b 0a 20 20 20 20 20 20  <usize> {.      
0f50: 20 20 73 65 6c 66 2e 30 2e 77 72 69 74 65 5f 61    self.0.write_a
0f60: 6c 6c 28 62 75 66 29 0a 20 20 20 20 20 20 20 20  ll(buf).        
0f70: 20 20 20 20 2e 61 6e 64 28 73 65 6c 66 2e 31 2e      .and(self.1.
0f80: 77 72 69 74 65 5f 61 6c 6c 28 62 75 66 29 29 0a  write_all(buf)).
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 2e 61 6e 64              .and
0fa0: 28 4f 6b 28 62 75 66 2e 6c 65 6e 28 29 29 29 0a  (Ok(buf.len())).
0fb0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 66 6c      }..    fn fl
0fc0: 75 73 68 28 26 6d 75 74 20 73 65 6c 66 29 20 2d  ush(&mut self) -
0fd0: 3e 20 69 6f 3a 3a 52 65 73 75 6c 74 3c 28 29 3e  > io::Result<()>
0fe0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
0ff0: 30 2e 66 6c 75 73 68 28 29 2e 61 6e 64 28 73 65  0.flush().and(se
1000: 6c 66 2e 31 2e 66 6c 75 73 68 28 29 29 0a 20 20  lf.1.flush()).  
1010: 20 20 7d 0a 7d 0a                                  }.}.