Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/kbknapp/cargo-count

a cargo subcommand for counting lines of code in Rust projects
https://github.com/kbknapp/cargo-count

Last synced: 3 months ago
JSON representation

a cargo subcommand for counting lines of code in Rust projects

Awesome Lists containing this project

README

        

# cargo-count

[![Join the chat at https://gitter.im/kbknapp/cargo-count](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kbknapp/cargo-count?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

Linux: [![Build Status](https://travis-ci.org/kbknapp/cargo-count.svg?branch=master)](https://travis-ci.org/kbknapp/cargo-count)

A cargo subcommand for displaying line counts of source code in projects, including a niave `unsafe` counter for Rust source files. This subcommand was originally based off and inspired by the project [tokei](https://github.com/aaronepower/tokei) by [Aaronepower](https://github.com/aaronepower)

## Demo

To count the source code in the [Rust](https://github.com/rust-lang/rust) repository (checkout `4c99649`), and print some naive statistics on how much "unsafe" code exists.

**NOTE:** The Rust repository is quite large, if you're on a slow internet connect consider using a smaller repository, such as the `cargo-count` repo.

```
$ git clone https://github.com/rust-lang/rust
$ cd rust
$ cargo count --separator , --unsafe-statistics
Gathering information...
Language Files Lines Blanks Comments Code Unsafe (%)
-------- ----- ----- ------ -------- ---- ----------
Rust 6,018 528,510 66,984 133,698 327,792 3,163 (0.96%)
C 54 9,962 1,445 1,492 7,025 7,025 (100.00%)
CSS 4 1,266 149 52 1,065
JavaScript 4 1,118 131 166 821
Python 31 4,797 843 585 3,369
C Header 13 1,865 284 585 996 996 (100.00%)
C++ 4 1,611 185 81 1,345 1,345 (100.00%)
-------- ----- ----- ------ -------- ---- ----------
Totals: 6,128 549,129 70,021 136,659 342,413 12,529 (3.66%)

```

The `--separator ,` sets a `,` character as the thousands separator, and `--unsafe-statistics` looks for, and counts lines of `unsafe`.

## Installing

`cargo-count` can be installed with `cargo install`

```
$ cargo install cargo-count
```

This may require a nightly version of `cargo` if you get an error about the `install` command not being found. You may also compile and install the traditional way by followin the instructions below.

## Compiling

Follow these instructions to compile `cargo-count`, then skip down to Installation.

1. Ensure you have current version of `cargo` and [Rust](https://www.rust-lang.org) installed
2. Clone the project `$ git clone https://github.com/kbknapp/cargo-count && cd cargo-count`
3. Build the project `$ cargo build --release` (**NOTE:** There is a large performance differnce when compiling without optimizations, so I recommend alwasy using `--release` to enable to them)
4. Once complete, the binary will be located at `target/release/cargo-count`

## Installation and Usage

All you need to do is place `cargo-count` somewhere in your `$PATH`. Then run `cargo count` anywhere in your project directory. For full details see below.

### Linux / OS X

You have two options, place `cargo-count` into a directory that is already located in your `$PATH` variable (To see which directories those are, open a terminal and type `echo "${PATH//:/\n}"`, the quotation marks are important), or you can add a custom directory to your `$PATH`

**Option 1**
If you have write permission to a directory listed in your `$PATH` or you have root permission (or via `sudo`), simply copy the `cargo-count` to that directory `# sudo cp cargo-count /usr/local/bin`

**Option 2**
If you do not have root, `sudo`, or write permission to any directory already in `$PATH` you can create a directory inside your home directory, and add that. Many people use `$HOME/.bin` to keep it hidden (and not clutter your home directory), or `$HOME/bin` if you want it to be always visible. Here is an example to make the directory, add it to `$PATH`, and copy `cargo-count` there.

Simply change `bin` to whatever you'd like to name the directory, and `.bashrc` to whatever your shell startup file is (usually `.bashrc`, `.bash_profile`, or `.zshrc`)

```sh
$ mkdir ~/bin
$ echo "export PATH=$PATH:$HOME/bin" >> ~/.bashrc
$ cp cargo-count ~/bin
$ source ~/.bashrc
```

### Windows

On Windows 7/8 you can add directory to the `PATH` variable by opening a command line as an administrator and running

```sh
C:\> setx path "%path%;C:\path\to\cargo-count\binary"
```

Otherwise, ensure you have the `cargo-count` binary in the directory which you operating in the command line from, because Windows automatically adds your current directory to PATH (i.e. if you open a command line to `C:\my_project\` to use `cargo-count` ensure `cargo-count.exe` is inside that directory as well).

### Options

There are a few options for using `cargo-count` which should be somewhat self explanitory.

```
USAGE:
cargo count [FLAGS] [OPTIONS] [--] [ARGS]

FLAGS:
-S, --follow-symlinks Follows symlinks and counts source files it finds
-a, --all Do not ignore .gitignored paths
(Defaults to false when omitted)
-h, --help Prints help information
--unsafe-statistics Displays lines and percentages of "unsafe" code
-V, --version Prints version information
-v, --verbose Print verbose output

OPTIONS:
-l, --language ... Only count these languges (by source code extension)
(i.e. '-l js py cpp')
-e, --exclude ... Files or directories to exclude (automatically includes '.git')
--utf8-rule Sets the UTF-8 parsing rule (Defaults to 'strict')
[values: ignore lossy strict]
-s, --separator Set the thousands separator for pretty printing

ARGS:
to_count... The files or directories (including children) to count
(defaults to current working directory when omitted)

When using '--exclude ' the path given can either be relative to the current
directory, or absolute. When '' is a file, it must be relative to the current
directory or it will not be found. Example, if the current directory has a child
directory named 'target' with a child fild 'test.rs' and you use `--exclude target/test.rs'

Globs are also supported. For example, to exclude 'test.rs' files from all child directories
of the current directory you could do '--exclude */test.rs'.
```

## License

`cargo-count` is released under the terms of the MIT. See the LICENSE-MIT file for the details.

## Dependencies Tree
![cargo-count dependencies](cargo-count.png)