Skip to content

Commit

Permalink
ci: update deployment for doc rearrangement
Browse files Browse the repository at this point in the history
This fixes CI to handle the new documentation files. We also continue to
do more cleanup. In particular, we devise a nicer way of detecting the
most recent Cargo OUT_DIR by writing a dummy file, and looking for the
most recently modified version of that file.
  • Loading branch information
BurntSushi committed Feb 10, 2018
1 parent 904c75b commit 09c5b2c
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 38 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ target
/ignore/Cargo.lock
/termcolor/Cargo.lock
/wincolor/Cargo.lock
/deployment

# Snapcraft files
stage
prime
parts
*.snap
*.pyc
ripgrep*_source.tar.bz2
ripgrep*_source.tar.bz2
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ before_deploy: ci/before_deploy.sh
deploy:
provider: releases
file_glob: true
file: deployment/${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}.*
file: deployment/${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}.tar.gz
skip_cleanup: true
on:
condition: $TRAVIS_RUST_VERSION = nightly
Expand Down
9 changes: 9 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ fn main() {
}
};
fs::create_dir_all(&outdir).unwrap();

let stamp_path = Path::new(&outdir).join("ripgrep-stamp");
if let Err(err) = File::create(&stamp_path) {
panic!("failed to write {}: {}", stamp_path.display(), err);
}
if let Err(err) = generate_man_page(&outdir) {
eprintln!("failed to generate man page: {}", err);
}
Expand Down Expand Up @@ -65,6 +70,10 @@ fn generate_man_page<P: AsRef<Path>>(outdir: P) -> io::Result<()> {
eprintln!("Error from running 'a2x': {}", err);
return Ok(());
}
// 1. Read asciidoc template.
// 2. Interpolate template with auto-generated docs.
// 3. Save interpolation to disk.
// 4. Use a2x (part of asciidoc) to convert to man page.
let outdir = outdir.as_ref();
let cwd = env::current_dir()?;
let tpl_path = cwd.join("doc").join("rg.1.txt.tpl");
Expand Down
40 changes: 24 additions & 16 deletions ci/before_deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,39 @@ mk_artifacts() {
}

mk_tarball() {
# When cross-compiling, use the right `strip` tool on the binary.
local gcc_prefix="$(gcc_prefix)"
local td="$(mktemp -d)"
# Create a temporary dir that contains our staging area.
# $tmpdir/$name is what eventually ends up as the deployed archive.
local tmpdir="$(mktemp -d)"
local name="${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}"
local staging="$td/$name"
mkdir -p "$staging/complete"
local staging="$tmpdir/$name"
mkdir -p "$staging"/{complete,doc}
# The deployment directory is where the final archive will reside.
# This path is known by the .travis.yml configuration.
local out_dir="$(pwd)/deployment"
mkdir -p "$out_dir"
# Find the correct (most recent) Cargo "out" directory. The out directory
# contains shell completion files and the man page.
local cargo_out_dir="$(cargo_out_dir "target/$TARGET")"

# Copy the ripgrep binary and strip it.
cp target/$TARGET/release/rg "$staging/rg"
cp "target/$TARGET/release/rg" "$staging/rg"
"${gcc_prefix}strip" "$staging/rg"
# Copy the README and licenses.
# Copy the licenses and README.
cp {README.md,UNLICENSE,COPYING,LICENSE-MIT} "$staging/"
# Copy documentation and man page.
cp {CHANGELOG.md,FAQ.md,GUIDE.md} "$staging/doc/"
if command -V a2x 2>&1 > /dev/null; then
# The man page should only exist if we have asciidoc installed.
cp "$cargo_out_dir/rg.1" "$staging/doc/"
fi
# Copy shell completion files.
cp \
target/"$TARGET"/release/build/ripgrep-*/out/{rg.bash,rg.fish,_rg.ps1} \
"$staging/complete/"
cp complete/_rg "$td/$name/complete/"
# Copy man page.
cp \
target/"$TARGET"/release/build/ripgrep-*/out/rg.1 \
"$td/$name/"

(cd "$td" && tar czf "$out_dir/$name.tar.gz" *)
rm -rf "$td"
cp "$cargo_out_dir"/{rg.bash,rg.fish,_rg.ps1} "$staging/complete/"
cp complete/_rg "$staging/complete/"

(cd "$tmpdir" && tar czf "$out_dir/$name.tar.gz" "$name")
rm -rf "$tmpdir"
}

main() {
Expand Down
9 changes: 9 additions & 0 deletions ci/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ install_targets() {
fi
}

install_osx_dependencies() {
if ! is_osx; then
return
fi

brew install asciidoc
}

configure_cargo() {
local prefix=$(gcc_prefix)
if [ -n "${prefix}" ]; then
Expand All @@ -44,6 +52,7 @@ EOF
}

main() {
install_osx_dependencies
install_rustup
install_targets
configure_cargo
Expand Down
36 changes: 16 additions & 20 deletions ci/script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,16 @@ main() {
# output of cargo a little trickier. So just wipe it.
cargo clean
# Test a normal debug build.
cargo build --target "${TARGET}" --verbose --all
cargo build --target "$TARGET" --verbose --all

# Show the output of build.rs stderr.
# Show the output of the most recent build.rs stderr.
set +x
find ./target/"$TARGET"/debug -name stderr | while read stderr; do
if [ -s "$stderr" ]; then
echo "===== $stderr ====="
cat "$stderr"
echo "====="
fi
done
stderr="$(find "target/$TARGET/debug" -name stderr -print0 | xargs -0 ls -t | head -n1)"
if [ -s "$stderr" ]; then
echo "===== $stderr ====="
cat "$stderr"
echo "====="
fi
set -x

# sanity check the file type
Expand All @@ -37,19 +36,16 @@ main() {
"$(dirname "${0}")/test_complete.sh"

# Check that we've generated man page and other shell completions.
find ./target/"$TARGET"/debug/build/ripgrep-* -name 'out' | \
while read outdir; do
file "$outdir/rg.bash"
file "$outdir/rg.fish"
file "$outdir/_rg.ps1"
# man page requires asciidoc, and we only install it on Linux x86.
if is_linux; then
file "$outdir/rg.1"
fi
done
outdir="$(cargo_out_dir "target/$TARGET/debug")"
file "$outdir/rg.bash"
file "$outdir/rg.fish"
file "$outdir/_rg.ps1"
# N.B. man page isn't generated on ARM cross-compile, but we gave up
# long before this anyway.
file "$outdir/rg.1"

# Run tests for ripgrep and all sub-crates.
cargo test --target "${TARGET}" --verbose --all
cargo test --target "$TARGET" --verbose --all
}

main
21 changes: 21 additions & 0 deletions ci/utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

# Various utility functions used through CI.

# Finds Cargo's `OUT_DIR` directory from the most recent build.
#
# This requires one parameter corresponding to the target directory
# to search for the build output.
cargo_out_dir() {
# This works by finding the most recent stamp file, which is produced by
# every ripgrep build.
target_dir="$1"
find "$target_dir" -name ripgrep-stamp -print0 \
| xargs -0 ls -t \
| head -n1 \
| xargs dirname
}

host() {
case "$TRAVIS_OS_NAME" in
linux)
Expand Down Expand Up @@ -68,3 +82,10 @@ is_linux() {
*) return 1 ;;
esac
}

is_osx() {
case "$TRAVIS_OS_NAME" in
osx) return 0 ;;
*) return 1 ;;
esac
}

0 comments on commit 09c5b2c

Please sign in to comment.