1
0
mirror of https://github.com/sharkdp/bat synced 2026-08-04 19:01:44 +00:00

Compare commits

...

85 Commits

Author SHA1 Message Date
Martin Nordholts b146958ecb Bump version to v0.18.3 2021-08-22 17:47:12 +02:00
Martin Nordholts 15c701b196 Bump bugreport to 0.4.1
(cherry picked from commit f6975e2acd)
2021-08-21 20:03:39 +02:00
David Peter d8339808a1 Update git2 dependency to fix incompatibility with Rust 1.54
(cherry picked from commit f3d53b79a2)
2021-08-21 20:02:56 +02:00
bl-ue 3b263f0917 Fix typo in README
(cherry picked from commit fc0794a83d)
2021-08-21 20:02:23 +02:00
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
116 changed files with 9648 additions and 323 deletions
+15 -13
View File
@@ -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:
@@ -94,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
@@ -120,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
@@ -268,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
+32 -1
View File
@@ -20,6 +20,37 @@
# v0.18.3
## Bugfixes
- Bump `git2` dependency to fix build with Rust 1.54, see #1761
# 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
@@ -535,7 +566,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
+56 -17
View File
@@ -1,5 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "adler"
version = "1.0.2"
@@ -17,9 +19,9 @@ dependencies = [
[[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.1"
version = "0.18.3"
dependencies = [
"ansi_colours",
"ansi_term 0.12.1",
@@ -97,6 +99,7 @@ dependencies = [
"error-chain",
"git2",
"globset",
"grep-cli",
"lazy_static",
"nix",
"path_abs",
@@ -156,9 +159,9 @@ dependencies = [
[[package]]
name = "bugreport"
version = "0.4.0"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0e97e538864a7c95d33accbf64c8d354018ba3b6e032502fd0fe7259cf1aa3d"
checksum = "0014b4b2b4f63bfe69c3838470121290cc437fdc79785d408a761a21e8b2404c"
dependencies = [
"git-version",
"shell-escape",
@@ -457,9 +460,9 @@ dependencies = [
[[package]]
name = "git2"
version = "0.13.19"
version = "0.13.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17929de7239dea9f68aa14f94b2ab4974e7b24c1314275ffcc12a7758172fa18"
checksum = "d9831e983241f8c5591ed53f17d874833e2fa82cac2625f3888c50cbfe136cba"
dependencies = [
"bitflags",
"libc",
@@ -476,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",
@@ -487,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"
@@ -561,15 +581,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.94"
version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36"
[[package]]
name = "libgit2-sys"
version = "0.12.20+1.1.0"
version = "0.12.21+1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e2f09917e00b9ad194ae72072bb5ada2cca16d8171a43e91ddba2afbb02664b"
checksum = "86271bacd72b2b9e854c3dcfb82efd538f15f870e4c11af66900effb462f6825"
dependencies = [
"cc",
"libc",
@@ -634,6 +654,15 @@ version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
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.4"
@@ -646,14 +675,15 @@ dependencies = [
[[package]]
name = "nix"
version = "0.20.0"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
checksum = "5c3728fec49d363a50a8828a190b379a446cc5cf085c06259bbbeb34447e4ec7"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"memoffset",
]
[[package]]
@@ -1133,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"
+4 -3
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.1"
version = "0.18.3"
exclude = ["assets/syntaxes/*", "assets/themes/*"]
build = "build.rs"
edition = '2018'
@@ -51,6 +51,7 @@ path_abs = { version = "0.5", default-features = false }
clircle = "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.20.0"
nix = "0.21.0"
[build-dependencies]
clap = { version = "2.33", optional = true }
+14 -7
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.1_amd64.deb # adapt version number and architecture
sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
```
### On Alpine Linux
@@ -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 vulnerability in `bat`.
## Project goals and alternatives
`bat` tries to achieve the following goals:
+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
+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.
+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:
+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",
+13 -2
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.1_amd64.deb # adapt version number and architecture
sudo dpkg -i bat_0.18.3_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)
とテーマを読み取ることができます。新しい構文を定義するために以下の手順を行います。
+463 -204
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.1_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.3_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-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)를 참조하세요.
+1 -1
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.1_amd64.deb # измените архитектуру и версию
sudo dpkg -i bat_0.18.3_amd64.deb # измените архитектуру и версию
```
### Alpine Linux
+37 -7
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
})
})
}
+14 -4
View File
@@ -231,7 +231,7 @@ 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())
@@ -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);
}
+1 -1
View File
@@ -211,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))
+3 -1
View File
@@ -4,7 +4,9 @@ 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)
}
+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 {
+12 -11
View File
@@ -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![],
@@ -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
@@ -18,6 +18,7 @@ BAT_OPTIONS = [
SKIP_FILENAMES = [
"LICENSE.md",
"NOTICE",
"README.md",
"bat_options",
]
+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}
@@ -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}
+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)
+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
+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
+26
View File
@@ -0,0 +1,26 @@
The `coffeescript.coffee` file has been added from https://github.com/jashkenas/coffeescript under the following license:
```text
Copyright (c) 2009-2018 Jeremy Ashkenas
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.
```
@@ -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}"
+27
View File
@@ -0,0 +1,27 @@
The `string.fs` file has been added from https://github.com/dotnet/fsharp under the following license:
```text
The MIT License (MIT)
Copyright (c) Microsoft Corporation.
All rights reserved.
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.
```
+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,25 @@
The `quicksort_real_F77.F` file has been added from https://github.com/jasonanema/Quicksort_Fortran77 under the following license:
```text
MIT License
Copyright (c) 2019 Jason Anema
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.
```
@@ -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
+25
View File
@@ -0,0 +1,25 @@
The `test_savetxt.f90` file has been added from https://github.com/fortran-lang/stdlib under the following license:
```text
MIT License
Copyright (c) 2019 Fortran stdlib developers
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.
```
@@ -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
+1
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
// foo~ (editor backup) should highlight same as foo
@@ -0,0 +1 @@
// foo~ for unknown foo should not highlight
File diff suppressed because it is too large Load Diff
+68
View File
@@ -0,0 +1,68 @@
Apache Tomcat
Copyright 1999-2021 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).
This software contains code derived from netty-native
developed by the Netty project
(https://netty.io, https://github.com/netty/netty-tcnative/)
and from finagle-native developed at Twitter
(https://github.com/twitter/finagle).
This software contains code derived from jgroups-kubernetes
developed by the JGroups project (http://www.jgroups.org/).
The Windows Installer is built with the Nullsoft
Scriptable Install System (NSIS), which is
open source software. The original software and
related information is available at
http://nsis.sourceforge.net.
Java compilation software for JSP pages is provided by the Eclipse
JDT Core Batch Compiler component, which is open source software.
The original software and related information is available at
https://www.eclipse.org/jdt/core/.
org.apache.tomcat.util.json.JSONParser.jj is a public domain javacc grammar
for JSON written by Robert Fischer.
https://github.com/RobertFischer/json-parser
For portions of the Tomcat JNI OpenSSL API and the OpenSSL JSSE integration
The org.apache.tomcat.jni and the org.apache.tomcat.net.openssl packages
are derivative work originating from the Netty project and the finagle-native
project developed at Twitter
* Copyright 2014 The Netty Project
* Copyright 2014 Twitter
For portions of the Tomcat cloud support
The org.apache.catalina.tribes.membership.cloud package contains derivative
work originating from the jgroups project.
https://github.com/jgroups-extras/jgroups-kubernetes
Copyright 2002-2018 Red Hat Inc.
The original XML Schemas for Java EE Deployment Descriptors:
- javaee_5.xsd
- javaee_web_services_1_2.xsd
- javaee_web_services_client_1_2.xsd
- javaee_6.xsd
- javaee_web_services_1_3.xsd
- javaee_web_services_client_1_3.xsd
- jsp_2_2.xsd
- web-app_3_0.xsd
- web-common_3_0.xsd
- web-fragment_3_0.xsd
- javaee_7.xsd
- javaee_web_services_1_4.xsd
- javaee_web_services_client_1_4.xsd
- jsp_2_3.xsd
- web-app_3_1.xsd
- web-common_3_1.xsd
- web-fragment_3_1.xsd
- javaee_8.xsd
- web-app_4_0.xsd
- web-common_4_0.xsd
- web-fragment_4_0.xsd
may be obtained from:
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html
@@ -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>
+47
View File
@@ -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}
+167
View File
@@ -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>
+25
View File
@@ -0,0 +1,25 @@
The `Default.build` file has been added from https://github.com/tillig/nant-tasks under the following license:
```text
The MIT License (MIT)
Copyright (c) 2009 Travis Illig
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.
```
+206
View File
@@ -0,0 +1,206 @@
The `manifest_large_exported_classes_node.pp` file has been added from https://github.com/puppetlabs/puppet under the following license:
```text
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
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.
```
@@ -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
}
+25
View File
@@ -0,0 +1,25 @@
The `src_test.rego` file has been added from https://github.com/Azure/Community-Policy under the following license:
```text
MIT License
Copyright (c) Microsoft Corporation.
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
```
+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"
}
+25
View File
@@ -0,0 +1,25 @@
The `recipe141_aws_simple_storage_service.robot` file has been added from https://github.com/adrianyorke/robotframework-cookbook under the following license:
```text
MIT License
Copyright (c) 2020 Adrian Yorke
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.
```

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