1
0
mirror of https://github.com/sharkdp/bat synced 2026-08-03 18:51:44 +00:00

Compare commits

...

141 Commits

Author SHA1 Message Date
David Peter 589df6792f Add note on vulnerability reporting, closes #1473 2021-07-13 11:00:36 +02:00
David Peter 945bba777b Upgrade CHANGELOG with security vulnerability notice 2021-07-13 10:56:51 +02:00
David Peter 64763eafbe Update Julia syntax test 2021-07-13 09:07:29 +02:00
David Peter 3da4651569 Update Julia syntax, closes #1692 2021-07-13 08:50:23 +02:00
David Peter 311ed2feca Update assets 2021-07-13 08:32:26 +02:00
David Peter 33c11d64f0 Run cargo fmt 2021-07-13 08:19:59 +02:00
David Peter a4b674902f Bump version to v0.18.2 2021-07-12 23:17:48 +02:00
David Peter 3fa09dbe2e Use resolved path for --diagnostic as well 2021-07-12 23:17:30 +02:00
David Peter bf2b2df9c9 Fix for Windows: do not run binaries from CWD
This fixes a bug on Windows where `Command::new` would also run
executables from the current working directory, possibly resulting in
accidental runs of programs called `less`.
2021-07-12 23:17:30 +02:00
dependabot[bot] 3617c98cf5 Bump assets/syntaxes/02_Extra/CMake from 7d6231c to ab6ef4e
Bumps [assets/syntaxes/02_Extra/CMake](https://github.com/zyxar/Sublime-CMakeLists) from `7d6231c` to `ab6ef4e`.
- [Release notes](https://github.com/zyxar/Sublime-CMakeLists/releases)
- [Commits](https://github.com/zyxar/Sublime-CMakeLists/compare/7d6231c934e097f51d329c900f9dd9dd9286e125...ab6ef4ef9f9b974806ea0788430a8c087ebe3761)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/CMake
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-12 21:19:05 +02:00
dependabot[bot] 774d36c989 Bump ansi_colours from 1.0.2 to 1.0.4
Bumps [ansi_colours](https://github.com/mina86/ansi_colours) from 1.0.2 to 1.0.4.
- [Release notes](https://github.com/mina86/ansi_colours/releases)
- [Commits](https://github.com/mina86/ansi_colours/commits)

---
updated-dependencies:
- dependency-name: ansi_colours
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-12 21:18:42 +02:00
dependabot[bot] 6abd61865f Bump globset from 0.4.6 to 0.4.8
Bumps [globset](https://github.com/BurntSushi/ripgrep) from 0.4.6 to 0.4.8.
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/globset-0.4.6...globset-0.4.8)

---
updated-dependencies:
- dependency-name: globset
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-12 21:18:21 +02:00
David Peter 3c59b98dc8 Add CHANGELOG entry for #1687 2021-07-09 06:36:06 +02:00
David Peter 21338ed789 Abort ignored filename suffix stripping early on unworkable filenames 2021-07-09 06:34:11 +02:00
David Peter dc8ab0b5ce Simplify ignored filename suffix stripping 2021-07-09 06:34:11 +02:00
Ville Skyttä ddb39ef2f6 Add syntax tests for ignored filename suffixes 2021-07-09 06:34:11 +02:00
Ville Skyttä 355e62efe9 Find syntax ignoring known backup/template filename suffixes
For example, fall back to `foo.extension` for `foo.extension~`,
`foo.extension.orig`, `foo.extension.in.in` etc.
2021-07-09 06:34:11 +02:00
David Peter fddd11a205 CICD: sync with pastel, minor changes 2021-07-05 17:24:59 +02:00
Ville Skyttä 8b37e62cf3 Add some more options to bash completion
https://github.com/sharkdp/bat/pull/1702#issuecomment-872452683
2021-07-01 22:47:00 +02:00
dependabot[bot] 4296d47dcb Bump assert_cmd from 1.0.4 to 1.0.5
Bumps [assert_cmd](https://github.com/assert-rs/assert_cmd) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/assert-rs/assert_cmd/releases)
- [Changelog](https://github.com/assert-rs/assert_cmd/blob/master/CHANGELOG.md)
- [Commits](https://github.com/assert-rs/assert_cmd/compare/v1.0.4...v1.0.5)

---
updated-dependencies:
- dependency-name: assert_cmd
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-07-01 20:23:05 +02:00
Frederick Zhang 42f1ef019a Fix missing config/cache arguments in Zsh completion 2021-06-28 11:59:01 +02:00
Frederick Zhang fe8e526292 Document --generate-config-file in manual 2021-06-28 11:59:01 +02:00
Ville Skyttä 0e9d612173 Add change log entry for bash completion 2021-06-28 11:58:03 +02:00
Ville Skyttä 06c601bc7c Depend on scop/bash-completion
For = option/arg separator support, improved mid-word completion
behavior, code cleanliness.
2021-06-28 11:58:03 +02:00
Ville Skyttä 229fbc1a18 Add missing comment about --theme arg escaping 2021-06-28 11:58:03 +02:00
Ville Skyttä e05f5010da Add bash completion
Closes https://github.com/sharkdp/bat/issues/1010
2021-06-28 11:58:03 +02:00
Martin Nordholts 073b9968c0 pretty_printer.rs: Don't use a URL as an example Input title
Otherwise Rust 1.53.0 gets confused during `cargo doc` because it thinks
we want an actual URL:

    warning: this URL is not a hyperlink
    --> src/pretty_printer.rs:331:40
        |
    331 |     /// The title for the input (e.g. "http://example.com/example.txt")
        |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `<http://example.com/example.txt>`
        |
        = note: `#[warn(rustdoc::bare_urls)]` on by default
        = note: bare URLs are not automatically turned into clickable links

It was perhaps also a bit confusing to give an URL as an example in the
first place, because according to our own API example
`examples/inputs.rs` it is meant to be more a free-text thing.
2021-06-28 07:10:30 +02:00
Rémi Ait-Younes d3aa17ae77 Update README.md 2021-06-27 21:08:59 +02:00
Rémi Ait-Younes 4187eed12b Update README.md 2021-06-27 21:08:59 +02:00
Mohamed Abdelnour 12ecb325c9 Modify Linguist overrides 2021-06-14 08:36:20 +02:00
Ville Skyttä 90e48e9b61 Spelling fixes 2021-06-13 22:08:56 +02:00
Kid 35f31270f3 Highlight mtab files with fstab highlighting 2021-06-10 14:46:36 +02:00
Martin Nordholts 2a71852070 README.md: List compatibility as another advantage to 3-bit themes
See discussion in #1681.
2021-06-10 13:54:24 +02:00
Martin Nordholts c8dd32802d README.md: Mention that PAGER is ignored if set to more or most
Fixes #1666
2021-06-08 07:13:46 +02:00
dependabot[bot] 71f04dc0e8 Bump nix from 0.20.0 to 0.21.0
Bumps [nix](https://github.com/nix-rust/nix) from 0.20.0 to 0.21.0.
- [Release notes](https://github.com/nix-rust/nix/releases)
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.20.0...v0.21.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-05 16:50:41 +02:00
dependabot[bot] 49f8bbfee4 Bump assert_cmd from 1.0.3 to 1.0.4
Bumps [assert_cmd](https://github.com/assert-rs/assert_cmd) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/assert-rs/assert_cmd/releases)
- [Changelog](https://github.com/assert-rs/assert_cmd/blob/master/CHANGELOG.md)
- [Commits](https://github.com/assert-rs/assert_cmd/compare/v1.0.3...v1.0.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-02 08:04:30 +02:00
Martin Nordholts f4217eba73 Merge pull request #1669 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/DotENV-58201ba
Bump assets/syntaxes/02_Extra/DotENV from `a1c9176` to `58201ba`
2021-06-02 07:48:13 +02:00
Mohamed Abdelnour 14900f6ed8 Update CHANGELOG.md for #1668 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour c18afcb01a Add Verilog syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 63043d4a60 Add varlink syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 76034880ae Add TypeScriptReact syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 768189859a Add Stylus syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 6e5a2a5c51 Add Strace syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 9935c4984c Add Robot Framework syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour a0a5e30c39 Add Rego syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 4126bbeead Add Puppet syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour a5b79295d7 Add NAnt Build File syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour e917784932 Add Literate Haskell syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour f46b90d28d Add jsonnet syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 64cbfbed47 Add Java Server Page (JSP) syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 1ced35ec76 Add 'NOTICE' to list of file names to skip 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 16d346773b Add Fortran Namelist syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour b02120cf66 Add Fortran (Fixed Form) syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour 702b5caf2d Add Fortran (Modern) syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour d395f64f58 Add F# syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour c9627040cc Add CoffeeScript syntax test file 2021-06-01 22:36:56 +02:00
Mohamed Abdelnour b1f69434f9 Add Cabal syntax test file 2021-06-01 22:36:56 +02:00
Martin Nordholts bcca56e3b1 CHANGELOG.md: Apply DotENV syntax also for .env.default and .env.defaults 2021-06-01 18:45:17 +02:00
Martin Nordholts 2f98610929 DotENV.sublime-syntax: Re-exported after .tmLanguage update
Exported from licenced version of Sublime Text, Version 3.1.1, Build
3176.
2021-06-01 18:39:39 +02:00
dependabot[bot] 89539ff247 Bump assets/syntaxes/02_Extra/DotENV from a1c9176 to 58201ba
Bumps [assets/syntaxes/02_Extra/DotENV](https://github.com/zaynali53/DotENV) from `a1c9176` to `58201ba`.
- [Release notes](https://github.com/zaynali53/DotENV/releases)
- [Commits](https://github.com/zaynali53/DotENV/compare/a1c917633d3f3c4222cdcfac5b46831abff54d65...58201ba2abbbe6a12b2f6d0595efea3b388c1e38)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 02:01:58 +00:00
Mohamed Abdelnour aa74d19940 Refactor "Use matches macro" 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour cf7d9ef962 Update CHANGELOG.md for #1661 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour 425a0f90e9 Use the functional update syntax 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour a27814db8e Implement From<..> instead of Into<..> 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour 9702f5256c Use the functional update syntax 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour 23fd11e806 Use matches macro 2021-05-27 12:05:07 +02:00
Mohamed Abdelnour 304ee1489c Use !theme.is_empty() 2021-05-27 12:05:07 +02:00
Ryooooooga 07d4179274 ja: add section about integration with fzf
ref: c569774e1a
2021-05-24 22:12:43 +02:00
Ryooooooga 1439dde265 ja: fix typo 2021-05-24 22:12:43 +02:00
Keith Hall bef0bf1654 Merge pull request #1654 from mohamed-abdelnour/support-dash-syntax
Add support for dash shebang
2021-05-15 11:33:23 +03:00
Mohamed Abdelnour 8435cad602 Merge master 2021-05-15 09:41:27 +02:00
Keith Hall 52c11fe23d Merge pull request #1655 from mohamed-abdelnour/support-xaml-files
Add support for XAML files
2021-05-15 10:02:11 +03:00
Mohamed Abdelnour 6fc9641f6a Update CHANGELOG for #1655 2021-05-15 00:13:42 +02:00
Mohamed Abdelnour 8b6341458b Add XAML test file 2021-05-14 23:59:11 +02:00
Mohamed Abdelnour 8b787b4f70 Add dash test file 2021-05-14 23:02:23 +02:00
Mohamed Abdelnour ef5154d5b3 Update CHANGELOG for #1654 2021-05-14 22:12:58 +02:00
Mohamed Abdelnour 7c49919297 Add support for XAML files 2021-05-14 18:43:06 +02:00
Mohamed Abdelnour 395a169104 Add support for dash shebang 2021-05-14 18:16:38 +02:00
David Peter 93f710bdff Merge pull request #1652 from Zeta611/master
Update the Korean version of the README
2021-05-14 17:15:06 +02:00
Jaeho Lee 170badfdd1 Fix broken img link 2021-05-14 14:15:14 +00:00
Jaeho Lee 978b9adc56 Update and polish Korean translation
- Fix Korean grammar
- Show original English words that can improve comprehensiveness side-by-side
- Reflect the updated README
- Fix broken links
- Other miscellaneous improvements
2021-05-14 13:52:12 +00:00
David Peter 3aea51455b Merge pull request #1649 from sharkdp/v0.18.1
bat 0.18.1
2021-05-13 10:06:50 +02:00
David Peter f827ed338b Update binary assets 2021-05-12 22:55:40 +02:00
David Peter 73dab51ad1 Bump version, update dependencies 2021-05-12 22:55:25 +02:00
David Peter 9328007d05 Updated CHANGELOG 2021-05-12 22:46:44 +02:00
David Peter 8d173cd960 Merge pull request #1598 from PatriotRossii/feature/dark_plus_theme
Add Dark+ theme
2021-05-12 22:45:53 +02:00
David Peter fb0f12a221 Merge pull request #1643 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/Lean-29a03a8
Bump assets/syntaxes/02_Extra/Lean from `824213d` to `29a03a8`
2021-05-12 22:35:01 +02:00
David Peter 9866408b72 Merge pull request #1647 from sharkdp/dependabot/cargo/serde-1.0.125
Bump serde from 1.0.124 to 1.0.125
2021-05-12 22:34:36 +02:00
David Peter aaac56d895 Merge pull request #1648 from sharkdp/dependabot/cargo/console-0.14.1
Bump console from 0.14.0 to 0.14.1
2021-05-12 22:34:21 +02:00
David Peter 516da7719f Merge pull request #1646 from sharkdp/dependabot/cargo/bugreport-0.4.0
Bump bugreport from 0.3.0 to 0.4.0
2021-05-12 22:34:00 +02:00
David Peter d4df0b4405 Merge pull request #1645 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/FSharp-9e4645c
Bump assets/syntaxes/02_Extra/FSharp from `c18616d` to `9e4645c`
2021-05-12 22:33:50 +02:00
David Peter bfa9c3bef6 Merge branch 'master' into feature/dark_plus_theme 2021-05-12 22:28:10 +02:00
David Peter 2904f24ea8 Merge pull request #1606 from sharkdp/syslog
Improve Syslog and general log file highlighting
2021-05-12 22:22:50 +02:00
Allen Wild 91a347bf6d Fix less version parsing for minor versions of less
Less 581.2 is here, and it has a ".2" in the version string, which can't
be parsed as a usize.

Update the check to find a non-digit character rather than a space. This
ignores the minor version, but parses the major version correctly.
2021-05-12 11:47:16 +02:00
Ersikan e219c8fc03 Update SublimeEthereum version
A fix I submitted upstream was merged, and this commit bumps the submodule
to include it.
2021-05-12 11:42:17 +02:00
Ersikan 9eb26b702c Add syntax test for Vyper language 2021-05-12 11:42:17 +02:00
Ersikan c933be926d Add syntax tests for Solidity language. 2021-05-12 11:42:17 +02:00
Ersikan fc88040b31 Add Solidity and Vyper syntax 2021-05-12 11:42:17 +02:00
David Peter 5db3c93057 Merge branch 'master' into syslog 2021-05-12 11:34:35 +02:00
David Peter aa442b5795 Merge branch 'master' into feature/dark_plus_theme 2021-05-12 11:30:49 +02:00
dependabot[bot] 09711cd6f9 Bump assets/syntaxes/02_Extra/Lean from 824213d to 29a03a8
Bumps [assets/syntaxes/02_Extra/Lean](https://github.com/leanprover/vscode-lean) from `824213d` to `29a03a8`.
- [Release notes](https://github.com/leanprover/vscode-lean/releases)
- [Commits](https://github.com/leanprover/vscode-lean/compare/824213de37245140d75cdcffb3fbd6f61f73a97c...29a03a8abaa884bde65b3c3dd1e46e87bb0fbfc4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 09:27:14 +00:00
dependabot[bot] b16cacc758 Bump assets/syntaxes/02_Extra/SCSS_Sass from 4868322 to 63819a1
Bumps [assets/syntaxes/02_Extra/SCSS_Sass](https://github.com/braver/SublimeSass) from `4868322` to `63819a1`.
- [Release notes](https://github.com/braver/SublimeSass/releases)
- [Commits](https://github.com/braver/SublimeSass/compare/4868322030c3644d6b8cfff68c85849789d9bdb2...63819a1ab6b2075360933b2cfe41b416de0e3c26)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 11:24:59 +02:00
dependabot[bot] 51451a9636 Bump console from 0.14.0 to 0.14.1
Bumps [console](https://github.com/mitsuhiko/console) from 0.14.0 to 0.14.1.
- [Release notes](https://github.com/mitsuhiko/console/releases)
- [Changelog](https://github.com/mitsuhiko/console/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mitsuhiko/console/compare/0.14.0...0.14.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 09:20:10 +00:00
dependabot[bot] fbc03da997 Bump serde from 1.0.124 to 1.0.125
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.124 to 1.0.125.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.124...v1.0.125)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 09:20:01 +00:00
dependabot[bot] 1a610dbdd2 Bump bugreport from 0.3.0 to 0.4.0
Bumps [bugreport](https://github.com/sharkdp/bugreport) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/sharkdp/bugreport/releases)
- [Commits](https://github.com/sharkdp/bugreport/compare/v0.3.0...v0.4.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 09:19:52 +00:00
dependabot[bot] a30e3c9066 Bump assets/syntaxes/02_Extra/FSharp from c18616d to 9e4645c
Bumps [assets/syntaxes/02_Extra/FSharp](https://github.com/hoest/sublimetext-fsharp) from `c18616d` to `9e4645c`.
- [Release notes](https://github.com/hoest/sublimetext-fsharp/releases)
- [Commits](https://github.com/hoest/sublimetext-fsharp/compare/c18616d6bd55b188672276da837837070170d967...9e4645c6085871d6fe4ae8dbcbafe93cb155b074)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 09:19:28 +00:00
dependabot-preview[bot] 613b41e357 Bump assets/syntaxes/02_Extra/Julia from 45a1b6f to cc13e7d
Bumps [assets/syntaxes/02_Extra/Julia](https://github.com/JuliaEditorSupport/Julia-sublime) from `45a1b6f` to `cc13e7d`.
- [Release notes](https://github.com/JuliaEditorSupport/Julia-sublime/releases)
- [Commits](https://github.com/JuliaEditorSupport/Julia-sublime/compare/45a1b6fe6cc37a2b614ae199d85c702b8711e22a...cc13e7d4ef74a6556af09d8858d2cc6a47ef5451)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 11:19:14 +02:00
dependabot-preview[bot] d405aa98d5 Bump console from 0.14.0 to 0.14.1
Bumps [console](https://github.com/mitsuhiko/console) from 0.14.0 to 0.14.1.
- [Release notes](https://github.com/mitsuhiko/console/releases)
- [Changelog](https://github.com/mitsuhiko/console/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mitsuhiko/console/compare/0.14.0...0.14.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 11:18:46 +02:00
dependabot-preview[bot] 285b1556a9 Upgrade to GitHub-native Dependabot 2021-05-12 11:18:03 +02:00
Marco Ieni 8321cc661c CI: check docs (#1612) 2021-05-12 07:20:12 +02:00
Keith Hall 848ceb6f10 Remove variable.other from CSV highlighting 2021-05-11 21:04:02 +02:00
Keith Hall 3559079de0 Improvements to CSV highlighting 2021-05-11 21:04:02 +02:00
Keith Hall b3ab843954 add warning highlighting to log file syntax definition 2021-04-09 22:09:01 +03:00
Keith Hall 867cf63dd9 add word boundaries to log syntax highlighting 2021-04-07 22:33:59 +03:00
Ethan P 0b44aa6f68 Merge pull request #1589 from Enselic/include-less-in-diagnostic
Include LESS in --diagnostic
2021-04-06 16:03:26 -07:00
Ethan P aa09a9dc04 Update changelog for #1589 2021-04-06 15:33:34 -07:00
Keith Hall 7c4edacb2b Add independent log syntax 2021-04-06 23:55:22 +03:00
Keith Hall 782ede5db5 improve syslog syntax 2021-04-05 22:24:04 +03:00
Keith Hall 1537733e6b replace Syslog dependency with a custom syntax 2021-04-04 22:47:01 +03:00
Keith Hall ba0d43672b add example syslog file for highlighting tests 2021-04-04 22:41:48 +03:00
msnspk 4384d25c79 Change TheClams/SystemVerilog submodule to use HTTPS
Using SSH to fetch the submodule was causing build failures for me, and as mentioned in #1581, this should be changed to HTTPS
2021-03-27 11:05:00 +01:00
PatriotRossii b6e3786529 Revert "Update of themes.bin that adds Dark+"
This reverts commit 6fff01397d.

Restore themes.bin
2021-03-24 21:27:02 +06:00
PatriotRossii 6fff01397d Update of themes.bin that adds Dark+ 2021-03-24 21:11:29 +06:00
PatriotRossii 0cd52e5be1 Add "Visual Studio Dark+" theme to vec of themes 2021-03-24 18:39:06 +05:00
PatriotRossii c14dd34dca Add Dark+ theme 2021-03-24 17:52:44 +05:00
Martin Nordholts e04fbd1992 Include LESS in --diagnostic
So issues like #1586 are easier to troubleshoot.
2021-03-17 21:10:16 +01:00
Sean McLoughlin d89fa3ebc2 Add SystemVerilog support 2021-03-15 07:21:15 +01:00
Sean Wei db57454f3f Update copyright year 2021-03-10 19:37:21 +01:00
Martin Nordholts 8f93844427 CICD: Remove explicit allow of clippy::match_bool since MSRV 1.45 bump
Now that we are on MSRV 1.45, there is no need to "backport" the change
that reclassified clippy::match_bool as "pedantic".
2021-03-08 07:08:55 +01:00
David Peter 52f84b063c Update dependencies, MSRV: 1.45 2021-03-07 15:33:37 +01:00
David Peter 2e7f2b6c07 'mut self' => 'self', remove pub 2021-03-07 14:59:10 +01:00
Aleksey Kladov 35347c2310 Improve readability
Using `Path`s for paths expresses intent more clearly.
2021-03-07 14:59:10 +01:00
dependabot-preview[bot] b489fc75c9 Bump assets/syntaxes/02_Extra/Crystal from 5e032ff to eb63666
Bumps [assets/syntaxes/02_Extra/Crystal](https://github.com/crystal-lang-tools/sublime-crystal) from `5e032ff` to `eb63666`.
- [Release notes](https://github.com/crystal-lang-tools/sublime-crystal/releases)
- [Commits](https://github.com/crystal-lang-tools/sublime-crystal/compare/5e032ff5f5d98c9d5d2984a1bd43b43230cd3d0a...eb63666f35c259733d4c7fcec9adbd82e5a91dda)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 12:18:40 +01:00
dependabot-preview[bot] fc24cb2a77 Bump assets/syntaxes/02_Extra/LESS from 44632e1 to a2eae04
Bumps [assets/syntaxes/02_Extra/LESS](https://github.com/danro/LESS-sublime) from `44632e1` to `a2eae04`.
- [Release notes](https://github.com/danro/LESS-sublime/releases)
- [Commits](https://github.com/danro/LESS-sublime/compare/44632e19af8370b39643dd60cd76deb7a13c63ee...a2eae0453ed062dd499e30f561bc33bbeb5804b4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 12:18:28 +01:00
David Peter 2540311cdf Update bug report issue template (--diagnostic option) 2021-03-01 08:27:07 +01:00
dependabot-preview[bot] 3880888286 Bump nix from 0.19.1 to 0.20.0
Bumps [nix](https://github.com/nix-rust/nix) from 0.19.1 to 0.20.0.
- [Release notes](https://github.com/nix-rust/nix/releases)
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 08:25:02 +01:00
dependabot-preview[bot] 5a806c2149 Bump path_abs from 0.5.0 to 0.5.1
Bumps [path_abs](https://github.com/vitiral/path_abs) from 0.5.0 to 0.5.1.
- [Release notes](https://github.com/vitiral/path_abs/releases)
- [Commits](https://github.com/vitiral/path_abs/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 08:24:13 +01:00
dependabot-preview[bot] 8a926d511a Bump assets/syntaxes/02_Extra/Julia from e2b1cb5 to 45a1b6f
Bumps [assets/syntaxes/02_Extra/Julia](https://github.com/JuliaEditorSupport/Julia-sublime) from `e2b1cb5` to `45a1b6f`.
- [Release notes](https://github.com/JuliaEditorSupport/Julia-sublime/releases)
- [Commits](https://github.com/JuliaEditorSupport/Julia-sublime/compare/e2b1cb549d57368b7b22e79430a1d5f47555e802...45a1b6fe6cc37a2b614ae199d85c702b8711e22a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 08:23:49 +01:00
dependabot-preview[bot] 8885285b10 Bump assets/syntaxes/02_Extra/Lean from 49d1853 to 824213d
Bumps [assets/syntaxes/02_Extra/Lean](https://github.com/leanprover/vscode-lean) from `49d1853` to `824213d`.
- [Release notes](https://github.com/leanprover/vscode-lean/releases)
- [Commits](https://github.com/leanprover/vscode-lean/compare/49d185361a9943f440d8efe389259a3374ade905...824213de37245140d75cdcffb3fbd6f61f73a97c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 08:23:34 +01:00
dependabot-preview[bot] d1f0181947 Bump assets/themes/zenburn from 7f6fb86 to 702023d
Bumps [assets/themes/zenburn](https://github.com/colinta/zenburn) from `7f6fb86` to `702023d`.
- [Release notes](https://github.com/colinta/zenburn/releases)
- [Commits](https://github.com/colinta/zenburn/compare/7f6fb86e0dcdd06d3c5181ad1cbe94c970834143...702023d80d9f845a5847eefc4c81c2d4dbbdac59)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 08:23:15 +01:00
David Peter b147443c32 Add new unreleased section 2021-02-28 23:28:59 +01:00
156 changed files with 11712 additions and 569 deletions
+13 -13
View File
@@ -9,11 +9,6 @@ assignees: ''
<!-- Hey there, thank you for creating an issue! -->
**What version of `bat` are you using?**
<!-- Output of `bat --version` -->
**Describe the bug you encountered:**
...
@@ -29,19 +24,24 @@ assignees: ''
---
**Environment**
**bat version and environment**
<!--
In order to reproduce your issue, please add some information about the environment
in which you're running bat.
in which you're running bat. To do this, run the full `bat` command that demonstrates
the bug, and attach the `--diagnostic` option:
Linux and MacOS:
Please run the script at
bat [other options and arguments…] --diagnostic
Finally, paste the Markdown output here. Please make sure that it does not reveal any
personal information.
If you are running bat 0.17.1 or older (where --diagnostic is not available), please
run the script at
https://github.com/sharkdp/bat/blob/master/diagnostics/info.sh
(click "Raw" to get the actual source code) and paste the Markdown output here.
Windows:
Please add your Windows Version (e.g. "Windows 10 1908")
(click "Raw" to get the actual source code) and paste the Markdown output here. If you
are on Windows, please let us know your bat version and your Windows version.
-->
+18
View File
@@ -0,0 +1,18 @@
version: 2
updates:
- package-ecosystem: cargo
directory: "/"
schedule:
interval: monthly
time: "04:00"
timezone: Europe/Berlin
ignore:
- dependency-name: git2
versions:
- 0.13.17
- package-ecosystem: gitsubmodule
directory: "/"
schedule:
interval: monthly
time: "04:00"
timezone: Europe/Berlin
+24 -17
View File
@@ -1,7 +1,7 @@
name: CICD
env:
MIN_SUPPORTED_RUST_VERSION: "1.42.0"
MIN_SUPPORTED_RUST_VERSION: "1.45.0"
CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
on:
@@ -18,8 +18,9 @@ jobs:
name: Minimum supported rust version
runs-on: ubuntu-18.04
steps:
- name: Git checkout
- name: Checkout source code
uses: actions/checkout@v2
- name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
uses: actions-rs/toolchain@v1
with:
@@ -31,9 +32,7 @@ jobs:
uses: actions-rs/cargo@v1
with:
command: clippy
# clippy::match_bool is allowed by default from Rust 1.45.0, see
# https://github.com/rust-lang/rust-clippy/commit/e1d13c34b0beaea9a5fbf13687672ef85e779d9f
args: --all-targets --all-features -- --allow clippy::match_bool
args: --all-targets --all-features
- name: Run tests
uses: actions-rs/cargo@v1
with:
@@ -81,6 +80,13 @@ jobs:
run: bat --list-languages
- name: List of themes
run: bat --list-themes
- name: Check documentation
env:
RUSTDOCFLAGS: -D warnings
uses: actions-rs/cargo@v1
with:
command: doc
args: --no-deps --document-private-items --all-features
build:
name: ${{ matrix.job.os }} (${{ matrix.job.target }})
@@ -89,17 +95,17 @@ jobs:
fail-fast: false
matrix:
job:
- { os: ubuntu-18.04 , target: arm-unknown-linux-gnueabihf , use-cross: true }
- { os: ubuntu-18.04 , target: aarch64-unknown-linux-gnu , use-cross: true }
- { os: ubuntu-18.04 , target: i686-unknown-linux-gnu , use-cross: true }
- { os: ubuntu-18.04 , target: i686-unknown-linux-musl , use-cross: true }
- { os: ubuntu-18.04 , target: x86_64-unknown-linux-gnu }
- { os: ubuntu-18.04 , target: x86_64-unknown-linux-musl , use-cross: true }
- { os: macos-10.15 , target: x86_64-apple-darwin }
# - { os: windows-2019 , target: i686-pc-windows-gnu } ## disabled; error: linker `i686-w64-mingw32-gcc` not found
- { os: windows-2019 , target: i686-pc-windows-msvc }
- { os: windows-2019 , target: x86_64-pc-windows-gnu }
- { os: windows-2019 , target: x86_64-pc-windows-msvc }
- { os: ubuntu-18.04, target: arm-unknown-linux-gnueabihf , use-cross: true }
- { os: ubuntu-18.04, target: aarch64-unknown-linux-gnu , use-cross: true }
- { os: ubuntu-18.04, target: i686-unknown-linux-gnu , use-cross: true }
- { os: ubuntu-18.04, target: i686-unknown-linux-musl , use-cross: true }
- { os: ubuntu-18.04, target: x86_64-unknown-linux-gnu }
- { os: ubuntu-18.04, target: x86_64-unknown-linux-musl , use-cross: true }
- { os: macos-10.15 , target: x86_64-apple-darwin }
# - { os: windows-2019, target: i686-pc-windows-gnu } ## disabled; error: linker `i686-w64-mingw32-gcc` not found
- { os: windows-2019, target: i686-pc-windows-msvc }
- { os: windows-2019, target: x86_64-pc-windows-gnu }
- { os: windows-2019, target: x86_64-pc-windows-msvc }
steps:
- name: Checkout source code
uses: actions/checkout@v2
@@ -115,7 +121,7 @@ jobs:
- name: Extract crate information
shell: bash
run: |
echo "PROJECT_NAME=$(sed -n 's/^name = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
echo "PROJECT_NAME=$(sed -n 's/^name = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
echo "PROJECT_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
echo "PROJECT_MAINTAINER=$(sed -n 's/^authors = \["\(.*\)"\]/\1/p' Cargo.toml)" >> $GITHUB_ENV
echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
@@ -263,6 +269,7 @@ jobs:
cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR"
# Autocompletion files
cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.bash "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.bash"
cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.fish"
cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.zsh"
+1
View File
@@ -2,6 +2,7 @@
**/*.rs.bk
# Generated files
/assets/completions/bat.bash
/assets/completions/bat.fish
/assets/completions/bat.zsh
/assets/manual/bat.1
+9 -7
View File
@@ -61,9 +61,6 @@
[submodule "assets/syntaxes/Puppet"]
path = assets/syntaxes/02_Extra/Puppet
url = https://github.com/russCloak/SublimePuppet
[submodule "assets/syntaxes/CSV"]
path = assets/syntaxes/02_Extra/CSV
url = https://github.com/wadetb/Sublime-Text-Advanced-CSV
[submodule "assets/themes/onehalf"]
path = assets/themes/onehalf
url = https://github.com/sonph/onehalf
@@ -97,10 +94,6 @@
[submodule "assets/syntaxes/Assembly (ARM)"]
path = assets/syntaxes/02_Extra/Assembly (ARM)
url = https://github.com/tvi/Sublime-ARM-Assembly
[submodule "assets/syntaxes/syslog-syntax"]
path = assets/syntaxes/02_Extra/Syslog
url = https://github.com/caos21/syslog-syntax.git
branch = master
[submodule "assets/syntaxes/protobuf-syntax-highlighting"]
path = assets/syntaxes/02_Extra/Protobuf
url = https://github.com/VcamX/protobuf-syntax-highlighting.git
@@ -216,3 +209,12 @@
[submodule "assets/syntaxes/02_Extra/gnuplot"]
path = assets/syntaxes/02_Extra/gnuplot
url = https://github.com/hesstobi/sublime_gnuplot
[submodule "assets/syntaxes/02_Extra/SystemVerilog"]
path = assets/syntaxes/02_Extra/SystemVerilog
url = https://github.com/TheClams/SystemVerilog.git
[submodule "assets/themes/visual-studio-dark-plus"]
path = assets/themes/visual-studio-dark-plus
url = https://github.com/vidann1/visual-studio-dark-plus.git
[submodule "assets/syntaxes/02_Extra/SublimeEthereum"]
path = assets/syntaxes/02_Extra/SublimeEthereum
url = https://github.com/davidhq/SublimeEthereum.git
+71 -1
View File
@@ -1,5 +1,75 @@
# unreleased
## Features
## Bugfixes
## Other
## Syntaxes
## New themes
## `bat` as a library
# v0.18.2
## Features
- Ignore known backup/template filename suffixes when selecting the syntax, see #1687 (@scop)
## Bugfixes
- Fix for a security vulnerability on Windows. Prior to this release, `bat` would execute programs called `less`/`less.exe` from the current working directory (instead of the one from `PATH`) with priority. An attacker might be able to use this by placing a malicious program in a shared directory where the user would execute `bat`. `bat` users on Windows are advised to upgrade to this version. See #1724 and #1472 (@Ry0taK).
## Other
- Add bash completion, see #1678 (@scop)
- Fix Clippy lints, see #1661 (@mohamed-abdelnour)
- Add syntax highlighting test files, see #1213 and #1668 (@mohamed-abdelnour)
## Syntaxes
- Upgraded Julia syntax to fix a highlighting bug, see #1692
- Added support for `dash` syntax, see #1654 (@mohamed-abdelnour)
- Added support for `XAML` syntax, see #1590 and #1655 (@mohamed-abdelnour)
- Apply `DotENV` syntax also for `.env.default` and `.env.defaults` files, see #1669
# v0.18.1
## Bugfixes
- Mouse support and screen clearing broken for `less` versions with minor version number (581.2), see #1629 and #1639 (@aswild)
## Other
- `Input::ordinary_file` and `Input::with_name` now accept `Path` rather than `OsStr` see #1571 (@matklad)
- The `LESS` environment variable is now included in `bat --diagnostic`, see #1589 (@Enselic)
- Increased min. required Rust version to 1.45
## Syntaxes
- Improved the Syslog syntax highlighting, see #1606 (@keith-hall)
- Replaced "Advanced CSV" with a custom CSV syntax definition written especially for `bat`; see #1574 (@keith-hall)
- Added SystemVerilog file syntax, see #1580 (@SeanMcLoughlin)
- Added Solidity and Vyper syntax, see #1602 (@Ersikan)
## New themes
- Dark+ VS Code theme, see #1588 and #1598 (@PatriotRossii)
# v0.18.0
## Features
@@ -489,7 +559,7 @@ You can see the API documentation here: https://docs.rs/bat/
- Added `BAT_CONFIG_PATH` environment variable to set a non-default path for `bat`s configuration file, see #375 (@deg4uss3r)
- Allow for multiple occurences of `--style` to allow for the configuration
- Allow for multiple occurrences of `--style` to allow for the configuration
of styles from the config file, see #367 (@sindreij)
- Allow for multiple `--line-range` arguments, see #23
Generated
+162 -141
View File
@@ -1,25 +1,27 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "adler"
version = "0.2.3"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "0.7.15"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
dependencies = [
"memchr",
]
[[package]]
name = "ansi_colours"
version = "1.0.2"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52cb663b84aea8670b4a40368360e29485c11b03d14ff6283261aeccd69d5ce1"
checksum = "60e2fb6138a49ad9f1cb3c6d8f8ccbdd5e62b4dab317c1b435a47ecd7da1d28f"
dependencies = [
"cc",
]
@@ -44,9 +46,9 @@ dependencies = [
[[package]]
name = "assert_cmd"
version = "1.0.3"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2475b58cd94eb4f70159f4fd8844ba3b807532fe3131b3373fae060bbe30396"
checksum = "a88b6bd5df287567ffdf4ddf4d33060048e1068308e5f62d81c6f9824a045a48"
dependencies = [
"bstr",
"doc-comment",
@@ -81,7 +83,7 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "bat"
version = "0.18.0"
version = "0.18.2"
dependencies = [
"ansi_colours",
"ansi_term 0.12.1",
@@ -97,6 +99,7 @@ dependencies = [
"error-chain",
"git2",
"globset",
"grep-cli",
"lazy_static",
"nix",
"path_abs",
@@ -115,11 +118,10 @@ dependencies = [
[[package]]
name = "bincode"
version = "1.3.1"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"byteorder",
"serde",
]
@@ -146,9 +148,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "bstr"
version = "0.2.15"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d"
checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279"
dependencies = [
"lazy_static",
"memchr",
@@ -157,25 +159,26 @@ dependencies = [
[[package]]
name = "bugreport"
version = "0.3.0"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "116762017f173ea5d8103e75533f6bdb62cb6f2257c9c95672beb085a70daed8"
checksum = "a0e97e538864a7c95d33accbf64c8d354018ba3b6e032502fd0fe7259cf1aa3d"
dependencies = [
"snailquote",
"git-version",
"shell-escape",
"sys-info",
]
[[package]]
name = "byteorder"
version = "1.4.2"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "cc"
version = "1.0.66"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
dependencies = [
"jobserver",
]
@@ -226,9 +229,9 @@ dependencies = [
[[package]]
name = "console"
version = "0.14.0"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa"
checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45"
dependencies = [
"encode_unicode",
"lazy_static",
@@ -292,9 +295,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "dtoa"
version = "0.4.7"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e"
checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
[[package]]
name = "encode_unicode"
@@ -414,9 +417,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "form_urlencoded"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
dependencies = [
"matches",
"percent-encoding",
@@ -434,10 +437,32 @@ dependencies = [
]
[[package]]
name = "git2"
version = "0.13.15"
name = "git-version"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44f267c9da8a4de3c615b59e23606c75f164f84896e97f4dd6c15a4294de4359"
checksum = "94918e83f1e01dedc2e361d00ce9487b14c58c7f40bab148026fa39d42cb41e2"
dependencies = [
"git-version-macro",
"proc-macro-hack",
]
[[package]]
name = "git-version-macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34a97a52fdee1870a34fa6e4b77570cba531b27d1838874fef4429a791a3d657"
dependencies = [
"proc-macro-hack",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "git2"
version = "0.13.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17929de7239dea9f68aa14f94b2ab4974e7b24c1314275ffcc12a7758172fa18"
dependencies = [
"bitflags",
"libc",
@@ -454,9 +479,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "globset"
version = "0.4.6"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a"
checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd"
dependencies = [
"aho-corasick",
"bstr",
@@ -465,6 +490,23 @@ dependencies = [
"regex",
]
[[package]]
name = "grep-cli"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dd110c34bb4460d0de5062413b773e385cbf8a85a63fc535590110a09e79e8a"
dependencies = [
"atty",
"bstr",
"globset",
"lazy_static",
"log",
"regex",
"same-file",
"termcolor",
"winapi-util",
]
[[package]]
name = "hashbrown"
version = "0.9.1"
@@ -482,9 +524,9 @@ dependencies = [
[[package]]
name = "idna"
version = "0.2.1"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094"
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
dependencies = [
"matches",
"unicode-bidi",
@@ -493,9 +535,9 @@ dependencies = [
[[package]]
name = "indexmap"
version = "1.6.1"
version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b"
checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
dependencies = [
"autocfg",
"hashbrown",
@@ -518,9 +560,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
[[package]]
name = "jobserver"
version = "0.1.21"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd"
dependencies = [
"libc",
]
@@ -539,15 +581,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.86"
version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36"
[[package]]
name = "libgit2-sys"
version = "0.12.18+1.1.0"
version = "0.12.20+1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3da6a42da88fc37ee1ecda212ffa254c25713532980005d5f7c0b0fbe7e6e885"
checksum = "1e2f09917e00b9ad194ae72072bb5ada2cca16d8171a43e91ddba2afbb02664b"
dependencies = [
"cc",
"libc",
@@ -557,9 +599,9 @@ dependencies = [
[[package]]
name = "libz-sys"
version = "1.1.2"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66"
dependencies = [
"cc",
"libc",
@@ -584,9 +626,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "lock_api"
version = "0.4.2"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
dependencies = [
"scopeguard",
]
@@ -608,15 +650,24 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
[[package]]
name = "memchr"
version = "2.3.4"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
[[package]]
name = "memoffset"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
dependencies = [
"autocfg",
]
[[package]]
name = "miniz_oxide"
version = "0.4.3"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
dependencies = [
"adler",
"autocfg",
@@ -624,14 +675,15 @@ dependencies = [
[[package]]
name = "nix"
version = "0.19.1"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2"
checksum = "5c3728fec49d363a50a8828a190b379a446cc5cf085c06259bbbeb34447e4ec7"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"memoffset",
]
[[package]]
@@ -659,12 +711,6 @@ dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
[[package]]
name = "onig"
version = "6.1.1"
@@ -714,9 +760,9 @@ dependencies = [
[[package]]
name = "path_abs"
version = "0.5.0"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb6b8e6dede0bf94e9300e669f335ba92d5fc9fc8be7f4b1ca8a05206489388c"
checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3"
dependencies = [
"std_prelude",
]
@@ -764,9 +810,9 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
[[package]]
name = "predicates"
version = "1.0.7"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eeb433456c1a57cc93554dea3ce40b4c19c4057e41c55d4a0f3d84ea71c325aa"
checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df"
dependencies = [
"difference",
"float-cmp",
@@ -792,10 +838,16 @@ dependencies = [
]
[[package]]
name = "proc-macro2"
version = "1.0.24"
name = "proc-macro-hack"
version = "0.5.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
dependencies = [
"unicode-xid",
]
@@ -851,9 +903,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.2.5"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
dependencies = [
"bitflags",
]
@@ -870,14 +922,13 @@ dependencies = [
[[package]]
name = "regex"
version = "1.4.3"
version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a"
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
"thread_local",
]
[[package]]
@@ -891,9 +942,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
version = "0.6.22"
version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "remove_dir_all"
@@ -951,18 +1002,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.123"
version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.123"
version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
dependencies = [
"proc-macro2",
"quote",
@@ -971,9 +1022,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.62"
version = "1.0.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486"
checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
dependencies = [
"itoa",
"ryu",
@@ -1014,6 +1065,12 @@ dependencies = [
"syn",
]
[[package]]
name = "shell-escape"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
[[package]]
name = "shell-words"
version = "1.0.0"
@@ -1026,16 +1083,6 @@ version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
[[package]]
name = "snailquote"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f34b729d802f52194598858ac852c3fb3b33f6e026cd03195072ccb7bf3fc810"
dependencies = [
"thiserror",
"unicode_categories",
]
[[package]]
name = "std_prelude"
version = "0.2.12"
@@ -1050,9 +1097,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "syn"
version = "1.0.60"
version = "1.0.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
dependencies = [
"proc-macro2",
"quote",
@@ -1084,9 +1131,9 @@ dependencies = [
[[package]]
name = "sys-info"
version = "0.7.0"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5cfbd84f86389198ade41b439f72a5b1b3a8ba728e61cd589e1720d0df44c39"
checksum = "33fcecee49339531cf6bd84ecf3ed94f9c8ef4a7e700f2a1cac9cc1ca485383a"
dependencies = [
"cc",
"libc",
@@ -1116,6 +1163,15 @@ dependencies = [
"winapi",
]
[[package]]
name = "termcolor"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
dependencies = [
"winapi-util",
]
[[package]]
name = "terminal_size"
version = "0.1.16"
@@ -1136,40 +1192,11 @@ dependencies = [
"unicode-width",
]
[[package]]
name = "thiserror"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "thread_local"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd"
dependencies = [
"once_cell",
]
[[package]]
name = "tinyvec"
version = "1.1.1"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023"
checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342"
dependencies = [
"tinyvec_macros",
]
@@ -1194,9 +1221,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
[[package]]
name = "unicode-bidi"
version = "0.3.4"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0"
dependencies = [
"matches",
]
@@ -1218,21 +1245,15 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
[[package]]
name = "unicode-xid"
version = "0.2.1"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
[[package]]
name = "unicode_categories"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
[[package]]
name = "url"
version = "2.2.0"
version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
dependencies = [
"form_urlencoded",
"idna",
@@ -1242,9 +1263,9 @@ dependencies = [
[[package]]
name = "vcpkg"
version = "0.2.11"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d"
[[package]]
name = "vec_map"
@@ -1254,9 +1275,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version_check"
version = "0.9.2"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "wait-timeout"
@@ -1269,9 +1290,9 @@ dependencies = [
[[package]]
name = "walkdir"
version = "2.3.1"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
dependencies = [
"same-file",
"winapi",
+6 -5
View File
@@ -6,7 +6,7 @@ homepage = "https://github.com/sharkdp/bat"
license = "MIT/Apache-2.0"
name = "bat"
repository = "https://github.com/sharkdp/bat"
version = "0.18.0"
version = "0.18.2"
exclude = ["assets/syntaxes/*", "assets/themes/*"]
build = "build.rs"
edition = '2018'
@@ -36,7 +36,7 @@ regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
atty = { version = "0.2.14", optional = true }
ansi_term = "^0.12.1"
ansi_colours = "^1.0"
console = "0.14.0"
console = "0.14.1"
lazy_static = { version = "1.4", optional = true }
wild = { version = "2.0", optional = true }
content_inspector = "0.2.4"
@@ -49,8 +49,9 @@ serde_yaml = "0.8"
semver = "0.11"
path_abs = { version = "0.5", default-features = false }
clircle = "0.3"
bugreport = "0.3"
bugreport = "0.4"
dirs-next = { version = "2.0.0", optional = true }
grep-cli = "0.1.6"
[dependencies.git2]
version = "0.13"
@@ -73,14 +74,14 @@ version = "0.12"
default-features = false
[dev-dependencies]
assert_cmd = "1.0.2"
assert_cmd = "1.0.5"
serial_test = "0.5.1"
predicates = "1.0.7"
wait-timeout = "0.2.0"
tempfile = "3.2.0"
[target.'cfg(unix)'.dev-dependencies]
nix = "0.19.1"
nix = "0.21.0"
[build-dependencies]
clap = { version = "2.33", optional = true }
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright (c) 2018-2020 bat-developers (https://github.com/sharkdp/bat).
Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+16 -9
View File
@@ -197,9 +197,9 @@ The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.
*... and other Debian-based Linux distributions.*
`bat` is making its way through the [Ubuntu](https://packages.ubuntu.com/eoan/bat) and
[Debian](https://packages.debian.org/sid/bat) package release process, and is available
for Ubuntu as of Eoan 19.10. On Debian `bat` is currently only available on the unstable
"Sid" branch.
[Debian](https://packages.debian.org/testing/bat) package release process, and is available
for Ubuntu as of Eoan 19.10. On Debian `bat` is currently available on the unstable
"Sid" branch and on the testing branch.
If your Ubuntu/Debian installation is new enough you can simply run:
@@ -222,7 +222,7 @@ the most recent release of `bat`, download the latest `.deb` package from the
[release page](https://github.com/sharkdp/bat/releases) and install it via:
```bash
sudo dpkg -i bat_0.18.0_amd64.deb # adapt version number and architecture
sudo dpkg -i bat_0.18.2_amd64.deb # adapt version number and architecture
```
### On Alpine Linux
@@ -363,7 +363,7 @@ binaries are also available: look for archives with `musl` in the file name.
### From source
If you want to build `bat` from source, you need Rust 1.42 or
If you want to build `bat` from source, you need Rust 1.45 or
higher. You can then use `cargo` to build everything:
```bash
@@ -409,10 +409,11 @@ even when truecolor support is available:
It replaces certain bright colors with 8-bit colors from 16 to 21. **Do not** use this simply
because you have a 256-color terminal but are not using base16-shell.
Although these themes are more restricted, they have two advantages over truecolor themes:
Although these themes are more restricted, they have three advantages over truecolor themes. They:
- They harmonize better with other terminal software using 3-bit or 4-bit colors.
- When you change your terminal theme, `bat` output already on the screen will update to match.
- Enjoy maximum compatibility. Some terminal utilities do not support more than 3-bit colors.
- Adapt to terminal theme changes. Even for already printed output.
- Visually harmonize better with other terminal software.
### Output style
@@ -516,6 +517,8 @@ set, `less` is used by default. If you want to use a different pager, you can ei
`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in
`PAGER`.
**Note**: If `PAGER` is `more` or `most`, `bat` will silently use `less` instead to ensure support for colors.
If you want to pass command-line arguments to the pager, you can also set them via the
`PAGER`/`BAT_PAGER` variables:
@@ -714,6 +717,10 @@ Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
- [keith-hall](https://github.com/keith-hall)
- [Enselic](https://github.com/Enselic)
## Security vulnerabilities
Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnarability in `bat`.
## Project goals and alternatives
`bat` tries to achieve the following goals:
@@ -727,7 +734,7 @@ There are a lot of alternatives, if you are looking for similar programs. See
[this document](doc/alternatives.md) for a comparison.
## License
Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
+88
View File
@@ -0,0 +1,88 @@
# shellcheck disable=SC2207
# Requires https://github.com/scop/bash-completion
_bat() {
local cur prev words cword split
_init_completion -s || return 0
if [[ ${words[1]-} == cache ]]; then
case $prev in
--source | --target)
_filedir -d
return 0
;;
esac
COMPREPLY=($(compgen -W "
--build --clear --source --target --blank --help
" -- "$cur"))
return 0
fi
case $prev in
-l | --language)
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(
"$1" --list-languages | while IFS=: read -r lang _; do
printf "%s\n" "$lang"
done
)" -- "$cur"))
compopt -o filenames # for escaping
return 0
;;
-H | --highlight-line | --diff-context | --tabs | --terminal-width | \
-m | --map-syntax | --style | --line-range | -h | --help | -V | \
--version | --diagnostic | --config-file | --config-dir | \
--cache-dir | --generate-config-file)
# argument required but no completion available, or option
# causes an exit
return 0
;;
--file-name)
_filedir
return 0
;;
--wrap)
COMPREPLY=($(compgen -W "auto never character" -- "$cur"))
return 0
;;
--color | --decorations | --paging)
COMPREPLY=($(compgen -W "auto never always" -- "$cur"))
return 0
;;
--italic-text)
COMPREPLY=($(compgen -W "always never" -- "$cur"))
return 0
;;
--pager)
COMPREPLY=($(compgen -c -- "$cur"))
return 0
;;
--theme)
local IFS=$'\n'
COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur"))
compopt -o filenames # for escaping
return 0
;;
esac
$split && return 0
if [[ $cur == -* ]]; then
COMPREPLY=($(compgen -W "
--show-all --plain --language --highlight-line
--file-name --diff --diff-context --tabs --wrap
--terminal-width --number --color --italic-text
--decorations --paging --pager --map-syntax --theme
--list-themes --style --line-range --list-languages
--help --version --force-colorization --unbuffered
--diagnostic --config-file --config-dir --cache-dir
--generate-config-file
" -- "$cur"))
return 0
fi
_filedir
((cword == 1)) && COMPREPLY+=($(compgen -W cache -- "$cur"))
} && complete -F _bat {{PROJECT_EXECUTABLE}}
+5
View File
@@ -44,6 +44,11 @@ _{{PROJECT_EXECUTABLE}}_main() {
'(--style)'--style='[Comma-separated list of style elements to display]:<components>:->style'
'(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:<N\:M>...'
'(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]'
'(: --no-config)'--no-config'[Do not use the configuration file]'
'(: --config-dir)'--config-dir'[Show bat'"'"'s configuration directory]'
'(: --config-file)'--config-file'[Show path to the configuration file]'
'(: --generate-config-file)'--generate-config-file'[Generates a default configuration file]'
'(: --cache-dir)'--cache-dir'[Show bat'"'"'s cache directory]'
'(: -)'{-h,--help}'[Print this help message]'
'(: -)'{-V,--version}'[Show version information]'
'*: :_files'
+4
View File
@@ -189,6 +189,10 @@ is dependent on your operating system. To get the default path for your system,
Alternatively, you can use the BAT_CONFIG_PATH environment variable to point {{PROJECT_EXECUTABLE}} to a non-default
location of the configuration file.
To generate a default configuration file, call:
\fB{{PROJECT_EXECUTABLE}} --generate-config-file\fR
.SH "ADDING CUSTOM LANGUAGES"
{{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be
customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language
+19 -1
View File
@@ -7,7 +7,7 @@ index 9c2aa3e..180cbbf 100644
<string>JSON String</string>
<key>scope</key>
- <string>meta.structure.dictionary.json string.quoted.double.json</string>
+ <string>meta.mapping.key.json string.quoted.double.json</string>
+ <string>meta.mapping.key.json string.quoted.double.json, punctuation.separator.sequence.csv</string>
<key>settings</key>
<dict>
<key>foreground</key>
@@ -16,3 +16,21 @@ index 9c2aa3e..180cbbf 100644
</dict>
</dict>
<dict>
@@ -1027,7 +1027,7 @@
<key>name</key>
<string>Invalid</string>
<key>scope</key>
- <string>invalid</string>
+ <string>invalid, markup.error</string>
<key>settings</key>
<dict>
<key>background</key>
@@ -1042,7 +1042,7 @@
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
- <string>invalid.deprecated</string>
+ <string>invalid.deprecated, markup.warning</string>
<key>settings</key>
<dict>
<key>background</key>
+7 -2
View File
@@ -1,8 +1,8 @@
diff --git syntaxes/01_Packages/ShellScript/Bash.sublime-syntax syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
index e973e319..a703cef8 100644
index e973e319..07c170a7 100644
--- syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
+++ syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
@@ -30,8 +30,8 @@ file_extensions:
@@ -30,12 +30,12 @@ file_extensions:
- .zshenv
- .zshrc
- PKGBUILD # https://jlk.fjfi.cvut.cz/arch/manpages/man/PKGBUILD.5
@@ -13,3 +13,8 @@ index e973e319..a703cef8 100644
first_line_match: |
(?x)
- ^\#! .* \b(bash|zsh|sh|tcsh|ash)\b
+ ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash)\b
| ^\# \s* -\*- [^*]* mode: \s* shell-script [^*]* -\*-
#-------------------------------------------------------------------------------
+12
View File
@@ -0,0 +1,12 @@
diff --git syntaxes/01_Packages/XML/XML.sublime-syntax syntaxes/01_Packages/XML/XML.sublime-syntax
index ad7d9c87..af4a00f0 100644
--- syntaxes/01_Packages/XML/XML.sublime-syntax
+++ syntaxes/01_Packages/XML/XML.sublime-syntax
@@ -12,6 +12,7 @@ file_extensions:
- rss
- opml
- svg
+ - xaml
first_line_match: |-
(?x:
^(?:
BIN
View File
Binary file not shown.
+71 -39
View File
@@ -1,46 +1,78 @@
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: Advanced CSV
# See http://www.sublimetext.com/docs/3/syntax.html
name: Comma Separated Values
file_extensions:
- csv
- tsv
scope: text.advanced_csv
scope: text.csv
variables:
field_separator: (?:[,;\t])
record_separator: (?:$\n?)
contexts:
prototype:
- match: (?={{record_separator}})
pop: true
fields:
- match: ''
push:
- field_or_record_separator
- field4
- field_or_record_separator
- field3
- field_or_record_separator
- field2
- field_or_record_separator
- field1
main:
- match: (\")
captures:
1: string.quoted.double.advanced_csv
push:
- meta_scope: meta.quoted.advanced_csv
- match: (\")
captures:
1: string.quoted.double.advanced_csv
pop: true
- include: main
- match: '(\[([+-]?\d*)(\:)?([+-]?\d*)(\,)?([+-]?\d*)(\:)?([+-]?\d*)\])?\s*([<>v^])?\s*(=)'
captures:
1: keyword.operator.advanced_csv
2: constant.numeric.formula.advanced_csv
4: constant.numeric.formula.advanced_csv
6: constant.numeric.formula.advanced_csv
8: constant.numeric.formula.advanced_csv
9: keyword.operator.advanced_csv
10: keyword.operator.advanced_csv
push:
- meta_scope: meta.range.advanced_csv
- match: (?=(\")|$)
pop: true
- include: scope:source.python
- match: '(?<=^|,|\s|\")([0-9.eE+-]+)(?=$|,|\s|\")'
scope: meta.number.advanced_csv
captures:
1: constant.numeric.advanced_csv
- match: '(?<=^|,|\s|\")([^, \t\"]+)(?=$|,|\s|\")'
scope: meta.nonnumber.advanced_csv
captures:
1: storage.type.advanced_csv
- match: (\,)
scope: meta.delimiter.advanced_csv
captures:
1: keyword.operator.advanced_csv
- meta_include_prototype: false
- match: '^'
set: fields
field_or_record_separator:
- meta_include_prototype: false
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
pop: true
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: double_quoted_string
- match: (?={{field_separator}}|{{record_separator}})
pop: true
double_quoted_string:
- meta_include_prototype: false
- meta_scope: string.quoted.double.csv
- match: '""'
scope: constant.character.escape.csv
- match: '"'
scope: punctuation.definition.string.end.csv
pop: true
field1:
- match: ''
set:
- meta_content_scope: meta.field-1.csv support.type
- include: field_contents
field2:
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
+4 -2
View File
@@ -4,7 +4,6 @@
name: DotENV
file_extensions:
- .env
- .envrc
- .env.dist
- .env.local
- .env.sample
@@ -19,8 +18,11 @@ file_extensions:
- .env.production
- .env.production.local
- .env.dusk.local
- .flaskenv
- .env.staging
- .env.default
- .env.defaults
- .envrc
- .flaskenv
scope: source.env
contexts:
main:
+1
View File
@@ -5,6 +5,7 @@ name: fstab
file_extensions:
- fstab
- crypttab
- mtab
scope: source.fstab
contexts:
+116
View File
@@ -0,0 +1,116 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
file_extensions:
- log
scope: text.log
variables:
ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
contexts:
main:
- match: (\w+)(=)
captures:
1: variable.parameter.log
2: keyword.operator.assignment.log
- match: (')([^']*)(')
scope: string.quoted.single.log
captures:
1: punctuation.definition.string.begin.log
3: punctuation.definition.string.end.log
- match: (")([^"]*)(")
scope: string.quoted.double.log
captures:
1: punctuation.definition.string.begin.log
3: punctuation.definition.string.end.log
- include: dates
- include: ip_addresses
- include: numbers
- match: \b(?i:fail(?:ure|ed)?|error|exception)\b
scope: markup.error.log
- match: \b(?i:warn(?:ing)?)\b
scope: markup.warning.log
#- include: scope:text.html.markdown#autolink-inet
- match: \b\w+:/{2,3}
scope: markup.underline.link.scheme.log
push: url-host
dates:
- match: \b\d{4}-\d{2}-\d{2}\b
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
- match: \b\d{4}/\d{2}/\d{2}\b
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
- match: \b(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)(?:(\.)\d{3})?\b
scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
captures:
1: punctuation.separator.decimal.log
ip_addresses:
- match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
push:
- meta_scope: meta.ipaddress.v4.log meta.number.integer.decimal.log
- match: \d+
scope: constant.numeric.value.log
- match: \.
scope: punctuation.separator.sequence.log
- match: ''
pop: true
- match: (?=(?:\h{0,4}:){2,6}\h{1,4}\b)
push:
- meta_scope: meta.ipaddress.v6.log meta.number.integer.hexadecimal.log
- match: \h{1,4}
scope: constant.numeric.value.log
- match: ':'
scope: punctuation.separator.sequence.log
- match: ''
pop: true
numbers:
- match: \b(0x)(\h+)(?:(\.)(\h+))?\b
scope: meta.number.float.hexadecimal.log
captures:
1: constant.numeric.base.log
2: constant.numeric.value.log
3: constant.numeric.value.log punctuation.separator.decimal.log
4: constant.numeric.value.log
- match: \b\d+(\.)\d+\b
scope: meta.number.float.log constant.numeric.value.log
captures:
1: punctuation.separator.decimal.log
- match: \b\d+\b
scope: meta.number.integer.log constant.numeric.value.log
url-host:
- meta_content_scope: markup.underline.link.host.log
- match: \[
scope: punctuation.section.brackets.begin.log
push:
- match: \]
scope: punctuation.section.brackets.end.log
pop: true
- include: ip_addresses
- match: '[^:/\s]+'
- match: ''
set: url-after-host
url-after-host:
- match: (:)(\d+)
scope: markup.underline.link.port.log
captures:
1: punctuation.separator.mapping.port.log
2: constant.numeric.value.log
#- include: scope:text.html.markdown#url-escaped-chars
- match: (%)\h{2}
scope: markup.underline.link.path.log constant.character.escape.url.log
captures:
1: punctuation.definition.escape.log
# After a valid domain, zero or more non-space non-< characters may follow
- match: (?=[?!.,:*_~]*[\s<]) # Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will not be considered part of the autolink, though they may be included in the interior of the link
pop: true
- match: \( # When an autolink ends in ), we scan the entire autolink for the total number of parentheses. If there is a greater number of closing parentheses than opening ones, we dont consider the last character part of the autolink, in order to facilitate including an autolink inside a parenthesis
push:
- meta_scope: markup.underline.link.path.log
- match: (?=[?!.,:*_~]*[\s<])
pop: true
- match: \)
pop: true
- match: (?=\)[?!.,:*_~]*[\s<])
pop: true
- match: '[^?!.,:*_~\s<&()%]+|\S'
scope: markup.underline.link.path.log
- match: ''
pop: true
+60
View File
@@ -0,0 +1,60 @@
# SYNTAX TEST "CSV.sublime-syntax"
Forename,Surname,House No.,Street,City,Postcode
#^^^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^^^^^^^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^ meta.field-4
# ^ punctuation.separator.sequence
# ^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
John,Doe,87,Logon Road,Citiville,TU43 6GH
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^^^^^ meta.field-4
# ^ punctuation.separator.sequence
# ^^^^^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Jane,Doe,22,"""Fun"" Street","The City, County",FA90 1XA
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
# ^^ constant.character.escape
# ^^ constant.character.escape
# ^ punctuation.separator.sequence
# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Fred,Bloggs,"19","Street
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^^ meta.field-3 string.quoted.double
# ^ punctuation.separator.sequence
# ^ meta.field-4 punctuation.definition.string.begin
# ^^^^^^^^ meta.field-4 string.quoted.double
Spanning Multiple ""
#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
# ^^ constant.character.escape
Lines",Citee,P0stc0d3
#^^^^^ meta.field-4 string.quoted.double
# ^ meta.field-4 punctuation.definition.string.end
# ^ punctuation.separator.sequence
# ^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Can't render this file because it contains an unexpected character in line 1 and column 15.
+60
View File
@@ -0,0 +1,60 @@
# SYNTAX TEST "CSV.sublime-syntax"
Forename Surname House No. Street City Postcode
#^^^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^^^^^^^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^ meta.field-4
# ^ punctuation.separator.sequence
# ^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
John Doe 87 Logon Road Citiville TU43 6GH
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^^^^^ meta.field-4
# ^ punctuation.separator.sequence
# ^^^^^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Jane Doe 22 """Fun"" Street" "The City County" FA90 1XA
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^ meta.field-3
# ^ punctuation.separator.sequence
# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
# ^^ constant.character.escape
# ^^ constant.character.escape
# ^ punctuation.separator.sequence
# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Fred Bloggs "19" "Street
#^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^ meta.field-2
# ^ punctuation.separator.sequence
# ^^^ meta.field-3 string.quoted.double
# ^ punctuation.separator.sequence
# ^ meta.field-4 punctuation.definition.string.begin
# ^^^^^^^^ meta.field-4 string.quoted.double
Spanning Multiple ""
#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
# ^^ constant.character.escape
Lines" Citee P0stc0d3
#^^^^^ meta.field-4 string.quoted.double
# ^ meta.field-4 punctuation.definition.string.end
# ^ punctuation.separator.sequence
# ^^^^^ meta.field-1
# ^ punctuation.separator.sequence
# ^^^^^^^^ meta.field-2
Can't render this file because it contains an unexpected character in line 1 and column 15.
+63
View File
@@ -0,0 +1,63 @@
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: syslog
file_extensions:
- syslog
scope: text.log.syslog
contexts:
main:
- match: ^(\w+\s+\d+)\s+(\d{2}:\d{2}:\d{2})
scope: meta.datetime.syslog constant.numeric.syslog
captures:
1: meta.date.syslog
2: meta.time.syslog
push: loghost
- match: ^
push: text
loghost:
- match: '[\w-]+'
scope: entity.other.attribute-name.loghost.syslog
set: process
process:
- match: ([\w-]+)(?:(\[)(\d+)(\]))?(:)
captures:
1: support.function.process.syslog
2: punctuation.separator.pid.begin.syslog
3: meta.pid.syslog meta.number.integer.syslog constant.numeric.value.syslog
4: punctuation.separator.pid.end.syslog
5: punctuation.separator.mapping.syslog
set: structured-data
structured-data:
- match: '\['
scope: punctuation.section.mapping.begin.syslog
push:
- match: \]
scope: punctuation.section.mapping.end.syslog
pop: true
- match: \w+
scope: variable.parameter.syslog
- match: =
scope: keyword.operator.assignment.syslog
push:
- match: '[^\s\]]+'
scope: constant.other.syslog
pop: true
- match: (?=\])
pop: true
- match: (?=\S)
set: text
text:
- match: $
pop: true
- match: '<\w+>'
scope: constant.language.syslog
- match: \b(CMD)\b\s+(\()
captures:
1: entity.name.label.syslog
2: punctuation.section.block.begin.syslog
embed: scope:source.shell.bash
escape: \)$
escape_captures:
0: punctuation.section.block.end.syslog
- include: scope:text.log
BIN
View File
Binary file not shown.
+5
View File
@@ -54,6 +54,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
"assets/manual/bat.1.in",
out_dir.join("assets/manual/bat.1"),
)?;
template(
&variables,
"assets/completions/bat.bash.in",
out_dir.join("assets/completions/bat.bash"),
)?;
template(
&variables,
"assets/completions/bat.fish.in",
+14 -3
View File
@@ -95,6 +95,17 @@ bat f - g # output 'f', then stdin, then 'g'.
### 他のツールとの統合
#### `fzf`
[`fzf`](https://github.com/junegunn/fzf) のプレビューウィンドウに `bat` を使用できます。
その場合、`bat``--color=always` オプションを用いてカラー出力を強制しなければなりません。
また、`--line-range` オプションを用いることで巨大なファイルの読み込み時間を制限できます:
```bash
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
```
詳しくは [`fzf` の `README`](https://github.com/junegunn/fzf#preview-window) を参照してください。
#### `find` or `fd`
`find``-exec` オプションを使用して、`bat` ですべての検索結果をプレビューできます:
@@ -191,7 +202,7 @@ ln -s /usr/bin/batcat ~/.local/bin/bat
batの最新リリースを実行する場合、または Ubuntu/Debian の古いバージョンを使用している場合は、[release page](https://github.com/sharkdp/bat/releases) から最新の `.deb` パッケージをダウンロードし、
次の方法でインストールします:
```bash
sudo dpkg -i bat_0.18.0_amd64.deb # adapt version number and architecture
sudo dpkg -i bat_0.18.2_amd64.deb # adapt version number and architecture
```
### On Alpine Linux
@@ -393,7 +404,7 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
### 新しい構文の追加 / 言語の定義
`bat` はシンタックスハイライトのための [`syntext`](https://github.com/trishume/syntect/)
`bat` はシンタックスハイライトのための [`syntect`](https://github.com/trishume/syntect/)
という素晴らしいライブラリを使用しています。`syntect` は、
[Sublime Text の `.sublime-syntax` ファイル](https://www.sublimetext.com/docs/3/syntax.html)
とテーマを読み取ることができます。新しい構文を定義するために以下の手順を行います。
@@ -630,7 +641,7 @@ cargo install --locked --force
比較については [このドキュメント](alternatives.md) を参照してください。
## ライセンス
Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
`bat` は MIT License 及び Apache License 2.0 の両方の条件の下で配布されています。
+464 -205
View File
@@ -1,75 +1,86 @@
<p align="center">
<img src="../doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
<a href="https://travis-ci.org/sharkdp/bat"><img src="https://travis-ci.org/sharkdp/bat.svg?branch=master" alt="Build Status"></a>
<a href="https://ci.appveyor.com/project/sharkdp/bat"><img src="https://ci.appveyor.com/api/projects/status/cptsmtbiwbnr2vhf/branch/master?svg=true"></a>
<a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
<img src="https://img.shields.io/crates/l/bat.svg" alt="license">
<a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
문법 강조와 깃 통합 기능의 <i>cat(1)</i> 클론
문법 강조와 Git 통합 기능의 <i>cat(1)</i> 클론
</p>
<p align="center">
<a href="#문법-강조">주요 기능들</a> •
<a href="#사용법">사용법</a> •
<a href="#설치">설치</a> •
<a href="#커스터마이즈">커스터마이즈</a> •
<a href="#사용자화">사용자화</a> •
<a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a> •
번역 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="../doc/README-ja.md">日本語</a>]
[<a href="https://github.com/chinanf-boy/bat-zh">中文</a>] [<a href="../doc/README-ja.md">日本語</a>] [<a href="../doc/README-ko.md">한국어</a>] [<a href="../doc/README-ru.md">Русский</a>]
</p>
### 문법 강조
`bat`은 다양한 프로그래밍 언어와 마크업 언어에 대해 문법 강조(Syntax highlighting)기능을 지원하고 있습니다:
`bat`은 다양한 프로그래밍 마크업 언어 문법 강조(syntax highlighting) 기능을
지원합니다:
![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
### Git 통합
`bat``git`을 통해 인덱스와 함께 변경분을 표시합니다 (왼쪽 바를 확인하세요):
`bat``git`을 통해 인덱스와 함께 변경분을 표시합니다
(왼쪽 사이드바를 확인하세요):
![Git integration example](https://i.imgur.com/2lSW4RE.png)
### 표시할 수 없는 문자 처리
### 비인쇄 문자 처리
`-A`/`--show-all` 옵션을 사용하여 표시할수 없는 문자를 시각화 해줍니다:
`-A`/`--show-all` 옵션을 사용하여 비인쇄 문자를 표시 및 강조할 수 있습니다:
![Non-printable character example](https://i.imgur.com/WndGp9H.png)
### 자동 페이징
### 자동 페이징
하나의 화면에 비해 출력이 너무 큰 경우, `less` 를 이용해 출력들을 연결할 수 있습니다.
`bat`은 기본적으로 한 화면에 비해 출력이 큰 경우 `less`와 같은 페이저(pager)로
출력을 연결(pipe)합니다.
만약 `bat`을 언제나 `cat`처럼 작동하게 하려면 (출력을 페이지하지 않기),
`--paging=never` 옵션을 커맨드 라인이나 설정 파일에 넣을 수 있습니다.
셸(shell) 설정에서 `cat``bat`의 alias로 사용하려면,
`alias cat='bat --paging=never'`를 써서 기본 행동을 유지할 수 있습니다.
### 파일 연결
### 파일 연결(concatenation)
이 뿐만 아니라 파일을 연결할 때도 사용 할 수 있습니다. :wink: `bat`가 인터렉티브 하지 않은(non-interactive)가 감지하면 (예를 들어,다른 프로세스 혹은 파일과 파이프라인을 연결 한 경우) `bat``cat`을 대신하여 동작하며 일반 파일 내용을 표기해줍니다.
페이저(pager)를 사용하더라도 `bat`은 파일들을 연결(concatenate)할 수 있습니다
:wink:.
`bat`이 비대화형(non-interactive) 터미널(예를 들어, 다른 프로세스나 파일에
연결(pipe)한 경우)을 감지하면, `bat``--pager` 옵션의 값과 상관없이 `cat`
동일하게 파일 내용을 그대로 출력합니다.
## 사용법
터미널에 하나의 파일 표시하기
터미널에 하나의 파일 표시하기
```bash
> bat README.md
```
여러 파일 한번에 보여주기
여러 파일 한 번에 보여주기
```bash
> bat src/*.rs
```
stdin에서 읽고, 자동으로 맞는 문법 강조 적용하기
stdin에서 읽고, 자동으로 맞는 문법 결정하기 (참고로, 문법 강조는 파일의 첫
줄만으로 문법이 결정될 수 있을 때만 작동합니다.
이는 보통 `#!/bin/sh`와 같은 셔뱅(shebang)으로 판단합니다.)
```bash
> curl -s https://sh.rustup.rs | bat
```
stdin에서 읽고, 명시적으로 언어 지정하여 적용하기
stdin에서 읽고, 명시적으로 언어 지정하
```bash
> yaml2json .travis.yml | json_pp | bat -l json
```
표시할 수 없는 문자 처리하기
비인쇄 문자 표시 및 강조하기
```bash
> bat -A /etc/hosts
```
@@ -86,23 +97,38 @@ bat -n main.rs # show line numbers (only)
bat f - g # output 'f', then stdin, then 'g'.
```
### 다른 툴과의 통합
### 다른 도구들과 통합하기
#### `find` 와 `fd`
#### `fzf`
`find``-exec` 옵션을 사용하여 `bat`의 모든 검색 결과를 미리 볼 수 있습니다:
`bat`을 [`fzf`](https://github.com/junegunn/fzf)의 프리뷰로 쓸 수 있습니다.
이를 위해서는 `bat``--color=always` 옵션으로 항상 컬러 출력이 나오게 해야
합니다.
또한 `--line-range` 옵션으로 긴 파일의 로드 시간을 제한할 수 있습니다:
```bash
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
```
더 많은 정보는
[`fzf`의 `README`](https://github.com/junegunn/fzf#preview-window)를 참고하세요.
#### `find`와 `fd`
`find``-exec` 옵션을 사용하여 모든 검색 결과를 `bat`로 미리 볼 수 있습니다:
```bash
find … -exec bat {} +
```
[`fd`](https://github.com/sharkdp/fd)를 사용하고 있는 경우, `-X`/`--exec-batch` 옵션을 이용하여 동일하게 사용할 수 있습니다:
[`fd`](https://github.com/sharkdp/fd)를 사용하는 경우, `-X`/`--exec-batch`
옵션을 이용하여 동일하게 사용할 수 있습니다:
```bash
fd … -X bat
```
#### `ripgrep`
[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)과 함께, [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를 `bat`을 이용하여 볼 수 있습니다.
[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)
통해 `bat`로 [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를
출력할 수 있습니다.
```bash
batgrep needle src/
@@ -110,279 +136,393 @@ batgrep needle src/
#### `tail -f`
`bat` `tail -f`를 함께 사용하여, 특정 파일을 문법 강조하며 지속적으로 모니터링 할 수 있습니다.
`bat` `tail -f`를 함께 사용하여 주어진 파일을 문법 강조하며 지속적으로
모니터할 수 있습니다.
```bash
tail -f /var/log/pacman.log | bat --paging=never -l log
```
이 작업을 하려면 페이징 기능을 꺼야합니다. 또, 자동 감지가 되지 않기 때문에, 적용되어야할 문법을 명시적(`-l log`)으로 지정해야 합니다.
참고로 이 작업을 하려면 페이징 기능을 꺼야 합니다.
또한 이 경우 문법을 자동 감지할 수 없기 때문에, 적용할 문법을 직접 지정해야
합니다 (`-l log`).
#### `git`
`bat``git show`를 함께 사용하여 주어진 파일의 이전 기록을 문법 강조와 함께 볼 수 있습니다:
`bat``git show`를 함께 사용하여 주어진 파일의 이전 버전을 올바른 문법 강조로
볼 수 있습니다:
```bash
git show v0.6.0:src/main.rs | bat -l rs
```
diffs 내에서 문법 강조 표시는 현재 지원되지 않습니다. 이 기능은 [`delta`](https://github.com/dandavison/delta)에서 찾아 볼 수 있습니다.
#### `git diff`
`bat``git diff`를 함께 사용하여 수정된 코드 주위의 줄들을 올바른 문법 강조로
볼 수 있습니다:
```bash
batdiff() {
git diff --name-only --diff-filter=d | xargs bat --diff
}
```
이것을 별도의 도구로 쓰고 싶다면
[`bat-extras`](https://github.com/eth-p/bat-extras)의 `batdiff`를 확인해 보세요.
Git과 diff의 더 많은 지원을 원한다면
[`delta`](https://github.com/dandavison/delta)를 확인해 보세요.
#### `xclip`
`bat` 출력에서 라인 넘버와 Git 수정 내역이 같이 있어 파일 내용을 복사하기가 어려울 수도 있습니다. 이 경우에는 `-p`/`--plain` 옵션을 사용 하거나 출력 시 파이프라인으로 `xclip`을 사용하면 됩니다:
`bat` 출력에 줄 번호와 Git 수정 내역이 포함되어서 파일 내용을 복사하기
어려울 수 있습니다.
이 경우에는 `bat``-p`/`--plain` 옵션을 사용하거나 간단히 `xclip`으로 출력을
연결(pipe)하면 됩니다:
```bash
bat main.cpp | xclip
```
`bat` 에서는 리다이렉트된 것으로 감지하여, 파일 내용 출력합니다.
`bat`는 출력이 우회되고 있다는 것을 감지하여 파일 내용 그대로를 출력합니다.
#### `man`
`bat``MANPAGER` 환경 변수 설정을 통해 `man`에 대하여 컬러 페이져를 사용할 수 있습니다:
`MANPAGER` 환경 변수 설정을 통해 `bat``man`의 컬러 페이저(pager)로 쓸 수
있습니다.
```bash
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man 2 select
```
(Debian이나 Ubuntu를 사용한다면 `bat``batcat`으로 치환하세요.)
매팅 문제가 발생한다면, `MANROFFOPT="-c"` 설정 해야 할 수 있습니다 .
문제가 발생한다면, `MANROFFOPT="-c"`을 써야 할 수 있습니다.
새 커맨드에서 이 번들을 사용하려면, [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 이용 할 수 있습니다.
이 기능을 포함한 새로운 명령어를 선호한다면,
[`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 쓸
수도 있습니다.
참고로 [Manpage 문법](../assets/syntaxes/Manpage.sublime-syntax)은 본 저장소에서
개발 중에 있으며, 아직 더 손봐야 합니다.
참고 : [Manpage syntax](../assets/syntaxes/Manpage.sublime-syntax)는 이 저장소에서 개발되고 있으며, 아직 작업 중 입니다.
또한, 이는 Mandoc의 `man` 구현에서
[작동하지 않습니다](https://github.com/sharkdp/bat/issues/1145).
#### `prettier` / `shfmt` / `rustfmt`
[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) 스크립트는 코드를 포맷팅하고 `bat`으로 출력해주는 랩퍼(wrapper) 입니다.
[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md)
스크립트는 코드를 포맷하고 `bat`으로 출력하는 래퍼(wrapper)입니다.
## 설치
[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
### On Ubuntu
*... 그리고 기타 Debian 기반의 Linux 배포판들.*
### Ubuntu에서 (`apt` 사용)
*... 그리고 다른 Debian 기반의 Linux 배포판들에서.*
Ubuntu Eoan 19.10 혹은 Debian unstable sid 이후 버전 부터는 [Ubuntu용 `bat` 패키지](https://packages.ubuntu.com/eoan/bat)나 [Debian용 `bat` 패키지](https://packages.debian.org/sid/bat) 를 설치 할 수 있습니다.
`bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와
[Debian](https://packages.debian.org/sid/bat) 패키지 배포 과정에 도입되는 중이며,
Eoan 19.10 버전의 Ubuntu에서부터 제공됩니다.
현재 Debain에서는 불안정한 "Sid" 브랜치에서만 `bat`이 제공됩니다.
만약 충분히 최신 버전의 Ubuntu/Debian이 설치되어 있다면 간단히 다음을 실행하세요:
```bash
apt install bat
```
만약 최근 릴리즈된 bat을 사용을 원하거나 buntu/Debian 예전 버전을 사용하는 경우, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다음과 같이 `.deb` 패키지를 받아 설치 할 수도 있습니다:
```bash
sudo dpkg -i bat_0.18.0_amd64.deb # adapt version number and architecture
**중요**: 만약 `bat`을 이와 같이 설치한다면, ([다른 패키지와의 이름
충돌](https://github.com/sharkdp/bat/issues/982)로 인하여) `bat` 대신에
`batcat`이라는 이름의 실행 파일로 설치될 수 있음을 참고하세요.
이에 따른 문제들과 다른 배포판들과의 일관성을 위하여 `bat -> batcat` symlink
혹은 alias를 설정할 수 있습니다:
``` bash
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
```
### On Alpine Linux
### Ubuntu에서 (가장 최신 `.deb` 패키지들 사용)
*... 그리고 다른 Debian 기반의 Linux 배포판들에서.*
공식 소스를 통해 [`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat) 를 설치 할 수 있습니다:
만약 여러분이 설치한 Ubuntu/Debian에 패키지가 배포되지 않거나 가장 최신 릴리즈된
`bat`을 원한다면, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서
다음과 같이 `.deb` 패키지를 받아 설치하세요:
```bash
sudo dpkg -i bat_0.18.2_amd64.deb # adapt version number and architecture
```
### Alpine Linux에서
적절한 저장소가 활성화되어 있다면, 공식 소스를 통해
[`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat)를 설치할 수
있습니다:
```bash
apk add bat
```
### On Arch Linux
### Arch Linux에서
공식 소스를 통해 [`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를 설치할 수 있습니다:
공식 소스를 통해
[`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를
설치할 수 있습니다:
```bash
pacman -S bat
```
### On Fedora
### Fedora에서
[공식 Fedora 모듈 저장소](https://docs.fedoraproject.org/en-US/modularity/using-modules/)에서 [`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)을 설치할 수 있습니다:
공식
[Fedora 모듈](https://docs.fedoraproject.org/en-US/modularity/using-modules/)
저장소에서
[`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)를
설치할 수 있습니다:
```bash
dnf install bat
```
### On Gentoo Linux
### Gentoo Linux에서
공식 소스를 통해 [`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수 있습니다.
공식 소스를 통해
[`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수
있습니다:
```bash
emerge sys-apps/bat
```
### On Void Linux
### Void Linux에서
xbps-install 이용해 `bat`을 설치할 수 있습니다:
xbps-install 이용해 `bat`을 설치할 수 있습니다:
```bash
xbps-install -S bat
```
### On FreeBSD
### Termux에서
pkg를 이용하여 미리 컴파일된 [`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다:
pkg를 이용해 `bat`을 설치할 수 있습니다:
```bash
pkg install bat
```
### FreeBSD에서
pkg를 이용하여 미리 컴파일된
[`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다:
```bash
pkg install bat
```
또는 FreeBSD 포트에서 직접 빌드할 수도 있습니다:
또는 FreeBSD 포트에서 직접 빌드할 수도 있습니다:
```bash
cd /usr/ports/textproc/bat
make install
```
### Via nix
### nix를 써서
[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수 있습니다:
[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수
있습니다:
```bash
nix-env -i bat
```
### On openSUSE
### openSUSE에서
zypper 이용해 `bat`을 설치할 수 있습니다:
zypper 이용해 `bat`을 설치할 수 있습니다:
```bash
zypper install bat
```
### On macOS
### snap 패키지를 써서
[Homebrew](http://braumeister.org/formula/bat)를 이용해 `bat`을 설치할 수 있습니다:
지금으로서는 추천하는 snap 패키지가 없습니다.
제공되는 패키지들이 존재할 수는 있지만, 공식적으로 지원되지 않으며
[문제](https://github.com/sharkdp/bat/issues/1519)가 있을 수 있습니다.
### macOS (또는 Linux)에서 Homebrew를 써서
[macOS의 Homebrew](https://formulae.brew.sh/formula/bat) 또는
[Linux의 Homebrew](https://formulae.brew.sh/formula-linux/bat)를 이용하여
`bat`을 설치할 수 있습니다.
```bash
brew install bat
```
또는 [MacPorts](https://ports.macports.org/port/bat/summary)를 사용할 수도 있습니다:
### macOS에서 MacPorts를 써서
[MacPorts](https://ports.macports.org/port/bat/summary)를 이용하여 `bat`을
설치할 수 있습니다:
```bash
port install bat
```
### On Windows
### Windows에서
Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다. 먼저 `bat`을 설치 한 후, ["Windows에서 사용하기"](#Windows에서-사용하기) 참고하시기 바랍니다.
Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다.
먼저 `bat`을 설치한 후,
["Windows에서 `bat` 사용하기"](#windows에서-bat-사용하기) 섹션을 살펴보세요.
#### With Chocolatey
#### 전제 조건
[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수 있습니다:
[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
패키지를 설치해야 합니다.
#### Chocolatey를 써서
[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수
있습니다:
```bash
choco install bat
```
#### With Scoop
#### Scoop을 써서
[scoop](https://scoop.sh/)을 이용해 `bat`을 설치할 수 있습니다:
```bash
scoop install bat
```
[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
#### From prebuilt binaries:
#### 사전 빌드된 바이너리들로
[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 빌드된 바이너리를 다운받을 수 있습니다.
[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 사전 빌드된
바이너리를 다운받을 수 있습니다.
[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
패키지를 설치해야 합니다.
### Via Docker
### 바이너리들로
컨테이너에서 `bat`을 사용할 수 있는 [Docker image](https://hub.docker.com/r/danlynn/bat/)가 있습니다.:
```bash
docker pull danlynn/bat
alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
```
[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 아키텍처를
위해 사전 빌드된 버전들을 확인할 수 있습니다.
정적 링크 바이너리들은 파일 이름에 `musl` 이 포함된 아카이브들을 확인하세요.
### Via Ansible
### 소스에서
[Ansible](https://www.ansible.com/)을 사용해 `bat`을 설치할 수 있습니다:
```bash
# Install role on local machine
ansible-galaxy install aeimer.install_bat
```
```yaml
---
# Playbook to install bat
- host: all
roles:
- aeimer.install_bat
```
- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat)
- [GitHub](https://github.com/aeimer/ansible-install-bat)
다음 배포판들에서 동작합니다:
- Debian/Ubuntu
- ARM (eg. Raspberry PI)
- Arch Linux
- Void Linux
- FreeBSD
- MacOS
### From binaries
[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 환경을 위해 빌드된 버전들을 확인 할 수 있습니다. 정적 링크 바이너리들은 아카이브에서 파일 이름에 `musl` 이 포함 파일로 확인 할 수 있습니다.
### From source
`bat`의 소스를 직접 빌드하기 위해서는, Rust 1.36 이상이 필요하며 `cargo`를 이용해 빌드할 수 있습니다.
`bat`의 소스를 빌드하기 위해서는, Rust 1.45 이상이 필요합니다.
`cargo`를 이용해 전부 빌드할 수 있습니다:
```bash
cargo install --locked bat
```
일부 플랫폼에서는 `llvm` 그리고/또는 `libclang-dev` 설치가 필요할 수도 있습니다.
참고로 man 페이지나 셸 자동 완성 파일과 같은 부가 파일들은 이 방법으로 설치될 수
없습니다.
이것들은 `cargo`에 의해 생성이 되고 (`build` 밑의) cargo 타켓 폴더에서 찾을 수
있습니다.
## 커스터마이즈
## 사용자화
### 문법 강조 테마
### 문법 강조 테마
`bat --list-themes`을 사용하면, 현재 사용 가능한 문법 강조 테마들을 확인할 수 있습니다. `TwoDark` 테마 선택하는 경우, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나 환경변수에서 `BAT_THEME``TwoDark`로 세팅해주면 됩니다. 쉘 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 계속 사용도 가능합니다. 이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수도 있습니다.
`bat --list-themes`을 사용하 사용 가능한 문법 강조 테마들의 목록을 확인할 수
있습니다.
`TwoDark` 테마를 선택하려면, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나
`BAT_THEME` 환경 변수를 `TwoDark`로 설정하세요.
셸 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 영구적으로 설정할 수
있습니다.
이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수 있습니다.
다른 테마를 미리 보고 싶은경우 다음 명령어와 같이 사용할 수 있습니다.(이 경우 [`fzf`](https://github.com/junegunn/fzf)가 필요합니다.)
만약 다른 테마들을 사용하여 특정 파일을 보고 싶다면, 다음 명령어를 쓸 수
있습니다(이 경우 [`fzf`](https://github.com/junegunn/fzf)가 필요합니다.)
```bash
bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
```
`bat`의 기본 테마는 어두운 배경색 터미널에 적합합니다. 만일 밝은 배경색을 사용할 경우에는 `GitHub` 이나 `OneHalfLight` 과 같은 테마가 더 잘 어울립니다. 아래 [새로운 테마 추가하기](#새로운-테마-추가하기)에 따라 커스텀 테마를 사용할수도 있습니다.
`bat`은 기본적으로 어두운 배경에 적합합니다.
그러나 밝은 배경의 터미널을 사용한다면 `GitHub`이나 `OneHalfLight`과 같은 테마가
더 잘 어울립니다.
아래 [새로운 테마 추가하기](#새로운-테마-추가하기) 섹션에 따라 커스텀 테마를
사용할 수도 있습니다.
### 8비트 테마
`bat`은 트루컬러 지원이 되더라도 항상
[8비트 색상](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors)을 사용하는
세 개의 테마가 있습니다.
- `ansi`는 어떤 터미널에서도 무난하게 보입니다. 이는 3비트 색상을 사용합니다:
검정, 빨강, 녹색, 노랑, 파랑, 마젠타, 시안, 하양.
- `base16`은 [base16](https://github.com/chriskempson/base16) 터미널 테마를 위해
디자인되었습니다.
이는 [base16 스타일 가이드라인](https://github.com/chriskempson/base16/blob/master/styling.md)에
따라 4비트 색상(3비트 색상에 밝은 변형 추가)을 사용합니다.
- `base16-256`는 [base16-shell](https://github.com/chriskempson/base16-shell)을
위해 디자인되었습니다.
이는 16부터 21의 일부 밝은 색상을 8비트 색상으로 대치합니다.
단지 256-색상 터미널을 쓰지만 base16-shell을 쓰지 않는다고 해서 이것을
사용하지 **마십시오**.
이들 테마는 더 제한적이지만, 트루컬러 테마에 비해 두 장점이 있습니다:
- 이들은 3비트 혹은 4비트 색상을 쓰는 다른 터미널 소프트웨어와 더 잘
어울립니다.
- 만약 터미널 테마를 바꾼다면, 이미 화면 상의 `bat`의 출력도 이에 맞추어
업데이트됩니다.
### 출력 스타일
`--style` 옵션을 이용하`bat`의 출력 스타일을 변경 할 수 있습니다. 예를 들어, `--style=numbers,changes`는 Git 변경분과 라인 넘버에 대해서만 출력하며 눈금과 파일 헤더가 표시되지 않습니다. `BAT_STYLE` 환경 변수로 정의하여 계속해서 사용하거나`bat`의 [설정 파일](#설정-파일)을 사용할 수 있습니다.
`--style` 옵션을 이용하면 `bat`의 출력 모양을 조절할 수 있습니다.
예를 들어, `--style=numbers,changes`를 통해 Git 변경분과 줄 번호는 출력하지만
격자와 파일 헤더는 출력하지 않을 수 있습니다.
`BAT_STYLE` 환경 변수를 정의하여 이러한 수정을 영구적으로 하거나 `bat`의
[설정 파일](#설정-파일)을 사용하세요.
### 새로운 문법 강조 / 언어 추가하기
### 새로운 문법 / 언어 정의 추가하기
`bat`은 문법 강조를 위해 [`syntect`](https://github.com/trishume/syntect/) 라이브러리를 사용하고 있습니다. `syntect`는 [Sublime Text의 `.sublime-syntax` 파일](https://www.sublimetext.com/docs/3/syntax.html)과 테마를 읽을 수 있습니다. 새로운 문법 강조를 추가하는 방법은 다음과 같습니다.
만약 `bat`에서 특정 문법이 지원되지 않을 경우, 다음의 절차를 통해 현재 `bat`
설치본에 새로운 문법을 쉽게 추가할 수 있습니다.
우선 문법 정의 파일을 넣을 폴더를 만듭니다:
`bat`은 문법 강조를 위해 훌륭한
[`syntect`](https://github.com/trishume/syntect/) 라이브러리를 사용합니다.
`syntect`는 임의의 [Sublime Text의 `.sublime-syntax`
파일](https://www.sublimetext.com/docs/3/syntax.html)과 테마를 읽을 수 있습니다.
```bash
mkdir -p "$(bat --config-dir)/syntaxes"
cd "$(bat --config-dir)/syntaxes"
[Package Control](https://packagecontrol.io/)에 Sublime 문법 패키지를 찾는
방법이 잘 정리되어 있습니다.
일단 문법을 찾았다면:
# Put new '.sublime-syntax' language definition files
# in this folder (or its subdirectories), for example:
git clone https://github.com/tellnobody1/sublime-purescript-syntax
```
1. 문법 정의 파일들을 넣을 폴더를 만듭니다:
다음 명령어를 통해 파일을 바이너리 캐시로 파싱합니다.
```bash
mkdir -p "$(bat --config-dir)/syntaxes"
cd "$(bat --config-dir)/syntaxes"
```bash
bat cache --build
```
# Put new '.sublime-syntax' language definition files
# in this folder (or its subdirectories), for example:
git clone https://github.com/tellnobody1/sublime-purescript-syntax
```
마지막으로 `bat --list-languages`을 통해 새로운 언어가 사용 가능한지 확인합니다.
2. 이제 다음 명령어를 통해 파일들을 파싱(parse)하여 바이너리 캐시를 만듭니다.
기본 설정으로 돌아가려면, 다음 명령어를 이용합니다.:
```bash
bat cache --build
```
```bash
bat cache --clear
```
3. 마지막으로, `bat --list-languages`로 새로 추가한 언어가 사용 가능한지
확인합니다.
만약 기본 설정으로 돌아갈 일이 생긴다면, 다음 명령어를 이용합니다:
```bash
bat cache --clear
```
4. 만약 특정 문법이 `bat`에 기본적으로 포함되어 있어야 한다고 생각한다면, 방침과
절차를 [여기](../doc/assets.md)서 읽은 후 "문법 요청(syntax request)"을 열어
주세요: [문법 요청하기](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md).
### 새로운 테마 추가하기
새로운 문법 정의 추가 매우 유사합니다.
이 과정은 새로운 문법 정의 추가 방식과 매우 비슷합니다.
먼저, 새로운 문법 강조 테마 폴더를 만듭니다.
먼저, 새로운 문법 강조 테마 폴더를 만듭니다.
```bash
mkdir -p "$(bat --config-dir)/themes"
cd "$(bat --config-dir)/themes"
@@ -394,32 +534,93 @@ git clone https://github.com/greggb/sublime-snazzy
bat cache --build
```
마지막으로 `bat --list-themes`을 통해 새로 테마 사용 가능한지 확인합니다.
마지막으로 `bat --list-themes`을 통해 새로 추가한 테마들이 사용 가능한지
확인합니다.
### 다른 페이져 사용하기
### 파일 타입 설정을 추가하거나 변경하기
`bat`은 환경변수 `PAGER`로 사용할 페이져를 명시합니다. 만약 이 변수가 정의되어있지 않다면 `less`가 기본입니다. 만약 다른 페이져를 사용하고 싶다면 `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경 변수로 `PAGER` 대신 정의 할 수도 있습니다.
새로운 파일 이름 패턴을 추가하려면 (혹은 이미 존재하는 것을 변경하려면)
`--map-syntax` 커맨드 라인 옵션을 사용하세요.
이 옵션은 `pattern:syntax` 꼴의 인자를 받습니다.
이때 `pattern`은 파일 이름과 절대 파일 경로를 매치할 글로브(glob) 패턴입니다.
`syntax` 부분은 지원되는 언어의 전체 이름입니다
(`bat --list-languages`를 통해 개요를 확인하세요).
만약 커맨드라인 인수로 넘기려면, `PAGER`/`BAT_PAGER` 변수를 정의를 통해 사용 할 수 있습니다. :
참고: 이 옵션은 커맨드 라인에 넘겨 주는 것보다는 `bat`의 설정 파일에 넣는 것이
좋을 것입니다 (아래를 보세요).
예시: "INI" 문법 강조를 `.conf` 파일 확장자의 모든 파일에 적용하려면, 다음을
사용하세요:
```bash
--map-syntax='*.conf:INI'
```
예시: `.ignore`(완전 일치)이라는 이름의 모든 파일을 "Git Ignore" 문법으로
열려면, 다음을 사용하세요:
```bash
--map-syntax='.ignore:Git Ignore'
```
예시: `/etc/apache2`의 하위 폴더들에 있는 모든 `.conf` 파일들을 "Apache Conf"
문법으로 열려면, 다음을 사용하세요 (이 대응(mapping)은 이미 내장되어 있습니다):
```bash
--map-syntax='/etc/apache2/**/*.conf:Apache Conf'
```
### 다른 페이저 사용하기
`bat`은 환경 변수 `PAGER`에 명시된 페이저를 사용합니다.
이 변수가 정의되어 있지 않다면, `less`가 기본으로 사용됩니다.
만약 다른 페이저를 사용하고 싶다면, `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경
변수를 설정하여 `PAGER`의 설정을 오버라이드(override)할 수 있습니다.
만약 커맨드라인 인수들을 페이저에게 넘겨 주려면, `PAGER`/`BAT_PAGER` 변수로
설정할 수 있습니다:
```bash
export BAT_PAGER="less -RF"
```
환경 변수 대신, `bat`의 [설정 파일](#설정-파일)에서 페이를 설정 할 수도 있습니다.(`--pager` 옵션)
환경 변수를 사용하는 대신, `bat`의 [설정 파일](#설정-파일)로 페이를 설정
수도 있습니다 (`--pager` 옵션).
**참고**: 기본적으로 페이`less`로 설정 되어있다면, `bat`은 다음 옵션들을 받을 수 있습니다: `-R`/`--RAW-CONTROL-CHARS`,
`-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`. 마지막 옵션(`-X`)은 530 이전 버전에서만 사용됩니다.
**참고**: 기본적으로, 페이가 `less`로 설정되어 있다면 (그리고 커맨드 라인
옵션이 지정되어 있지 않다면), `bat`은 다음 옵션들을 페이저로 넘겨줍니다:
`-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`.
마지막 옵션(`-X`)은 530 이전 버전의 `less`에만 사용됩니다.
`-R` 옵션은 ANSI 컬러를 올바르게 해석하기 위해 필요합니다. 두번째 옵션 (`-F`)은 출력 크기가 터미널의 세로 크기보다 작을 경우 즉시 종료되도록 합니다.
페이져를 종료하기 위해 `q`를 누를 필요 없기 때문에 작은 파일을 다룰 때 용이합니다. 세번째 옵션(`-X`)는 `less` 이전 버전의 `--quit-if-one-screen` 기능과 함께 버그를 잡을 때 필요합니다. 안타깝게도, `less`의 마우스 휠 지원은 종료합니다.
`-R` 옵션은 ANSI 색상을 올바르게 해석하기 위해 필요합니다.
두 번째 옵션(`-F`)은 출력 크기가 터미널의 세로 크기보다 작을 경우 less가 즉시
종료되도록 합니다.
이는 작은 파일을 다룰 때 페이저를 종료하기 위해 `q`를 누를 필요 없어서
편리합니다.
세 번째 옵션(`-X`)는 예전 버전의 `less`에 있는 `--quit-if-one-screen` 기능의
버그를 고치기 위해 필요합니다.
안타깝게도, 이는 `less`의 마우스 휠 지원과 호환되지 않습니다.
`less` 예전 버전에서 마우스 휠 기능을 활성화 시키려면, `-R` 옵션을 사용하면 됩니다. (위의 예제처럼, 이 옵션은 quit-if-one-screen 기능을 비활성화 시킵니다.)
530 이하 버전에서는 그대로 사용할 수 있습니다.
`less`의 예전 버전에서 마우스 휠 기능을 활성화려면, `-R` 옵션을 넘겨주세요
(위의 예제처럼, 이 옵션은 quit-if-one-screen 기능을 비활성화합니다).
less 530과 이후 버전에서는 그대로 사용할 수 있습니다.
### 들여쓰기
`bat`은 페이저에 의존하지 않고 탭을 4 스페이스로 확장합니다.
이를 변경하려면 간단히 `--tabs` 인자에 표시되기를 원하는 스페이스 개수를
추가하세요.
**참고**: (`bat`의 `--pager` 인자 혹은 `less`의 `LESS` 환경 변수를 통해)
페이저의 탭 길이를 지정하는 것은 효과가 없을 것인데, 이는 페이저가 이미
스페이스로 확장된 탭을 받기 때문입니다.
이 기능은 사이드바에 의한 들여쓰기 문제를 회피하기 위해 추가되었습니다.
`bat`을 `--tabs=0`과 함께 호출하면 이를 오버라이드하여 페이저가 탭을 처리하게
합니다.
### 다크 모드
macOS에서 다크 모드를 사용하고 있다면, OS 테마에 따라 다른 테마를 사용하도록 `bat`의 구성할 수 있습니다. 아래 코드는 라이트 모드에서는 `default` 테마를 다크모드에서는 `Github` 테마를 사용하는 방법입니다.
macOS에서 다크 모드를 사용하고 있다면, `bat`가 OS 테마에 따라 다른 테마를
사용하도록 구성할 수 있습니다.
아래 스니펫은 _다크 모드_에서는 `default` 테마를, _라이트 모드_에서는 `GitHub`
테마를 사용하는 방법입니다.
```bash
alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
@@ -427,57 +628,89 @@ alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /de
## 설정 파일
`bat` 설정 파일로 커스터마이즈 할 수 있습니다. 파일의 위치는 운영 체제에 따라 다릅니다. 아래 커맨드를 통해 시스템의 기본 경로를 알 수 있습니다.
`bat`는 설정 파일로도 사용자화 할 수 있습니다.
설정 파일의 위치는 운영 체제에 따라 다릅니다.
아래 커맨드를 통해 시스템의 기본 경로를 확인할 수 있습니다.
```
bat --config-file
```
또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat` 설정 파일 위치를 지정할 수 있습니다.
또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat`가 설정 파일의 기본 경로
이외의 위치를 사용하도록 할 수 있습니다.
```bash
export BAT_CONFIG_PATH="/path/to/bat.conf"
```
### 포맷
설정 파일은 명령어 인수들의 리스트 입니다. `bat --help`를 이용하여 가능한 옵션들과 값들을 확인해 볼 수 있습니다. 또, `#` 으로 주석을 추가할수도 있습니다.
설정 파일의 예:
기본 설정 파일은 `--generate-config-file` 옵션으로 생성할 수 있습니다.
```bash
# Set the theme to "TwoDark"
--theme="TwoDark"
# Show line numbers, Git modifications and file header (but no grid)
--style="numbers,changes,header"
# Use italic text on the terminal (not supported on all terminals)
--italic-text=always
# Use C++ syntax for .ino files
--map-syntax "*.ino:C++"
# Use ".gitignore"-style highlighting for ".ignore" files
--map-syntax ".ignore:Git Ignore"
bat --generate-config-file
```
## Windows에서 사용하기
### 포맷
`bat` 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능에는 추가 적인 구성이 필요할 수 있습니다.
설정 파일은 단순히 커맨드 라인 인자들의 리스트입니다.
`bat --help`로 가능한 모든 옵션과 값들을 확인하세요.
추가적으로, 줄 앞에 `#` 문자를 추가해 주석을 넣을 수 있습니다.
### 페이징
설정 파일 예시:
```bash
# "TwoDark" 테마 설정하기
--theme="TwoDark"
Windows는 `more` 형식의 매우 제한된 페이저만이 포함되어있습니다. `less`용 Windows 바이너리는 [이 홈페이지](http://www.greenwoodsoftware.com/less/download.html)나 [Chocolatey](https://chocolatey.org/packages/Less)에서 다운로드 받을 수 있습니다. 이를 사용하려면 바이너리를 `PATH` 디렉토리에 배치하거나 [환경 변수로 정의](#using-a-different-pager) 하세요. [Chocolatey 패키지](#on-windows)로 `less`를 자동으로 설치할 수 있습니다.
# 줄 번호, Git 변경 내용, 파일 헤더 보이기 (격자 없이)
--style="numbers,changes,header"
# 터미널에서 이탤릭체 쓰기 (일부 터미널에서 미지원)
--italic-text=always
# .ino 파일에 C++ 문법 쓰기
--map-syntax "*.ino:C++"
```
## Windows에서 `bat` 사용하기
`bat`는 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능은 추가적인
구성이 필요할 수 있습니다.
#### 전제 조건
[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
패키지를 설치해야 합니다.
### 페이징
Windows는 `more` 형식의 매우 제한된 페이저만 포함합니다.
Windows용 `less` 바이너리는
[공식 홈페이지](http://www.greenwoodsoftware.com/less/download.html)나
[Chocolatey](https://chocolatey.org/packages/Less)를 통해 다운로드 받을 수
있습니다.
이를 사용하려면 디렉터리 안의 바이너리를 `PATH`에 넣거나
[환경 변수로 정의](#using-a-different-pager)하세요.
[Chocolatey 패키지](#on-windows)는 `less`를 자동으로 설치합니다.
### 색상
Windows 10은 기본 내장기능으로 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) 이후의 `conhost.exe`(Command Prompt) 와 PowerShell, 그리고 최신 버전의 bash에서 색상을 지원합니다. 이전 버전의 Windows에서는, [ConEmu](https://conemu.github.io/)가 포함 된 [Cmder](http://cmder.net/)를 사용할 수 있습니다 .
Windows 10은
[v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update))부터
기본적으로 `conhost.exe`(Command Prompt)와 PowerShell에서 색상을 지원하며,
최신 버전의 bash에서도 색상을 지원합니다.
이전 버전의 Windows에서는, [ConEmu](https://conemu.github.io/)가 포함된
[Cmder](http://cmder.net/)를 사용할 수 있습니다.
**참고:** `less` Git과 MSYS 버전 Windows에서 색상을 올바르게 해석하지 않습니다. 다른 페이져가 설치되어 있지 않은 경우, `--paging=never` 하거나 `BAT_PAGER`를 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다 .
**참고:** Git과 MSYS 버전의 `less`는 Windows에서 색상을 올바르게 해석하지
않습니다.
다른 페이저가 설치되어 있지 않은 경우, `--paging=never`을 넘겨주거나
`BAT_PAGER`을 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다.
### Cygwin
Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일 경로(`/cygdrive/*`)를 지원하지 않습니다. cygwin 절대경로를 인자로 받았을 때, `bat`은 다음과 같이 오류를 반환합니다. `:The system cannot find the path specified. (os error 3)`
Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일 경로(`/cygdrive/*`)를
지원하지 않습니다.
Cygwin 절대 경로를 인자로 받았을 때, `bat`은 다음과 같은 오류를 반환합니다:
`The system cannot find the path specified. (os error 3)`
이 경우, wrapper를 만들거나 다음 함수를 `.bash_profile`추가하여 문제를 해결하실 수 있습니다 :
이는 wrapper를 만들거나 다음 함수를 `.bash_profile`에 추가하여 해결할 수
있습니다:
```bash
bat() {
@@ -493,68 +726,94 @@ bat() {
}
```
## 트러블슈팅
## 문제 해결
### 터미널과 색상
`bat`은 터미널 트루컬러 지원 여부와 상관없이 동작합니다. 하지만, 문법 강조 테마의 색상이 8-bit 컬러에는 최적화 되어 있지 않고 있으며, 24-bit 트루컬러 지원하는 터미널 사용하는 것을 적극 권장합니다.(`terminator`, `konsole`, `iTerm2`, ...). [이 글](https://gist.github.com/XVilka/8346728)에서 24-bit 트루컬러 지원하는 터미널들을 찾아보실 수 있습니다.
`bat`은 터미널 트루컬러 지원 여부와 상관 없이 동작합니다.
그러나 대부분 문법 강조 테마의 색상은 8비트 색상에 최적화되어 있지 않습니다.
따라서 24비트 트루컬러 지원이 되는 터미널(`terminator`, `konsole`, `iTerm2`,
...)을 사용하는 것을 적극 권장합니다.
트루컬러를 지원하는 터미널들과 더 자세한 정보는
[이 글](https://gist.github.com/XVilka/8346728)에서 찾아보실 수 있습니다.
사용하고 있는 터미널에서 `COLORTERM``truecolor` 혹은
`24bit`로 설정 되어있는지 확인하세요. 만약 아니라면, `bat`은 24-bit escape sequence를 지원되는지 여부를 판단 할 수 없습니다. (그리고 8-bit 색상으로 돌아갑니다.)
사용하고 있는 트루컬러 터미널에서 `COLORTERM` 변수를 `truecolor` 혹은
`24bit`로 설정되어 있는지 확인하세요.
그렇지 않을 경우, `bat`은 24비트 확장열(escape sequence)이 지원되는지 여부를
판단할 수 없습니다 (그리고 8비트 색상을 사용합니다).
### 라인 숫자와 눈금이 잘 보이지 않는 경우
### 줄 번호와 격자가 잘 보이지 않는 경우
다른 테마를 사용해 보세요. (`bat --list-themes`에서 테마들을 확인해 볼 수 있습니다.) `OneHalfDark``OneHalfLight` 테마는 눈금과 선의 색을 밝게 합니다.
다른 테마를 사용해 보세요 (`bat --list-themes`에서 목록을 볼 수 있습니다).
`OneHalfDark`와 `OneHalfLight` 테마는 더 밝은 눈금과 선의 색상을 사용합니다.
### 파일 인코딩
`bat`은 기본적으로 UTF-8과 UTF-8을 제공합니다. 다른 파일 인코딩의 경우, 자동 감지 되지 않으므로 UTF-8로 먼저 변환해 주어야 합니다. 이렇게 할 때, `iconv`를 사용 할 수 있습니다. 예를 들어, Latin-1 (ISO-8859-1)로 인코딩된 PHP파일이라면 다음과 같이 사용할 수 있습니다.:
`bat`은 기본적으로 UTF-8과 UTF-16을 지원합니다.
다른 모든 종류의 파일 인코딩에 대해서는, 일반적으로 인코딩을 자동으로 판별하는
방법이 없기 때문에 먼저 UTF-8으로 변환해야 할 수 있습니다.
이를 위해 `iconv`를 사용할 수 있습니다.
예시: Latin-1(ISO-8859-1)로 인코딩된 PHP 파일은 다음과 같이 처리할 수 있습니다:
``` bash
iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
```
참고: `bat`으로 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을 사용할 수도 있습니다.
참고: `bat`으로 문법 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을
사용할 수 있습니다.
## 배포
## 개발
```bash
# Recursive clone to retrieve all submodules
# 모든 서브모듈을 받기 위해 재귀적으로 복제하기
git clone --recursive https://github.com/sharkdp/bat
# Build (debug version)
# (디버그 버전) 빌드
cd bat
cargo build --bins
# Run unit tests and integration tests
# 단위 테스트와 통합 테스트 실행
cargo test
# Install (release version)
# (배포 버전) 설치
cargo install --locked
# Build a bat binary with modified syntaxes and themes
# 수정된 문법과 테마가 적용된 bat 바이너리 빌드
bash assets/create.sh
cargo install --locked --force
```
`bat`의 pretty-printing 기능을 라이브러리로 사용하는 애플리케이션을 만들고
싶다면, [API 문서](https://docs.rs/bat/)를 살펴보세요.
참고로 `bat`에 라이브러리로써 의존한다면, `regex-onig`나 `regex-fancy`를
기능으로 사용해야 합니다.
## 기여하기
[`CONTRIBUTING.md`](../CONTRIBUTING.md) 가이드를 살펴보세요.
## 메인테이너들
- [sharkdp](https://github.com/sharkdp)
- [eth-p](https://github.com/eth-p)
- [keith-hall](https://github.com/keith-hall)
- [Enselic](https://github.com/Enselic)
## 프로젝트 목표와 대안들
`bat`은 아래와 같은 목표를 달성하려고 합니다:
`bat`은 다음과 같은 목표를 달성하려고 합니다:
- 아름답고 발전된 문법 강조 기능
- Git 연동을 통한 파일 수정 확인
- (POSIX)`cat`의 대체제
- 사용자 친화적인 CLI 제공
- 아름답고 발전된 문법 강조 기능 제공
- Git과의 연동을 통한 파일 변경 확인
- (POSIX) `cat`의 대체제
- 사용자 친화적인 커맨드 라인 인터페이스 제공
슷한 프로그램들을 찾고 있다면, 많은 대안들이 있습니다. 비교는 [이 문서]((doc/alternatives.md))를 참조해주세요.
비슷한 프로그램들을 찾고 있다면 많은 대안들이 있습니다.
비교는 [이 문서](../doc/alternatives.md)를 참조해 주세요.
## 라이센스
Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
`bat`는 MIT 라이센스 Apache 라이센스 2.0의 조건에 따라 배포됩니다.
`bat`는 여러분의 선택에 따라 MIT 라이센스 또는 Apache 라이센스 2.0의 조건에 따라
배포됩니다.
라이센스 세부사항은 [LICENSE-APACHE](LICENSE-APACHE)와 [LICENSE-MIT](LICENSE-MIT)를 참조하세요.
라이센스 세부사항은 [LICENSE-APACHE](../LICENSE-APACHE)와
[LICENSE-MIT](../LICENSE-MIT)를 참조하세요.
+3 -3
View File
@@ -185,7 +185,7 @@ ln -s /usr/bin/batcat ~/.local/bin/bat
[release page](https://github.com/sharkdp/bat/releases) и установить так:
```bash
sudo dpkg -i bat_0.18.0_amd64.deb # измените архитектуру и версию
sudo dpkg -i bat_0.18.2_amd64.deb # измените архитектуру и версию
```
### Alpine Linux
@@ -341,7 +341,7 @@ ansible-galaxy install aeimer.install_bat
### Из исходников
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.42 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.45 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
```bash
cargo install --locked bat
@@ -587,7 +587,7 @@ cargo install --locked --force
Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения.
## Лицензия
Copyright (c) 2018-2020 [Разработчики bat](https://github.com/sharkdp/bat).
Copyright (c) 2018-2021 [Разработчики bat](https://github.com/sharkdp/bat).
`bat` распостраняется под лицензями MIT License и Apache License 2.0 (на выбор пользователя).
+42 -11
View File
@@ -23,6 +23,23 @@ pub struct HighlightingAssets {
fallback_theme: Option<&'static str>,
}
const IGNORED_SUFFIXES: [&str; 10] = [
// Editor etc backups
"~",
".bak",
".old",
".orig",
// Debian and derivatives apt/dpkg backups
".dpkg-dist",
".dpkg-old",
// Red Hat and derivatives rpm backups
".rpmnew",
".rpmorig",
".rpmsave",
// Build system input/template files
".in",
];
impl HighlightingAssets {
pub fn default_theme() -> &'static str {
"Monokai Extended"
@@ -201,7 +218,7 @@ impl HighlightingAssets {
bat_warning!("Theme '{}' is deprecated, using 'ansi' instead.", theme);
return self.get_theme("ansi");
}
if theme != "" {
if !theme.is_empty() {
bat_warning!("Unknown theme '{}', using default.", theme)
}
&self.theme_set.themes[self.fallback_theme.unwrap_or_else(|| Self::default_theme())]
@@ -273,12 +290,25 @@ impl HighlightingAssets {
self.syntax_set
.find_syntax_by_extension(file_name.to_str().unwrap_or_default())
.or_else(|| {
self.syntax_set.find_syntax_by_extension(
Path::new(file_name)
.extension()
.and_then(|x| x.to_str())
.unwrap_or_default(),
)
let file_path = Path::new(file_name);
self.syntax_set
.find_syntax_by_extension(
file_path
.extension()
.and_then(|x| x.to_str())
.unwrap_or_default(),
)
.or_else(|| {
if let Some(file_str) = file_path.to_str() {
for suffix in IGNORED_SUFFIXES.iter() {
if let Some(stripped_filename) = file_str.strip_suffix(suffix) {
return self
.get_extension_syntax(OsStr::new(stripped_filename));
}
}
}
None
})
})
}
@@ -327,7 +357,7 @@ mod tests {
writeln!(temp_file, "{}", first_line).unwrap();
}
let input = Input::ordinary_file(file_path.as_os_str());
let input = Input::ordinary_file(&file_path);
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
@@ -341,7 +371,7 @@ mod tests {
fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String {
let file_path = self.temp_dir.path().join(file_name);
let input = Input::from_reader(Box::new(BufReader::new(first_line.as_bytes())))
.with_name(Some(file_path.as_os_str()));
.with_name(Some(&file_path));
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
@@ -366,7 +396,7 @@ mod tests {
}
fn syntax_for_stdin_with_content(&self, file_name: &str, content: &[u8]) -> String {
let input = Input::stdin().with_name(Some(OsStr::new(file_name)));
let input = Input::stdin().with_name(Some(file_name));
let mut opened_input = input.open(content, None).unwrap();
self.assets
@@ -450,6 +480,7 @@ mod tests {
assert_eq!(test.syntax_for_file("test.sass"), "Sass");
assert_eq!(test.syntax_for_file("test.js"), "JavaScript (Babel)");
assert_eq!(test.syntax_for_file("test.fs"), "F#");
assert_eq!(test.syntax_for_file("test.v"), "Verilog");
}
#[test]
@@ -521,7 +552,7 @@ mod tests {
.expect("creation of directory succeeds");
symlink(&file_path, &file_path_symlink).expect("creation of symbolic link succeeds");
let input = Input::ordinary_file(file_path_symlink.as_os_str());
let input = Input::ordinary_file(&file_path_symlink);
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
+10 -7
View File
@@ -1,6 +1,6 @@
use std::collections::HashSet;
use std::env;
use std::ffi::OsStr;
use std::path::Path;
use std::str::FromStr;
use atty::{self, Stream};
@@ -248,16 +248,19 @@ impl App {
}
_ => {}
}
let filenames: Option<Vec<&str>> = self
let filenames: Option<Vec<&Path>> = self
.matches
.values_of("file-name")
.map(|values| values.collect());
.values_of_os("file-name")
.map(|values| values.map(Path::new).collect());
let mut filenames_or_none: Box<dyn Iterator<Item = _>> = match filenames {
Some(ref filenames) => Box::new(filenames.iter().map(|name| Some(OsStr::new(*name)))),
let mut filenames_or_none: Box<dyn Iterator<Item = Option<&Path>>> = match filenames {
Some(filenames) => Box::new(filenames.into_iter().map(Some)),
None => Box::new(std::iter::repeat(None)),
};
let files: Option<Vec<&OsStr>> = self.matches.values_of_os("FILE").map(|vs| vs.collect());
let files: Option<Vec<&Path>> = self
.matches
.values_of_os("FILE")
.map(|vs| vs.map(Path::new).collect());
if files.is_none() {
return Ok(vec![new_stdin_input(
+4 -4
View File
@@ -1,15 +1,15 @@
use bat::input::Input;
use std::ffi::OsStr;
use std::path::Path;
pub fn new_file_input<'a>(file: &'a OsStr, name: Option<&'a OsStr>) -> Input<'a> {
pub fn new_file_input<'a>(file: &'a Path, name: Option<&'a Path>) -> Input<'a> {
named(Input::ordinary_file(file), name.or(Some(file)))
}
pub fn new_stdin_input(name: Option<&OsStr>) -> Input {
pub fn new_stdin_input(name: Option<&Path>) -> Input {
named(Input::stdin(), name)
}
fn named<'a>(input: Input<'a>, name: Option<&OsStr>) -> Input<'a> {
fn named<'a>(input: Input<'a>, name: Option<&Path>) -> Input<'a> {
if let Some(provided_name) = name {
let mut input = input.with_name(Some(provided_name));
input.description_mut().set_kind(Some("File".to_owned()));
+16 -6
View File
@@ -9,7 +9,6 @@ mod directories;
mod input;
use std::collections::{HashMap, HashSet};
use std::ffi::OsStr;
use std::io;
use std::io::{BufReader, Write};
use std::path::Path;
@@ -232,13 +231,14 @@ fn run() -> Result<bool> {
let pager = bat::config::get_pager_executable(app.matches.value_of("pager"))
.unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
bugreport!()
let report = bugreport!()
.info(SoftwareVersion::default())
.info(OperatingSystem::default())
.info(CommandLine::default())
.info(EnvironmentVariables::list(&[
"SHELL",
"PAGER",
"LESS",
"BAT_PAGER",
"BAT_CACHE_PATH",
"BAT_CONFIG_PATH",
@@ -253,9 +253,19 @@ fn run() -> Result<bool> {
"MANPAGER",
]))
.info(FileContent::new("Config file", config_file()))
.info(CompileTimeInformation::default())
.info(CommandOutput::new("Less version", pager, &["--version"]))
.print::<Markdown>();
.info(CompileTimeInformation::default());
let mut report = if let Ok(resolved_path) = grep_cli::resolve_binary(pager) {
report.info(CommandOutput::new(
"Less version",
resolved_path,
&["--version"],
))
} else {
report
};
report.print::<Markdown>();
return Ok(true);
}
@@ -269,7 +279,7 @@ fn run() -> Result<bool> {
run_cache_subcommand(cache_matches)?;
Ok(true)
} else {
let inputs = vec![Input::ordinary_file(OsStr::new("cache"))];
let inputs = vec![Input::ordinary_file("cache")];
let config = app.config(&inputs)?;
run_controller(inputs, &config)
+1 -2
View File
@@ -1,7 +1,6 @@
#![cfg(feature = "git")]
use std::collections::HashMap;
use std::ffi::OsStr;
use std::fs;
use std::path::Path;
@@ -17,7 +16,7 @@ pub enum LineChange {
pub type LineChanges = HashMap<u32, LineChange>;
pub fn get_git_diff(filename: &OsStr) -> Option<LineChanges> {
pub fn get_git_diff(filename: &Path) -> Option<LineChanges> {
let repo = Repository::discover(&filename).ok()?;
let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?;
+16 -8
View File
@@ -1,7 +1,7 @@
use std::convert::TryFrom;
use std::ffi::{OsStr, OsString};
use std::fs::File;
use std::io::{self, BufRead, BufReader, Read};
use std::path::{Path, PathBuf};
use clircle::{Clircle, Identifier};
use content_inspector::{self, ContentType};
@@ -69,7 +69,7 @@ impl InputDescription {
}
pub(crate) enum InputKind<'a> {
OrdinaryFile(OsString),
OrdinaryFile(PathBuf),
StdIn,
CustomReader(Box<dyn Read + 'a>),
}
@@ -86,7 +86,7 @@ impl<'a> InputKind<'a> {
#[derive(Clone, Default)]
pub(crate) struct InputMetadata {
pub(crate) user_provided_name: Option<OsString>,
pub(crate) user_provided_name: Option<PathBuf>,
}
pub struct Input<'a> {
@@ -96,7 +96,7 @@ pub struct Input<'a> {
}
pub(crate) enum OpenedInputKind {
OrdinaryFile(OsString),
OrdinaryFile(PathBuf),
StdIn,
CustomReader,
}
@@ -109,8 +109,12 @@ pub(crate) struct OpenedInput<'a> {
}
impl<'a> Input<'a> {
pub fn ordinary_file(path: &OsStr) -> Self {
let kind = InputKind::OrdinaryFile(path.to_os_string());
pub fn ordinary_file(path: impl AsRef<Path>) -> Self {
Self::_ordinary_file(path.as_ref())
}
fn _ordinary_file(path: &Path) -> Self {
let kind = InputKind::OrdinaryFile(path.to_path_buf());
Input {
description: kind.description(),
metadata: InputMetadata::default(),
@@ -140,7 +144,11 @@ impl<'a> Input<'a> {
matches!(self.kind, InputKind::StdIn)
}
pub fn with_name(mut self, provided_name: Option<&OsStr>) -> Self {
pub fn with_name(self, provided_name: Option<impl AsRef<Path>>) -> Self {
self._with_name(provided_name.as_ref().map(|it| it.as_ref()))
}
fn _with_name(mut self, provided_name: Option<&Path>) -> Self {
if let Some(name) = provided_name {
self.description.name = name.to_string_lossy().to_string()
}
@@ -203,7 +211,7 @@ impl<'a> Input<'a> {
)
.into());
}
file = input_identifier.into_inner().expect("The file was lost in the clircle::Identifier, this should not have happended...");
file = input_identifier.into_inner().expect("The file was lost in the clircle::Identifier, this should not have happened...");
}
InputReader::new(BufReader::new(file))
+17 -2
View File
@@ -4,14 +4,16 @@ use std::ffi::OsStr;
use std::process::Command;
pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<usize> {
let cmd = Command::new(less_path).arg("--version").output().ok()?;
let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
parse_less_version(&cmd.stdout)
}
fn parse_less_version(output: &[u8]) -> Option<usize> {
if output.starts_with(b"less ") {
let version = std::str::from_utf8(&output[5..]).ok()?;
let end = version.find(' ')?;
let end = version.find(|c: char| !c.is_ascii_digit())?;
version[..end].parse::<usize>().ok()
} else {
None
@@ -57,6 +59,19 @@ Home page: http://www.greenwoodsoftware.com/less";
assert_eq!(Some(551), parse_less_version(output));
}
#[test]
fn test_parse_less_version_581_2() {
let output = b"less 581.2 (PCRE2 regular expressions)
Copyright (C) 1984-2021 Mark Nudelman
less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less";
assert_eq!(Some(581), parse_less_version(output));
}
#[test]
fn test_parse_less_version_wrong_program() {
let output = b"more from util-linux 2.34";
+8 -1
View File
@@ -63,7 +63,14 @@ impl OutputType {
return Err(ErrorKind::InvalidPagerValueBat.into());
}
let mut p = Command::new(&pager.bin);
let resolved_path = match grep_cli::resolve_binary(&pager.bin) {
Ok(path) => path,
Err(_) => {
return Ok(OutputType::stdout());
}
};
let mut p = Command::new(resolved_path);
let args = pager.args;
if pager.kind == PagerKind::Less {
+11 -11
View File
@@ -98,17 +98,17 @@ pub(crate) fn get_pager(config_pager: Option<&str>) -> Result<Option<Pager>, Par
Some((bin, args)) => {
let kind = PagerKind::from_bin(bin);
let use_less_instead = match (&source, &kind) {
// 'more' and 'most' do not supports colors; automatically use 'less' instead
// if the problematic pager came from the generic PAGER env var
(PagerSource::EnvVarPager, PagerKind::More) => true,
(PagerSource::EnvVarPager, PagerKind::Most) => true,
// If PAGER=bat, silently use 'less' instead to prevent recursion ...
(PagerSource::EnvVarPager, PagerKind::Bat) => true,
// Never silently use less if BAT_PAGER or --pager has been specified
_ => false,
let use_less_instead = if source == PagerSource::EnvVarPager {
// 'more' and 'most' do not supports colors; automatically use
// 'less' instead if the problematic pager came from the
// generic PAGER env var.
// If PAGER=bat, silently use 'less' instead to prevent
// recursion.
// Never silently use 'less' if BAT_PAGER or --pager has been
// specified.
matches!(kind, PagerKind::More | PagerKind::Most | PagerKind::Bat)
} else {
false
};
Ok(Some(if use_less_instead {
+19 -18
View File
@@ -1,5 +1,5 @@
use std::ffi::OsStr;
use std::io::Read;
use std::path::Path;
use console::Term;
use syntect::parsing::SyntaxReference;
@@ -40,10 +40,11 @@ pub struct PrettyPrinter<'a> {
impl<'a> PrettyPrinter<'a> {
pub fn new() -> Self {
let mut config = Config::default();
config.colored_output = true;
config.true_color = true;
let config = Config {
colored_output: true,
true_color: true,
..Default::default()
};
PrettyPrinter {
inputs: vec![],
@@ -71,7 +72,7 @@ impl<'a> PrettyPrinter<'a> {
}
/// Add a file which should be pretty-printed
pub fn input_file(&mut self, path: impl AsRef<OsStr>) -> &mut Self {
pub fn input_file(&mut self, path: impl AsRef<Path>) -> &mut Self {
self.input(Input::from_file(path).kind("File"))
}
@@ -79,7 +80,7 @@ impl<'a> PrettyPrinter<'a> {
pub fn input_files<I, P>(&mut self, paths: I) -> &mut Self
where
I: IntoIterator<Item = P>,
P: AsRef<OsStr>,
P: AsRef<Path>,
{
self.inputs(paths.into_iter().map(Input::from_file))
}
@@ -297,8 +298,8 @@ impl<'a> Input<'a> {
}
/// A new input from a file.
pub fn from_file(path: impl AsRef<OsStr>) -> Self {
input::Input::ordinary_file(path.as_ref()).into()
pub fn from_file(path: impl AsRef<Path>) -> Self {
input::Input::ordinary_file(path).into()
}
/// A new input from bytes.
@@ -313,8 +314,8 @@ impl<'a> Input<'a> {
/// The filename of the input.
/// This affects syntax detection and changes the default header title.
pub fn name(mut self, name: impl AsRef<OsStr>) -> Self {
self.input = self.input.with_name(Some(name.as_ref()));
pub fn name(mut self, name: impl AsRef<Path>) -> Self {
self.input = self.input.with_name(Some(name));
self
}
@@ -327,7 +328,7 @@ impl<'a> Input<'a> {
self
}
/// The title for the input (e.g. "http://example.com/example.txt")
/// The title for the input (e.g. "Descriptive title")
/// This defaults to the file name.
pub fn title(mut self, title: impl Into<String>) -> Self {
self.input.description_mut().set_title(Some(title.into()));
@@ -335,14 +336,14 @@ impl<'a> Input<'a> {
}
}
impl<'a> Into<Input<'a>> for input::Input<'a> {
fn into(self) -> Input<'a> {
Input { input: self }
impl<'a> From<input::Input<'a>> for Input<'a> {
fn from(input: input::Input<'a>) -> Self {
Self { input }
}
}
impl<'a> Into<input::Input<'a>> for Input<'a> {
fn into(self) -> input::Input<'a> {
self.input
impl<'a> From<Input<'a>> for input::Input<'a> {
fn from(Input { input }: Input<'a>) -> Self {
input
}
}
+8 -4
View File
@@ -447,8 +447,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
if text.len() != text_trimmed.len() {
if let Some(background_color) = background_color {
let mut ansi_style = Style::default();
ansi_style.background = to_ansi_color(background_color, true_color);
let ansi_style = Style {
background: to_ansi_color(background_color, true_color),
..Default::default()
};
let width = if cursor_total <= cursor_max {
cursor_max - cursor_total + 1
} else {
@@ -588,8 +590,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
}
if let Some(background_color) = background_color {
let mut ansi_style = Style::default();
ansi_style.background = to_ansi_color(background_color, self.config.true_color);
let ansi_style = Style {
background: to_ansi_color(background_color, self.config.true_color),
..Default::default()
};
write!(
handle,
+6 -6
View File
@@ -4,9 +4,9 @@ snapshots/** text=auto eol=lf
syntax-tests/source/** text=auto eol=lf
syntax-tests/highlighted/** text=auto eol=lf
examples/* linguist-vendored
snapshots/* linguist-vendored
benchmarks/* linguist-vendored
benchmarks/test-src/* linguist-vendored
scripts/* linguist-vendored
syntax-tests/* linguist-vendored
# Linguist overrides
benchmarks/** linguist-vendored
examples/** linguist-vendored
snapshots/** linguist-vendored
syntax-tests/highlighted/** linguist-vendored
syntax-tests/source/** linguist-vendored
+1
View File
@@ -30,6 +30,7 @@ fn all_themes_are_present() {
"Solarized (light)",
"Sublime Snazzy",
"TwoDark",
"Visual Studio Dark+",
"ansi",
"base16",
"base16-256",
+3
View File
@@ -17,6 +17,9 @@ fn no_duplicate_extensions() {
// The '.fs' extension appears in F# and GLSL.
// We default to F#.
"fs",
// SystemVerilog and Verilog both use .v files.
// We default to Verilog.
"v",
];
let assets = HighlightingAssets::from_binary();
@@ -18,6 +18,7 @@ BAT_OPTIONS = [
SKIP_FILENAMES = [
"LICENSE.md",
"NOTICE",
"README.md",
"bat_options",
]
+7 -7
View File
@@ -1,7 +1,7 @@
first,last,address,city,zip
John,Doe,120 any st.,"Anytown, WW",08123
a,b
1,"ha 
""ha"" 
ha",120 any st.,"Anytown, WW",08123
3,4,120 any st.,"Anytown, WW",08123
first,last,address,city,zip
John,Doe,120 any st.,"Anytown, WW",08123
a,b
1,"ha 
""ha"" 
ha",120 any st.,"Anytown, WW",08123
3,4,120 any st.,"Anytown, WW",08123
Can't render this file because it contains an unexpected character in line 2 and column 276.
+247
View File
@@ -0,0 +1,247 @@
cabal-version: 2.4
name: semantic
version: 0.11.0.1
synopsis: Framework and executable for analyzing and diffing untrusted code.
description: Semantic is a library for parsing, analyzing, and comparing source code across many languages.
homepage: http://github.com/github/semantic#readme
bug-reports: https://github.com/github/semantic/issues
license: MIT
license-file: LICENSE
author: The Semantic authors
maintainer: opensource+semantic@github.com
copyright: (c) 2015-2020 GitHub, Inc.
category: Language
build-type: Simple
stability: alpha
extra-source-files: README.md
tested-with: GHC == 8.10.1
flag release
 description: Build with optimizations on (for CI or deployment builds)
 default: False
-- GHC extensions shared between targets
common haskell
 default-language: Haskell2010
 default-extensions: StrictData
 ghc-options:
 -Weverything
 -Wno-missing-local-signatures
 -Wno-missing-import-lists
 -Wno-implicit-prelude
 -Wno-safe
 -Wno-unsafe
 -Wno-name-shadowing
 -Wno-monomorphism-restriction
 -Wno-missed-specialisations
 -Wno-all-missed-specialisations
 -Wno-star-is-type
 cpp-options:
 -DBAZEL_BUILD=0
 if (impl(ghc >= 8.8))
 ghc-options: -Wno-missing-deriving-strategies
 if (impl(ghc >= 8.10))
 ghc-options:
 -Wno-missing-safe-haskell-mode
 -Wno-prepositive-qualified-module
common executable-flags
 ghc-options: -threaded -rtsopts "-with-rtsopts=-N -A4m -n2m"
library
 import: haskell
 hs-source-dirs: src
 exposed-modules: Control.Carrier.Parse.Measured
 , Control.Carrier.Parse.Simple
 -- Effects
 , Control.Effect.Parse
 , Control.Effect.Sum.Project
 , Control.Effect.Timeout
 -- General datatype definitions & generic algorithms
 , Data.Blob
 , Data.Blob.IO
 , Data.Duration
 , Data.Edit
 , Data.Error
 , Data.Flag
 , Data.Graph.Algebraic
 , Data.Handle
 , Data.Maybe.Exts
 , Data.Semigroup.App
 -- Parser glue
 , Parsing.Parser
 , Parsing.TreeSitter
 -- API
 , Semantic.Api
 , Semantic.Api.Bridge
 , Semantic.Api.StackGraph
 , Semantic.Api.Symbols
 , Semantic.Api.Terms
 , Semantic.CLI
 , Semantic.Config
 , Semantic.Env
 , Semantic.IO
 , Semantic.Task
 , Semantic.Task.Files
 , Semantic.Telemetry
 , Semantic.Telemetry.AsyncQueue
 , Semantic.Telemetry.Error
 , Semantic.Telemetry.Log
 , Semantic.Telemetry.Stat
 , Semantic.Util
 , Semantic.Util.Pretty
 , Semantic.Version
 -- Serialization
 , Serializing.Format
 , Serializing.SExpression.Precise
 -- Custom Prelude
 autogen-modules: Paths_semantic
 other-modules: Paths_semantic
 -- Except in case of vendored dependencies, these deps should be expressed
 -- as caret-operator bounds relative to a version in Stackage.
 -- These are currently pinned to lts-13.13.
 build-depends:
 , aeson ^>= 1.4.2.0
 , algebraic-graphs ^>= 0.3
 , ansi-terminal >= 0.8.2 && <1
 , async ^>= 2.2.1
 , base >= 4.13 && < 5
 , bytestring ^>= 0.10.8.2
 , containers ^>= 0.6.0.1
 , directory-tree ^>= 0.12.1
 , filepath ^>= 1.4.2.1
 , fused-effects ^>= 1.1
 , ghc-prim >= 0.5 && < 0.7
 , hostname ^>= 1.0
 , hscolour ^>= 1.24.4
 , lens >= 4.17 && < 4.20
 , network ^>= 2.8.0.0
 , network-uri ^>= 2.6.1.0
 , optparse-applicative >= 0.14.3 && < 0.16
 , pathtype ^>= 0.8.1
 , pretty-show ^>= 1.9.5
 , proto-lens >= 0.5 && < 0.8
 , semantic-analysis ^>= 0
 , semantic-ast
 , semantic-codeql ^>= 0
 , semantic-go ^>= 0
 , semantic-java ^>= 0
 , semantic-json ^>= 0
 , semantic-php ^>= 0
 , semantic-proto ^>= 0
 , semantic-python ^>= 0
 , semantic-ruby ^>= 0
 , semantic-scope-graph ^>= 0
 , semantic-source ^>= 0.1.0.1
 , semantic-tags ^>= 0
 , semantic-tsx ^>= 0
 , semantic-typescript ^>= 0
 , semilattices ^>= 0.0.0.3
 , split ^>= 0.2.3.3
 , stm-chans ^>= 3.0.0.4
 , text ^>= 1.2.3.2
 , time >= 1.8.0.2 && < 1.10
 , tree-sitter ^>= 0.9.0.1
 , tree-sitter-go ^>= 0.5.0.0
 , tree-sitter-java ^>= 0.7.0.0
 , tree-sitter-json ^>= 0.7.0.0
 , tree-sitter-php ^>= 0.5.0.0
 , tree-sitter-python ^>= 0.9.0.1
 , tree-sitter-ql ^>= 0.1.0.1
 , tree-sitter-ruby ^>= 0.5.0.0
 , tree-sitter-tsx ^>= 0.5.0.0
 , tree-sitter-typescript ^>= 0.5.0.0
 , unix ^>= 2.7.2.2
executable semantic
 import: haskell, executable-flags
 hs-source-dirs: app
 main-is: Main.hs
 build-depends:
 , base
 , semantic
test-suite test
 import: haskell, executable-flags
 type: exitcode-stdio-1.0
 hs-source-dirs: test
 main-is: Spec.hs
 other-modules: Data.Graph.Spec
 , Data.Language.Spec
 , Data.Semigroup.App.Spec
 , Integration.Spec
 , Semantic.Spec
 , Semantic.CLI.Spec
 , Semantic.IO.Spec
 , Semantic.Stat.Spec
 , Tags.Spec
 , SpecHelpers
 , Generators
 , Properties
 build-depends:
 , algebraic-graphs ^>= 0.3
 , base >= 4.13 && < 5
 , bytestring ^>= 0.10.8.2
 , fused-effects
 , Glob ^>= 0.10.0
 , hedgehog ^>= 1
 , hspec >= 2.6 && <3
 , hspec-expectations ^>= 0.8.2
 , network ^>= 2.8.0.0
 , pathtype ^>= 0.8.1
 , semantic
 , semantic-analysis
 , semantic-ast
 , semantic-proto
 , semantic-source ^>= 0.1.0.1
 , semantic-tags
 , semilattices
 , tasty ^>= 1.2.3
 , tasty-golden ^>= 2.3.2
 , tasty-hedgehog ^>= 1.0.0.1
 , tasty-hspec ^>= 1.1.5.1
 , tasty-hunit ^>= 0.10.0.2
test-suite parse-examples
 import: haskell, executable-flags
 type: exitcode-stdio-1.0
 hs-source-dirs: test
 main-is: Examples.hs
 build-depends:
 , async ^>= 2.2.1
 , base
 , fused-effects ^>= 1.1
 , Glob
 , lens >= 4.17 && < 4.20
 , pathtype ^>= 0.8.1
 , process ^>= 1.6.3.0
 , semantic
 , semantic-analysis ^>= 0
 , semantic-ast
 , semantic-proto ^>= 0
 , tasty
 , tasty-hunit
 , text ^>= 1.2.3.2
benchmark benchmarks
 import: haskell, executable-flags
 hs-source-dirs: bench
 type: exitcode-stdio-1.0
 main-is: Main.hs
 other-modules: Tagging
 ghc-options: -static
 build-depends:
 , base
 , fused-effects ^>= 1.1
 , gauge ^>= 0.2.5
 , Glob
 , pathtype ^>= 0.8.1
 , semantic
 , semantic-analysis ^>= 0
 , semantic-proto
source-repository head
 type: git
 location: https://github.com/github/semantic
@@ -0,0 +1,391 @@
# CoffeeScript can be used both on the server, as a command-line compiler based
# on Node.js/V8, or to run CoffeeScript directly in the browser. This module
# contains the main entry functions for tokenizing, parsing, and compiling
# source CoffeeScript into JavaScript.
{Lexer} = require './lexer'
{parser} = require './parser'
helpers = require './helpers'
SourceMap = require './sourcemap'
# Require `package.json`, which is two levels above this file, as this file is
# evaluated from `lib/coffeescript`.
packageJson = require '../../package.json'
# The current CoffeeScript version number.
exports.VERSION = packageJson.version
exports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']
# Expose helpers for testing.
exports.helpers = helpers
# Function that allows for btoa in both nodejs and the browser.
base64encode = (src) -> switch
 when typeof Buffer is 'function'
 Buffer.from(src).toString('base64')
 when typeof btoa is 'function'
 # The contents of a `<script>` block are encoded via UTF-16, so if any extended
 # characters are used in the block, btoa will fail as it maxes out at UTF-8.
 # See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
 # for the gory details, and for the solution implemented here.
 btoa encodeURIComponent(src).replace /%([0-9A-F]{2})/g, (match, p1) ->
 String.fromCharCode '0x' + p1
 else
 throw new Error('Unable to base64 encode inline sourcemap.')
# Function wrapper to add source file information to SyntaxErrors thrown by the
# lexer/parser/compiler.
withPrettyErrors = (fn) ->
 (code, options = {}) ->
 try
 fn.call @, code, options
 catch err
 throw err if typeof code isnt 'string' # Support `CoffeeScript.nodes(tokens)`.
 throw helpers.updateSyntaxError err, code, options.filename
# For each compiled file, save its source in memory in case we need to
# recompile it later. We might need to recompile if the first compilation
# didnt create a source map (faster) but something went wrong and we need
# a stack trace. Assuming that most of the time, code isnt throwing
# exceptions, its probably more efficient to compile twice only when we
# need a stack trace, rather than always generating a source map even when
# its not likely to be used. Save in form of `filename`: [`(source)`]
sources = {}
# Also save source maps if generated, in form of `(source)`: [`(source map)`].
sourceMaps = {}
# This is exported to enable an external module to implement caching of
# compilation results. When the compiled js source is loaded from cache, the
# original coffee code should be added with this method in order to enable the
# Error.prepareStackTrace below to correctly adjust the stack trace for the
# corresponding file (the source map will be generated on demand).
exports.registerCompiled = registerCompiled = (filename, source, sourcemap) ->
 sources[filename] ?= []
 sources[filename].push source
 if sourcemap?
 sourceMaps[filename] ?= []
 sourceMaps[filename].push sourcemap
# Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.
#
# If `options.sourceMap` is specified, then `options.filename` must also be
# specified. All options that can be passed to `SourceMap#generate` may also
# be passed here.
#
# This returns a javascript string, unless `options.sourceMap` is passed,
# in which case this returns a `{js, v3SourceMap, sourceMap}`
# object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for
# doing programmatic lookups.
exports.compile = compile = withPrettyErrors (code, options = {}) ->
 # Clone `options`, to avoid mutating the `options` object passed in.
 options = Object.assign {}, options
 # Always generate a source map if no filename is passed in, since without a
 # a filename we have no way to retrieve this source later in the event that
 # we need to recompile it to get a source map for `prepareStackTrace`.
 generateSourceMap = options.sourceMap or options.inlineMap or not options.filename?
 filename = options.filename or '<anonymous>'
 checkShebangLine filename, code
 map = new SourceMap if generateSourceMap
 tokens = lexer.tokenize code, options
 # Pass a list of referenced variables, so that generated variables wont get
 # the same name.
 options.referencedVars = (
 token[1] for token in tokens when token[0] is 'IDENTIFIER'
 )
 # Check for import or export; if found, force bare mode.
 unless options.bare? and options.bare is yes
 for token in tokens
 if token[0] in ['IMPORT', 'EXPORT']
 options.bare = yes
 break
 nodes = parser.parse tokens
 # If all that was requested was a POJO representation of the nodes, e.g.
 # the abstract syntax tree (AST), we can stop now and just return that
 # (after fixing the location data for the root/`File`»`Program` node,
 # which mightve gotten misaligned from the original source due to the
 # `clean` function in the lexer).
 if options.ast
 nodes.allCommentTokens = helpers.extractAllCommentTokens tokens
 sourceCodeNumberOfLines = (code.match(/\r?\n/g) or '').length + 1
 sourceCodeLastLine = /.*$/.exec(code)[0] # `.*` matches all but line break characters.
 ast = nodes.ast options
 range = [0, code.length]
 ast.start = ast.program.start = range[0]
 ast.end = ast.program.end = range[1]
 ast.range = ast.program.range = range
 ast.loc.start = ast.program.loc.start = {line: 1, column: 0}
 ast.loc.end.line = ast.program.loc.end.line = sourceCodeNumberOfLines
 ast.loc.end.column = ast.program.loc.end.column = sourceCodeLastLine.length
 ast.tokens = tokens
 return ast
 fragments = nodes.compileToFragments options
 currentLine = 0
 currentLine += 1 if options.header
 currentLine += 1 if options.shiftLine
 currentColumn = 0
 js = ""
 for fragment in fragments
 # Update the sourcemap with data from each fragment.
 if generateSourceMap
 # Do not include empty, whitespace, or semicolon-only fragments.
 if fragment.locationData and not /^[;\s]*$/.test fragment.code
 map.add(
 [fragment.locationData.first_line, fragment.locationData.first_column]
 [currentLine, currentColumn]
 {noReplace: true})
 newLines = helpers.count fragment.code, "\n"
 currentLine += newLines
 if newLines
 currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1)
 else
 currentColumn += fragment.code.length
 # Copy the code from each fragment into the final JavaScript.
 js += fragment.code
 if options.header
 header = "Generated by CoffeeScript #{@VERSION}"
 js = "// #{header}\n#{js}"
 if generateSourceMap
 v3SourceMap = map.generate options, code
 if options.transpile
 if typeof options.transpile isnt 'object'
 # This only happens if run via the Node API and `transpile` is set to
 # something other than an object.
 throw new Error 'The transpile option must be given an object with options to pass to Babel'
 # Get the reference to Babel that we have been passed if this compiler
 # is run via the CLI or Node API.
 transpiler = options.transpile.transpile
 delete options.transpile.transpile
 transpilerOptions = Object.assign {}, options.transpile
 # See https://github.com/babel/babel/issues/827#issuecomment-77573107:
 # Babel can take a v3 source map object as input in `inputSourceMap`
 # and it will return an *updated* v3 source map object in its output.
 if v3SourceMap and not transpilerOptions.inputSourceMap?
 transpilerOptions.inputSourceMap = v3SourceMap
 transpilerOutput = transpiler js, transpilerOptions
 js = transpilerOutput.code
 if v3SourceMap and transpilerOutput.map
 v3SourceMap = transpilerOutput.map
 if options.inlineMap
 encoded = base64encode JSON.stringify v3SourceMap
 sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64,#{encoded}"
 sourceURL = "//# sourceURL=#{options.filename ? 'coffeescript'}"
 js = "#{js}\n#{sourceMapDataURI}\n#{sourceURL}"
 registerCompiled filename, code, map
 if options.sourceMap
 {
 js
 sourceMap: map
 v3SourceMap: JSON.stringify v3SourceMap, null, 2
 }
 else
 js
# Tokenize a string of CoffeeScript code, and return the array of tokens.
exports.tokens = withPrettyErrors (code, options) ->
 lexer.tokenize code, options
# Parse a string of CoffeeScript code or an array of lexed tokens, and
# return the AST. You can then compile it by calling `.compile()` on the root,
# or traverse it by using `.traverseChildren()` with a callback.
exports.nodes = withPrettyErrors (source, options) ->
 source = lexer.tokenize source, options if typeof source is 'string'
 parser.parse source
# This file used to export these methods; leave stubs that throw warnings
# instead. These methods have been moved into `index.coffee` to provide
# separate entrypoints for Node and non-Node environments, so that static
# analysis tools dont choke on Node packages when compiling for a non-Node
# environment.
exports.run = exports.eval = exports.register = ->
 throw new Error 'require index.coffee, not this file'
# Instantiate a Lexer for our use here.
lexer = new Lexer
# The real Lexer produces a generic stream of tokens. This object provides a
# thin wrapper around it, compatible with the Jison API. We can then pass it
# directly as a “Jison lexer.”
parser.lexer =
 yylloc:
 range: []
 options:
 ranges: yes
 lex: ->
 token = parser.tokens[@pos++]
 if token
 [tag, @yytext, @yylloc] = token
 parser.errorToken = token.origin or token
 @yylineno = @yylloc.first_line
 else
 tag = ''
 tag
 setInput: (tokens) ->
 parser.tokens = tokens
 @pos = 0
 upcomingInput: -> ''
# Make all the AST nodes visible to the parser.
parser.yy = require './nodes'
# Override Jison's default error handling function.
parser.yy.parseError = (message, {token}) ->
 # Disregard Jison's message, it contains redundant line number information.
 # Disregard the token, we take its value directly from the lexer in case
 # the error is caused by a generated token which might refer to its origin.
 {errorToken, tokens} = parser
 [errorTag, errorText, errorLoc] = errorToken
 errorText = switch
 when errorToken is tokens[tokens.length - 1]
 'end of input'
 when errorTag in ['INDENT', 'OUTDENT']
 'indentation'
 when errorTag in ['IDENTIFIER', 'NUMBER', 'INFINITY', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START']
 errorTag.replace(/_START$/, '').toLowerCase()
 else
 helpers.nameWhitespaceCharacter errorText
 # The second argument has a `loc` property, which should have the location
 # data for this token. Unfortunately, Jison seems to send an outdated `loc`
 # (from the previous token), so we take the location information directly
 # from the lexer.
 helpers.throwSyntaxError "unexpected #{errorText}", errorLoc
# Based on http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js
# Modified to handle sourceMap
formatSourcePosition = (frame, getSourceMapping) ->
 filename = undefined
 fileLocation = ''
 if frame.isNative()
 fileLocation = "native"
 else
 if frame.isEval()
 filename = frame.getScriptNameOrSourceURL()
 fileLocation = "#{frame.getEvalOrigin()}, " unless filename
 else
 filename = frame.getFileName()
 filename or= "<anonymous>"
 line = frame.getLineNumber()
 column = frame.getColumnNumber()
 # Check for a sourceMap position
 source = getSourceMapping filename, line, column
 fileLocation =
 if source
 "#{filename}:#{source[0]}:#{source[1]}"
 else
 "#{filename}:#{line}:#{column}"
 functionName = frame.getFunctionName()
 isConstructor = frame.isConstructor()
 isMethodCall = not (frame.isToplevel() or isConstructor)
 if isMethodCall
 methodName = frame.getMethodName()
 typeName = frame.getTypeName()
 if functionName
 tp = as = ''
 if typeName and functionName.indexOf typeName
 tp = "#{typeName}."
 if methodName and functionName.indexOf(".#{methodName}") isnt functionName.length - methodName.length - 1
 as = " [as #{methodName}]"
 "#{tp}#{functionName}#{as} (#{fileLocation})"
 else
 "#{typeName}.#{methodName or '<anonymous>'} (#{fileLocation})"
 else if isConstructor
 "new #{functionName or '<anonymous>'} (#{fileLocation})"
 else if functionName
 "#{functionName} (#{fileLocation})"
 else
 fileLocation
getSourceMap = (filename, line, column) ->
 # Skip files that we didnt compile, like Node system files that appear in
 # the stack trace, as they never have source maps.
 return null unless filename is '<anonymous>' or filename.slice(filename.lastIndexOf('.')) in FILE_EXTENSIONS
 if filename isnt '<anonymous>' and sourceMaps[filename]?
 return sourceMaps[filename][sourceMaps[filename].length - 1]
 # CoffeeScript compiled in a browser or via `CoffeeScript.compile` or `.run`
 # may get compiled with `options.filename` thats missing, which becomes
 # `<anonymous>`; but the runtime might request the stack trace with the
 # filename of the script file. See if we have a source map cached under
 # `<anonymous>` that matches the error.
 else if sourceMaps['<anonymous>']?
 # Work backwards from the most recent anonymous source maps, until we find
 # one that works. This isnt foolproof; there is a chance that multiple
 # source maps will have line/column pairs that match. But we have no other
 # way to match them. `frame.getFunction().toString()` doesnt always work,
 # and its not foolproof either.
 for map in sourceMaps['<anonymous>'] by -1
 sourceLocation = map.sourceLocation [line - 1, column - 1]
 return map if sourceLocation?[0]? and sourceLocation[1]?
 # If all else fails, recompile this source to get a source map. We need the
 # previous section (for `<anonymous>`) despite this option, because after it
 # gets compiled we will still need to look it up from
 # `sourceMaps['<anonymous>']` in order to find and return it. Thats why we
 # start searching from the end in the previous block, because most of the
 # time the source map we want is the last one.
 if sources[filename]?
 answer = compile sources[filename][sources[filename].length - 1],
 filename: filename
 sourceMap: yes
 literate: helpers.isLiterate filename
 answer.sourceMap
 else
 null
# Based on [michaelficarra/CoffeeScriptRedux](http://goo.gl/ZTx1p)
# NodeJS / V8 have no support for transforming positions in stack traces using
# sourceMap, so we must monkey-patch Error to display CoffeeScript source
# positions.
Error.prepareStackTrace = (err, stack) ->
 getSourceMapping = (filename, line, column) ->
 sourceMap = getSourceMap filename, line, column
 answer = sourceMap.sourceLocation [line - 1, column - 1] if sourceMap?
 if answer? then [answer[0] + 1, answer[1] + 1] else null
 frames = for frame in stack
 break if frame.getFunction() is exports.run
 " at #{formatSourcePosition frame, getSourceMapping}"
 "#{err.toString()}\n#{frames.join '\n'}\n"
checkShebangLine = (file, input) ->
 firstLine = input.split(/$/m)[0]
 rest = firstLine?.match(/^#!\s*([^\s]+\s*)(.*)/)
 args = rest?[2]?.split(/\s/).filter (s) -> s isnt ''
 if args?.length > 1
 console.error '''
 The script to be run begins with a shebang line with more than one
 argument. This script will fail on platforms such as Linux which only
 allow a single argument.
 '''
 console.error "The shebang line was: '#{firstLine}' in file '#{file}'"
 console.error "The arguments were: #{JSON.stringify args}"
+182
View File
@@ -0,0 +1,182 @@
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace Microsoft.FSharp.Core
 open System
 open System.Text
 open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators
 open Microsoft.FSharp.Core.Operators
 open Microsoft.FSharp.Core.Operators.Checked
 open Microsoft.FSharp.Collections
 open Microsoft.FSharp.Primitives.Basics
 [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
 [<RequireQualifiedAccess>]
 module String =
 [<Literal>]
 /// LOH threshold is calculated from Internal.Utilities.Library.LOH_SIZE_THRESHOLD_BYTES,
 /// and is equal to 80_000 / sizeof<char>
 let LOH_CHAR_THRESHOLD = 40_000
 [<CompiledName("Length")>]
 let length (str:string) = if isNull str then 0 else str.Length
 [<CompiledName("Concat")>]
 let concat sep (strings : seq<string>) = 
 let concatArray sep (strings: string []) =
 match length sep with
 | 0 -> String.Concat strings
 // following line should be used when this overload becomes part of .NET Standard (it's only in .NET Core)
 //| 1 -> String.Join(sep.[0], strings, 0, strings.Length)
 | _ -> String.Join(sep, strings, 0, strings.Length)
 match strings with
 | :? array<string> as arr -> 
 concatArray sep arr
 | :? list<string> as lst -> 
 lst 
 |> List.toArray 
 |> concatArray sep
 | _ ->
 String.Join(sep, strings)
 [<CompiledName("Iterate")>]
 let iter (action : (char -> unit)) (str:string) =
 if not (String.IsNullOrEmpty str) then
 for i = 0 to str.Length - 1 do
 action str.[i] 
 [<CompiledName("IterateIndexed")>]
 let iteri action (str:string) =
 if not (String.IsNullOrEmpty str) then
 let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(action)
 for i = 0 to str.Length - 1 do
 f.Invoke(i, str.[i]) 
 [<CompiledName("Map")>]
 let map (mapping: char -> char) (str:string) =
 if String.IsNullOrEmpty str then
 String.Empty
 else
 let result = str.ToCharArray()
 let mutable i = 0
 for c in result do
 result.[i] <- mapping c
 i <- i + 1
 new String(result)
 [<CompiledName("MapIndexed")>]
 let mapi (mapping: int -> char -> char) (str:string) =
 let len = length str
 if len = 0 then 
 String.Empty
 else
 let result = str.ToCharArray()
 let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(mapping)
 let mutable i = 0
 while i < len do
 result.[i] <- f.Invoke(i, result.[i])
 i <- i + 1
 new String(result)
 [<CompiledName("Filter")>]
 let filter (predicate: char -> bool) (str:string) =
 let len = length str
 if len = 0 then 
 String.Empty
 elif len > LOH_CHAR_THRESHOLD then
 // By using SB here, which is twice slower than the optimized path, we prevent LOH allocations 
 // and 'stop the world' collections if the filtering results in smaller strings.
 // We also don't pre-allocate SB here, to allow for less mem pressure when filter result is small.
 let res = StringBuilder()
 str |> iter (fun c -> if predicate c then res.Append c |> ignore)
 res.ToString()
 else
 // Must do it this way, since array.fs is not yet in scope, but this is safe
 let target = Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked len
 let mutable i = 0
 for c in str do
 if predicate c then 
 target.[i] <- c
 i <- i + 1
 String(target, 0, i)
 [<CompiledName("Collect")>]
 let collect (mapping: char -> string) (str:string) =
 if String.IsNullOrEmpty str then
 String.Empty
 else
 let res = StringBuilder str.Length
 str |> iter (fun c -> res.Append(mapping c) |> ignore)
 res.ToString()
 [<CompiledName("Initialize")>]
 let init (count:int) (initializer: int-> string) =
 if count < 0 then invalidArgInputMustBeNonNegative "count" count
 let res = StringBuilder count
 for i = 0 to count - 1 do 
 res.Append(initializer i) |> ignore
 res.ToString()
 [<CompiledName("Replicate")>]
 let replicate (count:int) (str:string) =
 if count < 0 then invalidArgInputMustBeNonNegative "count" count
 let len = length str
 if len = 0 || count = 0 then 
 String.Empty
 elif len = 1 then
 new String(str.[0], count)
 elif count <= 4 then
 match count with
 | 1 -> str
 | 2 -> String.Concat(str, str)
 | 3 -> String.Concat(str, str, str)
 | _ -> String.Concat(str, str, str, str)
 else
 // Using the primitive, because array.fs is not yet in scope. It's safe: both len and count are positive.
 let target = Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked (len * count)
 let source = str.ToCharArray()
 // O(log(n)) performance loop:
 // Copy first string, then keep copying what we already copied 
 // (i.e., doubling it) until we reach or pass the halfway point
 Array.Copy(source, 0, target, 0, len)
 let mutable i = len
 while i * 2 < target.Length do
 Array.Copy(target, 0, target, i, i)
 i <- i * 2
 // finally, copy the remain half, or less-then half
 Array.Copy(target, 0, target, i, target.Length - i)
 new String(target)
 [<CompiledName("ForAll")>]
 let forall predicate (str:string) =
 if String.IsNullOrEmpty str then
 true
 else
 let rec check i = (i >= str.Length) || (predicate str.[i] && check (i+1)) 
 check 0
 [<CompiledName("Exists")>]
 let exists predicate (str:string) =
 if String.IsNullOrEmpty str then
 false
 else
 let rec check i = (i < str.Length) && (predicate str.[i] || check (i+1)) 
 check 0 
@@ -0,0 +1,323 @@
C Fortran 77 implementation of a quicksort algorithm for arrays with
C real entries.
C ----------
C June 2019 
C Jason Allen Anema, Ph.D.
C Division of Statistical Genomics
C Department of Genetics
C Washington University School of Medicine in St. Louis
C 
C This work is partially supported NIH grant AG023746
C ----------
C Insertion sort is used for short arrays, as quicksort is slower on
C these.
C 
C Hoare partition scheme is used (sweeping left and right), as it does
C three times fewer swaps on average that the Lamuto partition scheme.
C In conjunction with this, tripartite partition is performed
C concurrently (solving the "Dutch National Flag problem"). This avoids 
C horrible runtimes on highly repetitive arrays. For example, without 
C this, an array of random zeros and ones would have a runtime of
C O(N^2), but now has a runtime of O(N). The runtime for this algorthm
C on arrays with k highly repetitive entries is now O(kN).
C 
C For medium length (sub)arrays, pivots are choosen using
C Median-of-Three, and those three items are sorted. For longer (sub)arrays
C the pseudomedian of nine (Median of medians). This avoids O(N^2) runtime on
C nonrandom inputs such as increasing and decreasing sequences. 
C
C See Louis Bentley, Jon & McIlroy, Douglas. (1993). Engineering a Sort Function.
C Softw., Pract. Exper.. 23. 1249-1265. 10.1002/spe.4380231105 for details. 
C
C The ordering on elements of the array are defined by a comparison
C function,compar, that is a user-supplied INTEGER*2 function of the form
C compar(a,b) which returns:
C -1 if a precedes b
C +1 if b precedes a
C 0 is a and b are considered equivalent
C and thus defines a total ordering.
C 
C If one would like to use the standard order on integers, the
C compar function could be written in a file "compint.F" as:
C ----------------------------------------------------------------
C INTEGER*2 FUNCTION compint(a,b)
C INTEGER a, b
C if(a.lt.b)then
C compint = -1
C elseif(a.gt.b)then
C compint = +1
C else
C compint = 0
C endif
C END
C ----------------------------------------------------------------
C Then in your program, call quicksort with:
C call quicksort_real_F77(array, n, compint)
C
C The maximal length of an array in this implementation is (2^31-1),
C but can be changed to allow for length up to (2^63-1) by changing the
C data types of the relevant variables and constants. If you wish to 
C sort longer arrays, of length N, you'll need to customize variable 
C and constant types and set mstack to be at least (2*log_2(N)+2). 
C
C ----------------------------------------------------------------
C Copyright 2019 Jason Allen Anema
C 
C Permission is hereby granted, free of charge, to any person obtaining
C a copy of this software and associated documentation files (the "Software"),
C to deal in the Software without restriction, including without limitation the
C rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
C sell copies of the Software, and to permit persons to whom the Software is
C furnished to do so, subject to the following conditions:
C
C The above copyright notice and this permission notice shall be included
C in all copies or substantial portions of the Software.
C
C THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
C OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
C FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
C THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
C LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
C FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
C IN THE SOFTWARE.
C -------------------------------------------------------------------
C
 SUBROUTINE quicksort_real_F77(array,n,compar)
 INTEGER n, maxins, maxmid, mstack
 REAL array(n)
 PARAMETER (maxins = 7, maxmid = 40, mstack = 128)
C maxins: maximal size of (sub)arrays to be sorted with
C insertion sort.
C maxmid: maximal size of (sub)arrays that will be quicksorted with
C Median-of-Three pivots.
C mstack: maximal size of required auxiliary storage (a stack), plus 2 
C extra spots, which tracks the starts and ends of yet unsorted 
C subarrays. mstack = 130 is large enough to handle arrays up to 
C length 2^63-1. This maximal size follows from
C processing smaller arrays first and pigeonhole principal.
C 
 INTEGER a, d, i, j, k, s, lo, mid, hi, tstack, bstack(mstack)
C a, d, i, j, k, s: indices
C lo, mid, and hi: their natural location in a (sub)array
C tstack: equal to twice the number of additional subarrays still 
C needing to be sorted
C bstack: stack of the endpoints of unsorted subarrays
 INTEGER pm1, pm2, pm3, pm4, pm5, pm6, pm7, pm8, pm9
C for pseudomedian of nine positions in (sub)arrays
 REAL piv, temp
C piv is to store the pivot's value
C 
 EXTERNAL compar
 INTEGER*2 compar
C compar is a user-supplied INTEGER*2 function of the form
C compar(a,b) which returns:
C -1 if a precedes b
C +1 if b precedes a
C 0 is a and b are considered equivalent
C and thus defines a total ordering. 
 tstack = 0
 lo = 1 
 hi = n
C
C Insertion sort subarrays of size maxins or less
 1 if(hi-lo+1.le.maxins)then
 do 10, i = lo + 1, hi, 1
 temp = array(i)
 do 11 j = i - 1, lo, -1
 if(compar(array(j), temp).le.0)goto 2
 array(j+1)=array(j)
 11 continue
 j = lo - 1
 2 array(j+1) = temp
 10 continue
 if(tstack.eq.0)return
C Pop the bstack, and start new partitioning
 hi = bstack(tstack)
 lo = bstack(tstack-1)
 tstack = tstack - 2
 else
C Use Median-of-Three as choice of pivot (median of lo, middle, hi)
C and reorder those elements appropriately when subarrays are medium
C length (between maxins and maxmid)
 mid = lo + (hi-lo)/2
 if(hi-lo.le.maxmid)then
 if(compar(array(mid), array(lo)).eq.-1)then
 temp = array(lo)
 array(lo) = array(mid)
 array(mid) = temp
 endif
 if(compar(array(hi), array(lo)).eq.-1)then
 temp = array(hi)
 array(hi) = array(lo)
 array(lo) = temp
 endif
 if(compar(array(hi), array(mid)).eq.-1)then
 temp = array(hi)
 array(hi) = array(mid)
 array(mid) = temp
 endif
C Use pseudomedian of nine (Median of medians) as choice of pivot when 
C subarrays are longer than maxmid. Note that doing it this way requires only 12
C comparisons for finding the pivot.
 elseif(hi-lo+1.gt.maxmid)then
 pm1 = lo
 pm5 = lo + (hi-lo)/2
 pm9 = hi
 pm3 = lo + (pm5-lo)/2
 pm7 = pm5 + (hi-pm5)/2
 pm2 = lo + (pm3-lo)/2
 pm4 = pm3 + (pm5-pm3)/2
 pm6 = pm5 + (pm7-pm5)/2
 pm8 = pm7 + (pm9-pm7)/2
C Median and sorting for pm1, pm2, pm3
 if(compar(array(pm2), array(pm1)).eq.-1)then
 temp = array(pm1)
 array(pm1) = array(pm2)
 array(pm2) = temp
 endif
 if(compar(array(pm3), array(pm1)).eq.-1)then
 temp = array(pm3)
 array(pm3) = array(pm1)
 array(pm1) = temp
 endif
 if(compar(array(pm3), array(pm2)).eq.-1)then
 temp = array(pm3)
 array(pm3) = array(pm2)
 array(pm2) = temp
 endif
C Median and sorting for pm4, pm5, pm6
 if(compar(array(pm5), array(pm4)).eq.-1)then
 temp = array(pm4)
 array(pm4) = array(pm5)
 array(pm5) = temp
 endif
 if(compar(array(pm6), array(pm4)).eq.-1)then
 temp = array(pm6)
 array(pm6) = array(pm4)
 array(pm4) = temp
 endif
 if(compar(array(pm6), array(pm5)).eq.-1)then
 temp = array(pm6)
 array(pm6) = array(pm5)
 array(pm5) = temp
 endif
C Median and sorting for pm7, pm8, pm9
 if(compar(array(pm8), array(pm7)).eq.-1)then
 temp = array(pm7)
 array(pm7) = array(pm8)
 array(pm8) = temp
 endif
 if(compar(array(pm9), array(pm7)).eq.-1)then
 temp = array(pm9)
 array(pm9) = array(pm7)
 array(pm7) = temp
 endif
 if(compar(array(pm9), array(pm8)).eq.-1)then
 temp = array(pm9)
 array(pm9) = array(pm8)
 array(pm8) = temp
 endif
C Median of the medians (which are now pm2, pm5, pm8)
 if(compar(array(pm5), array(pm2)).eq.-1)then
 temp = array(pm2)
 array(pm2) = array(pm5)
 array(pm5) = temp
 endif
 if(compar(array(pm8), array(pm2)).eq.-1)then
 temp = array(pm8)
 array(pm8) = array(pm2)
 array(pm2) = temp
 endif
 if(compar(array(pm8), array(pm5)).eq.-1)then
 temp = array(pm8)
 array(pm8) = array(pm5)
 array(pm5) = temp
 endif
 endif
C Pivot assigned for medium and long length subarrays.
C Note that pm5 = mid
 piv = array(mid)
C Initialize pointers for partitioning
 i = lo-1
 j = hi+1
C Initialize counts of repeat values of pivot.
 a = 0
 d = 0
C Beginning of outer loop for placing pivot.
 3 continue
C Scan up to find an element > piv.
 i = i + 1
C Check if pointers crossed.
 if(j.lt.i)goto 5
C Check if i pointer hit hi boundary.
 if(i.eq.hi)goto 4
C 
 if(compar(array(i), piv).eq.-1)goto 3
C Check for copies of pivot from scanning right. 
 if(compar(array(i), piv).eq.0)then
 array(i) = array(lo+a)
 array(lo+a) = piv
 a = a + 1
 goto 3 
 endif
C Beginning of innerloop for placing pivot.
 4 continue
C Scan down to find an element < piv.
 j = j - 1
C Check if pointers crossed.
 if(j.lt.i)goto 5
 if(compar(array(j), piv).eq.1)goto 4
C Check for copies of pivot from scanning left. 
 if(compar(array(j), piv).eq.0)then
 array(j) = array(hi-d)
 array(hi-d) = piv
 d = d + 1
 goto 4 
 endif
C Check if pointers crossed.
 if(j.lt.i)goto 5
C Exchange elements
 temp = array(i)
 array(i) = array(j)
 array(j) = temp
C End of outermost loop for placing pivot.
 goto 3
C Insert all copies of pivot in appropriate place
 5 s = MIN(a, j-lo-a+1)
 DO 6 k = 1, s
 array(lo-1+k) = array(i-k)
 array(i-k) = piv
 6 CONTINUE
 s = MIN(d, hi-j-d)
 DO 7 k = 1, s
 array(hi+1-k) = array(j+k)
 array(j+k) = piv
 7 CONTINUE
C Increase effective stack size
 tstack = tstack + 2 
C Push pointers to larger subarray on stack for later processing,
C process smaller subarray immediately. 
 if(tstack.gt.mstack) THEN
 WRITE(*,*)'Stack size is too small in quicksort fortran code quicksort_real_F77.F' 
 WRITE(*,*)'Are you sure you want to sort an array this long?'
 WRITE(*,*)'Your array has more than 2^63-1 entries?'
 WRITE(*,*)'If so, set mstack parameter to be at least:'
 WRITE(*,*)'2*ceiling(log_2(N))+2, for N = length of array,'
 WRITE(*,*)'and recompile this subroutine.'
 RETURN 
 endif
 if(hi-j-d-1.ge.j-a-lo)then
 bstack(tstack) = hi
 bstack(tstack-1) = MIN(j+d+1, hi)
 hi=MAX(j-a,lo)
 else
 bstack(tstack)=MAX(j-a,lo)
 bstack(tstack-1)=lo
 lo=MIN(j+d+1,hi)
 endif
C
C end of outermost if statement 
 endif
 goto 1
C END of subroutine quicksort
 END
@@ -0,0 +1,119 @@
program test_savetxt
use stdlib_kinds, only: int32, sp, dp
use stdlib_io, only: loadtxt, savetxt
use stdlib_error, only: check
implicit none
character(:), allocatable :: outpath
outpath = get_outpath() // "/tmp.dat"
call test_iint32(outpath)
call test_rsp(outpath)
call test_rdp(outpath)
call test_csp(outpath)
call test_cdp(outpath)
contains
 function get_outpath() result(outpath)
 integer :: ierr
 character(256) :: argv
 character(:), allocatable :: outpath
 call get_command_argument(1, argv, status=ierr)
 if (ierr==0) then
 outpath = trim(argv)
 else
 outpath = '.'
 endif
 end function get_outpath
 subroutine test_iint32(outpath)
 character(*), intent(in) :: outpath
 integer(int32) :: d(3, 2), e(2, 3)
 integer(int32), allocatable :: d2(:, :)
 d = reshape([1, 2, 3, 4, 5, 6], [3, 2])
 call savetxt(outpath, d)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [3, 2]))
 call check(all(abs(d-d2) == 0))
 e = reshape([1, 2, 3, 4, 5, 6], [2, 3])
 call savetxt(outpath, e)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [2, 3]))
 call check(all(abs(e-d2) == 0))
 end subroutine
 subroutine test_rsp(outpath)
 character(*), intent(in) :: outpath
 real(sp) :: d(3, 2), e(2, 3)
 real(sp), allocatable :: d2(:, :)
 d = reshape([1, 2, 3, 4, 5, 6], [3, 2])
 call savetxt(outpath, d)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [3, 2]))
 call check(all(abs(d-d2) < epsilon(1._sp)))
 e = reshape([1, 2, 3, 4, 5, 6], [2, 3])
 call savetxt(outpath, e)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [2, 3]))
 call check(all(abs(e-d2) < epsilon(1._sp)))
 end subroutine test_rsp
 subroutine test_rdp(outpath)
 character(*), intent(in) :: outpath
 real(dp) :: d(3, 2), e(2, 3)
 real(dp), allocatable :: d2(:, :)
 d = reshape([1, 2, 3, 4, 5, 6], [3, 2])
 call savetxt(outpath, d)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [3, 2]))
 call check(all(abs(d-d2) < epsilon(1._dp)))
 e = reshape([1, 2, 3, 4, 5, 6], [2, 3])
 call savetxt(outpath, e)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [2, 3]))
 call check(all(abs(e-d2) < epsilon(1._dp)))
 end subroutine test_rdp
 subroutine test_csp(outpath)
 character(*), intent(in) :: outpath
 complex(sp) :: d(3, 2), e(2, 3)
 complex(sp), allocatable :: d2(:, :)
 d = cmplx(1, 1,kind=sp)* reshape([1, 2, 3, 4, 5, 6], [3, 2])
 call savetxt(outpath, d)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [3, 2]))
 call check(all(abs(d-d2) < epsilon(1._sp)))
 e = cmplx(1, 1,kind=sp)* reshape([1, 2, 3, 4, 5, 6], [2, 3])
 call savetxt(outpath, e)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [2, 3]))
 call check(all(abs(e-d2) < epsilon(1._sp)))
 end subroutine test_csp
 subroutine test_cdp(outpath)
 character(*), intent(in) :: outpath
 complex(dp) :: d(3, 2), e(2, 3)
 complex(dp), allocatable :: d2(:, :)
 d = cmplx(1._dp, 1._dp,kind=dp)* reshape([1, 2, 3, 4, 5, 6], [3, 2])
 call savetxt(outpath, d)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [3, 2]))
 call check(all(abs(d-d2) < epsilon(1._dp)))
 e = cmplx(1, 1,kind=dp)* reshape([1, 2, 3, 4, 5, 6], [2, 3])
 call savetxt(outpath, e)
 call loadtxt(outpath, d2)
 call check(all(shape(d2) == [2, 3]))
 call check(all(abs(e-d2) < epsilon(1._dp)))
 end subroutine test_cdp
end program test_savetxt
@@ -0,0 +1,5 @@
&TEST
FOO=0,
BAR=1.0,
BAZ='Hello, World!'
/
@@ -0,0 +1 @@
// foo.bak (editor etc backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.dpkg-dist (Debian dpkg backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.dpkg-old (Debian dpkg backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.in (build system input) should highlight same as foo
@@ -0,0 +1 @@
// foo.in.in (build system input, doubly replaced) should highlight same as foo
@@ -0,0 +1 @@
// foo.old (editor etc backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.orig (editor, diff etc backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.orig~ (backup of an editor, diff etc backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.rpmnew (Red Hat rpm backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.rpmorig (Red Hat rpm backup) should highlight same as foo
@@ -0,0 +1 @@
// foo.rpmsave (Red Hat rpm backup) should highlight same as foo
@@ -0,0 +1 @@
// foo~ (editor backup) should highlight same as foo
@@ -0,0 +1 @@
// foo~ for unknown foo should not highlight
@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?>
<%--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements. See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License. You may obtain a copy of the License at
 http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
--%>
<%@page session="false" contentType="text/html; charset=ISO-8859-1" %>
<%@page import="java.util.Enumeration" %>
<%@page import="jakarta.servlet.http.HttpSession" %>
<%@page import="org.apache.catalina.Session" %>
<%@page import="org.apache.catalina.manager.JspHelper" %>
<%@page import="org.apache.catalina.util.ContextName" %>
<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%--!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"--%>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<% String path = (String) request.getAttribute("path");
 String version = (String) request.getAttribute("version");
 ContextName cn = new ContextName(path, version);
 Session currentSession = (Session)request.getAttribute("currentSession");
 String currentSessionId = null;
 HttpSession currentHttpSession = null;
 if (currentSession != null) {
 currentHttpSession = currentSession.getSession();
 currentSessionId = JspHelper.escapeXml(currentSession.getId());
 } else {
 currentSessionId = "Session invalidated";
 }
 String submitUrl = JspHelper.escapeXml(response.encodeURL(
 ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
 "?path=" + path + "&version=" + version));
%>
<head>
 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
 <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 -->
 <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 -->
 <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' -->
 <meta http-equiv="content-language" content="en"/>
 <meta name="author" content="Cedrik LIME"/>
 <meta name="copyright" content="copyright 2005-2021 the Apache Software Foundation"/>
 <meta name="robots" content="noindex,nofollow,noarchive"/>
 <title>Sessions Administration: details for <%= currentSessionId %></title>
</head>
<body>
<% if (currentHttpSession == null) { %>
 <h1><%=currentSessionId%></h1>
<% } else { %>
 <h1>Details for Session <%= currentSessionId %></h1>
 <table style="text-align: left;" border="0">
 <tr>
 <th>Session Id</th>
 <td><%= currentSessionId %></td>
 </tr>
 <tr>
 <th>Guessed Locale</th>
 <td><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
 </tr>
 <tr>
 <th>Guessed User</th>
 <td><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td>
 </tr>
 <tr>
 <th>Creation Time</th>
 <td><%= JspHelper.getDisplayCreationTimeForSession(currentSession) %></td>
 </tr>
 <tr>
 <th>Last Accessed Time</th>
 <td><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td>
 </tr>
 <tr>
 <th>Session Max Inactive Interval</th>
 <td><%= JspHelper.secondsToTimeString(currentSession.getMaxInactiveInterval()) %></td>
 </tr>
 <tr>
 <th>Used Time</th>
 <td><%= JspHelper.getDisplayUsedTimeForSession(currentSession) %></td>
 </tr>
 <tr>
 <th>Inactive Time</th>
 <td><%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %></td>
 </tr>
 <tr>
 <th>TTL</th>
 <td><%= JspHelper.getDisplayTTLForSession(currentSession) %></td>
 </tr>
 </table>
 <form method="post" action="<%= submitUrl %>">
 <div>
 <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
 <input type="hidden" name="action" value="sessionDetail" />
 <%
 if ("Primary".equals(request.getParameter("sessionType"))) {
 %>
 <input type="hidden" name="sessionType" value="Primary" />
 <%
 }
 %> <input type="submit" value="Refresh" />
 </div>
 </form>
 <div class="error"><%= JspHelper.escapeXml(request.getAttribute("error")) %></div>
 <div class="message"><%= JspHelper.escapeXml(request.getAttribute("message")) %></div>
 <table style="text-align: left;" border="1" cellpadding="2" cellspacing="2">
 <% int nAttributes = 0;
 Enumeration<String> attributeNamesEnumeration = currentHttpSession.getAttributeNames();
 while (attributeNamesEnumeration.hasMoreElements()) {
 attributeNamesEnumeration.nextElement();
 ++nAttributes;
 }
 %>
 <caption style="font-variant: small-caps;"><%= JspHelper.formatNumber(nAttributes) %> attributes</caption>
 <thead>
 <tr>
 <th>Remove Attribute</th>
 <th>Attribute name</th>
 <th>Attribute value</th>
 </tr>
 </thead>
 <%--tfoot>
 <tr>
 <td colspan="3" style="text-align: center;">
 TODO: set Max Inactive Interval on sessions
 </td>
 </tr>
 </tfoot--%>
 <tbody>
 <% attributeNamesEnumeration = currentHttpSession.getAttributeNames();
 while (attributeNamesEnumeration.hasMoreElements()) {
 String attributeName = attributeNamesEnumeration.nextElement();
 %>
 <tr>
 <td align="center">
 <form method="post" action="<%= submitUrl %>">
 <div>
 <input type="hidden" name="action" value="removeSessionAttribute" />
 <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
 <input type="hidden" name="attributeName" value="<%= JspHelper.escapeXml(attributeName) %>" />
 <%
 if ("Primary".equals(request.getParameter("sessionType"))) {
 %>
 <input type="submit" value="Remove" />
 <input type="hidden" name="sessionType" value="Primary" />
 <%
 } else {
 out.print("Primary sessions only");
 }
 %>
 </div>
 </form>
 </td>
 <td><%= JspHelper.escapeXml(attributeName) %></td>
 <td><% Object attributeValue = currentHttpSession.getAttribute(attributeName); %><span title="<%= attributeValue == null ? "" : attributeValue.getClass().toString() %>"><%= JspHelper.escapeXml(attributeValue) %></span></td>
 </tr>
 <% } // end while %>
 </tbody>
 </table>
<% } // endif%>
<form method="post" action="<%=submitUrl%>">
 <p style="text-align: center;">
 <input type="submit" value="Return to session list" />
 </p>
</form>
<%--div style="display: none;">
<p>
 <a href="http://validator.w3.org/check?uri=referer"><img
 src="http://www.w3.org/Icons/valid-html401"
 alt="Valid HTML 4.01!" height="31" width="88"></a>
 <a href="http://validator.w3.org/check?uri=referer"><img
 src="http://www.w3.org/Icons/valid-xhtml10"
 alt="Valid XHTML 1.0!" height="31" width="88" /></a>
 <a href="http://validator.w3.org/check?uri=referer"><img
 src="http://www.w3.org/Icons/valid-xhtml11"
 alt="Valid XHTML 1.1!" height="31" width="88" /></a>
</p>
</div--%>
</body>
</html>
+22 -22
View File
@@ -1,10 +1,10 @@
x = 3
x = 3
y = 2x
y = 2x
typeof(y)
f(x) = 2 + x
f(x) = 2 + x
f
@@ -12,44 +12,44 @@
f(10)
function g(x, y)
 z = x + y
 return z^2
function g(x, y)
 z = x + y
 return z^2
end
g(1, 2)
let s = 0
 for i in 1:10
 s += i # Equivalent to s = s + i
let s = 0
 for i in 1:10
 s += i # Equivalent to s = s + i
 end
 s
 s
end
typeof(1:10)
function mysum(n)
 s = 0
 for i in 1:n
 s += i
 s = 0
 for i in 1:n
 s += i
 end
 return s
 return s
end
mysum(100)
a = 3
a = 3
a < 5
a < 5
if a < 5
if a < 5
 "small"
else
 "big"
end
v = [1, 2, 3]
v = [1, 2, 3]
typeof(v)
@@ -57,15 +57,15 @@
v[2] = 10
v2 = [i^2 for i in 1:10]
v2 = [i^2 for i in 1:10]
M = [1 2
M = [1 2
 3 4]
typeof(M)
zeros(5, 5)
zeros(Int, 4, 5)
zeros(Int, 4, 5)
[i + j for i in 1:5, j in 1:6]
[i + j for i in 1:5, j in 1:6]
@@ -0,0 +1,47 @@
\documentclass{article}
\begin{document}
\section*{Introduction}
Text outside code environments should follow TeX/LaTeX highlighting.
The code environment delimiters themselves should be highlighted.
Text inside code environments should follow regular Haskell highlighting.
\begin{code}
import Data.List
import System.Environment
import Text.Printf
twoSumN :: Int -> [Int] -> [Int]
twoSumN _ [] = []
twoSumN n (x : xs) | (n - x) `elem` xs = [x, n - x]
 | otherwise = twoSumN n xs
threeSumN :: Int -> [Int] -> [Int]
threeSumN _ [] = []
threeSumN n (x : xs) | null partial = threeSumN n xs
 | otherwise = x : partial
 where partial = twoSumN (n - x) xs
\end{code}
Text in-between code environments.
% LaTeX comment.
\begin{code}
output :: String -> IO ()
output path = do
 input <- sort . map read . filter (not . null) . lines <$> readFile path
 printf "File: %s\n" path
 printf " Part 1: %d\n" . product . twoSumN 2020 $ input
 printf " Part 2: %d\n" . product . threeSumN 2020 $ input
-- Haskell comment inside code environment.
main :: IO ()
main = getArgs >>= mapM_ output
\end{code}
\end{document}
+2
View File
@@ -0,0 +1,2 @@
2021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html
2021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="Paraesthesia.Tools.NAntTasks" default="all" verbose="false">
 <!-- === ENVIRONMENT SETUP === -->
 <property name="nant.settings.currentframework" value="net-2.0"/>
 <tstamp />
 <sysinfo />
 <property name="build.config" value="Release" />
 <property name="build.version" value="2.0.0.0" />
 <property name="build.name" value="Paraesthesia.Tools.NAntTasks" />
 <property name="build.dir" value="${project::get-base-directory()}\build" />
 <property name="build.bin.dir" value="${build.dir}\bin" />
 <property name="build.doc.dir" value="${build.dir}\doc" />
 <property name="build.install.dir" value="${build.dir}\install" />
 <property name="build.log.dir" value="${build.dir}\log" />
 
 <!-- === STANDARD TARGETS === -->
 <target name="all" depends="build-tasks test" description="Builds all custom NAnt task projects."/>
 <target name="clean" description="Remove all compiled output folders.">
 <echo message="Removing build output folder..."/>
 <delete dir="${build.dir}" failonerror="false" verbose="false"/>
 <echo message="Removing compilation artifact folders..."/>
 <delete failonerror="false" verbose="false">
 <fileset>
 <exclude name="lib" />
 <exclude name="lib\**" />
 <include name="**\obj\**" />
 <include name="**\bin\**" />
 </fileset>
 </delete>
 <echo message="Clean complete."/>
 </target>
 <target name="test" description="Run unit tests on this project." depends="build-tests">
 <!-- TODO: Run the unit tests -->
 </target>
 <target name="doc" description="Generates NDoc documentation." depends="build-tasks">
 <ndoc>
 <assemblies basedir="${build.bin.dir}">
 <include name="Paraesthesia.Tools.*.dll"/>
 </assemblies>
 <summaries>
 <include name="NamespaceSummary.xml"/>
 </summaries>
 <documenters>
 <documenter name="MSDN">
 <property name="AutoDocumentConstructors" value="True" />
 <property name="AutoPropertyBackerSummaries" value="True" />
 <property name="CollectionNamespace" value="${build.name} v${build.version}" />
 <property name="CopyrightHref" value="http://www.paraesthesia.com" />
 <property name="CopyrightText" value="Copyright 2007 Travis Illig" />
 <property name="DefaultTOC" value="Empty" />
 <property name="DeleteCHM" value="False" />
 <property name="DocumentEmptyNamespaces" value="False" />
 <property name="DocumentInternals" value="False" />
 <property name="DocumentPrivates" value="False" />
 <property name="DocumentProtected" value="True" />
 <property name="GenerateCollectionFiles" value="True" />
 <property name="HtmlHelpCompilerFilename" value="hhc.exe" />
 <property name="HtmlHelpName" value="${build.name} v${build.version}" />
 <property name="IncludeAssemblyVersion" value="True" />
 <property name="IncludeFavorites" value="True" />
 <property name="IncludeHeirarchy" value="True" />
 <property name="LinkToSdkDocVersion" value="SDK_v1_1" />
 <property name="OmitObjectTags" value="False" />
 <property name="OutputDirectory" value="${build.doc.dir}" />
 <property name="PlugInNamespace" value="ms.vscc" />
 <property name="RootPageContainsNamespaces" value="True" />
 <property name="ShowMissingParams" value="True" />
 <property name="ShowMissingRemarks" value="False" />
 <property name="ShowMissingReturns" value="True" />
 <property name="ShowMissingSummaries" value="True" />
 <property name="ShowMissingValues" value="True" />
 <property name="ShowVisualBasic" value="False" />
 <property name="SortTOCByNamespace" value="True" />
 <property name="SplitTOCs" value="False" />
 <property name="Title" value="${build.name} v${build.version}" />
 </documenter>
 </documenters>
 </ndoc>
 <delete>
 <fileset basedir="${build.doc.dir}">
 <include name="**/**" />
 <exclude name="*.chm" />
 </fileset>
 </delete>
 </target>
 
 <target name="install" description="Creates distribution packages." depends="all">
 <mkdir dir="${build.install.dir}" />
 <zip verbose="true"
 zipfile="${build.install.dir}/${build.name}_${build.version}.zip"
 ziplevel="9">
 <fileset basedir="${build.dir}">
 <include name="**" />
 <exclude name="${build.install.dir}/**" />
 <exclude name="${build.log.dir}/**" />
 </fileset>
 <fileset basedir=".">
 <include name="readme.txt" />
 </fileset>
 </zip>
 <zip verbose="true"
 zipfile="${build.install.dir}/${build.name}_${build.version}_src.zip"
 ziplevel="9">
 <fileset basedir=".">
 <include name="**" />
 <exclude name="**/*.suo" />
 <exclude name="**/*.user" />
 <exclude name="**/*.cache" />
 <exclude name="**/bin/**" />
 <exclude name="**/build/**" />
 <exclude name="**/lib/*.dll" />
 <exclude name="**/obj/**" />
 </fileset>
 </zip>
 </target>
 
 <target name="production" description="Executes the production build." depends="clean set-version all test doc cleanup-build-output install">
 <echo message="Completed production build." />
 </target>
 
 <!-- === PREREQUISITE TASKS === -->
 <target name="build-tasks" description="Builds the custom NAnt task solution.">
 <!-- solution configuration="${build.config}" outputdir="${build.bin.dir}" solutionfile="Paraesthesia.Tools.NAntTasks.sln" / -->
 <exec program="MSBuild.exe">
 <arg value="Paraesthesia.Tools.NAntTasks.sln" />
 <arg line="/p:Configuration=${build.config}" />
 <arg line="/p:OutDir=&quot;${build.bin.dir}\\&quot;" />
 </exec>
 </target>
 
 <target name="build-tests" description="Builds the unit tests for the project.">
 <!-- TODO: When there are unit tests, build them. -->
 </target>
 <target name="cleanup-build-output" description="Cleans up the build output for archival.">
 <echo message="Cleaning up build output..." />
 <delete>
 <fileset basedir="${build.bin.dir}">
 <include name="*" />
 <exclude name="Paraesthesia.Tools.*" />
 </fileset>
 </delete>
 <echo message="Build output cleaned up. Only project output files remain." />
 </target>
 <target name="set-version" description="Updates the build assembly version.">
 <asminfo output="AssemblyVersion.cs" language="CSharp">
 <imports>
 <import namespace="System.Reflection" />
 </imports>
 <attributes>
 <attribute type="AssemblyVersionAttribute" value="${build.version}"/>
 <attribute type="AssemblyCompanyAttribute" value="Paraesthesia" />
 <attribute type="AssemblyCopyrightAttribute" value="(c) 2007 - ${datetime::get-year(datetime::now())} Travis Illig" />
 </attributes>
 <references>
 <include name="System.dll" />
 </references>
 </asminfo>
 </target>
</project>
@@ -0,0 +1,65 @@
class foo ($bar) {
 @@notify { 'foo': }
}
@@file { "somedir/${name}_${munin_port_real}":
 ensure => present,
 content => template("munin/defaultclient.erb"),
}
# Collect all exported files
File <<||>>
# Compile the munin.conf with a local header
concatenated_file { "/etc/munin/munin.conf":
 dir => somedir,
 header => "/etc/munin/munin.conf.header",
}
hosting_vserver_configuration {
 "erics":
 domain => "orange.co",
 type => "friend",
 context => 13,
 ip => "255.255.255.254", prefix => 27,
 admin_user => "erict", admin_user_name => "hello, its me",
 admin_user_email => "erict@orange.co",
 customer => "hello? is it me?",
 admin_password => file("/etc/puppet/secrets/hosting/erict_passwd"),
}
class davids_black_co_at {
 ## Create users for my parents and my grandmother
 hosting::user {
 rztt: realname => "some other rztt",
 uid => 2001, admin => true;
 same: realname => "could be same",
 uid => 2002;
 imapersontoodamnit: realname => "some one else",
 uid => 2003;
 }
 # Install git.black.co.at
 include git::daemon
 include git::web
 git::web::export { [manifests, "puppet-trunk"]: }
 # Provision an additional mysql database on the database server
 hosting::database { "fogbugz": type => mysql }
 # Create another VirtualHost
 apache2::site { "local-fogbugz":
 source => "puppet://$servername/files/hosting/erict/sites/local-fogbugz"
 }
}
node backuppc {
 # only use the smarthost
 $mta = ssmtp
 # this is a vserver on this host, so register correctly in nagios
 $nagios_parent = "orange.co"
 # I'm sharing an IP here, so those things have to have their own ports
 $apache2_port = 8080
 $munin_port = 5008
 $munin_stats_port = 8667
 # default configuration
 include dbp
 # configure the backuppc server
 include backuppc::server
}
+181
View File
@@ -0,0 +1,181 @@
package k8sazureprocmount
test_input_container_not_proc_mount_allowed {
 input := { "review": input_review, "parameters": input_parameters_default}
 results := violation with input as input
 count(results) == 0
}
test_input_container_proc_mount_not_allowed {
 input := { "review": input_review_unmasked, "parameters": input_parameters_default}
 results := violation with input as input
 count(results) == 1
}
test_input_container_proc_mount_not_allowed_null_param {
 input := { "review": input_review_unmasked, "parameters": null }
 results := violation with input as input
 count(results) == 1
}
test_input_container_proc_mount_not_allowed_missing_param {
 input := { "review": input_review_unmasked }
 results := violation with input as input
 count(results) == 1
}
test_input_container_many_not_proc_mount_allowed {
 input := { "review": input_review_many, "parameters": input_parameters_default}
 results := violation with input as input
 count(results) == 0
}
test_input_container_many_mixed_proc_mount_not_allowed {
 input := { "review": input_review_many_mixed, "parameters": input_parameters_default}
 results := violation with input as input
 count(results) == 1
}
test_input_container_many_mixed_proc_mount_not_allowed_two {
 input := { "review": input_review_many_mixed_two, "parameters": input_parameters_default}
 results := violation with input as input
 count(results) == 2
}
test_input_container_proc_mount_case_insensitive {
 input := { "review": input_review, "parameters": input_parameters_default_lower}
 results := violation with input as input
 count(results) == 0
}
test_input_container_not_proc_mount_unmasked {
 input := { "review": input_review, "parameters": input_parameters_unmasked}
 results := violation with input as input
 count(results) == 0
}
test_input_container_proc_mount_unmasked {
 input := { "review": input_review_unmasked, "parameters": input_parameters_unmasked}
 results := violation with input as input
 count(results) == 0
}
test_input_container_many_mixed_proc_mount_allowed_two {
 input := { "review": input_review_many_mixed_two, "parameters": input_parameters_unmasked}
 results := violation with input as input
 count(results) == 0
}
input_review = {
 "object": {
 "metadata": {
 "name": "nginx"
 },
 "spec": {
 "containers": input_containers_one
 }
 }
}
input_review_unmasked = {
 "object": {
 "metadata": {
 "name": "nginx"
 },
 "spec": {
 "containers": input_containers_one_unmasked
 }
 }
}
input_review_many = {
 "object": {
 "metadata": {
 "name": "nginx"
 },
 "spec": {
 "containers": input_containers_many,
 "initContainers": input_containers_one
 }
 }
}
input_review_many_mixed = {
 "object": {
 "metadata": {
 "name": "nginx"
 },
 "spec": {
 "containers": input_containers_many,
 "initContainers": input_containers_one_unmasked
 }
 }
}
input_review_many_mixed_two = {
 "object": {
 "metadata": {
 "name": "nginx"
 },
 "spec": {
 "containers": input_containers_many_mixed,
 "initContainers": input_containers_one_unmasked
 }
 }
}
input_containers_one = [
{
 "name": "nginx",
 "image": "nginx",
 "securityContext": {
 "procMount": "Default"
 }
}]
input_containers_one_unmasked = [
{
 "name": "nginx",
 "image": "nginx",
 "securityContext": {
 "procMount": "Unmasked"
 }
}]
input_containers_many = [
{
 "name": "nginx",
 "image": "nginx",
 "securityContext": {
 "procMount": "Default"
 }
},
{
 "name": "nginx1",
 "image": "nginx"
},
{
 "name": "nginx2",
 "image": "nginx",
 "securityContext": {
 "runAsUser": "1000"
 }
}]
input_containers_many_mixed = [
{
 "name": "nginx",
 "image": "nginx",
 "securityContext": {
 "procMount": "Default"
 }
},
{
 "name": "nginx1",
 "image": "nginx",
 "securityContext": {
 "procMount": "Unmasked"
 }
}]
input_parameters_default = {
 "procMount": "Default"
}
input_parameters_default_lower = {
 "procMount": "default"
}
input_parameters_unmasked = {
 "procMount": "Unmasked"
}
@@ -0,0 +1,31 @@
*** Settings ***
Documentation PROBLEM:
... You want to test the existence of a file in an AWS S3 bucket
... without using lower level Python code or developing a custom library.
... DISCUSSION:
... This recipe demonstrates:
... - using a Suite Teardown to end the test suite cleanly
... - using keywords from an external library
... - accessing OS Environment Variables directly using %{} syntax
... This recipe has the following external dependencies:
... $ pip install --upgrade robotframework-aws
... This recipe also requires the following OS environment variables:
... AWS_ACCESS_KEY_ID
... AWS_SECRET_ACCESS_KEY
Suite Teardown  Delete All Sessions
Library  AWSLibrary
Force Tags  no-ci-testing
*** Variables ***
${recipe} Recipe 14.1 AWS Simple Storage Service
${level} Intermediate
${category} External Library: AWSLibrary
${REGION} us-east-1
${BUCKET} YOUR_BUCKET_NAME_GOES_HERE
${KEY} YOUR_FILE_PATH_GOES_HERE
*** Test Cases ***
Check Key Exists In Bucket
 Log Variables
 Create Session With Keys ${REGION} %{AWS_ACCESS_KEY_ID} %{AWS_SECRET_ACCESS_KEY}
 Key Should Exist ${BUCKET} ${KEY}
+376
View File
@@ -0,0 +1,376 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
 using Address for address;
 using Strings for uint256;
 // Token name
 string private _name;
 // Token symbol
 string private _symbol;
 // Mapping from token ID to owner address
 mapping (uint256 => address) private _owners;
 // Mapping owner address to token count
 mapping (address => uint256) private _balances;
 // Mapping from token ID to approved address
 mapping (uint256 => address) private _tokenApprovals;
 // Mapping from owner to operator approvals
 mapping (address => mapping (address => bool)) private _operatorApprovals;
 /**
 * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
 */
 constructor (string memory name_, string memory symbol_) {
 _name = name_;
 _symbol = symbol_;
 }
 /**
 * @dev See {IERC165-supportsInterface}.
 */
 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
 return interfaceId == type(IERC721).interfaceId
 || interfaceId == type(IERC721Metadata).interfaceId
 || super.supportsInterface(interfaceId);
 }
 /**
 * @dev See {IERC721-balanceOf}.
 */
 function balanceOf(address owner) public view virtual override returns (uint256) {
 require(owner != address(0), "ERC721: balance query for the zero address");
 return _balances[owner];
 }
 /**
 * @dev See {IERC721-ownerOf}.
 */
 function ownerOf(uint256 tokenId) public view virtual override returns (address) {
 address owner = _owners[tokenId];
 require(owner != address(0), "ERC721: owner query for nonexistent token");
 return owner;
 }
 /**
 * @dev See {IERC721Metadata-name}.
 */
 function name() public view virtual override returns (string memory) {
 return _name;
 }
 /**
 * @dev See {IERC721Metadata-symbol}.
 */
 function symbol() public view virtual override returns (string memory) {
 return _symbol;
 }
 /**
 * @dev See {IERC721Metadata-tokenURI}.
 */
 function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
 require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
 string memory baseURI = _baseURI();
 return bytes(baseURI).length > 0
 ? string(abi.encodePacked(baseURI, tokenId.toString()))
 : '';
 }
 /**
 * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
 * in child contracts.
 */
 function _baseURI() internal view virtual returns (string memory) {
 return "";
 }
 /**
 * @dev See {IERC721-approve}.
 */
 function approve(address to, uint256 tokenId) public virtual override {
 address owner = ERC721.ownerOf(tokenId);
 require(to != owner, "ERC721: approval to current owner");
 require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
 "ERC721: approve caller is not owner nor approved for all"
 );
 _approve(to, tokenId);
 }
 /**
 * @dev See {IERC721-getApproved}.
 */
 function getApproved(uint256 tokenId) public view virtual override returns (address) {
 require(_exists(tokenId), "ERC721: approved query for nonexistent token");
 return _tokenApprovals[tokenId];
 }
 /**
 * @dev See {IERC721-setApprovalForAll}.
 */
 function setApprovalForAll(address operator, bool approved) public virtual override {
 require(operator != _msgSender(), "ERC721: approve to caller");
 _operatorApprovals[_msgSender()][operator] = approved;
 emit ApprovalForAll(_msgSender(), operator, approved);
 }
 /**
 * @dev See {IERC721-isApprovedForAll}.
 */
 function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
 return _operatorApprovals[owner][operator];
 }
 /**
 * @dev See {IERC721-transferFrom}.
 */
 function transferFrom(address from, address to, uint256 tokenId) public virtual override {
 //solhint-disable-next-line max-line-length
 require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
 _transfer(from, to, tokenId);
 }
 /**
 * @dev See {IERC721-safeTransferFrom}.
 */
 function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
 safeTransferFrom(from, to, tokenId, "");
 }
 /**
 * @dev See {IERC721-safeTransferFrom}.
 */
 function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
 require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
 _safeTransfer(from, to, tokenId, _data);
 }
 /**
 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
 *
 * `_data` is additional data, it has no specified format and it is sent in call to `to`.
 *
 * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
 * implement alternative mechanisms to perform token transfer, such as signature-based.
 *
 * Requirements:
 *
 * - `from` cannot be the zero address.
 * - `to` cannot be the zero address.
 * - `tokenId` token must exist and be owned by `from`.
 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
 *
 * Emits a {Transfer} event.
 */
 function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
 _transfer(from, to, tokenId);
 require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
 }
 /**
 * @dev Returns whether `tokenId` exists.
 *
 * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
 *
 * Tokens start existing when they are minted (`_mint`),
 * and stop existing when they are burned (`_burn`).
 */
 function _exists(uint256 tokenId) internal view virtual returns (bool) {
 return _owners[tokenId] != address(0);
 }
 /**
 * @dev Returns whether `spender` is allowed to manage `tokenId`.
 *
 * Requirements:
 *
 * - `tokenId` must exist.
 */
 function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
 require(_exists(tokenId), "ERC721: operator query for nonexistent token");
 address owner = ERC721.ownerOf(tokenId);
 return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
 }
 /**
 * @dev Safely mints `tokenId` and transfers it to `to`.
 *
 * Requirements:
 *
 * - `tokenId` must not exist.
 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
 *
 * Emits a {Transfer} event.
 */
 function _safeMint(address to, uint256 tokenId) internal virtual {
 _safeMint(to, tokenId, "");
 }
 /**
 * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
 * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
 */
 function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
 _mint(to, tokenId);
 require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
 }
 /**
 * @dev Mints `tokenId` and transfers it to `to`.
 *
 * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
 *
 * Requirements:
 *
 * - `tokenId` must not exist.
 * - `to` cannot be the zero address.
 *
 * Emits a {Transfer} event.
 */
 function _mint(address to, uint256 tokenId) internal virtual {
 require(to != address(0), "ERC721: mint to the zero address");
 require(!_exists(tokenId), "ERC721: token already minted");
 _beforeTokenTransfer(address(0), to, tokenId);
 _balances[to] += 1;
 _owners[tokenId] = to;
 emit Transfer(address(0), to, tokenId);
 }
 /**
 * @dev Destroys `tokenId`.
 * The approval is cleared when the token is burned.
 *
 * Requirements:
 *
 * - `tokenId` must exist.
 *
 * Emits a {Transfer} event.
 */
 function _burn(uint256 tokenId) internal virtual {
 address owner = ERC721.ownerOf(tokenId);
 _beforeTokenTransfer(owner, address(0), tokenId);
 // Clear approvals
 _approve(address(0), tokenId);
 _balances[owner] -= 1;
 delete _owners[tokenId];
 emit Transfer(owner, address(0), tokenId);
 }
 /**
 * @dev Transfers `tokenId` from `from` to `to`.
 * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
 *
 * Requirements:
 *
 * - `to` cannot be the zero address.
 * - `tokenId` token must be owned by `from`.
 *
 * Emits a {Transfer} event.
 */
 function _transfer(address from, address to, uint256 tokenId) internal virtual {
 require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
 require(to != address(0), "ERC721: transfer to the zero address");
 _beforeTokenTransfer(from, to, tokenId);
 // Clear approvals from the previous owner
 _approve(address(0), tokenId);
 _balances[from] -= 1;
 _balances[to] += 1;
 _owners[tokenId] = to;
 emit Transfer(from, to, tokenId);
 }
 /**
 * @dev Approve `to` to operate on `tokenId`
 *
 * Emits a {Approval} event.
 */
 function _approve(address to, uint256 tokenId) internal virtual {
 _tokenApprovals[tokenId] = to;
 emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
 }
 /**
 * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
 * The call is not executed if the target address is not a contract.
 *
 * @param from address representing the previous owner of the given token ID
 * @param to target address that will receive the tokens
 * @param tokenId uint256 ID of the token to be transferred
 * @param _data bytes optional data to send along with the call
 * @return bool whether the call correctly returned the expected magic value
 */
 function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
 private returns (bool)
 {
 if (to.isContract()) {
 try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
 return retval == IERC721Receiver(to).onERC721Received.selector;
 } catch (bytes memory reason) {
 if (reason.length == 0) {
 revert("ERC721: transfer to non ERC721Receiver implementer");
 } else {
 // solhint-disable-next-line no-inline-assembly
 assembly {
 revert(add(32, reason), mload(reason))
 }
 }
 }
 } else {
 return true;
 }
 }
 /**
 * @dev Hook that is called before any token transfer. This includes minting
 * and burning.
 *
 * Calling conditions:
 *
 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
 * transferred to `to`.
 * - When `from` is zero, `tokenId` will be minted for `to`.
 * - When `to` is zero, ``from``'s `tokenId` will be burned.
 * - `from` cannot be the zero address.
 * - `to` cannot be the zero address.
 *
 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
 */
 function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
+94
View File
@@ -0,0 +1,94 @@
execve("/usr/bin/ls", ["ls"], 0x7fff7d89cea0 /* 34 vars */) = 0
brk(NULL) = 0x55bc0a294000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=45404, ...}) = 0
mmap(NULL, 45404, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7066972000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@k\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=155296, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7066970000
mmap(NULL, 2259632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7066748000
mprotect(0x7f706676d000, 2093056, PROT_NONE) = 0
mmap(0x7f706696c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7f706696c000
mmap(0x7f706696e000, 6832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f706696e000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260A\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7066587000
mprotect(0x7f70665a9000, 1658880, PROT_NONE) = 0
mmap(0x7f70665a9000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f70665a9000
mmap(0x7f70666f1000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f70666f1000
mmap(0x7f706673e000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f706673e000
mmap(0x7f7066744000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7066744000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340!\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=468944, ...}) = 0
mmap(NULL, 471304, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7066513000
mmap(0x7f7066515000, 335872, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f7066515000
mmap(0x7f7066567000, 122880, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x54000) = 0x7f7066567000
mmap(0x7f7066585000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x71000) = 0x7f7066585000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14592, ...}) = 0
mmap(NULL, 16656, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f706650e000
mmap(0x7f706650f000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f706650f000
mmap(0x7f7066510000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f7066510000
mmap(0x7f7066511000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f7066511000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@l\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=146968, ...}) = 0
mmap(NULL, 132288, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f70664ed000
mmap(0x7f70664f3000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f70664f3000
mmap(0x7f7066502000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f7066502000
mmap(0x7f7066508000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7f7066508000
mmap(0x7f706650a000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f706650a000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f70664eb000
arch_prctl(ARCH_SET_FS, 0x7f70664ec380) = 0
mprotect(0x7f706673e000, 16384, PROT_READ) = 0
mprotect(0x7f7066508000, 4096, PROT_READ) = 0
mprotect(0x7f7066511000, 4096, PROT_READ) = 0
mprotect(0x7f7066585000, 4096, PROT_READ) = 0
mprotect(0x7f706696c000, 4096, PROT_READ) = 0
mprotect(0x55bc08de8000, 4096, PROT_READ) = 0
mprotect(0x7f70669a5000, 4096, PROT_READ) = 0
munmap(0x7f7066972000, 45404) = 0
set_tid_address(0x7f70664ec650) = 1737
set_robust_list(0x7f70664ec660, 24) = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7f70664f36b0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f70664ff730}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f70664f3740, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f70664ff730}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffd655ea110) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffd655ea110) = -1 ENOENT (No such file or directory)
brk(NULL) = 0x55bc0a294000
brk(0x55bc0a2b5000) = 0x55bc0a2b5000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 333
read(3, "", 1024) = 0
close(3) = 0
access("/etc/selinux/config", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3031696, ...}) = 0
mmap(NULL, 3031696, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7066206000
close(3) = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=46, ws_col=173, ws_xpixel=0, ws_ypixel=0}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
getdents64(3, /* 3 entries */, 32768) = 80
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "ls.strace\n", 10) = 10
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
+90
View File
@@ -0,0 +1,90 @@
@import 'config'
/*
 * Implicit color stop position.
 */
pos-in-stops(i, stops)
 len = length(stops)
 if len - 1 == i
 100%
 else if i
 unit(i / len * 100, '%')
 else
 0
/*
 * Normalize color stops:
 *
 * - (color pos) -> (pos color)
 * - (color) -> (implied-pos color)
 *
 */
normalize-stops(stops)
 stops = clone(stops)
 for stop, i in stops
 if length(stop) == 1
 color = stop[0]
 stop[0] = pos-in-stops(i, stops)
 stop[1] = color
 else if typeof(stop[1]) == 'unit'
 pos = stop[1]
 stop[1] = stop[0]
 stop[0] = pos
 stops
/*
 * Join color stops with the given translation function.
 */
join-stops(stops, translate)
 str = ''
 len = length(stops)
 for stop, i in stops
 str += ', ' if i
 pos = stop[0]
 color = stop[1]
 str += translate(color, pos)
 unquote(str)
/*
 * Standard color stop.
 */
std-stop(color, pos)
 '%s %s' % (color pos)
/*
 * Create a linear gradient with the given start position
 * and variable number of color stops.
 *
 * Examples:
 *
 * background: linear-gradient(top, red, green, blue)
 * background: linear-gradient(bottom, red, green 50%, blue)
 * background: linear-gradient(bottom, red, 50% green, blue)
 * background: linear-gradient(bottom, red, 50% green, 90% white, blue)
 *
 */
linear-gradient(start, stops...)
 error('color stops required') unless length(stops)
 unquote('linear-gradient(' + join(', ',arguments) + ')')
/*
 * Create a linear gradient image with the given start position
 * and variable number of color stops.
 */
linear-gradient-image(start, stops...)
 error('node-canvas is required for linear-gradient-image()') unless has-canvas
 stops = stops[0] if length(stops) == 1
 error('gradient image size required') unless start[0] is a 'unit'
 size = start[0]
 start = start[1] or 'top'
 grad = create-gradient-image(size, start)
 stops = normalize-stops(stops)
 add-color-stop(grad, stop[0], stop[1]) for stop in stops
 'url(%s)' % gradient-data-uri(grad)
+11
View File
@@ -0,0 +1,11 @@
Apr 4 00:00:01 hostname-here systemd[1]: logrotate.service: Succeeded.
Apr 4 00:00:01 hostname-here systemd[1]: Finished Rotate log files.
Apr 4 00:00:01 hostname-here colord[920]: failed to get session [pid 137485]: No data available
Apr 4 00:00:21 hostname-here kernel: [55604.908232] audit: type=1400 audit(1617483621.094:28): apparmor="DENIED" operation="capable" profile="/usr/sbin/cups-browsed" pid=59311 comm="cups-browsed" capability=23 capname="sys_nice"
Apr 4 00:01:38 hostname-here systemd-resolved[721]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
Apr 4 00:04:46 hostname-here ntpd[952]: Soliciting pool server 255.76.59.37
Apr 4 00:05:21 hostname-here ntpd[952]: ::1 local addr 0:0:0:0:0:0:0:1 -> <null>
Apr 4 00:06:29 hostname-here ntpd[952]: receive: Unexpected origin timestamp 0xe414a8d1.82e825f5 does not match aorg 0xe414a8d5.82c50d8c from server@127.0.0.1 xmt 0xe414a8d1.e671d7c4
Apr 4 09:30:01 hostname-here CRON[89278]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Apr 4 16:32:07 hostname-here NetworkManager[740]: <info> [1617629527.1101] manager: NetworkManager state is now CONNECTED_GLOBAL
Apr 4 22:00:45 hostname-here dbus-daemon[1094]: [session uid=1000 pid=1094] Successfully activated service 'io.github.celluloid_player.Celluloid'
+103
View File
@@ -0,0 +1,103 @@
`timescale 1ns/1ps
// Design Code
module ADDER(
 input clk,
 input [7:0] a,
 input [7:0] b,
 input bIsPos,
 output reg [8:0] result
);
 always @ (posedge clk) begin
 if (bIsPos) begin 
 result <= a + b;
 end else begin
 result <= a - b;
 end
 end
endmodule: ADDER
interface adder_if(
 input bit clk,
 input [7:0] a,
 input [7:0] b,
 input bIsPos,
 input [8:0] result
);
 clocking cb @(posedge clk);
 output a;
 output b;
 output bIsPos;
 input result;
 endclocking : cb
endinterface: adder_if
bind ADDER adder_if my_adder_if(
 .clk(clk),
 .a(a),
 .b(b),
 .bIsPos(bIsPos),
 .result(result)
);
// Testbench Code
import uvm_pkg::*;
`include "uvm_macros.svh"
class testbench_env extends uvm_env;
 virtual adder_if m_if;
 function new(string name, uvm_component parent = null);
 super.new(name, parent);
 endfunction
 
 function void connect_phase(uvm_phase phase);
 assert(uvm_resource_db#(virtual adder_if)::read_by_name(get_full_name(), "adder_if", m_if));
 endfunction: connect_phase
 task run_phase(uvm_phase phase);
 phase.raise_objection(this);
 `uvm_info(get_name(), "Starting test!", UVM_HIGH);
 begin
 int a = 8'h4, b = 8'h5;
 @(m_if.cb);
 m_if.cb.a <= a;
 m_if.cb.b <= b;
 m_if.cb.bIsPos <= 1'b1;
 repeat(2) @(m_if.cb);
 `uvm_info(get_name(), $sformatf("%0d + %0d = %0d", a, b, m_if.cb.result), UVM_LOW);
 end
 `uvm_info(get_name(), "Ending test!", UVM_HIGH);
 phase.drop_objection(this);
 endtask: run_phase
endclass
module top;
 bit clk;
 env environment;
 ADDER dut(.clk (clk));
 initial begin
 environment = new("testbench_env");
 uvm_resource_db#(virtual adder_if)::set("env", "adder_if", dut.my_adder_if);
 clk = 0;
 run_test();
 end
 // Clock generation 
 initial begin
 forever begin
 #(1) clk = ~clk;
 end
 end
 
endmodule
+35
View File
@@ -0,0 +1,35 @@
import * as React from "react";
import { HelloComponent } from "./hello";
import { NameEditComponent } from "./nameEdit";
export const App = () => {
 const [name, setName] = React.useState("defaultUserName");
 const [editingName, setEditingName] = React.useState("defaultUserName");
 const loadUsername = () => {
 setTimeout(() => {
 setName("name from async call");
 setEditingName("name from async call");
 }, 500);
 };
 React.useEffect(() => {
 loadUsername();
 }, []);
 const setUsernameState = () => {
 setName(editingName);
 };
 return (
 <>
 <HelloComponent userName={name} />
 <NameEditComponent
 initialUserName={name}
 editingName={editingName}
 onNameUpdated={setUsernameState}
 onEditingNameUpdated={setEditingName}
 />
 </>
 );
};
+172
View File
@@ -0,0 +1,172 @@
// Copyright 2018 Schuyler Eldridge
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Implements a fixed-point parameterized pipelined division
// operation. Outputs are expected to be on range [-1,1), techincally
// [-1,2^(BITS-1)-1/2^(BITS-1)]. There is no convergent rounding.
//
// [TODO] Implement optional convergent rounding and some form of
// variable output binary point placement. There are arguments in
// these changes that make sense (specifically, adding an additional
// bit results in a gain of one value when all the other 2^6 values
// greater than 1 aren't used). Other improvements that are needed: 1)
// quotient_gen is getting smaller by one bit in every stage, it would
// make more sense to generate this as such, 2) there's some weird
// initial behavior after rst_n is deasserted, you get weird output on
// the quotient line for a number of cycles.
//
// [TODO] This doesn't exactly behave as expected if you specify
// different BITS and STAGES parameters (which for a functional
// module, should be implemented). Note, that this technically works,
// but needs more investigation to fully understand its properties.
`timescale 1ns / 1ps
module div_pipelined
 (
 input clk,
 input rst_n,
 input start,
 input [BITS-1:0] dividend,
 input [BITS-1:0] divisor,
 output reg data_valid,
 output reg div_by_zero,
 output reg [STAGES-1:0] quotient
 // output reg [7:0] quotient_correct
 );
 // WARNING!!! THESE PARAMETERS ARE INTENDED TO BE MODIFIED IN A TOP
 // LEVEL MODULE. LOCAL CHANGES HERE WILL, MOST LIKELY, BE
 // OVERWRITTEN!
 parameter
 BITS = 8,
 STAGES = BITS;
 // y = a/bQ
 reg [STAGES-1:0] start_gen, negative_quotient_gen, div_by_zero_gen;
 reg [BITS*2*(STAGES-1)-1:0] dividend_gen, divisor_gen, quotient_gen;
 wire [BITS-1:0] pad_dividend;
 wire [BITS-2:0] pad_divisor;
 assign pad_dividend = 0;
 assign pad_divisor = 0;
 // sign conversion stage
 always @ (posedge clk or negedge rst_n)
 begin
 if (!rst_n) begin
 div_by_zero_gen[0] <= 0;
 start_gen[0] <=0;
 negative_quotient_gen[0] <= 0;
 dividend_gen[BITS*2-1:0] <= 0;
 divisor_gen[BITS*2-1:0] <= 0; end
 else begin
 div_by_zero_gen[0] <= (divisor == 0);
 start_gen[0] <= start;
 negative_quotient_gen[0] <= dividend[BITS-1] ^ divisor[BITS-1];
 dividend_gen[BITS*2-1:0] <= (dividend[BITS-1]) ? ~{dividend,pad_dividend} + 1 : {dividend,pad_dividend};
 divisor_gen[BITS*2-1:0] <= (divisor [BITS-1]) ? ~{1'b1,divisor, pad_divisor} + 1 : {1'b0,divisor, pad_divisor};
 end
 end
 // first computation stage
 always @ (posedge clk or negedge rst_n) begin
 if (!rst_n) begin
 div_by_zero_gen[1] <= 0;
 start_gen[1] <= 0;
 negative_quotient_gen[1] <= 0;
 divisor_gen[BITS*2*2-1:BITS*2] <= 0;
 quotient_gen[BITS*2-1:0] <= 0;
 dividend_gen[BITS*2*2-1:BITS*2] <= 0;
 end
 else begin
 div_by_zero_gen[1] <= div_by_zero_gen[0];
 start_gen[1] <= start_gen[0];
 negative_quotient_gen[1] <= negative_quotient_gen[0];
 divisor_gen[BITS*2*2-1:BITS*2] <= divisor_gen[BITS*2-1:0] >> 1;
 if ( dividend_gen[BITS*2-1:0] >= divisor_gen[BITS*2-1:0]) begin
 quotient_gen[BITS*2-1:0] <= 1 << STAGES - 2;
 dividend_gen[BITS*2*2-1:BITS*2] <= dividend_gen[BITS*2-1:0] - divisor_gen[BITS*2-1:0];
 end
 else begin
 quotient_gen[BITS*2-1:0] <= 0;
 dividend_gen[BITS*2*2-1:BITS*2] <= dividend_gen[BITS*2-1:0];
 end
 end // else: !if(!rst_n)
 end // always @ (posedge clk)
 generate
 genvar i;
 for (i = 1; i < STAGES - 2; i = i + 1) begin : pipeline
 always @ (posedge clk or negedge rst_n) begin
 if (!rst_n) begin
 div_by_zero_gen[i+1] <= 0;
 start_gen[i+1] <= 0;
 negative_quotient_gen[i+1] <= 0;
 divisor_gen[BITS*2*(i+2)-1:BITS*2*(i+1)] <= 0;
 quotient_gen[BITS*2*(i+1)-1:BITS*2*i] <= 0;
 dividend_gen[BITS*2*(i+2)-1:BITS*2*(i+1)] <= 0;
 end
 else begin
 div_by_zero_gen[i+1] <= div_by_zero_gen[i];
 start_gen[i+1] <= start_gen[i];
 negative_quotient_gen[i+1] <= negative_quotient_gen[i];
 divisor_gen[BITS*2*(i+2)-1:BITS*2*(i+1)] <= divisor_gen[BITS*2*(i+1)-1:BITS*2*i] >> 1;
 if (dividend_gen[BITS*2*(i+1)-1:BITS*2*i] >= divisor_gen[BITS*2*(i+1)-1:BITS*2*i]) begin
 quotient_gen[BITS*2*(i+1)-1:BITS*2*i] <= quotient_gen[BITS*2*i-1:BITS*2*(i-1)] | (1 << (STAGES-2-i));
 dividend_gen[BITS*2*(i+2)-1:BITS*2*(i+1)] <= dividend_gen[BITS*2*(i+1)-1:BITS*2*i] - divisor_gen[BITS*2*(i+1)-1:BITS*2*i];
 end
 else begin
 quotient_gen[BITS*2*(i+1)-1:BITS*2*i] <= quotient_gen[BITS*2*i-1:BITS*2*(i-1)];
 dividend_gen[BITS*2*(i+2)-1:BITS*2*(i+1)] <= dividend_gen[BITS*2*(i+1)-1:BITS*2*i];
 end
 end // else: !if(!rst_n)
 end // always @ (posedge clk or negedge rst_n)
 end // block: pipeline
 endgenerate
 // last computation stage
 always @ (posedge clk or negedge rst_n) begin
 if (!rst_n) begin
 div_by_zero_gen[STAGES-1] <= 0;
 start_gen[STAGES-1] <= 0;
 negative_quotient_gen[STAGES-1] <= 0;
 quotient_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] <= 0;
 end
 else begin
 div_by_zero_gen[STAGES-1] <= div_by_zero_gen[STAGES-2];
 start_gen[STAGES-1] <= start_gen[STAGES-2];
 negative_quotient_gen[STAGES-1] <= negative_quotient_gen[STAGES-2];
 if ( dividend_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] >= divisor_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] )
 quotient_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] <= quotient_gen[BITS*2*(STAGES-2)-1:BITS*2*(STAGES-3)] | 1;
 else
 quotient_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] <= quotient_gen[BITS*2*(STAGES-2)-1:BITS*2*(STAGES-3)];
 end // else: !if(!rst_n)
 end // always @ (posedge clk)
 // sign conversion stage
 always @ (posedge clk or negedge rst_n) begin
 if (!rst_n) begin
 div_by_zero <= 0;
 data_valid <= 0;
 quotient <= 0;
 end
 else begin
 div_by_zero <= div_by_zero_gen[STAGES-1];
 data_valid <= start_gen[STAGES-1];
 quotient <= (negative_quotient_gen[STAGES-1]) ? ~quotient_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)] + 1 : quotient_gen[BITS*2*(STAGES-1)-1:BITS*2*(STAGES-2)];
 end
 end
endmodule
+89
View File
@@ -0,0 +1,89 @@
# IndividuallyCappedCrowdsale
# Contributors: Binod Nirvan
# This file is released under Apache 2.0 license.
# @dev Crowdsale with a limit for total contributions.
# Ported from Open Zeppelin
# https://github.com/OpenZeppelin
# 
# See https://github.com/OpenZeppelin
# Open Zeppelin tests ported: Crowdsale.test.js
#@dev ERC20/223 Features referenced by this contract
contract TokenContract:
 def transfer(_to: address, _value: uint256) -> bool: modifying
# Event for token purchase logging
# @param _purchaser who paid for the tokens
# @param _beneficiary who got the tokens
# @param _value weis paid for purchase
# @param _amount amount of tokens purchased
TokenPurchase: event({_purchaser: indexed(address), _beneficiary: indexed(address), _value: uint256(wei), _amount: uint256})
# The token being sold
token: public(address)
#Address where funds are collected
wallet: public(address)
# How many token units a buyer gets per wei.
# The rate is the conversion between wei and the smallest and indivisible token unit.
# So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
# 1 wei will give you 1 unit, or 0.001 TOK.
rate: public(uint256)
#Amount of wei raised
weiRaised: public(uint256(wei))
@public
def __init__(_rate: uint256, _wallet: address, _token: address):
 """
 @dev Initializes this contract
 @param _rate Number of token units a buyer gets per wei
 @param _wallet Address where collected funds will be forwarded to
 @param _token Address of the token being sold
 """
 assert _rate > 0, "Invalid value supplied for the parameter \"_rate\"."
 assert _wallet != ZERO_ADDRESS, "Invalid wallet address."
 assert _token != ZERO_ADDRESS, "Invalid token address."
 self.rate = _rate
 self.wallet = _wallet
 self.token = _token
@private
@constant
def getTokenAmount(_weiAmount: uint256) -> uint256:
 return _weiAmount * self.rate
@private
def processTransaction(_sender: address, _beneficiary: address, _weiAmount: uint256(wei)):
 #pre validate
 assert _beneficiary != ZERO_ADDRESS, "Invalid address."
 assert _weiAmount != 0, "Invalid amount received."
 #calculate the number of tokens for the Ether contribution.
 tokens: uint256 = self.getTokenAmount(as_unitless_number(_weiAmount))
 
 self.weiRaised += _weiAmount
 #process purchase
 assert TokenContract(self.token).transfer(_beneficiary, tokens), "Could not forward funds due to an unknown error."
 log.TokenPurchase(_sender, _beneficiary, _weiAmount, tokens)
 #forward funds to the receiving wallet address.
 send(self.wallet, _weiAmount)
 #post validate
@public
@payable
def buyTokens(_beneficiary: address):
 self.processTransaction(msg.sender, _beneficiary, msg.value)
@public
@payable
def __default__():
 self.processTransaction(msg.sender, msg.sender, msg.value)
+264
View File
@@ -0,0 +1,264 @@
<!--
 //*********************************************************
 //
 // Copyright (c) Microsoft. All rights reserved.
 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
 //
 //*********************************************************
-->
<Page
 x:Class="AppUIBasics.ItemPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:common="using:AppUIBasics.Common"
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:data="using:AppUIBasics.Data"
 xmlns:local="using:AppUIBasics"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 x:Name="pageRoot"
 mc:Ignorable="d">
 <!--
 This grid acts as a root panel for the page that defines two rows:
 * Row 0 contains the back button and page title
 * Row 1 contains the rest of the page layout
 -->
 <Grid x:Name="rootPanel" d:DataContext="{Binding Groups[0].Items[0], Source={d:DesignData Source=/DataModel/ControlinfoData.json, Type=data:ControlInfoDataSource}}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 <VisualStateManager.VisualStateGroups>
 <VisualStateGroup>
 <VisualState>
 <VisualState.StateTriggers>
 <local:DeviceFamilyTrigger DeviceFamily="Windows.Xbox" />
 </VisualState.StateTriggers>
 <VisualState.Setters>
 <Setter Target="svPanel.Margin" Value="0,0,48,27" />
 </VisualState.Setters>
 </VisualState>
 </VisualStateGroup>
 <VisualStateGroup>
 <VisualState x:Name="NormalFrameContent" />
 <VisualState x:Name="WideFrameContent">
 <VisualState.Setters>
 <Setter Target="contentFrame.Width" Value="1028" />
 <Setter Target="contentFrame.HorizontalAlignment" Value="Left" />
 </VisualState.Setters>
 </VisualState>
 </VisualStateGroup>
 <VisualStateGroup x:Name="LayoutVisualStates">
 <VisualState x:Name="LargeLayout">
 <VisualState.StateTriggers>
 <AdaptiveTrigger MinWindowWidth="1372" />
 </VisualState.StateTriggers>
 </VisualState>
 <VisualState x:Name="WideLayout">
 <VisualState.StateTriggers>
 <AdaptiveTrigger MinWindowWidth="{StaticResource Breakpoint640Plus}" />
 </VisualState.StateTriggers>
 <VisualState.Setters>
 <Setter Target="seeAlsoPanel.Width" Value="Auto" />
 <Setter Target="seeAlsoPanel.(Grid.Row)" Value="3" />
 <Setter Target="seeAlsoPanel.(Grid.Column)" Value="0" />
 <Setter Target="seeAlsoPanel.(Grid.ColumnSpan)" Value="3" />
 <Setter Target="SourcePanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="DocumentationPanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="RelatedControlsPanel.(Grid.Row)" Value="0" />
 <Setter Target="RelatedControlsPanel.(Grid.Column)" Value="2" />
 <Setter Target="RelatedControlsPanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="FeedbackPanel.(Grid.Row)" Value="1" />
 <Setter Target="FeedbackPanel.(Grid.Column)" Value="2" />
 <Setter Target="FeedbackPanel.(Grid.ColumnSpan)" Value="1" />
 </VisualState.Setters>
 </VisualState>
 <VisualState x:Name="NarrowLayout">
 <VisualState.StateTriggers>
 <AdaptiveTrigger MinWindowWidth="0" />
 </VisualState.StateTriggers>
 <VisualState.Setters>
 <Setter Target="seeAlsoPanel.Width" Value="Auto" />
 <Setter Target="seeAlsoPanel.(Grid.Row)" Value="3" />
 <Setter Target="seeAlsoPanel.(Grid.Column)" Value="0" />
 <Setter Target="seeAlsoPanel.(Grid.ColumnSpan)" Value="3" />
 <Setter Target="SourcePanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="DocumentationPanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="RelatedControlsPanel.(Grid.Row)" Value="0" />
 <Setter Target="RelatedControlsPanel.(Grid.Column)" Value="2" />
 <Setter Target="RelatedControlsPanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="FeedbackPanel.(Grid.Row)" Value="1" />
 <Setter Target="FeedbackPanel.(Grid.Column)" Value="2" />
 <Setter Target="FeedbackPanel.(Grid.ColumnSpan)" Value="1" />
 <Setter Target="rightMargin.Width" Value="0" />
 <Setter Target="contentRoot.Padding" Value="14,0" />
 </VisualState.Setters>
 </VisualState>
 </VisualStateGroup>
 </VisualStateManager.VisualStateGroups>
 <!-- Content Region -->
 <ScrollViewer
 x:Name="svPanel"
 VerticalScrollBarVisibility="Auto"
 VerticalScrollMode="Auto">
 <Grid x:Name="contentRoot" Padding="24,0,0,0" SizeChanged="OnContentRootSizeChanged">
 <Grid.ColumnDefinitions>
 <ColumnDefinition x:Name="contentColumn" />
 <ColumnDefinition x:Name="rightMargin" Width="20" />
 <ColumnDefinition x:Name="infoColumn" Width="Auto" />
 </Grid.ColumnDefinitions>
 <Grid.RowDefinitions>
 <RowDefinition Height="Auto" />
 <RowDefinition Height="*" />
 <RowDefinition Height="20" />
 <RowDefinition Height="Auto" />
 </Grid.RowDefinitions>
 <TextBlock
 x:Name="descriptionText"
 Style="{ThemeResource BodyTextBlockStyle}"
 Grid.ColumnSpan="2"
 Margin="0,5,24,0"
 Text="{x:Bind Item.Description}" />
 <Frame x:Name="contentFrame" Grid.Row="1" />
 <Grid
 x:Name="seeAlsoPanel"
 Grid.Row="0"
 Grid.RowSpan="2"
 Grid.Column="2"
 Width="280"
 Margin="0,0,24,24">
 <Grid.RowDefinitions>
 <RowDefinition Height="Auto" />
 <RowDefinition Height="Auto" />
 <RowDefinition Height="Auto" />
 <RowDefinition Height="Auto" />
 </Grid.RowDefinitions>
 <Grid.ColumnDefinitions>
 <ColumnDefinition />
 <ColumnDefinition Width="20" />
 <ColumnDefinition />
 </Grid.ColumnDefinitions>
 <StackPanel x:Name="SourcePanel" Grid.Row="0" Grid.ColumnSpan="3" Margin="0,0,0,40">
 <TextBlock
 x:Name="SourceHeader"
 x:Uid="SourceHeader"
 Style="{ThemeResource SubtitleTextBlockStyle}"
 Text="View page code on GitHub"/>
 <HyperlinkButton
 x:Name="PageMarkupGitHubLink"
 ToolTipService.ToolTip="{x:Bind PageMarkupGitHubLink.NavigateUri, Mode=OneWay}">
 <TextBlock Text="XAML source code"/>
 </HyperlinkButton>
 <HyperlinkButton
 x:Name="PageCodeGitHubLink"
 ToolTipService.ToolTip="{x:Bind PageCodeGitHubLink.NavigateUri, Mode=OneWay}"
 Margin="0,12,0,0">
 <TextBlock Text="C# source code"/>
 </HyperlinkButton>
 </StackPanel>
 <StackPanel x:Name="DocumentationPanel" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,0,0,40">
 <TextBlock
 x:Name="docHeader"
 x:Uid="DocHeader"
 Style="{StaticResource SubtitleTextBlockStyle}" />
 <ItemsControl
 x:Name="DocsList"
 Margin="0,12,0,0"
 IsTabStop="False"
 ItemsSource="{x:Bind Item.Docs}">
 <ItemsControl.ItemsPanel>
 <ItemsPanelTemplate>
 <StackPanel Orientation="Vertical" />
 </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
 <DataTemplate x:DataType="data:ControlInfoDocLink">
 <HyperlinkButton NavigateUri="{Binding Uri}" ToolTipService.ToolTip="{Binding Uri}">
 <TextBlock Text="{x:Bind Title}" />
 </HyperlinkButton>
 </DataTemplate>
 </ItemsControl.ItemTemplate>
 </ItemsControl>
 </StackPanel>
 <StackPanel x:Name="RelatedControlsPanel" Grid.Row="2" Grid.ColumnSpan="3" Margin="0,0,0,40">
 <TextBlock
 x:Name="relatedControlsHeader"
 x:Uid="RelatedControlsHeader"
 Style="{StaticResource SubtitleTextBlockStyle}" />
 <ItemsControl
 x:Name="relatedItemsControl"
 Margin="0,12,0,0"
 IsTabStop="False"
 ItemsSource="{x:Bind Item.RelatedControls}">
 <ItemsControl.ItemsPanel>
 <ItemsPanelTemplate>
 <StackPanel Orientation="Vertical" />
 </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
 <DataTemplate x:DataType="x:String">
 <!-- A HyperlinkButton must always provide an accessible name to a screen reader which
 conveys the purpose of the link. By default, when the HyperlinkButton is built
 as below, with an Image and TextBlock, the HyperlinkButton provides no accessible
 name. So bind the accessible name to the same data that provides the text shown
 visually on the contained TextBlock. -->
 <HyperlinkButton AutomationProperties.Name="{x:Bind}" Click="OnRelatedControlClick">
 <RelativePanel>
 <!-- Now that the HyperlinkButton has a helpful accessible name, it serves no
 useful purpose for the contained Image, (which is purely decorative,) or
 the contained TextBlock to be exposed to a screen reader. All the information
 required by customers using a screen reader is accessible directly through the
 Hyperlink button. As such, mark the contained elements as not being interesting
 to a screen reader through use of the AutomationProperties.AccessibilityView
 property. -->
 <Image
 AutomationProperties.AccessibilityView="Raw"
 x:Name="iconImage"
 Width="25"
 Margin="0,0,15,0"
 common:ImageLoader.Source="{Binding}" />
 <TextBlock
 AutomationProperties.AccessibilityView="Raw"
 Foreground="{ThemeResource HyperlinkButtonForeground}"
 RelativePanel.RightOf="iconImage"
 Text="{x:Bind}"
 TextWrapping="Wrap" />
 </RelativePanel>
 </HyperlinkButton>
 </DataTemplate>
 </ItemsControl.ItemTemplate>
 </ItemsControl>
 </StackPanel>
 <StackPanel x:Name="FeedbackPanel" Grid.Row="3" Grid.ColumnSpan="3">
 <TextBlock
 x:Name="feedbackHeader"
 x:Uid="FeedbackHeader"
 Style="{StaticResource SubtitleTextBlockStyle}" />
 <HyperlinkButton NavigateUri="https://github.com/microsoft/Xaml-Controls-Gallery/issues/new/choose" 
 ToolTipService.ToolTip="https://github.com/microsoft/Xaml-Controls-Gallery/issues/new/choose">
 <TextBlock x:Uid="FeedbackLink" />
 </HyperlinkButton>
 </StackPanel>
 </Grid>
 </Grid>
 </ScrollViewer>
 </Grid>
</Page>
+425
View File
@@ -0,0 +1,425 @@
#!/usr/bin/env dash
esc() {
 case $1 in
 # vt100 (IL is vt102) (DECTCEM is vt520)
 CUD) printf '%s[%sB' "$esc_c" "$2" ;; # cursor down
 CUP) printf '%s[%s;%sH' "$esc_c" "$2" "$3" ;; # cursor home
 CUU) printf '%s[%sA' "$esc_c" "$2" ;; # cursor up
 DECAWM) printf '%s[?7%s' "$esc_c" "$2" ;; # line wrap
 DECRC) printf '%s8' "$esc_c" ;; # cursor restore
 DECSC) printf '%s7' "$esc_c" ;; # cursor save
 DECSTBM) printf '%s[%s;%sr' "$esc_c" "$2" "$3" ;; # scroll region
 DECTCEM) printf '%s[?25%s' "$esc_c" "$2" ;; # cursor visible
 ED[0-2]) printf '%s[%sJ' "$esc_c" "${1#ED}" ;; # clear screen
 EL[0-2]) printf '%s[%sK' "$esc_c" "${1#EL}" ;; # clear line
 IL) printf '%s[%sL' "$esc_c" "$2" ;; # insert line
 SGR) printf '%s[%s;%sm' "$esc_c" "$2" "$3" ;; # colors
 # xterm (since 1988, supported widely)
 screen_alt) printf '%s[?1049%s' "$esc_c" "$2" ;; # alternate buffer
 esac
}
term_setup() {
 stty=$(stty -g)
 stty -icanon -echo
 esc screen_alt h
 esc DECAWM l
 esc DECTCEM l
 esc ED2
 esc DECSTBM 1 "$((LINES - 2))"
}
term_reset() {
 esc DECAWM h >&2
 esc DECTCEM h >&2
 esc ED2 >&2
 esc DECSTBM >&2
 esc screen_alt l >&2
 stty "$stty"
 # needed for cd-on-exit
 printf '%s\n' "$PWD" >&1
}
term_resize() {
 # false-positive, behavior intentional, globbing is disabled.
 # shellcheck disable=2046
 {
 set -f
 set +f -- $(stty size)
 }
 LINES=$1 COLUMNS=$2
 # space for status_line
 bottom=$((LINES - 2))
}
term_scroll_down() {
 case $((y - $#)) in
 [0-9]*) return
 esac
 y=$((y + 1))
 y2=$((y2 + 1 < bottom ? y2 + 1 : bottom))
 line_print "$((y - 1))" "$@"
 printf '\n'
 line_print "$y" "$@"
 status_line "$#"
}
term_scroll_up() {
 case $y in
 -*|0|1) return
 esac
 y=$((y - 1))
 line_print "$((y + 1))" "$@"
 case $y2 in
 1) esc IL ;;
 *) esc CUU; y2=$((y2 > 1 ? y2 - 1 : 1))
 esac
 line_print "$y" "$@"
 status_line "$#"
}
cmd_run() {
 stty "$stty"
 esc DECTCEM h
 esc DECSTBM
 esc ED2
 "$@" ||:
 esc DECSTBM 1 "$((LINES - 2))"
 esc DECTCEM l
 stty -icanon -echo
 hist=2
}
file_escape() {
 tmp=$1 safe=
 # loop over string char by char
 while c=${tmp%"${tmp#?}"}; do
 case $c in
 '') return ;;
 [[:cntrl:]]) safe=$safe\? ;;
 *) safe=$safe$c ;;
 esac
 tmp=${tmp#?}
 done
}
hist_search() {
 hist=0 j=1
 for file do
 case ${PWD%%/}/$file in
 "$old_pwd") y=$j y2=$((j > bottom ? mid : j)) cur=$file
 esac
 j=$((j + 1))
 done
}
list_print() {
 esc ED2
 esc CUP
 i=1
 end=$((bottom + 1))
 mid=$((bottom / 4 < 5 ? 1 : bottom / 4))
 case $# in
 1) [ -e "$1" ] || set -- empty
 esac
 case $hist in
 2) # redraw after cmd run
 shift "$((y > y2 ? y - y2 : 0))"
 ;;
 1) # redraw after go-to-parent
 hist_search "$@"
 shift "$((y >= bottom ? y - mid : 0))"
 ;;
 *) # everything else
 shift "$((y >= bottom ? y - bottom : 0))"
 ;;
 esac
 for file do
 case $i in
 "$y2") esc SGR 0 7
 esac
 case $((i - end)) in
 -*)
 line_format "$file"
 esc CUD
 ;;
 esac
 i=$((i + 1))
 done
 esc CUP "$((y > y2 ? y2 : y))"
}
redraw() {
 list_print "$@"
 status_line "$#"
}
status_line() {
 esc DECSC
 esc CUP "$LINES"
 case $USER in
 root) esc SGR 31 7 ;;
 *) esc SGR 34 7 ;;
 esac
 printf '%*s\r%s ' "$COLUMNS" "" "($y/$1)"
 case $ltype in
 '') printf %s "$PWD" ;;
 *) printf %s "$ltype"
 esac
 esc SGR 0 0
 esc DECRC
}
prompt() {
 esc DECSC
 esc CUP "$LINES"
 printf %s "$1"
 esc DECTCEM h
 esc EL0
 case $2 in
 r)
 stty icanon echo
 read -r ans ||:
 stty -icanon -echo
 ;;
 esac
 esc DECRC
 esc DECTCEM l
 status_line "($y/$#) $PWD"
}
line_print() {
 offset=$1
 case $offset in
 "$y") esc SGR 0 7
 esac
 shift "$offset"
 case $offset in
 "$y") cur=$1
 esac
 line_format "$1"
}
line_format() {
 file_escape "$1"
 [ -d "$1" ] && esc SGR 1 31
 printf %s "$safe"
 [ -d "$1" ] && printf /
 esc SGR 0 0
 esc EL0
 printf '\r'
}
main() {
 set -e
 case $1 in
 -h|--help)
 printf 'shfm -[hv] <starting dir>\n'
 exit 0
 ;;
 -v|--version)
 printf 'shfm 0.4.2\n'
 exit 0
 ;;
 *)
 cd -- "${1:-"$PWD"}"
 ;;
 esac
 esc_c=$(printf '\033')
 bs_char=$(printf '\177')
 set -- *
 cur=$1
 term_resize
 term_setup
 trap 'term_reset' EXIT INT
 trap 'term_resize; term_setup; y=1 y2=1; redraw "$@"' WINCH
 y=1 y2=1
 redraw "$@"
 while key=$(dd ibs=1 count=1 2>/dev/null); do
 case $key${esc:=0} in
 k?|A2)
 term_scroll_up "$@"
 ;;
 j?|B2)
 term_scroll_down "$@"
 ;;
 l?|C2|"$esc") # ARROW RIGHT
 if [ -d "$cur" ] && cd -- "$cur" >/dev/null 2>&1; then
 set -- *
 y=1 y2=1 cur=$1 ltype=
 redraw "$@"
 elif [ -e "$cur" ]; then
 cmd_run "${SHFM_OPENER:="${EDITOR:=vi}"}" "$cur"
 redraw "$@"
 fi
 ;;
 h?|D2|"$bs_char"?) # ARROW LEFT
 old_pwd=$PWD
 case $ltype in
 '') cd .. || continue ;;
 *) ltype= ;;
 esac
 set -- *
 y=1 y2=1 cur=$1 hist=1
 redraw "$@"
 ;;
 g?)
 case $y in
 1) continue
 esac
 y=1 y2=1 cur=$1
 redraw "$@"
 ;;
 G?)
 y=$#
 y2=$(($# < bottom ? $# : bottom))
 redraw "$@"
 ;;
 .?)
 case ${hidden:=1} in
 1) hidden=0; set -- .* ;;
 0) hidden=1; set -- *
 esac
 y=1 y2=1 cur=$1
 redraw "$@"
 ;;
 :?)
 prompt "cd: " r
 # false positive, behavior intentional
 # shellcheck disable=2088
 case $ans in
 '~') ans=$HOME ;;
 '~/'*) ans=$HOME/${ans#"~/"}
 esac
 cd -- "${ans:="$0"}" >/dev/null 2>&1|| continue
 set -- *
 y=1 y2=1 cur=$1
 redraw "$@"
 ;;
 /?)
 prompt / r
 # word splitting and globbing intentional
 # shellcheck disable=2086
 set -- $ans*
 case $1$# in
 "$ans*1") set -- 'no results'
 esac
 y=1 y2=1 cur=$1 ltype="search $PWD/$ans*"
 redraw "$@"
 status_line "$#"
 ;;
 -?)
 cd -- "$OLDPWD" >/dev/null 2>&1|| continue
 set -- *
 y=1 y2=1 cur=$1
 redraw "$@"
 ;;
 \~?)
 cd || continue
 set -- *
 y=1 y2=1 cur=$1
 redraw "$@"
 ;;
 \!?)
 export SHFM_LEVEL
 SHFM_LEVEL=$((SHFM_LEVEL + 1))
 cmd_run "${SHELL:=/bin/sh}"
 redraw "$@"
 ;;
 \??)
 set -- 'j - down' \
 'k - up' \
 'l - open file or directory' \
 'h - go up level' \
 'g - go to top' \
 'G - go to bottom' \
 'q - quit' \
 ': - cd to <input>' \
 '/ - search current directory <input>*' \
 '- - go to last directory' \
 '~ - go home' \
 '! - spawn shell' \
 '. - toggle hidden files' \
 '? - show keybinds'
 y=1 y2=1 cur=$1 ltype=keybinds
 redraw "$@"
 status_line "$#"
 ;;
 q?) exit 0 ;;
 # handle keys which emit escape sequences
 "$esc_c"*) esc=1 ;;
 '[1') esc=2 ;;
 *) esc=0 ;;
 esac
 done
}
main "$@" >/dev/tty
+88
View File
@@ -0,0 +1,88 @@
local html = import 'html.libsonnet';
local jekyll = import 'jekyll.libsonnet';
local content = import 'stdlib-content.jsonnet';
local
 h1 = html.h1,
 p = html.p;
local manifestJsonSingleLine(val) = std.strReplace(std.manifestJsonEx(val, ''), '\n', ' ');
local exampleDoc(ex) =
 local exRep =
 if std.isString(ex) then
 ex
 else
 html.spaceless([html.code({}, ex.input), ' yields ', html.code({}, manifestJsonSingleLine(ex.output))])
 ;
 html.p({}, html.spaceless(['Example: ', exRep, '.']))
;
local hgroup(body) = html.div({ class: 'hgroup' }, body);
local hgroup_inline(body) = html.div({ class: 'hgroup-inline' }, [body, '<div style="clear: both"></div>']);
local panel(body) = html.div({ class: 'panel' }, body);
local in_panel(body) = hgroup(hgroup_inline(panel(body)));
local fieldParams(f) =
 if std.objectHas(f, 'params') then
 '(' + std.join(', ', f.params) + ')'
 else
 ''
;
local fieldDescription(f) =
 if std.isString(f.description) then
 html.p({}, f.description)
 else
 f.description
;
local fieldDoc(f, prefix) =
 [
 in_panel(html.h4({ id: f.name }, prefix + '.' + f.name + fieldParams(f))),
 in_panel([
 if std.objectHas(f, 'availableSince') then (
 html.p(
 {},
 html.em(
 {},
 if f.availableSince == 'upcoming' then
 'Available in upcoming release.'
 else
 'Available since version ' + f.availableSince + '.'
 )
 )
 ),
 fieldDescription(f),
 if std.objectHas(f, 'examples') then [
 exampleDoc(ex)
 for ex in f.examples
 ] else [],
 ]),
 '',
 ];
local group(group_spec, prefix) =
 [
 in_panel(html.h3({ id: group_spec.id }, group_spec.name)),
 if std.objectHas(group_spec, 'intro') then in_panel(group_spec.intro),
 '',
 [fieldDoc(f, prefix) for f in group_spec.fields],
 '',
 ];
local stdlibPage = [
 in_panel(html.h1({id: 'standard_library'}, 'Standard Library')),
 '',
 in_panel(content.intro),
 '',
 [group(g, content.prefix) for g in content.groups],
];
local stdlibFrontMatter = {
 layout: 'default',
 title: 'Standard Library',
};
jekyll.renderWithFrontMatter(stdlibFrontMatter, stdlibPage)
@@ -0,0 +1,86 @@
# Interface to test varlink implementations against.
# First you write a varlink client calling:
# Start, Test01, Test02, …, Test09, End
# The return value of the previous call should be the argument of the next call.
# Then you test this client against well known servers like python or rust from
# https://github.com/varlink/
#
# Next you write a varlink server providing the same service as the well known ones.
# Now run your client against it and run well known clients like python or rust
# from https://github.com/varlink/ against your server. If all works out, then
# your new language bindings should be varlink certified.
interface org.varlink.certification
type Interface (
 foo: ?[]?[string](foo, bar, baz),
 anon: (foo: bool, bar: bool)
)
type MyType (
 object: object,
 enum: (one, two, three),
 struct: (first: int, second: string),
 array: []string,
 dictionary: [string]string,
 stringset: [string](),
 nullable: ?string,
 nullable_array_struct: ?[](first: int, second: string),
 interface: Interface
)
method Start() -> (client_id: string)
method Test01(client_id: string) -> (bool: bool)
method Test02(client_id: string, bool: bool) -> (int: int)
method Test03(client_id: string, int: int) -> (float: float)
method Test04(client_id: string, float: float) -> (string: string)
method Test05(client_id: string, string: string) -> (
 bool: bool,
 int: int,
 float: float,
 string: string
)
method Test06(
 client_id: string,
 bool: bool,
 int: int,
 float: float,
 string: string
) -> (
 struct: (
 bool: bool,
 int: int,
 float: float,
 string: string
 )
)
method Test07(
 client_id: string,
 struct: (
 bool: bool,
 int: int,
 float: float,
 string: string
 )
) -> (map: [string]string)
method Test08(client_id: string, map: [string]string) -> (set: [string]())
method Test09(client_id: string, set: [string]()) -> (mytype: MyType)
# returns more than one reply with "continues"
method Test10(client_id: string, mytype: MyType) -> (string: string)
# must be called as "oneway"
method Test11(client_id: string, last_more_replies: []string) -> ()
method End(client_id: string) -> (all_ok: bool)
error ClientIdError ()
error CertificationError (wants: object, got: object)
+25
View File
@@ -0,0 +1,25 @@
The `semantic.cabal` file has been added from https://github.com/github/semantic under the following license:
```text
MIT License
Copyright (c) 2015-2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
+247
View File
@@ -0,0 +1,247 @@
cabal-version: 2.4
name: semantic
version: 0.11.0.1
synopsis: Framework and executable for analyzing and diffing untrusted code.
description: Semantic is a library for parsing, analyzing, and comparing source code across many languages.
homepage: http://github.com/github/semantic#readme
bug-reports: https://github.com/github/semantic/issues
license: MIT
license-file: LICENSE
author: The Semantic authors
maintainer: opensource+semantic@github.com
copyright: (c) 2015-2020 GitHub, Inc.
category: Language
build-type: Simple
stability: alpha
extra-source-files: README.md
tested-with: GHC == 8.10.1
flag release
description: Build with optimizations on (for CI or deployment builds)
default: False
-- GHC extensions shared between targets
common haskell
default-language: Haskell2010
default-extensions: StrictData
ghc-options:
-Weverything
-Wno-missing-local-signatures
-Wno-missing-import-lists
-Wno-implicit-prelude
-Wno-safe
-Wno-unsafe
-Wno-name-shadowing
-Wno-monomorphism-restriction
-Wno-missed-specialisations
-Wno-all-missed-specialisations
-Wno-star-is-type
cpp-options:
-DBAZEL_BUILD=0
if (impl(ghc >= 8.8))
ghc-options: -Wno-missing-deriving-strategies
if (impl(ghc >= 8.10))
ghc-options:
-Wno-missing-safe-haskell-mode
-Wno-prepositive-qualified-module
common executable-flags
ghc-options: -threaded -rtsopts "-with-rtsopts=-N -A4m -n2m"
library
import: haskell
hs-source-dirs: src
exposed-modules: Control.Carrier.Parse.Measured
, Control.Carrier.Parse.Simple
-- Effects
, Control.Effect.Parse
, Control.Effect.Sum.Project
, Control.Effect.Timeout
-- General datatype definitions & generic algorithms
, Data.Blob
, Data.Blob.IO
, Data.Duration
, Data.Edit
, Data.Error
, Data.Flag
, Data.Graph.Algebraic
, Data.Handle
, Data.Maybe.Exts
, Data.Semigroup.App
-- Parser glue
, Parsing.Parser
, Parsing.TreeSitter
-- API
, Semantic.Api
, Semantic.Api.Bridge
, Semantic.Api.StackGraph
, Semantic.Api.Symbols
, Semantic.Api.Terms
, Semantic.CLI
, Semantic.Config
, Semantic.Env
, Semantic.IO
, Semantic.Task
, Semantic.Task.Files
, Semantic.Telemetry
, Semantic.Telemetry.AsyncQueue
, Semantic.Telemetry.Error
, Semantic.Telemetry.Log
, Semantic.Telemetry.Stat
, Semantic.Util
, Semantic.Util.Pretty
, Semantic.Version
-- Serialization
, Serializing.Format
, Serializing.SExpression.Precise
-- Custom Prelude
autogen-modules: Paths_semantic
other-modules: Paths_semantic
-- Except in case of vendored dependencies, these deps should be expressed
-- as caret-operator bounds relative to a version in Stackage.
-- These are currently pinned to lts-13.13.
build-depends:
, aeson ^>= 1.4.2.0
, algebraic-graphs ^>= 0.3
, ansi-terminal >= 0.8.2 && <1
, async ^>= 2.2.1
, base >= 4.13 && < 5
, bytestring ^>= 0.10.8.2
, containers ^>= 0.6.0.1
, directory-tree ^>= 0.12.1
, filepath ^>= 1.4.2.1
, fused-effects ^>= 1.1
, ghc-prim >= 0.5 && < 0.7
, hostname ^>= 1.0
, hscolour ^>= 1.24.4
, lens >= 4.17 && < 4.20
, network ^>= 2.8.0.0
, network-uri ^>= 2.6.1.0
, optparse-applicative >= 0.14.3 && < 0.16
, pathtype ^>= 0.8.1
, pretty-show ^>= 1.9.5
, proto-lens >= 0.5 && < 0.8
, semantic-analysis ^>= 0
, semantic-ast
, semantic-codeql ^>= 0
, semantic-go ^>= 0
, semantic-java ^>= 0
, semantic-json ^>= 0
, semantic-php ^>= 0
, semantic-proto ^>= 0
, semantic-python ^>= 0
, semantic-ruby ^>= 0
, semantic-scope-graph ^>= 0
, semantic-source ^>= 0.1.0.1
, semantic-tags ^>= 0
, semantic-tsx ^>= 0
, semantic-typescript ^>= 0
, semilattices ^>= 0.0.0.3
, split ^>= 0.2.3.3
, stm-chans ^>= 3.0.0.4
, text ^>= 1.2.3.2
, time >= 1.8.0.2 && < 1.10
, tree-sitter ^>= 0.9.0.1
, tree-sitter-go ^>= 0.5.0.0
, tree-sitter-java ^>= 0.7.0.0
, tree-sitter-json ^>= 0.7.0.0
, tree-sitter-php ^>= 0.5.0.0
, tree-sitter-python ^>= 0.9.0.1
, tree-sitter-ql ^>= 0.1.0.1
, tree-sitter-ruby ^>= 0.5.0.0
, tree-sitter-tsx ^>= 0.5.0.0
, tree-sitter-typescript ^>= 0.5.0.0
, unix ^>= 2.7.2.2
executable semantic
import: haskell, executable-flags
hs-source-dirs: app
main-is: Main.hs
build-depends:
, base
, semantic
test-suite test
import: haskell, executable-flags
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Spec.hs
other-modules: Data.Graph.Spec
, Data.Language.Spec
, Data.Semigroup.App.Spec
, Integration.Spec
, Semantic.Spec
, Semantic.CLI.Spec
, Semantic.IO.Spec
, Semantic.Stat.Spec
, Tags.Spec
, SpecHelpers
, Generators
, Properties
build-depends:
, algebraic-graphs ^>= 0.3
, base >= 4.13 && < 5
, bytestring ^>= 0.10.8.2
, fused-effects
, Glob ^>= 0.10.0
, hedgehog ^>= 1
, hspec >= 2.6 && <3
, hspec-expectations ^>= 0.8.2
, network ^>= 2.8.0.0
, pathtype ^>= 0.8.1
, semantic
, semantic-analysis
, semantic-ast
, semantic-proto
, semantic-source ^>= 0.1.0.1
, semantic-tags
, semilattices
, tasty ^>= 1.2.3
, tasty-golden ^>= 2.3.2
, tasty-hedgehog ^>= 1.0.0.1
, tasty-hspec ^>= 1.1.5.1
, tasty-hunit ^>= 0.10.0.2
test-suite parse-examples
import: haskell, executable-flags
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Examples.hs
build-depends:
, async ^>= 2.2.1
, base
, fused-effects ^>= 1.1
, Glob
, lens >= 4.17 && < 4.20
, pathtype ^>= 0.8.1
, process ^>= 1.6.3.0
, semantic
, semantic-analysis ^>= 0
, semantic-ast
, semantic-proto ^>= 0
, tasty
, tasty-hunit
, text ^>= 1.2.3.2
benchmark benchmarks
import: haskell, executable-flags
hs-source-dirs: bench
type: exitcode-stdio-1.0
main-is: Main.hs
other-modules: Tagging
ghc-options: -static
build-depends:
, base
, fused-effects ^>= 1.1
, gauge ^>= 0.2.5
, Glob
, pathtype ^>= 0.8.1
, semantic
, semantic-analysis ^>= 0
, semantic-proto
source-repository head
type: git
location: https://github.com/github/semantic

Some files were not shown because too many files have changed in this diff Show More