Skip to content

Commit

Permalink
Add append_dir_all doc test without renaming (#365)
Browse files Browse the repository at this point in the history
This adds a doc test that shows how to add the contents of a directory to an archive without renaming them.

## Context

It might seem silly, but I was unsure of the correct way to write all contents of a directory to an archive without renaming. I initially looked for a different associated function that only took one argument but couldn't find one. When that failed I guessed and checked that `"."` would work, and it did. On searching, others used `""`. 

It makes sense in hind-site, but I would have loved to have a signal that this was the correct way to perform that operation.

In addition to demonstrating `append_dir_all("", ...` this example also shows usage of `into_inner` to retrieve a reference to the original struct. Which is the recommended alternative to `finish`.

I certainly understand that you can't have an example for every permutation and combination, but I believe that archiving the contents of a directory without renaming is common-enough to warrant an explicit example.
  • Loading branch information
schneems authored Aug 22, 2024
1 parent 3747caf commit def682d
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,35 @@ impl<W: Write> Builder<W> {
/// // with a different name.
/// ar.append_dir_all("bardir", ".").unwrap();
/// ```
///
/// Use `append_dir_all` with an empty string as the first path argument to
/// create an archive from all files in a directory without renaming.
///
/// ```
/// use std::fs;
/// use std::path::PathBuf;
/// use tar::{Archive, Builder};
///
/// let tmpdir = tempfile::tempdir().unwrap();
/// let path = tmpdir.path();
/// fs::write(path.join("a.txt"), b"hello").unwrap();
/// fs::write(path.join("b.txt"), b"world").unwrap();
///
/// // Create a tarball from the files in the directory
/// let mut ar = Builder::new(Vec::new());
/// ar.append_dir_all("", path).unwrap();
///
/// // List files in the archive
/// let archive = ar.into_inner().unwrap();
/// let archived_files = Archive::new(archive.as_slice())
/// .entries()
/// .unwrap()
/// .map(|entry| entry.unwrap().path().unwrap().into_owned())
/// .collect::<Vec<_>>();
///
/// assert!(archived_files.contains(&PathBuf::from("a.txt")));
/// assert!(archived_files.contains(&PathBuf::from("b.txt")));
/// ```
pub fn append_dir_all<P, Q>(&mut self, path: P, src_path: Q) -> io::Result<()>
where
P: AsRef<Path>,
Expand Down

0 comments on commit def682d

Please sign in to comment.