Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/jez/as-tree

Print a list of paths as a tree of paths 🌳
https://github.com/jez/as-tree

cli

Last synced: about 1 month ago
JSON representation

Print a list of paths as a tree of paths 🌳

Lists

README

        

# as-tree

[![Build Status](https://travis-ci.org/jez/as-tree.svg?branch=master)](https://travis-ci.org/jez/as-tree)

Print a list of paths as a tree of paths.

For example, given:

```
dir1/foo.txt
dir1/bar.txt
dir2/qux.txt
```

it will print:

```
.
├── dir1
│ ├── foo.txt
│ └── bar.txt
└── dir2
└── qux.txt
```

This tool is particularly useful when used with `find` or `fd` to produce such
a list of files. It's similar in spirit to `tree`, but `find` and `fd` tend to
be more powerful when it comes to controlling which files to list.

Inspired by [this feature request](https://github.com/sharkdp/fd/issues/283).

## Install

There are pre-built binary releases in the Releases tab.

This project is written in Rust and builds under both Bazel and Cargo.

To install from source using Cargo:

```shell
cargo install -f --git https://github.com/jez/as-tree
```

To install from source using Bazel:

```shell
git clone https://github.com/jez/as-tree
cd as-tree
make install
```

## Usage

```
❯ as-tree --help
Print a list of paths as a tree of paths.

Usage:
as-tree [options] []

Arguments:
The file to read from. When omitted, reads from stdin.

Options:
--color (always|auto|never)
Whether to colorize the output [default: auto]
-f Prints the full path prefix for each file.
-h, --help Print this help message

Example:
find . -name '*.txt' | as-tree
```

## Example

This tool is particularly useful with tools like `fd` which can prune the list
of files to print better than `tree` can alone.

```
❯ fd --exclude test | as-tree
.
├── LICENSE.md
├── Makefile
├── README.md
├── WORKSPACE
├── bazel
├── main
│ ├── BUILD
│ └── main.cc
├── third_party
│ ├── BUILD
│ ├── externals.bzl
│ └── spdlog.BUILD
└── tools
├── BUILD
├── clang.bzl
└── scripts
├── build_compilation_db.sh
└── generate_compdb_targets.sh
```

## Developing

Running the tests requires Bazel. The `./bazel` shell script in this repo will
download and cache a specific version of Bazel for you. From there, Bazel knows
how to install all the dependencies it needs to build this project (including a
Rust toolchain).

```shell
# Run the tests:
./bazel test --test_output=errors //test

# To add a test, create two files:
#
# - test/fixtures/foo.txt
# - test/fixtures/foo.txt.exp
#
# The first file is the input to feed to `as-tree`, and the second is the
# expected output of `as-tree` on that input

# Update all the tests:
./bazel test //test:update

# When you add a new dependency, you'll need to add it with Bazel too:
cargo install cargo-raze # (one time setup)
cd third_party/cargo
cargo raze
```

## TODO(jez)

- rustfmt / buildifier / shellcheck in CI
- [ ] Only use box drawing characters if the locale supports it
- See `man locale`, `LC_CTYPE=C tree`
- [ ] Add a `-0` flag to support files with newlines in their name
- Seriously why is this allowed?